diff --git a/build.gradle b/build.gradle index e5784c0f0..3c3368556 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ sourceCompatibility = 1.14 targetCompatibility = 1.14 allprojects { - version = '0.24.1' + version = '0.25.0' group = 'com.yelp.nrtsearch' } diff --git a/clientlib/src/main/proto/yelp/nrtsearch/search.proto b/clientlib/src/main/proto/yelp/nrtsearch/search.proto index bf2cb33b9..59f30fdf0 100644 --- a/clientlib/src/main/proto/yelp/nrtsearch/search.proto +++ b/clientlib/src/main/proto/yelp/nrtsearch/search.proto @@ -432,6 +432,26 @@ message SearchRequest { Highlight highlight = 24; // If Lucene explanation should be included in the response bool explain = 25; + // Search nested object fields for each hit + map inner_hits = 26; +} + +/* Inner Hit search request */ +message InnerHit { + // Nested path to search against assuming same index as the parent Query. + string query_nested_path = 1; + // Which hit to start from (for pagination); default: 0 + int32 start_hit = 2; + // How many top hits to retrieve; default: 3. It limits the hits returned, starting from index 0. For pagination: set it to startHit + window_size. + int32 top_hits = 3; + // InnerHit query to query against the nested documents specified by queryNestedPath. + Query inner_query = 4; + // Fields to retrieve; Parent's fields except its id field are unavailable in the innerHit. + repeated string retrieve_fields = 5; + // Sort hits by field (default is by relevance). + QuerySortField query_sort = 6; + // Highlight the children documents. + Highlight highlight = 7; } /* Virtual field used during search */ @@ -542,6 +562,7 @@ message SearchResponse { map facetTimeMs = 9; double rescoreTimeMs = 10; map rescorersTimeMs = 11; + map innerHitsDiagnostics = 12; } message Hit { @@ -582,6 +603,8 @@ message SearchResponse { map highlights = 5; // Lucene explanation of the hit string explain = 6; + // InnerHits for each hit + map innerHits = 7; } message SearchState { diff --git a/docs/index.rst b/docs/index.rst index 0d3cc0020..c617bf9c0 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -12,6 +12,7 @@ A high performance gRPC server, with optional REST APIs on top of `Apache Lucene querying_nrtsearch analysis highlighting + inner_hit additional_collectors index_settings index_live_settings diff --git a/docs/inner_hit.rst b/docs/inner_hit.rst new file mode 100644 index 000000000..5ee91ced3 --- /dev/null +++ b/docs/inner_hit.rst @@ -0,0 +1,167 @@ +InnerHit +========================== + +Nested objects are stored as the separate documents, compared to the parent documents. NestedQuery enables the filter on parent documents that have at least one nested/child document matches the inner filters. However, the HitResponse will return only the parent documents, so no matched child information will be available from it. To get all the matched child documents per parent document, the innerHit must be used. Users may think the innerHit as a second layer search for each parent hit, and an empty innerHit query would return all children for each hit. + +Requirements +------------ + +To start an innerHit, a parent searchRequest must be present. In additional, the index to search must have the child object field registed as nested field. + +.. code-block:: json + { + "name": "field_name" + "nestedDoc": true, + "multiValued": true, + "type": "OBJECT", + "childFields": [ + ... + ] + } + + +Query Syntax +------------ + +This is the proto definition for InnerHit message which can be specified in SearchRequest: + +.. code-block:: protobuf + + /* Inner Hit search request */ + message InnerHit { + // Nested path to search against assuming same index as the parent Query. + string query_nested_path = 1; + // Which hit to start from (for pagination); default: 0 + int32 start_hit = 2; + // How many top hits to retrieve; default: 3. It limits the hits returned, starting from index 0. For pagination: set it to startHit + window_size. + int32 top_hits = 3; + // InnerHit query to query against the nested documents specified by queryNestedPath. + Query inner_query = 4; + // Fields to retrieve; Parent's fields except its id field are unavailable in the innerHit. + repeated string retrieve_fields = 5; + // Sort hits by field (default is by relevance). + QuerySortField query_sort = 6; + // Highlight the children documents. + Highlight highlight = 7; + } + + +Example Queries +--------------- + +Assuming we have a yaml representation of the documents stored in `index_alpha`: + +.. code-block:: yaml + + // parent document 1 + - business_name: restaurant_A + business_address: 10 A street + menu: + - food_name: chicken + price: 5 + - food_name: burger + price: 8 + // parent document 2 + - business_name: restaurant_B + business_address: 6 B avenue + menu: + - food_name: coke + price: 4 + - food_name: cheeseburger + price: 10 + +Case 1 +^^^^^^ +We would like to get all parents. - get all business. (no innerHit involvement) + +.. code-block:: json + + { + "indexName": "index_alpha", + "retrieveFields": ["business_name"] + } + + +Case 2 +^^^^^^ +We would like to get all children. - get all food in the menu for each business. + +.. code-block:: json + + { + "indexName": "index_alpha", + "retrieveFields": ["business_name"], + "innerHit": { + "query_nested_path": "menu", + "retrieve_fields": ["menu.food_name"] + } + } + +Case 3 +^^^^^^ +We would like to get all children with parent filtering. - get all food in the menu for restaurant_A. + +.. code-block:: json + + { + "indexName": "index_alpha", + "query": { + "termQuery":{ + "field": "business_name", + "textValue": "restaurant_A" + } + }, + "retrieveFields": ["business_name"], + "innerHit": { + "query_nested_path": "menu", + "retrieve_fields": ["menu.food_name"] + } + } + +Case 4 +^^^^^^ +We would like to get all children with child filtering. - get all food in the menu whose price is lower than 6. + +.. code-block:: json + + { + "indexName": "index_alpha", + "retrieveFields": ["business_name"], + "innerHit": { + "query_nested_path": "menu", + "query": { + "rangeQuery":{ + "field": "menu.price", + "upper": "6" + } + }, + "retrieve_fields": ["menu.food_name"] + } + } + +Case 5 +^^^^^^ +We would like to get children with both parent and child filtering. - get all food in the menu whose price is lower than 6 within resturant_A. + +.. code-block:: json + + { + "indexName": "index_alpha", + "query": { + "termQuery":{ + "field": "business_name", + "textValue": "restaurant_A" + } + }, + "retrieveFields": ["business_name"], + "innerHit": { + "query_nested_path": "menu", + "query": { + "rangeQuery":{ + "field": "menu.price", + "upper": "6" + } + }, + "retrieve_fields": ["menu.food_name"] + } + } \ No newline at end of file diff --git a/grpc-gateway/luceneserver.swagger.json b/grpc-gateway/luceneserver.swagger.json index 01e3d04ad..d9aec16ff 100644 --- a/grpc-gateway/luceneserver.swagger.json +++ b/grpc-gateway/luceneserver.swagger.json @@ -2032,6 +2032,12 @@ "type": "number", "format": "double" } + }, + "innerHitsDiagnostics": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/SearchResponseDiagnostics" + } } } }, @@ -2068,6 +2074,13 @@ "explain": { "type": "string", "title": "Lucene explanation of the hit" + }, + "innerHits": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/luceneserverHitsResult" + }, + "title": "InnerHits for each hit" } } }, @@ -3688,6 +3701,45 @@ }, "title": "A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester)" }, + "luceneserverInnerHit": { + "type": "object", + "properties": { + "query_nested_path": { + "type": "string", + "description": "Nested path to search against assuming same index as the parent Query." + }, + "start_hit": { + "type": "integer", + "format": "int32", + "title": "Which hit to start from (for pagination); default: 0" + }, + "top_hits": { + "type": "integer", + "format": "int32", + "description": "How many top hits to retrieve; default: 3. It limits the hits returned, starting from index 0. For pagination: set it to startHit + window_size." + }, + "inner_query": { + "$ref": "#/definitions/luceneserverQuery", + "description": "InnerHit query to query against the nested documents specified by queryNestedPath." + }, + "retrieve_fields": { + "type": "array", + "items": { + "type": "string" + }, + "description": "Fields to retrieve; Parent's fields except its id field are unavailable in the innerHit." + }, + "query_sort": { + "$ref": "#/definitions/luceneserverQuerySortField", + "description": "Sort hits by field (default is by relevance)." + }, + "highlight": { + "$ref": "#/definitions/luceneserverHighlight", + "description": "Highlight the children documents." + } + }, + "title": "Inner Hit search request" + }, "luceneserverIntObject": { "type": "object", "properties": { @@ -4585,6 +4637,13 @@ "explain": { "type": "boolean", "title": "If Lucene explanation should be included in the response" + }, + "inner_hits": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/luceneserverInnerHit" + }, + "title": "Search nested object fields for each hit" } } }, diff --git a/grpc-gateway/search.pb.go b/grpc-gateway/search.pb.go index 5d078143a..04aaa607e 100644 --- a/grpc-gateway/search.pb.go +++ b/grpc-gateway/search.pb.go @@ -646,7 +646,7 @@ func (x Script_ParamNullValue) Number() protoreflect.EnumNumber { // Deprecated: Use Script_ParamNullValue.Descriptor instead. func (Script_ParamNullValue) EnumDescriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27, 0} } //* How the {TotalHits#value} should be interpreted. @@ -695,7 +695,7 @@ func (x TotalHits_Relation) Number() protoreflect.EnumNumber { // Deprecated: Use TotalHits_Relation.Descriptor instead. func (TotalHits_Relation) EnumDescriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{30, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{31, 0} } //Sorting order type @@ -742,7 +742,7 @@ func (x BucketOrder_OrderType) Number() protoreflect.EnumNumber { // Deprecated: Use BucketOrder_OrderType.Descriptor instead. func (BucketOrder_OrderType) EnumDescriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{49, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{50, 0} } type Highlight_Type int32 @@ -796,7 +796,7 @@ func (x Highlight_Type) Number() protoreflect.EnumNumber { // Deprecated: Use Highlight_Type.Descriptor instead. func (Highlight_Type) EnumDescriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{53, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{54, 0} } // A clause in a BooleanQuery. @@ -2951,6 +2951,8 @@ type SearchRequest struct { Highlight *Highlight `protobuf:"bytes,24,opt,name=highlight,proto3" json:"highlight,omitempty"` // If Lucene explanation should be included in the response Explain bool `protobuf:"varint,25,opt,name=explain,proto3" json:"explain,omitempty"` + // Search nested object fields for each hit + InnerHits map[string]*InnerHit `protobuf:"bytes,26,rep,name=inner_hits,json=innerHits,proto3" json:"inner_hits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *SearchRequest) Reset() { @@ -3167,6 +3169,13 @@ func (x *SearchRequest) GetExplain() bool { return false } +func (x *SearchRequest) GetInnerHits() map[string]*InnerHit { + if x != nil { + return x.InnerHits + } + return nil +} + type isSearchRequest_Searcher interface { isSearchRequest_Searcher() } @@ -3189,6 +3198,109 @@ func (*SearchRequest_Version) isSearchRequest_Searcher() {} func (*SearchRequest_Snapshot) isSearchRequest_Searcher() {} +// Inner Hit search request +type InnerHit struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Nested path to search against assuming same index as the parent Query. + QueryNestedPath string `protobuf:"bytes,1,opt,name=query_nested_path,json=queryNestedPath,proto3" json:"query_nested_path,omitempty"` + // Which hit to start from (for pagination); default: 0 + StartHit int32 `protobuf:"varint,2,opt,name=start_hit,json=startHit,proto3" json:"start_hit,omitempty"` + // How many top hits to retrieve; default: 3. It limits the hits returned, starting from index 0. For pagination: set it to startHit + window_size. + TopHits int32 `protobuf:"varint,3,opt,name=top_hits,json=topHits,proto3" json:"top_hits,omitempty"` + // InnerHit query to query against the nested documents specified by queryNestedPath. + InnerQuery *Query `protobuf:"bytes,4,opt,name=inner_query,json=innerQuery,proto3" json:"inner_query,omitempty"` + // Fields to retrieve; Parent's fields except its id field are unavailable in the innerHit. + RetrieveFields []string `protobuf:"bytes,5,rep,name=retrieve_fields,json=retrieveFields,proto3" json:"retrieve_fields,omitempty"` + // Sort hits by field (default is by relevance). + QuerySort *QuerySortField `protobuf:"bytes,6,opt,name=query_sort,json=querySort,proto3" json:"query_sort,omitempty"` + // Highlight the children documents. + Highlight *Highlight `protobuf:"bytes,7,opt,name=highlight,proto3" json:"highlight,omitempty"` +} + +func (x *InnerHit) Reset() { + *x = InnerHit{} + if protoimpl.UnsafeEnabled { + mi := &file_yelp_nrtsearch_search_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InnerHit) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InnerHit) ProtoMessage() {} + +func (x *InnerHit) ProtoReflect() protoreflect.Message { + mi := &file_yelp_nrtsearch_search_proto_msgTypes[25] + 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 InnerHit.ProtoReflect.Descriptor instead. +func (*InnerHit) Descriptor() ([]byte, []int) { + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{25} +} + +func (x *InnerHit) GetQueryNestedPath() string { + if x != nil { + return x.QueryNestedPath + } + return "" +} + +func (x *InnerHit) GetStartHit() int32 { + if x != nil { + return x.StartHit + } + return 0 +} + +func (x *InnerHit) GetTopHits() int32 { + if x != nil { + return x.TopHits + } + return 0 +} + +func (x *InnerHit) GetInnerQuery() *Query { + if x != nil { + return x.InnerQuery + } + return nil +} + +func (x *InnerHit) GetRetrieveFields() []string { + if x != nil { + return x.RetrieveFields + } + return nil +} + +func (x *InnerHit) GetQuerySort() *QuerySortField { + if x != nil { + return x.QuerySort + } + return nil +} + +func (x *InnerHit) GetHighlight() *Highlight { + if x != nil { + return x.Highlight + } + return nil +} + // Virtual field used during search type VirtualField struct { state protoimpl.MessageState @@ -3202,7 +3314,7 @@ type VirtualField struct { func (x *VirtualField) Reset() { *x = VirtualField{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[25] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3215,7 +3327,7 @@ func (x *VirtualField) String() string { func (*VirtualField) ProtoMessage() {} func (x *VirtualField) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[25] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3228,7 +3340,7 @@ func (x *VirtualField) ProtoReflect() protoreflect.Message { // Deprecated: Use VirtualField.ProtoReflect.Descriptor instead. func (*VirtualField) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{25} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26} } func (x *VirtualField) GetScript() *Script { @@ -3258,7 +3370,7 @@ type Script struct { func (x *Script) Reset() { *x = Script{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[26] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3271,7 +3383,7 @@ func (x *Script) String() string { func (*Script) ProtoMessage() {} func (x *Script) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[26] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3284,7 +3396,7 @@ func (x *Script) ProtoReflect() protoreflect.Message { // Deprecated: Use Script.ProtoReflect.Descriptor instead. func (*Script) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27} } func (x *Script) GetLang() string { @@ -3321,7 +3433,7 @@ type QuerySortField struct { func (x *QuerySortField) Reset() { *x = QuerySortField{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[27] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3334,7 +3446,7 @@ func (x *QuerySortField) String() string { func (*QuerySortField) ProtoMessage() {} func (x *QuerySortField) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[27] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3347,7 +3459,7 @@ func (x *QuerySortField) ProtoReflect() protoreflect.Message { // Deprecated: Use QuerySortField.ProtoReflect.Descriptor instead. func (*QuerySortField) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{28} } func (x *QuerySortField) GetDoDocScores() bool { @@ -3383,7 +3495,7 @@ type SortFields struct { func (x *SortFields) Reset() { *x = SortFields{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[28] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3396,7 +3508,7 @@ func (x *SortFields) String() string { func (*SortFields) ProtoMessage() {} func (x *SortFields) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[28] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3409,7 +3521,7 @@ func (x *SortFields) ProtoReflect() protoreflect.Message { // Deprecated: Use SortFields.ProtoReflect.Descriptor instead. func (*SortFields) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{28} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{29} } func (x *SortFields) GetSortedFields() []*SortType { @@ -3439,7 +3551,7 @@ type SortType struct { func (x *SortType) Reset() { *x = SortType{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[29] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3452,7 +3564,7 @@ func (x *SortType) String() string { func (*SortType) ProtoMessage() {} func (x *SortType) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[29] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3465,7 +3577,7 @@ func (x *SortType) ProtoReflect() protoreflect.Message { // Deprecated: Use SortType.ProtoReflect.Descriptor instead. func (*SortType) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{29} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{30} } func (x *SortType) GetFieldName() string { @@ -3516,7 +3628,7 @@ type TotalHits struct { func (x *TotalHits) Reset() { *x = TotalHits{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[30] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3529,7 +3641,7 @@ func (x *TotalHits) String() string { func (*TotalHits) ProtoMessage() {} func (x *TotalHits) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[30] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3542,7 +3654,7 @@ func (x *TotalHits) ProtoReflect() protoreflect.Message { // Deprecated: Use TotalHits.ProtoReflect.Descriptor instead. func (*TotalHits) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{30} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{31} } func (x *TotalHits) GetRelation() TotalHits_Relation { @@ -3572,7 +3684,7 @@ type Point struct { func (x *Point) Reset() { *x = Point{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[31] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3585,7 +3697,7 @@ func (x *Point) String() string { func (*Point) ProtoMessage() {} func (x *Point) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[31] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3598,7 +3710,7 @@ func (x *Point) ProtoReflect() protoreflect.Message { // Deprecated: Use Point.ProtoReflect.Descriptor instead. func (*Point) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{31} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32} } func (x *Point) GetLatitude() float64 { @@ -3637,7 +3749,7 @@ type SearchResponse struct { func (x *SearchResponse) Reset() { *x = SearchResponse{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[32] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3650,7 +3762,7 @@ func (x *SearchResponse) String() string { func (*SearchResponse) ProtoMessage() {} func (x *SearchResponse) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[32] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3663,7 +3775,7 @@ func (x *SearchResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse.ProtoReflect.Descriptor instead. func (*SearchResponse) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33} } func (x *SearchResponse) GetDiagnostics() *SearchResponse_Diagnostics { @@ -3744,7 +3856,7 @@ type NumericRangeType struct { func (x *NumericRangeType) Reset() { *x = NumericRangeType{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[33] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3757,7 +3869,7 @@ func (x *NumericRangeType) String() string { func (*NumericRangeType) ProtoMessage() {} func (x *NumericRangeType) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[33] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3770,7 +3882,7 @@ func (x *NumericRangeType) ProtoReflect() protoreflect.Message { // Deprecated: Use NumericRangeType.ProtoReflect.Descriptor instead. func (*NumericRangeType) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{34} } func (x *NumericRangeType) GetLabel() string { @@ -3827,7 +3939,7 @@ type Facet struct { func (x *Facet) Reset() { *x = Facet{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[34] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3840,7 +3952,7 @@ func (x *Facet) String() string { func (*Facet) ProtoMessage() {} func (x *Facet) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[34] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3853,7 +3965,7 @@ func (x *Facet) ProtoReflect() protoreflect.Message { // Deprecated: Use Facet.ProtoReflect.Descriptor instead. func (*Facet) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{34} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{35} } func (x *Facet) GetDim() string { @@ -3935,7 +4047,7 @@ type FacetResult struct { func (x *FacetResult) Reset() { *x = FacetResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[35] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3948,7 +4060,7 @@ func (x *FacetResult) String() string { func (*FacetResult) ProtoMessage() {} func (x *FacetResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[35] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3961,7 +4073,7 @@ func (x *FacetResult) ProtoReflect() protoreflect.Message { // Deprecated: Use FacetResult.ProtoReflect.Descriptor instead. func (*FacetResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{35} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{36} } func (x *FacetResult) GetDim() string { @@ -4018,7 +4130,7 @@ type LabelAndValue struct { func (x *LabelAndValue) Reset() { *x = LabelAndValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[36] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4031,7 +4143,7 @@ func (x *LabelAndValue) String() string { func (*LabelAndValue) ProtoMessage() {} func (x *LabelAndValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[36] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4044,7 +4156,7 @@ func (x *LabelAndValue) ProtoReflect() protoreflect.Message { // Deprecated: Use LabelAndValue.ProtoReflect.Descriptor instead. func (*LabelAndValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{36} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{37} } func (x *LabelAndValue) GetLabel() string { @@ -4073,7 +4185,7 @@ type FetchTask struct { func (x *FetchTask) Reset() { *x = FetchTask{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[37] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4086,7 +4198,7 @@ func (x *FetchTask) String() string { func (*FetchTask) ProtoMessage() {} func (x *FetchTask) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[37] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4099,7 +4211,7 @@ func (x *FetchTask) ProtoReflect() protoreflect.Message { // Deprecated: Use FetchTask.ProtoReflect.Descriptor instead. func (*FetchTask) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{37} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{38} } func (x *FetchTask) GetName() string { @@ -4129,7 +4241,7 @@ type PluginRescorer struct { func (x *PluginRescorer) Reset() { *x = PluginRescorer{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[38] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4142,7 +4254,7 @@ func (x *PluginRescorer) String() string { func (*PluginRescorer) ProtoMessage() {} func (x *PluginRescorer) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[38] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4155,7 +4267,7 @@ func (x *PluginRescorer) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginRescorer.ProtoReflect.Descriptor instead. func (*PluginRescorer) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{38} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{39} } func (x *PluginRescorer) GetName() string { @@ -4186,7 +4298,7 @@ type QueryRescorer struct { func (x *QueryRescorer) Reset() { *x = QueryRescorer{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[39] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4199,7 +4311,7 @@ func (x *QueryRescorer) String() string { func (*QueryRescorer) ProtoMessage() {} func (x *QueryRescorer) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[39] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4212,7 +4324,7 @@ func (x *QueryRescorer) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryRescorer.ProtoReflect.Descriptor instead. func (*QueryRescorer) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{39} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{40} } func (x *QueryRescorer) GetRescoreQuery() *Query { @@ -4254,7 +4366,7 @@ type Rescorer struct { func (x *Rescorer) Reset() { *x = Rescorer{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[40] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4267,7 +4379,7 @@ func (x *Rescorer) String() string { func (*Rescorer) ProtoMessage() {} func (x *Rescorer) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[40] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4280,7 +4392,7 @@ func (x *Rescorer) ProtoReflect() protoreflect.Message { // Deprecated: Use Rescorer.ProtoReflect.Descriptor instead. func (*Rescorer) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{40} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41} } func (x *Rescorer) GetWindowSize() int32 { @@ -4349,7 +4461,7 @@ type ProfileResult struct { func (x *ProfileResult) Reset() { *x = ProfileResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[41] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4362,7 +4474,7 @@ func (x *ProfileResult) String() string { func (*ProfileResult) ProtoMessage() {} func (x *ProfileResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[41] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4375,7 +4487,7 @@ func (x *ProfileResult) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileResult.ProtoReflect.Descriptor instead. func (*ProfileResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42} } func (x *ProfileResult) GetSearchStats() *ProfileResult_SearchStats { @@ -4426,7 +4538,7 @@ type Collector struct { func (x *Collector) Reset() { *x = Collector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[42] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4439,7 +4551,7 @@ func (x *Collector) String() string { func (*Collector) ProtoMessage() {} func (x *Collector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[42] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4452,7 +4564,7 @@ func (x *Collector) ProtoReflect() protoreflect.Message { // Deprecated: Use Collector.ProtoReflect.Descriptor instead. func (*Collector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{43} } func (m *Collector) GetCollectors() isCollector_Collectors { @@ -4555,7 +4667,7 @@ type PluginCollector struct { func (x *PluginCollector) Reset() { *x = PluginCollector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[43] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4568,7 +4680,7 @@ func (x *PluginCollector) String() string { func (*PluginCollector) ProtoMessage() {} func (x *PluginCollector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[43] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4581,7 +4693,7 @@ func (x *PluginCollector) ProtoReflect() protoreflect.Message { // Deprecated: Use PluginCollector.ProtoReflect.Descriptor instead. func (*PluginCollector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{43} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{44} } func (x *PluginCollector) GetName() string { @@ -4617,7 +4729,7 @@ type TermsCollector struct { func (x *TermsCollector) Reset() { *x = TermsCollector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[44] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4630,7 +4742,7 @@ func (x *TermsCollector) String() string { func (*TermsCollector) ProtoMessage() {} func (x *TermsCollector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[44] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4643,7 +4755,7 @@ func (x *TermsCollector) ProtoReflect() protoreflect.Message { // Deprecated: Use TermsCollector.ProtoReflect.Descriptor instead. func (*TermsCollector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{44} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{45} } func (m *TermsCollector) GetTermsSource() isTermsCollector_TermsSource { @@ -4720,7 +4832,7 @@ type TopHitsCollector struct { func (x *TopHitsCollector) Reset() { *x = TopHitsCollector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[45] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[46] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4733,7 +4845,7 @@ func (x *TopHitsCollector) String() string { func (*TopHitsCollector) ProtoMessage() {} func (x *TopHitsCollector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[45] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[46] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4746,7 +4858,7 @@ func (x *TopHitsCollector) ProtoReflect() protoreflect.Message { // Deprecated: Use TopHitsCollector.ProtoReflect.Descriptor instead. func (*TopHitsCollector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{45} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{46} } func (x *TopHitsCollector) GetStartHit() int32 { @@ -4799,7 +4911,7 @@ type FilterCollector struct { func (x *FilterCollector) Reset() { *x = FilterCollector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[46] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[47] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4812,7 +4924,7 @@ func (x *FilterCollector) String() string { func (*FilterCollector) ProtoMessage() {} func (x *FilterCollector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[46] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[47] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4825,7 +4937,7 @@ func (x *FilterCollector) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterCollector.ProtoReflect.Descriptor instead. func (*FilterCollector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{46} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{47} } func (m *FilterCollector) GetFilter() isFilterCollector_Filter { @@ -4881,7 +4993,7 @@ type MaxCollector struct { func (x *MaxCollector) Reset() { *x = MaxCollector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[47] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[48] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4894,7 +5006,7 @@ func (x *MaxCollector) String() string { func (*MaxCollector) ProtoMessage() {} func (x *MaxCollector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[47] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[48] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4907,7 +5019,7 @@ func (x *MaxCollector) ProtoReflect() protoreflect.Message { // Deprecated: Use MaxCollector.ProtoReflect.Descriptor instead. func (*MaxCollector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{47} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{48} } func (m *MaxCollector) GetValueSource() isMaxCollector_ValueSource { @@ -4952,7 +5064,7 @@ type CollectorResult struct { func (x *CollectorResult) Reset() { *x = CollectorResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[48] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -4965,7 +5077,7 @@ func (x *CollectorResult) String() string { func (*CollectorResult) ProtoMessage() {} func (x *CollectorResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[48] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -4978,7 +5090,7 @@ func (x *CollectorResult) ProtoReflect() protoreflect.Message { // Deprecated: Use CollectorResult.ProtoReflect.Descriptor instead. func (*CollectorResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{48} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{49} } func (m *CollectorResult) GetCollectorResults() isCollectorResult_CollectorResults { @@ -5077,7 +5189,7 @@ type BucketOrder struct { func (x *BucketOrder) Reset() { *x = BucketOrder{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[49] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5090,7 +5202,7 @@ func (x *BucketOrder) String() string { func (*BucketOrder) ProtoMessage() {} func (x *BucketOrder) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[49] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5103,7 +5215,7 @@ func (x *BucketOrder) ProtoReflect() protoreflect.Message { // Deprecated: Use BucketOrder.ProtoReflect.Descriptor instead. func (*BucketOrder) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{49} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{50} } func (x *BucketOrder) GetKey() string { @@ -5135,7 +5247,7 @@ type BucketResult struct { func (x *BucketResult) Reset() { *x = BucketResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[50] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[51] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5148,7 +5260,7 @@ func (x *BucketResult) String() string { func (*BucketResult) ProtoMessage() {} func (x *BucketResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[50] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[51] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5161,7 +5273,7 @@ func (x *BucketResult) ProtoReflect() protoreflect.Message { // Deprecated: Use BucketResult.ProtoReflect.Descriptor instead. func (*BucketResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{50} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{51} } func (x *BucketResult) GetBuckets() []*BucketResult_Bucket { @@ -5199,7 +5311,7 @@ type HitsResult struct { func (x *HitsResult) Reset() { *x = HitsResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[51] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[52] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5212,7 +5324,7 @@ func (x *HitsResult) String() string { func (*HitsResult) ProtoMessage() {} func (x *HitsResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[51] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[52] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5225,7 +5337,7 @@ func (x *HitsResult) ProtoReflect() protoreflect.Message { // Deprecated: Use HitsResult.ProtoReflect.Descriptor instead. func (*HitsResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{51} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{52} } func (x *HitsResult) GetTotalHits() *TotalHits { @@ -5256,7 +5368,7 @@ type FilterResult struct { func (x *FilterResult) Reset() { *x = FilterResult{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[52] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[53] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5269,7 +5381,7 @@ func (x *FilterResult) String() string { func (*FilterResult) ProtoMessage() {} func (x *FilterResult) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[52] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[53] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5282,7 +5394,7 @@ func (x *FilterResult) ProtoReflect() protoreflect.Message { // Deprecated: Use FilterResult.ProtoReflect.Descriptor instead. func (*FilterResult) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{52} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{53} } func (x *FilterResult) GetDocCount() int32 { @@ -5316,7 +5428,7 @@ type Highlight struct { func (x *Highlight) Reset() { *x = Highlight{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[53] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[54] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5329,7 +5441,7 @@ func (x *Highlight) String() string { func (*Highlight) ProtoMessage() {} func (x *Highlight) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[53] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[54] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5342,7 +5454,7 @@ func (x *Highlight) ProtoReflect() protoreflect.Message { // Deprecated: Use Highlight.ProtoReflect.Descriptor instead. func (*Highlight) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{53} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{54} } func (x *Highlight) GetSettings() *Highlight_Settings { @@ -5377,7 +5489,7 @@ type TermInSetQuery_TextTerms struct { func (x *TermInSetQuery_TextTerms) Reset() { *x = TermInSetQuery_TextTerms{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[54] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[55] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5390,7 +5502,7 @@ func (x *TermInSetQuery_TextTerms) String() string { func (*TermInSetQuery_TextTerms) ProtoMessage() {} func (x *TermInSetQuery_TextTerms) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[54] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[55] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5424,7 +5536,7 @@ type TermInSetQuery_IntTerms struct { func (x *TermInSetQuery_IntTerms) Reset() { *x = TermInSetQuery_IntTerms{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[55] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[56] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5437,7 +5549,7 @@ func (x *TermInSetQuery_IntTerms) String() string { func (*TermInSetQuery_IntTerms) ProtoMessage() {} func (x *TermInSetQuery_IntTerms) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[55] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[56] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5471,7 +5583,7 @@ type TermInSetQuery_LongTerms struct { func (x *TermInSetQuery_LongTerms) Reset() { *x = TermInSetQuery_LongTerms{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[56] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[57] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5484,7 +5596,7 @@ func (x *TermInSetQuery_LongTerms) String() string { func (*TermInSetQuery_LongTerms) ProtoMessage() {} func (x *TermInSetQuery_LongTerms) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[56] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[57] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5518,7 +5630,7 @@ type TermInSetQuery_FloatTerms struct { func (x *TermInSetQuery_FloatTerms) Reset() { *x = TermInSetQuery_FloatTerms{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[57] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[58] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5531,7 +5643,7 @@ func (x *TermInSetQuery_FloatTerms) String() string { func (*TermInSetQuery_FloatTerms) ProtoMessage() {} func (x *TermInSetQuery_FloatTerms) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[57] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[58] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5565,7 +5677,7 @@ type TermInSetQuery_DoubleTerms struct { func (x *TermInSetQuery_DoubleTerms) Reset() { *x = TermInSetQuery_DoubleTerms{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[58] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[59] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5578,7 +5690,7 @@ func (x *TermInSetQuery_DoubleTerms) String() string { func (*TermInSetQuery_DoubleTerms) ProtoMessage() {} func (x *TermInSetQuery_DoubleTerms) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[58] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[59] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5621,7 +5733,7 @@ type MultiFunctionScoreQuery_FilterFunction struct { func (x *MultiFunctionScoreQuery_FilterFunction) Reset() { *x = MultiFunctionScoreQuery_FilterFunction{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[60] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[61] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5634,7 +5746,7 @@ func (x *MultiFunctionScoreQuery_FilterFunction) String() string { func (*MultiFunctionScoreQuery_FilterFunction) ProtoMessage() {} func (x *MultiFunctionScoreQuery_FilterFunction) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[60] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[61] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5712,7 +5824,7 @@ type Script_ParamValue struct { func (x *Script_ParamValue) Reset() { *x = Script_ParamValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[62] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[64] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5725,7 +5837,7 @@ func (x *Script_ParamValue) String() string { func (*Script_ParamValue) ProtoMessage() {} func (x *Script_ParamValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[62] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[64] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5738,7 +5850,7 @@ func (x *Script_ParamValue) ProtoReflect() protoreflect.Message { // Deprecated: Use Script_ParamValue.ProtoReflect.Descriptor instead. func (*Script_ParamValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27, 0} } func (m *Script_ParamValue) GetParamValues() isScript_ParamValue_ParamValues { @@ -5881,7 +5993,7 @@ type Script_ParamStructValue struct { func (x *Script_ParamStructValue) Reset() { *x = Script_ParamStructValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[63] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[65] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5894,7 +6006,7 @@ func (x *Script_ParamStructValue) String() string { func (*Script_ParamStructValue) ProtoMessage() {} func (x *Script_ParamStructValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[63] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[65] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5907,7 +6019,7 @@ func (x *Script_ParamStructValue) ProtoReflect() protoreflect.Message { // Deprecated: Use Script_ParamStructValue.ProtoReflect.Descriptor instead. func (*Script_ParamStructValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26, 1} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27, 1} } func (x *Script_ParamStructValue) GetFields() map[string]*Script_ParamValue { @@ -5929,7 +6041,7 @@ type Script_ParamListValue struct { func (x *Script_ParamListValue) Reset() { *x = Script_ParamListValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[64] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[66] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -5942,7 +6054,7 @@ func (x *Script_ParamListValue) String() string { func (*Script_ParamListValue) ProtoMessage() {} func (x *Script_ParamListValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[64] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[66] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -5955,7 +6067,7 @@ func (x *Script_ParamListValue) ProtoReflect() protoreflect.Message { // Deprecated: Use Script_ParamListValue.ProtoReflect.Descriptor instead. func (*Script_ParamListValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{26, 2} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{27, 2} } func (x *Script_ParamListValue) GetValues() []*Script_ParamValue { @@ -5977,21 +6089,22 @@ type SearchResponse_Diagnostics struct { // Deprecated: Do not use. RewrittenQuery string `protobuf:"bytes,2,opt,name=rewrittenQuery,proto3" json:"rewrittenQuery,omitempty"` // Deprecated: Do not use. - DrillDownQuery string `protobuf:"bytes,3,opt,name=drillDownQuery,proto3" json:"drillDownQuery,omitempty"` - FirstPassSearchTimeMs float64 `protobuf:"fixed64,4,opt,name=firstPassSearchTimeMs,proto3" json:"firstPassSearchTimeMs,omitempty"` - HighlightTimeMs float64 `protobuf:"fixed64,5,opt,name=highlightTimeMs,proto3" json:"highlightTimeMs,omitempty"` - GetFieldsTimeMs float64 `protobuf:"fixed64,6,opt,name=getFieldsTimeMs,proto3" json:"getFieldsTimeMs,omitempty"` - NewSnapshotSearcherOpenMs float64 `protobuf:"fixed64,7,opt,name=newSnapshotSearcherOpenMs,proto3" json:"newSnapshotSearcherOpenMs,omitempty"` - NrtWaitTimeMs float64 `protobuf:"fixed64,8,opt,name=nrtWaitTimeMs,proto3" json:"nrtWaitTimeMs,omitempty"` - FacetTimeMs map[string]float64 `protobuf:"bytes,9,rep,name=facetTimeMs,proto3" json:"facetTimeMs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` - RescoreTimeMs float64 `protobuf:"fixed64,10,opt,name=rescoreTimeMs,proto3" json:"rescoreTimeMs,omitempty"` - RescorersTimeMs map[string]float64 `protobuf:"bytes,11,rep,name=rescorersTimeMs,proto3" json:"rescorersTimeMs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + DrillDownQuery string `protobuf:"bytes,3,opt,name=drillDownQuery,proto3" json:"drillDownQuery,omitempty"` + FirstPassSearchTimeMs float64 `protobuf:"fixed64,4,opt,name=firstPassSearchTimeMs,proto3" json:"firstPassSearchTimeMs,omitempty"` + HighlightTimeMs float64 `protobuf:"fixed64,5,opt,name=highlightTimeMs,proto3" json:"highlightTimeMs,omitempty"` + GetFieldsTimeMs float64 `protobuf:"fixed64,6,opt,name=getFieldsTimeMs,proto3" json:"getFieldsTimeMs,omitempty"` + NewSnapshotSearcherOpenMs float64 `protobuf:"fixed64,7,opt,name=newSnapshotSearcherOpenMs,proto3" json:"newSnapshotSearcherOpenMs,omitempty"` + NrtWaitTimeMs float64 `protobuf:"fixed64,8,opt,name=nrtWaitTimeMs,proto3" json:"nrtWaitTimeMs,omitempty"` + FacetTimeMs map[string]float64 `protobuf:"bytes,9,rep,name=facetTimeMs,proto3" json:"facetTimeMs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + RescoreTimeMs float64 `protobuf:"fixed64,10,opt,name=rescoreTimeMs,proto3" json:"rescoreTimeMs,omitempty"` + RescorersTimeMs map[string]float64 `protobuf:"bytes,11,rep,name=rescorersTimeMs,proto3" json:"rescorersTimeMs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"` + InnerHitsDiagnostics map[string]*SearchResponse_Diagnostics `protobuf:"bytes,12,rep,name=innerHitsDiagnostics,proto3" json:"innerHitsDiagnostics,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *SearchResponse_Diagnostics) Reset() { *x = SearchResponse_Diagnostics{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[67] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[69] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6004,7 +6117,7 @@ func (x *SearchResponse_Diagnostics) String() string { func (*SearchResponse_Diagnostics) ProtoMessage() {} func (x *SearchResponse_Diagnostics) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[67] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[69] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6017,7 +6130,7 @@ func (x *SearchResponse_Diagnostics) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse_Diagnostics.ProtoReflect.Descriptor instead. func (*SearchResponse_Diagnostics) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 0} } // Deprecated: Do not use. @@ -6100,6 +6213,13 @@ func (x *SearchResponse_Diagnostics) GetRescorersTimeMs() map[string]float64 { return nil } +func (x *SearchResponse_Diagnostics) GetInnerHitsDiagnostics() map[string]*SearchResponse_Diagnostics { + if x != nil { + return x.InnerHitsDiagnostics + } + return nil +} + type SearchResponse_Hit struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6113,12 +6233,14 @@ type SearchResponse_Hit struct { Highlights map[string]*SearchResponse_Hit_Highlights `protobuf:"bytes,5,rep,name=highlights,proto3" json:"highlights,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // Lucene explanation of the hit Explain string `protobuf:"bytes,6,opt,name=explain,proto3" json:"explain,omitempty"` + // InnerHits for each hit + InnerHits map[string]*HitsResult `protobuf:"bytes,7,rep,name=innerHits,proto3" json:"innerHits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *SearchResponse_Hit) Reset() { *x = SearchResponse_Hit{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[68] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[70] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6131,7 +6253,7 @@ func (x *SearchResponse_Hit) String() string { func (*SearchResponse_Hit) ProtoMessage() {} func (x *SearchResponse_Hit) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[68] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[70] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6144,7 +6266,7 @@ func (x *SearchResponse_Hit) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse_Hit.ProtoReflect.Descriptor instead. func (*SearchResponse_Hit) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 1} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 1} } func (x *SearchResponse_Hit) GetLuceneDocId() int32 { @@ -6189,6 +6311,13 @@ func (x *SearchResponse_Hit) GetExplain() string { return "" } +func (x *SearchResponse_Hit) GetInnerHits() map[string]*HitsResult { + if x != nil { + return x.InnerHits + } + return nil +} + type SearchResponse_SearchState struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -6204,7 +6333,7 @@ type SearchResponse_SearchState struct { func (x *SearchResponse_SearchState) Reset() { *x = SearchResponse_SearchState{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[69] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[71] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6217,7 +6346,7 @@ func (x *SearchResponse_SearchState) String() string { func (*SearchResponse_SearchState) ProtoMessage() {} func (x *SearchResponse_SearchState) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[69] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[71] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6230,7 +6359,7 @@ func (x *SearchResponse_SearchState) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse_SearchState.ProtoReflect.Descriptor instead. func (*SearchResponse_SearchState) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 2} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 2} } func (x *SearchResponse_SearchState) GetTimestamp() int64 { @@ -6289,7 +6418,7 @@ type SearchResponse_Hit_FieldValue struct { func (x *SearchResponse_Hit_FieldValue) Reset() { *x = SearchResponse_Hit_FieldValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[73] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[76] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6302,7 +6431,7 @@ func (x *SearchResponse_Hit_FieldValue) String() string { func (*SearchResponse_Hit_FieldValue) ProtoMessage() {} func (x *SearchResponse_Hit_FieldValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[73] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[76] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6315,7 +6444,7 @@ func (x *SearchResponse_Hit_FieldValue) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse_Hit_FieldValue.ProtoReflect.Descriptor instead. func (*SearchResponse_Hit_FieldValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 1, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 1, 0} } func (m *SearchResponse_Hit_FieldValue) GetFieldValues() isSearchResponse_Hit_FieldValue_FieldValues { @@ -6458,7 +6587,7 @@ type SearchResponse_Hit_CompositeFieldValue struct { func (x *SearchResponse_Hit_CompositeFieldValue) Reset() { *x = SearchResponse_Hit_CompositeFieldValue{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[74] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[77] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6471,7 +6600,7 @@ func (x *SearchResponse_Hit_CompositeFieldValue) String() string { func (*SearchResponse_Hit_CompositeFieldValue) ProtoMessage() {} func (x *SearchResponse_Hit_CompositeFieldValue) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[74] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[77] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6484,7 +6613,7 @@ func (x *SearchResponse_Hit_CompositeFieldValue) ProtoReflect() protoreflect.Mes // Deprecated: Use SearchResponse_Hit_CompositeFieldValue.ProtoReflect.Descriptor instead. func (*SearchResponse_Hit_CompositeFieldValue) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 1, 1} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 1, 1} } func (x *SearchResponse_Hit_CompositeFieldValue) GetFieldValue() []*SearchResponse_Hit_FieldValue { @@ -6506,7 +6635,7 @@ type SearchResponse_Hit_Highlights struct { func (x *SearchResponse_Hit_Highlights) Reset() { *x = SearchResponse_Hit_Highlights{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[75] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[78] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6519,7 +6648,7 @@ func (x *SearchResponse_Hit_Highlights) String() string { func (*SearchResponse_Hit_Highlights) ProtoMessage() {} func (x *SearchResponse_Hit_Highlights) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[75] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[78] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6532,7 +6661,7 @@ func (x *SearchResponse_Hit_Highlights) ProtoReflect() protoreflect.Message { // Deprecated: Use SearchResponse_Hit_Highlights.ProtoReflect.Descriptor instead. func (*SearchResponse_Hit_Highlights) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 1, 2} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 1, 2} } func (x *SearchResponse_Hit_Highlights) GetFragments() []string { @@ -6553,7 +6682,7 @@ type SearchResponse_Hit_FieldValue_Vector struct { func (x *SearchResponse_Hit_FieldValue_Vector) Reset() { *x = SearchResponse_Hit_FieldValue_Vector{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[79] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[83] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6566,7 +6695,7 @@ func (x *SearchResponse_Hit_FieldValue_Vector) String() string { func (*SearchResponse_Hit_FieldValue_Vector) ProtoMessage() {} func (x *SearchResponse_Hit_FieldValue_Vector) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[79] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[83] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6579,7 +6708,7 @@ func (x *SearchResponse_Hit_FieldValue_Vector) ProtoReflect() protoreflect.Messa // Deprecated: Use SearchResponse_Hit_FieldValue_Vector.ProtoReflect.Descriptor instead. func (*SearchResponse_Hit_FieldValue_Vector) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{32, 1, 0, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{33, 1, 0, 0} } func (x *SearchResponse_Hit_FieldValue_Vector) GetValue() []float32 { @@ -6601,7 +6730,7 @@ type ProfileResult_AdditionalCollectorStats struct { func (x *ProfileResult_AdditionalCollectorStats) Reset() { *x = ProfileResult_AdditionalCollectorStats{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[80] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[84] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6614,7 +6743,7 @@ func (x *ProfileResult_AdditionalCollectorStats) String() string { func (*ProfileResult_AdditionalCollectorStats) ProtoMessage() {} func (x *ProfileResult_AdditionalCollectorStats) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[80] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[84] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6627,7 +6756,7 @@ func (x *ProfileResult_AdditionalCollectorStats) ProtoReflect() protoreflect.Mes // Deprecated: Use ProfileResult_AdditionalCollectorStats.ProtoReflect.Descriptor instead. func (*ProfileResult_AdditionalCollectorStats) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42, 0} } func (x *ProfileResult_AdditionalCollectorStats) GetCollectTimeMs() float64 { @@ -6656,7 +6785,7 @@ type ProfileResult_CollectorStats struct { func (x *ProfileResult_CollectorStats) Reset() { *x = ProfileResult_CollectorStats{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[81] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[85] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6669,7 +6798,7 @@ func (x *ProfileResult_CollectorStats) String() string { func (*ProfileResult_CollectorStats) ProtoMessage() {} func (x *ProfileResult_CollectorStats) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[81] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[85] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6682,7 +6811,7 @@ func (x *ProfileResult_CollectorStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileResult_CollectorStats.ProtoReflect.Descriptor instead. func (*ProfileResult_CollectorStats) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41, 1} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42, 1} } func (x *ProfileResult_CollectorStats) GetTerminated() bool { @@ -6740,7 +6869,7 @@ type ProfileResult_SegmentStats struct { func (x *ProfileResult_SegmentStats) Reset() { *x = ProfileResult_SegmentStats{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[82] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[86] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6753,7 +6882,7 @@ func (x *ProfileResult_SegmentStats) String() string { func (*ProfileResult_SegmentStats) ProtoMessage() {} func (x *ProfileResult_SegmentStats) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[82] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[86] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6766,7 +6895,7 @@ func (x *ProfileResult_SegmentStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileResult_SegmentStats.ProtoReflect.Descriptor instead. func (*ProfileResult_SegmentStats) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41, 2} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42, 2} } func (x *ProfileResult_SegmentStats) GetMaxDoc() int32 { @@ -6819,7 +6948,7 @@ type ProfileResult_SearchStats struct { func (x *ProfileResult_SearchStats) Reset() { *x = ProfileResult_SearchStats{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[83] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[87] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6832,7 +6961,7 @@ func (x *ProfileResult_SearchStats) String() string { func (*ProfileResult_SearchStats) ProtoMessage() {} func (x *ProfileResult_SearchStats) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[83] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[87] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6845,7 +6974,7 @@ func (x *ProfileResult_SearchStats) ProtoReflect() protoreflect.Message { // Deprecated: Use ProfileResult_SearchStats.ProtoReflect.Descriptor instead. func (*ProfileResult_SearchStats) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{41, 3} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{42, 3} } func (x *ProfileResult_SearchStats) GetTotalCollectTimeMs() float64 { @@ -6883,7 +7012,7 @@ type BucketResult_Bucket struct { func (x *BucketResult_Bucket) Reset() { *x = BucketResult_Bucket{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[86] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[90] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6896,7 +7025,7 @@ func (x *BucketResult_Bucket) String() string { func (*BucketResult_Bucket) ProtoMessage() {} func (x *BucketResult_Bucket) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[86] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[90] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6909,7 +7038,7 @@ func (x *BucketResult_Bucket) ProtoReflect() protoreflect.Message { // Deprecated: Use BucketResult_Bucket.ProtoReflect.Descriptor instead. func (*BucketResult_Bucket) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{50, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{51, 0} } func (x *BucketResult_Bucket) GetKey() string { @@ -6967,7 +7096,7 @@ type Highlight_Settings struct { func (x *Highlight_Settings) Reset() { *x = Highlight_Settings{} if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[89] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[93] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -6980,7 +7109,7 @@ func (x *Highlight_Settings) String() string { func (*Highlight_Settings) ProtoMessage() {} func (x *Highlight_Settings) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_search_proto_msgTypes[89] + mi := &file_yelp_nrtsearch_search_proto_msgTypes[93] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -6993,7 +7122,7 @@ func (x *Highlight_Settings) ProtoReflect() protoreflect.Message { // Deprecated: Use Highlight_Settings.ProtoReflect.Descriptor instead. func (*Highlight_Settings) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{53, 0} + return file_yelp_nrtsearch_search_proto_rawDescGZIP(), []int{54, 0} } func (x *Highlight_Settings) GetHighlighterType() Highlight_Type { @@ -7498,7 +7627,7 @@ var file_yelp_nrtsearch_search_proto_rawDesc = []byte{ 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x61, 0x6e, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x42, 0x0b, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0x9c, 0x09, + 0x42, 0x0b, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x6f, 0x64, 0x65, 0x22, 0xbd, 0x0a, 0x0a, 0x0d, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1a, 0x0a, @@ -7566,200 +7695,245 @@ var file_yelp_nrtsearch_search_proto_rawDesc = []byte{ 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x18, 0x19, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x1a, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x42, 0x0a, 0x0a, 0x08, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0x50, 0x0a, 0x0c, - 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, 0x06, - 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xb0, - 0x07, 0x0a, 0x06, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6c, 0x61, 0x6e, - 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x61, 0x6e, 0x67, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, - 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, - 0xba, 0x03, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, - 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, - 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x20, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, - 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x6e, 0x75, 0x6c, 0x6c, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, - 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, - 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, + 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x49, 0x0a, 0x0a, 0x69, 0x6e, 0x6e, 0x65, + 0x72, 0x5f, 0x68, 0x69, 0x74, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x69, 0x74, 0x73, 0x1a, 0x56, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x54, 0x0a, 0x0e, 0x49, + 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, + 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x42, 0x0a, 0x0a, 0x08, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x22, 0xc1, 0x02, + 0x0a, 0x08, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x5f, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x4e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x50, 0x61, 0x74, 0x68, 0x12, 0x1b, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x68, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x48, 0x69, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x6f, 0x70, 0x5f, 0x68, 0x69, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x12, 0x34, + 0x0a, 0x0b, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0a, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x27, 0x0a, 0x0f, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, + 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, + 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x3b, 0x0a, + 0x0a, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, + 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x68, 0x69, + 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, + 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x52, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x50, 0x0a, 0x0c, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, + 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x22, 0xb0, 0x07, 0x0a, 0x06, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6c, 0x61, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6c, 0x61, + 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x1a, 0xba, 0x03, 0x0a, 0x0a, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x6f, + 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x08, 0x69, 0x6e, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, + 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, + 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x20, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x0a, 0x66, + 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x64, 0x6f, 0x75, + 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, + 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x43, 0x0a, + 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, - 0x52, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0x0a, - 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0xb9, 0x01, 0x0a, - 0x10, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x49, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x5a, 0x0a, 0x0b, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 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, 0x6c, + 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x75, 0x6c, 0x6c, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x43, 0x0a, 0x09, 0x6c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x69, + 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x06, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x1a, 0x5a, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 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, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, - 0x20, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, - 0x00, 0x22, 0x84, 0x01, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x44, 0x6f, 0x63, 0x53, 0x63, 0x6f, - 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x6f, 0x44, 0x6f, 0x63, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x6f, 0x4d, 0x61, 0x78, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x6f, 0x4d, 0x61, - 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x48, 0x0a, 0x0a, 0x53, 0x6f, 0x72, 0x74, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x08, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, - 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, - 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x12, 0x1e, - 0x0a, 0x0a, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4c, 0x61, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x22, 0x97, 0x01, 0x0a, 0x09, 0x54, 0x6f, 0x74, - 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, - 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x36, 0x0a, 0x08, 0x52, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x0a, 0x08, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, - 0x54, 0x4f, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x52, 0x45, 0x41, 0x54, 0x45, 0x52, 0x5f, - 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, - 0x10, 0x01, 0x22, 0x41, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x6c, - 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, - 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0xd1, 0x16, 0x0a, 0x0e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0b, 0x64, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, + 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x1a, 0xb9, 0x01, 0x0a, 0x10, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x53, 0x74, 0x72, 0x75, 0x63, + 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x1a, 0x5a, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 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, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x49, 0x0a, + 0x0e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4c, 0x69, 0x73, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x37, 0x0a, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, + 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x52, 0x06, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0x5a, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 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, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x2e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0x20, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x4e, 0x75, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x55, 0x4c, 0x4c, 0x5f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0x10, 0x00, 0x22, 0x84, 0x01, 0x0a, 0x0e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x64, 0x6f, 0x44, + 0x6f, 0x63, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, + 0x64, 0x6f, 0x44, 0x6f, 0x63, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x64, + 0x6f, 0x4d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x64, 0x6f, 0x4d, 0x61, 0x78, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x06, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0x48, 0x0a, + 0x0a, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x0c, 0x73, + 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x73, 0x6f, 0x72, 0x74, 0x65, + 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x22, 0xc3, 0x01, 0x0a, 0x08, 0x53, 0x6f, 0x72, 0x74, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x73, 0x65, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x06, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, 0x4c, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6e, 0x67, + 0x4c, 0x61, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x76, 0x65, 0x72, 0x73, 0x65, 0x22, 0x97, 0x01, + 0x0a, 0x09, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x08, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, + 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, + 0x36, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0c, 0x0a, 0x08, 0x45, + 0x51, 0x55, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x47, 0x52, 0x45, + 0x41, 0x54, 0x45, 0x52, 0x5f, 0x54, 0x48, 0x41, 0x4e, 0x5f, 0x4f, 0x52, 0x5f, 0x45, 0x51, 0x55, + 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x10, 0x01, 0x22, 0x41, 0x0a, 0x05, 0x50, 0x6f, 0x69, 0x6e, 0x74, + 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, + 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x22, 0xe3, 0x19, 0x0a, 0x0e, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, + 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x64, 0x69, + 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x69, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, 0x61, + 0x6c, 0x48, 0x69, 0x74, 0x73, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, + 0x12, 0x34, 0x0a, 0x04, 0x68, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, + 0x52, 0x04, 0x68, 0x69, 0x74, 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x41, 0x0a, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x0d, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, + 0x6c, 0x74, 0x12, 0x5e, 0x0a, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, + 0x45, 0x61, 0x72, 0x6c, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x65, 0x72, + 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x1a, 0xd4, 0x07, 0x0a, + 0x0b, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x24, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, + 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, + 0x0a, 0x0e, 0x64, 0x72, 0x69, 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x64, 0x72, 0x69, 0x6c, + 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, + 0x72, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x66, 0x69, 0x72, 0x73, 0x74, + 0x50, 0x61, 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, + 0x12, 0x28, 0x0a, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x67, 0x65, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0f, 0x67, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x3c, 0x0a, 0x19, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x6e, 0x4d, + 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x6e, + 0x4d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x6e, 0x72, 0x74, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x72, 0x74, 0x57, 0x61, + 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x5b, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, + 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x0b, 0x64, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, - 0x74, 0x69, 0x63, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, - 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x04, 0x68, - 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x52, 0x04, 0x68, 0x69, 0x74, - 0x73, 0x12, 0x4a, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3b, 0x0a, - 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0b, 0x66, - 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x41, 0x0a, 0x0d, 0x70, 0x72, - 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x0d, - 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x5e, 0x0a, - 0x10, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x63, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x28, 0x0a, - 0x0f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x45, 0x61, 0x72, 0x6c, 0x79, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, - 0x65, 0x64, 0x45, 0x61, 0x72, 0x6c, 0x79, 0x1a, 0xe9, 0x05, 0x0a, 0x0b, 0x44, 0x69, 0x61, 0x67, - 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x12, 0x24, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, - 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, - 0x52, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, - 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, - 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x0e, 0x64, 0x72, 0x69, - 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0e, 0x64, 0x72, 0x69, 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x66, 0x69, 0x72, 0x73, 0x74, 0x50, 0x61, - 0x73, 0x73, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x15, 0x66, 0x69, 0x72, 0x73, 0x74, 0x50, 0x61, 0x73, 0x73, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x68, - 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x67, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, - 0x67, 0x65, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, - 0x3c, 0x0a, 0x19, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x6e, 0x4d, 0x73, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x19, 0x6e, 0x65, 0x77, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x4f, 0x70, 0x65, 0x6e, 0x4d, 0x73, 0x12, 0x24, 0x0a, - 0x0d, 0x6e, 0x72, 0x74, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6e, 0x72, 0x74, 0x57, 0x61, 0x69, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x4d, 0x73, 0x12, 0x5b, 0x0a, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, - 0x4d, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, - 0x63, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, - 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4d, - 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x3d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, - 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0f, - 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x1a, - 0x3e, 0x0a, 0x10, 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, - 0x42, 0x0a, 0x14, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, - 0x4d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x1a, 0x81, 0x0a, 0x0a, 0x03, 0x48, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6c, + 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x66, 0x61, 0x63, 0x65, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x72, 0x65, + 0x73, 0x63, 0x6f, 0x72, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x67, 0x0a, 0x0f, 0x72, + 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x0b, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x52, + 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0f, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x76, 0x0a, 0x14, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, + 0x73, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x18, 0x0c, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x2e, 0x49, 0x6e, 0x6e, + 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, + 0x73, 0x44, 0x69, 0x61, 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x1a, 0x3e, 0x0a, 0x10, + 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x42, 0x0a, 0x14, + 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x1a, 0x71, 0x0a, 0x19, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x3e, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x44, 0x69, 0x61, + 0x67, 0x6e, 0x6f, 0x73, 0x74, 0x69, 0x63, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0xa8, 0x0b, 0x0a, 0x03, 0x48, 0x69, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x44, 0x6f, 0x63, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x44, 0x6f, 0x63, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x73, 0x63, @@ -7779,511 +7953,521 @@ var file_yelp_nrtsearch_search_proto_rawDesc = []byte{ 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x1a, 0xd3, 0x03, - 0x0a, 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, - 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0c, - 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x1c, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x1e, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x20, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, - 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x6c, 0x61, 0x74, 0x4c, 0x6e, 0x67, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e, 0x67, - 0x48, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, - 0x3b, 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, - 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x56, 0x0a, 0x0b, - 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x32, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, - 0x48, 0x69, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x1e, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, - 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x02, 0x52, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x73, 0x1a, 0x62, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x12, 0x4d, 0x0a, + 0x09, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, + 0x69, 0x74, 0x2e, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x52, 0x09, 0x69, 0x6e, 0x6e, 0x65, 0x72, 0x48, 0x69, 0x74, 0x73, 0x1a, 0xd3, 0x03, 0x0a, + 0x0a, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1e, 0x0a, 0x09, 0x74, + 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, + 0x52, 0x09, 0x74, 0x65, 0x78, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x24, 0x0a, 0x0c, 0x62, + 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x08, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x6f, 0x6f, 0x6c, 0x65, 0x61, 0x6e, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x1c, 0x0a, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x08, 0x69, 0x6e, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x1e, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x20, 0x0a, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x00, 0x52, 0x0a, 0x66, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x22, 0x0a, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x0b, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x37, 0x0a, 0x0b, 0x6c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x48, + 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3b, + 0x0a, 0x0b, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x48, 0x00, 0x52, 0x0b, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x56, 0x0a, 0x0b, 0x76, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x32, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, + 0x69, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x2e, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0b, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x1a, 0x1e, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x02, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x0d, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x1a, 0x62, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, + 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x2a, 0x0a, 0x0a, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x1a, 0x6f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x2e, 0x48, 0x69, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, + 0x02, 0x38, 0x01, 0x1a, 0x75, 0x0a, 0x11, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x0f, 0x48, 0x69, + 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x66, 0x69, 0x65, - 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0x2a, 0x0a, 0x0a, 0x48, 0x69, 0x67, 0x68, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x1a, 0x6f, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x48, 0x69, 0x74, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x75, 0x0a, 0x11, 0x53, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6a, 0x0a, 0x0f, 0x48, - 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, - 0x74, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xbb, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, - 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, 0x63, 0x49, 0x64, 0x12, 0x28, 0x0a, - 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x53, - 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, - 0x53, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x62, 0x0a, 0x15, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, - 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x94, 0x01, 0x0a, 0x10, 0x4e, 0x75, - 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x49, 0x6e, 0x63, - 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x69, - 0x6e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, - 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x22, 0x0a, 0x0c, - 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, - 0x22, 0xab, 0x02, 0x0a, 0x05, 0x46, 0x61, 0x63, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, - 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x6d, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, - 0x68, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, - 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, - 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x4f, 0x72, 0x64, - 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, - 0x65, 0x4f, 0x72, 0x64, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x6f, 0x70, 0x4e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x74, 0x6f, 0x70, 0x4e, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x52, 0x06, 0x73, 0x63, - 0x72, 0x69, 0x70, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x6f, - 0x70, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbc, - 0x01, 0x0a, 0x0b, 0x46, 0x61, 0x63, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, - 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x6d, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, - 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, - 0x61, 0x62, 0x65, 0x6c, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x6c, 0x61, - 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x69, - 0x6c, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, - 0x68, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, - 0x0d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x41, 0x6e, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, - 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, - 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x50, 0x0a, 0x09, 0x46, 0x65, - 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x55, 0x0a, 0x0e, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x12, + 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x56, 0x0a, 0x0e, 0x49, 0x6e, 0x6e, 0x65, 0x72, 0x48, + 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xbb, + 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x28, 0x0a, 0x0f, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, + 0x63, 0x49, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x44, + 0x6f, 0x63, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0f, 0x6c, + 0x61, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x1c, + 0x0a, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x09, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x1a, 0x62, 0x0a, 0x15, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x94, 0x01, 0x0a, 0x10, 0x4e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, + 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, + 0x69, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x22, 0x0a, + 0x0c, 0x6d, 0x69, 0x6e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, + 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, + 0x6d, 0x61, 0x78, 0x12, 0x22, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, + 0x69, 0x76, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x49, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x76, 0x65, 0x22, 0xab, 0x02, 0x0a, 0x05, 0x46, 0x61, 0x63, 0x65, + 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, + 0x64, 0x69, 0x6d, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x05, 0x70, 0x61, 0x74, 0x68, 0x73, 0x12, 0x42, 0x0a, 0x0c, 0x6e, 0x75, 0x6d, + 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, + 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x0c, 0x6e, 0x75, 0x6d, 0x65, 0x72, 0x69, 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x22, 0x0a, + 0x0c, 0x75, 0x73, 0x65, 0x4f, 0x72, 0x64, 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x73, 0x65, 0x4f, 0x72, 0x64, 0x73, 0x43, 0x61, 0x63, 0x68, + 0x65, 0x12, 0x16, 0x0a, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x06, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x6f, 0x70, + 0x4e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x74, 0x6f, 0x70, 0x4e, 0x12, 0x2c, 0x0a, + 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, + 0x69, 0x70, 0x74, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x73, + 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x70, 0x44, 0x6f, 0x63, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xbc, 0x01, 0x0a, 0x0b, 0x46, 0x61, 0x63, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x03, 0x64, 0x69, 0x6d, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x12, 0x3d, 0x0a, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x41, 0x6e, 0x64, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0b, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x12, 0x1e, 0x0a, 0x0a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x3b, 0x0a, 0x0d, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x41, 0x6e, 0x64, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, + 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x22, 0x50, 0x0a, 0x09, 0x46, 0x65, 0x74, 0x63, 0x68, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x0d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, - 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, + 0x61, 0x6d, 0x73, 0x22, 0x55, 0x0a, 0x0e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x0d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x37, 0x0a, 0x0c, + 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x20, 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x63, 0x6f, + 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x12, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0xd8, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x63, + 0x6f, 0x72, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x0c, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x20, - 0x0a, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x72, 0x65, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0xd8, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x1e, 0x0a, - 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x43, 0x0a, - 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, - 0x72, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, - 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, - 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x70, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0b, - 0x0a, 0x09, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x73, 0x22, 0x81, 0x09, 0x0a, 0x0d, - 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x49, 0x0a, - 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, - 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, - 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x72, 0x69, 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x72, 0x69, 0x6c, - 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x40, 0x0a, 0x18, 0x41, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x1a, 0xeb, 0x03, 0x0a, - 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, - 0x4c, 0x0a, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, - 0x6c, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x30, 0x0a, - 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x2e, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, - 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, - 0x84, 0x01, 0x0a, 0x18, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x41, - 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x18, 0x61, 0x64, - 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x81, 0x01, 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x0e, 0x70, 0x6c, 0x75, + 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x72, 0x48, + 0x00, 0x52, 0x0e, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x52, 0x65, 0x73, 0x63, 0x6f, 0x72, 0x65, + 0x72, 0x73, 0x22, 0x81, 0x09, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x12, 0x49, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, + 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x73, 0x65, 0x64, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x77, 0x72, 0x69, + 0x74, 0x74, 0x65, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x72, 0x69, + 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x64, 0x72, 0x69, 0x6c, 0x6c, 0x44, 0x6f, 0x77, 0x6e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x1a, 0x40, 0x0a, 0x18, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x24, 0x0a, + 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x1a, 0xeb, 0x03, 0x0a, 0x0e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, + 0x61, 0x74, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x74, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x12, 0x4c, 0x0a, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0c, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x13, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x18, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x61, 0x74, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, - 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0xc0, 0x01, 0x0a, 0x0c, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, - 0x61, 0x78, 0x44, 0x6f, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, - 0x44, 0x6f, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x75, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x26, 0x0a, - 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, - 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x01, 0x52, 0x13, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x1a, 0xbf, 0x01, - 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, - 0x65, 0x4d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x2c, 0x0a, + 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x18, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x81, 0x01, + 0x0a, 0x1d, 0x41, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, + 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, + 0x79, 0x12, 0x4a, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x41, 0x64, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, + 0x01, 0x1a, 0xc0, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6e, 0x75, + 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, 0x6d, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x0a, 0x13, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, + 0x65, 0x4d, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x76, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x73, 0x1a, 0xbf, 0x01, 0x0a, 0x0b, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x2e, 0x0a, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x12, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x2c, 0x0a, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x64, + 0x75, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, 0x65, 0x64, 0x75, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x4d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x52, - 0x65, 0x64, 0x75, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, - 0x8a, 0x04, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x34, 0x0a, - 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x72, 0x6d, - 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, - 0x72, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x75, 0x67, - 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x70, - 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, - 0x0a, 0x10, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x10, 0x74, 0x6f, 0x70, 0x48, - 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x06, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x59, 0x0a, 0x10, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, + 0x4d, 0x73, 0x12, 0x52, 0x0a, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x8a, 0x04, 0x0a, 0x09, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x12, 0x34, 0x0a, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x48, 0x00, 0x52, 0x05, 0x74, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x49, 0x0a, 0x0f, 0x70, 0x6c, + 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x0f, 0x70, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4c, 0x0a, 0x10, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, + 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, + 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, + 0x00, 0x52, 0x10, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x37, 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x2e, 0x0a, 0x03, + 0x6d, 0x61, 0x78, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x59, 0x0a, 0x10, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, - 0x1a, 0x5c, 0x0a, 0x15, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, - 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0f, - 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x0e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x2e, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x14, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, - 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, - 0x69, 0x7a, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, - 0x72, 0x64, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x54, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, - 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x48, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x48, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x12, 0x3a, - 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, - 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, - 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, - 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, 0x61, 0x69, 0x6e, 0x22, 0x84, 0x01, 0x0a, - 0x0f, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x2b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, - 0x65, 0x72, 0x6d, 0x49, 0x6e, 0x53, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, - 0x08, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x08, 0x0a, 0x06, 0x46, 0x69, 0x6c, - 0x74, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0c, 0x4d, 0x61, 0x78, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0xdf, 0x02, 0x0a, 0x0f, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, - 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x34, 0x0a, 0x09, 0x61, 0x6e, 0x79, 0x52, - 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, - 0x79, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, - 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x0a, - 0x68, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x0c, - 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x0c, - 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x48, 0x00, 0x52, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x42, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0b, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x72, - 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, - 0x4f, 0x72, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x22, 0x1e, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x01, - 0x22, 0xaf, 0x03, 0x0a, 0x0c, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x42, - 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x22, - 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x75, 0x63, 0x6b, 0x65, - 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4f, 0x74, 0x68, 0x65, 0x72, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x91, - 0x02, 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x75, 0x0a, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x3d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x42, 0x75, - 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, - 0x52, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x68, 0x0a, 0x1b, 0x4e, 0x65, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x2e, + 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x1a, 0x5c, 0x0a, 0x15, 0x4e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x22, 0x56, 0x0a, 0x0f, 0x50, 0x6c, 0x75, 0x67, 0x69, 0x6e, 0x43, 0x6f, 0x6c, + 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xac, 0x01, 0x0a, 0x0e, + 0x54, 0x65, 0x72, 0x6d, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x16, + 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, + 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, 0x48, 0x00, 0x52, 0x06, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x2f, 0x0a, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, + 0x72, 0x64, 0x65, 0x72, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x42, 0x0d, 0x0a, 0x0b, 0x54, + 0x65, 0x72, 0x6d, 0x73, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xc6, 0x01, 0x0a, 0x10, 0x54, + 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x08, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x69, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x74, + 0x6f, 0x70, 0x48, 0x69, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x74, 0x6f, + 0x70, 0x48, 0x69, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, + 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x09, 0x71, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, + 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0e, 0x72, 0x65, 0x74, 0x72, 0x69, + 0x65, 0x76, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, + 0x6c, 0x61, 0x69, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x6c, + 0x61, 0x69, 0x6e, 0x22, 0x84, 0x01, 0x0a, 0x0f, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2b, 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x05, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x12, 0x3a, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x49, 0x6e, 0x53, 0x65, 0x74, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x48, 0x00, 0x52, 0x08, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x42, 0x08, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x22, 0x4d, 0x0a, 0x0c, 0x4d, 0x61, + 0x78, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x2e, 0x0a, 0x06, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x48, 0x00, 0x52, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x42, 0x0d, 0x0a, 0x0b, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0xdf, 0x02, 0x0a, 0x0f, 0x43, 0x6f, + 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x40, 0x0a, + 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x48, + 0x00, 0x52, 0x0c, 0x62, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, + 0x34, 0x0a, 0x09, 0x61, 0x6e, 0x79, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x48, 0x00, 0x52, 0x09, 0x61, 0x6e, 0x79, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x68, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x12, 0x40, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x12, 0x42, 0x0a, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x52, 0x65, 0x73, + 0x75, 0x6c, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x6f, 0x75, 0x62, + 0x6c, 0x65, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x48, 0x00, 0x52, 0x0c, 0x64, 0x6f, 0x75, 0x62, 0x6c, + 0x65, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x42, 0x12, 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0x7a, 0x0a, 0x0b, 0x42, + 0x75, 0x63, 0x6b, 0x65, 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x05, + 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, + 0x74, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x2e, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0x1e, 0x0a, 0x09, 0x4f, 0x72, 0x64, 0x65, 0x72, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x45, 0x53, 0x43, 0x10, 0x00, 0x12, 0x07, + 0x0a, 0x03, 0x41, 0x53, 0x43, 0x10, 0x01, 0x22, 0xaf, 0x03, 0x0a, 0x0c, 0x42, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x62, 0x75, 0x63, 0x6b, + 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x07, 0x62, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x42, 0x75, + 0x63, 0x6b, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x74, 0x6f, 0x74, + 0x61, 0x6c, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x10, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x4f, 0x74, 0x68, 0x65, 0x72, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x1a, 0x91, 0x02, 0x0a, 0x06, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x75, 0x0a, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0x79, 0x0a, 0x0a, 0x48, 0x69, 0x74, 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x12, 0x35, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x52, 0x09, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x12, 0x34, 0x0a, 0x04, 0x68, 0x69, 0x74, 0x73, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x52, 0x04, 0x68, 0x69, 0x74, 0x73, 0x22, 0x84, 0x02, - 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1a, - 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x64, 0x6f, 0x63, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x6e, 0x0a, 0x16, 0x6e, 0x65, - 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, - 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, 0x68, 0x0a, 0x1b, 0x4e, 0x65, + 0x74, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x52, 0x65, + 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x42, 0x75, 0x63, 0x6b, 0x65, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, + 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x1a, + 0x68, 0x0a, 0x1b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, + 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x79, 0x0a, 0x0a, 0x48, 0x69, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x35, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, + 0x48, 0x69, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x48, + 0x69, 0x74, 0x73, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x48, 0x69, 0x74, 0x73, 0x12, 0x34, + 0x0a, 0x04, 0x68, 0x69, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x48, 0x69, 0x74, 0x52, 0x04, + 0x68, 0x69, 0x74, 0x73, 0x22, 0x84, 0x02, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x6e, 0x0a, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x36, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x2e, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, - 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcf, 0x08, 0x0a, 0x09, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x51, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x1a, 0xf7, 0x05, 0x0a, 0x08, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x68, 0x69, 0x67, 0x68, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x65, 0x54, 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, - 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x72, 0x61, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, - 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, - 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x53, 0x0a, 0x17, - 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x72, - 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x6d, 0x61, 0x78, - 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, - 0x73, 0x12, 0x3c, 0x0a, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, - 0x0e, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, - 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, - 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x0d, - 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x4f, 0x72, 0x64, 0x65, 0x72, 0x65, 0x64, 0x12, 0x3c, 0x0a, - 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, 0x64, - 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x64, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x4d, 0x75, - 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x36, 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, - 0x6f, 0x6d, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, - 0x6d, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x53, 0x0a, 0x19, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0c, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x17, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x62, 0x0a, 0x12, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, - 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, - 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x46, 0x41, 0x53, 0x54, 0x5f, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, - 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, - 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0x25, 0x0a, 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x48, 0x4f, 0x55, 0x4c, - 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x55, 0x53, 0x54, 0x10, 0x01, 0x2a, 0x95, 0x01, - 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, - 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x43, 0x4f, 0x52, - 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, - 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, - 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x4f, 0x52, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x45, 0x52, 0x4d, - 0x53, 0x5f, 0x42, 0x4c, 0x45, 0x4e, 0x44, 0x45, 0x44, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x10, - 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x42, - 0x4f, 0x4f, 0x53, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x45, - 0x52, 0x4d, 0x53, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x13, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, - 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, - 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x00, 0x12, 0x0f, - 0x0a, 0x0b, 0x46, 0x55, 0x5a, 0x5a, 0x59, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x01, 0x2a, - 0x85, 0x03, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, - 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x48, - 0x52, 0x41, 0x53, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, - 0x46, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x51, - 0x55, 0x45, 0x52, 0x59, 0x10, 0x03, 0x12, 0x0e, 0x0a, 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x5f, 0x51, - 0x55, 0x45, 0x52, 0x59, 0x10, 0x04, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x45, 0x52, 0x4d, 0x5f, 0x49, - 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x05, 0x12, 0x13, 0x0a, - 0x0f, 0x44, 0x49, 0x53, 0x4a, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, - 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x07, 0x12, 0x10, 0x0a, - 0x0c, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x50, 0x48, 0x52, 0x41, 0x53, 0x45, 0x10, 0x08, 0x12, - 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x09, - 0x12, 0x09, 0x0a, 0x05, 0x52, 0x41, 0x4e, 0x47, 0x45, 0x10, 0x0a, 0x12, 0x14, 0x0a, 0x10, 0x47, - 0x45, 0x4f, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x42, 0x4f, 0x58, 0x10, - 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x47, 0x45, 0x4f, 0x5f, 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x0c, - 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x45, 0x53, 0x54, 0x45, 0x44, 0x10, 0x0d, 0x12, 0x0a, 0x0a, 0x06, - 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x0e, 0x12, 0x0e, 0x0a, 0x0a, 0x47, 0x45, 0x4f, 0x5f, - 0x52, 0x41, 0x44, 0x49, 0x55, 0x53, 0x10, 0x0f, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4d, 0x50, - 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x10, 0x12, 0x1e, 0x0a, 0x1a, 0x4d, 0x55, 0x4c, 0x54, - 0x49, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, - 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x11, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x54, 0x43, - 0x48, 0x5f, 0x50, 0x48, 0x52, 0x41, 0x53, 0x45, 0x5f, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x10, - 0x12, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x10, 0x13, 0x12, 0x18, 0x0a, - 0x14, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, - 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x14, 0x2a, 0x3c, 0x0a, 0x08, 0x53, 0x65, 0x6c, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, - 0x4d, 0x41, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x49, 0x44, 0x44, 0x4c, 0x45, 0x5f, - 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x4d, 0x49, 0x44, 0x44, 0x4c, 0x45, 0x5f, - 0x4d, 0x41, 0x58, 0x10, 0x03, 0x42, 0x58, 0x0a, 0x1e, 0x63, 0x6f, 0x6d, 0x2e, 0x79, 0x65, 0x6c, - 0x70, 0x2e, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x42, 0x13, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x19, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x59, 0x65, 0x6c, 0x70, 0x2f, - 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0xa2, 0x02, 0x03, 0x48, 0x4c, 0x57, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x16, 0x6e, 0x65, 0x73, 0x74, 0x65, + 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x73, 0x1a, 0x68, 0x0a, 0x1b, 0x4e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6c, 0x6c, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x33, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcf, 0x08, 0x0a, 0x09, + 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, + 0x51, 0x0a, 0x0e, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x0d, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x1a, 0xf7, 0x05, 0x0a, 0x08, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x47, 0x0a, 0x10, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, + 0x68, 0x74, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x5f, + 0x74, 0x61, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x70, 0x72, 0x65, 0x54, + 0x61, 0x67, 0x73, 0x12, 0x1b, 0x0a, 0x09, 0x70, 0x6f, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x74, 0x54, 0x61, 0x67, 0x73, + 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x69, 0x7a, 0x65, 0x12, 0x53, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x5f, 0x6f, 0x66, 0x5f, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x55, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x4f, 0x66, 0x46, + 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3c, 0x0a, 0x0f, 0x68, 0x69, 0x67, 0x68, + 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x0e, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x3b, 0x0a, 0x0b, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, + 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, + 0x74, 0x63, 0x68, 0x12, 0x3f, 0x0a, 0x0d, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x5f, 0x6f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, + 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x4f, 0x72, 0x64, + 0x65, 0x72, 0x65, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0a, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x13, 0x64, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x5f, 0x6d, + 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x64, 0x69, 0x73, + 0x63, 0x72, 0x65, 0x74, 0x65, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, + 0x36, 0x0a, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, + 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x15, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, + 0x74, 0x65, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x53, 0x0a, 0x19, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x5f, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, + 0x75, 0x63, 0x74, 0x52, 0x17, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x48, 0x69, 0x67, 0x68, 0x6c, + 0x69, 0x67, 0x68, 0x74, 0x65, 0x72, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x62, 0x0a, 0x12, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x36, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x2e, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, + 0x22, 0x3b, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, + 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x41, 0x53, 0x54, 0x5f, 0x56, 0x45, + 0x43, 0x54, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x10, + 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, 0x03, 0x2a, 0x25, 0x0a, + 0x0d, 0x4d, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x0a, + 0x0a, 0x06, 0x53, 0x48, 0x4f, 0x55, 0x4c, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x4d, 0x55, + 0x53, 0x54, 0x10, 0x01, 0x2a, 0x95, 0x01, 0x0a, 0x0d, 0x52, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, + 0x4d, 0x65, 0x74, 0x68, 0x6f, 0x64, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, + 0x4e, 0x54, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, + 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x42, 0x4f, 0x4f, + 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x53, 0x43, 0x4f, 0x52, 0x49, 0x4e, + 0x47, 0x5f, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x54, + 0x4f, 0x50, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x42, 0x4c, 0x45, 0x4e, 0x44, 0x45, 0x44, + 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x4f, 0x50, 0x5f, + 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x42, 0x4f, 0x4f, 0x53, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, + 0x09, 0x54, 0x4f, 0x50, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x10, 0x05, 0x2a, 0x38, 0x0a, 0x13, + 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x5f, 0x51, 0x55, + 0x45, 0x52, 0x59, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x46, 0x55, 0x5a, 0x5a, 0x59, 0x5f, 0x51, + 0x55, 0x45, 0x52, 0x59, 0x10, 0x01, 0x2a, 0x85, 0x03, 0x0a, 0x09, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x11, + 0x0a, 0x0d, 0x42, 0x4f, 0x4f, 0x4c, 0x45, 0x41, 0x4e, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, + 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x50, 0x48, 0x52, 0x41, 0x53, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, + 0x59, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x46, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x03, 0x12, 0x0e, 0x0a, + 0x0a, 0x54, 0x45, 0x52, 0x4d, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x04, 0x12, 0x15, 0x0a, + 0x11, 0x54, 0x45, 0x52, 0x4d, 0x5f, 0x49, 0x4e, 0x5f, 0x53, 0x45, 0x54, 0x5f, 0x51, 0x55, 0x45, + 0x52, 0x59, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x44, 0x49, 0x53, 0x4a, 0x55, 0x4e, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x4d, 0x41, 0x54, + 0x43, 0x48, 0x10, 0x07, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x50, 0x48, + 0x52, 0x41, 0x53, 0x45, 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, + 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x09, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x41, 0x4e, 0x47, 0x45, + 0x10, 0x0a, 0x12, 0x14, 0x0a, 0x10, 0x47, 0x45, 0x4f, 0x5f, 0x42, 0x4f, 0x55, 0x4e, 0x44, 0x49, + 0x4e, 0x47, 0x5f, 0x42, 0x4f, 0x58, 0x10, 0x0b, 0x12, 0x0d, 0x0a, 0x09, 0x47, 0x45, 0x4f, 0x5f, + 0x50, 0x4f, 0x49, 0x4e, 0x54, 0x10, 0x0c, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x45, 0x53, 0x54, 0x45, + 0x44, 0x10, 0x0d, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x58, 0x49, 0x53, 0x54, 0x53, 0x10, 0x0e, 0x12, + 0x0e, 0x0a, 0x0a, 0x47, 0x45, 0x4f, 0x5f, 0x52, 0x41, 0x44, 0x49, 0x55, 0x53, 0x10, 0x0f, 0x12, + 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x10, 0x12, + 0x1e, 0x0a, 0x1a, 0x4d, 0x55, 0x4c, 0x54, 0x49, 0x5f, 0x46, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x4f, + 0x4e, 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x11, 0x12, + 0x17, 0x0a, 0x13, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x5f, 0x50, 0x48, 0x52, 0x41, 0x53, 0x45, 0x5f, + 0x50, 0x52, 0x45, 0x46, 0x49, 0x58, 0x10, 0x12, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x52, 0x45, 0x46, + 0x49, 0x58, 0x10, 0x13, 0x12, 0x18, 0x0a, 0x14, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x41, 0x4e, 0x54, + 0x5f, 0x53, 0x43, 0x4f, 0x52, 0x45, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x14, 0x2a, 0x3c, + 0x0a, 0x08, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x49, + 0x4e, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x41, 0x58, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x49, 0x44, 0x44, 0x4c, 0x45, 0x5f, 0x4d, 0x49, 0x4e, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, + 0x4d, 0x49, 0x44, 0x44, 0x4c, 0x45, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x03, 0x42, 0x58, 0x0a, 0x1e, + 0x63, 0x6f, 0x6d, 0x2e, 0x79, 0x65, 0x6c, 0x70, 0x2e, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x2e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x67, 0x72, 0x70, 0x63, 0x42, 0x13, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x19, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x59, 0x65, 0x6c, 0x70, 0x2f, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0xa2, 0x02, 0x03, 0x48, 0x4c, 0x57, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -8299,7 +8483,7 @@ func file_yelp_nrtsearch_search_proto_rawDescGZIP() []byte { } var file_yelp_nrtsearch_search_proto_enumTypes = make([]protoimpl.EnumInfo, 14) -var file_yelp_nrtsearch_search_proto_msgTypes = make([]protoimpl.MessageInfo, 91) +var file_yelp_nrtsearch_search_proto_msgTypes = make([]protoimpl.MessageInfo, 95) var file_yelp_nrtsearch_search_proto_goTypes = []interface{}{ (MatchOperator)(0), // 0: luceneserver.MatchOperator (RewriteMethod)(0), // 1: luceneserver.RewriteMethod @@ -8340,80 +8524,84 @@ var file_yelp_nrtsearch_search_proto_goTypes = []interface{}{ (*ConstantScoreQuery)(nil), // 36: luceneserver.ConstantScoreQuery (*Query)(nil), // 37: luceneserver.Query (*SearchRequest)(nil), // 38: luceneserver.SearchRequest - (*VirtualField)(nil), // 39: luceneserver.VirtualField - (*Script)(nil), // 40: luceneserver.Script - (*QuerySortField)(nil), // 41: luceneserver.QuerySortField - (*SortFields)(nil), // 42: luceneserver.SortFields - (*SortType)(nil), // 43: luceneserver.SortType - (*TotalHits)(nil), // 44: luceneserver.TotalHits - (*Point)(nil), // 45: luceneserver.Point - (*SearchResponse)(nil), // 46: luceneserver.SearchResponse - (*NumericRangeType)(nil), // 47: luceneserver.NumericRangeType - (*Facet)(nil), // 48: luceneserver.Facet - (*FacetResult)(nil), // 49: luceneserver.FacetResult - (*LabelAndValue)(nil), // 50: luceneserver.LabelAndValue - (*FetchTask)(nil), // 51: luceneserver.FetchTask - (*PluginRescorer)(nil), // 52: luceneserver.PluginRescorer - (*QueryRescorer)(nil), // 53: luceneserver.QueryRescorer - (*Rescorer)(nil), // 54: luceneserver.Rescorer - (*ProfileResult)(nil), // 55: luceneserver.ProfileResult - (*Collector)(nil), // 56: luceneserver.Collector - (*PluginCollector)(nil), // 57: luceneserver.PluginCollector - (*TermsCollector)(nil), // 58: luceneserver.TermsCollector - (*TopHitsCollector)(nil), // 59: luceneserver.TopHitsCollector - (*FilterCollector)(nil), // 60: luceneserver.FilterCollector - (*MaxCollector)(nil), // 61: luceneserver.MaxCollector - (*CollectorResult)(nil), // 62: luceneserver.CollectorResult - (*BucketOrder)(nil), // 63: luceneserver.BucketOrder - (*BucketResult)(nil), // 64: luceneserver.BucketResult - (*HitsResult)(nil), // 65: luceneserver.HitsResult - (*FilterResult)(nil), // 66: luceneserver.FilterResult - (*Highlight)(nil), // 67: luceneserver.Highlight - (*TermInSetQuery_TextTerms)(nil), // 68: luceneserver.TermInSetQuery.TextTerms - (*TermInSetQuery_IntTerms)(nil), // 69: luceneserver.TermInSetQuery.IntTerms - (*TermInSetQuery_LongTerms)(nil), // 70: luceneserver.TermInSetQuery.LongTerms - (*TermInSetQuery_FloatTerms)(nil), // 71: luceneserver.TermInSetQuery.FloatTerms - (*TermInSetQuery_DoubleTerms)(nil), // 72: luceneserver.TermInSetQuery.DoubleTerms - nil, // 73: luceneserver.MultiMatchQuery.FieldBoostsEntry - (*MultiFunctionScoreQuery_FilterFunction)(nil), // 74: luceneserver.MultiFunctionScoreQuery.FilterFunction - nil, // 75: luceneserver.SearchRequest.CollectorsEntry - (*Script_ParamValue)(nil), // 76: luceneserver.Script.ParamValue - (*Script_ParamStructValue)(nil), // 77: luceneserver.Script.ParamStructValue - (*Script_ParamListValue)(nil), // 78: luceneserver.Script.ParamListValue - nil, // 79: luceneserver.Script.ParamsEntry - nil, // 80: luceneserver.Script.ParamStructValue.FieldsEntry - (*SearchResponse_Diagnostics)(nil), // 81: luceneserver.SearchResponse.Diagnostics - (*SearchResponse_Hit)(nil), // 82: luceneserver.SearchResponse.Hit - (*SearchResponse_SearchState)(nil), // 83: luceneserver.SearchResponse.SearchState - nil, // 84: luceneserver.SearchResponse.CollectorResultsEntry - nil, // 85: luceneserver.SearchResponse.Diagnostics.FacetTimeMsEntry - nil, // 86: luceneserver.SearchResponse.Diagnostics.RescorersTimeMsEntry - (*SearchResponse_Hit_FieldValue)(nil), // 87: luceneserver.SearchResponse.Hit.FieldValue - (*SearchResponse_Hit_CompositeFieldValue)(nil), // 88: luceneserver.SearchResponse.Hit.CompositeFieldValue - (*SearchResponse_Hit_Highlights)(nil), // 89: luceneserver.SearchResponse.Hit.Highlights - nil, // 90: luceneserver.SearchResponse.Hit.FieldsEntry - nil, // 91: luceneserver.SearchResponse.Hit.SortedFieldsEntry - nil, // 92: luceneserver.SearchResponse.Hit.HighlightsEntry - (*SearchResponse_Hit_FieldValue_Vector)(nil), // 93: luceneserver.SearchResponse.Hit.FieldValue.Vector - (*ProfileResult_AdditionalCollectorStats)(nil), // 94: luceneserver.ProfileResult.AdditionalCollectorStats - (*ProfileResult_CollectorStats)(nil), // 95: luceneserver.ProfileResult.CollectorStats - (*ProfileResult_SegmentStats)(nil), // 96: luceneserver.ProfileResult.SegmentStats - (*ProfileResult_SearchStats)(nil), // 97: luceneserver.ProfileResult.SearchStats - nil, // 98: luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry - nil, // 99: luceneserver.Collector.NestedCollectorsEntry - (*BucketResult_Bucket)(nil), // 100: luceneserver.BucketResult.Bucket - nil, // 101: luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry - nil, // 102: luceneserver.FilterResult.NestedCollectorResultsEntry - (*Highlight_Settings)(nil), // 103: luceneserver.Highlight.Settings - nil, // 104: luceneserver.Highlight.FieldSettingsEntry - (*Analyzer)(nil), // 105: luceneserver.Analyzer - (*latlng.LatLng)(nil), // 106: google.type.LatLng - (*structpb.Struct)(nil), // 107: google.protobuf.Struct - (*anypb.Any)(nil), // 108: google.protobuf.Any - (*wrapperspb.DoubleValue)(nil), // 109: google.protobuf.DoubleValue - (*wrapperspb.UInt32Value)(nil), // 110: google.protobuf.UInt32Value - (*wrapperspb.BoolValue)(nil), // 111: google.protobuf.BoolValue - (*wrapperspb.StringValue)(nil), // 112: google.protobuf.StringValue + (*InnerHit)(nil), // 39: luceneserver.InnerHit + (*VirtualField)(nil), // 40: luceneserver.VirtualField + (*Script)(nil), // 41: luceneserver.Script + (*QuerySortField)(nil), // 42: luceneserver.QuerySortField + (*SortFields)(nil), // 43: luceneserver.SortFields + (*SortType)(nil), // 44: luceneserver.SortType + (*TotalHits)(nil), // 45: luceneserver.TotalHits + (*Point)(nil), // 46: luceneserver.Point + (*SearchResponse)(nil), // 47: luceneserver.SearchResponse + (*NumericRangeType)(nil), // 48: luceneserver.NumericRangeType + (*Facet)(nil), // 49: luceneserver.Facet + (*FacetResult)(nil), // 50: luceneserver.FacetResult + (*LabelAndValue)(nil), // 51: luceneserver.LabelAndValue + (*FetchTask)(nil), // 52: luceneserver.FetchTask + (*PluginRescorer)(nil), // 53: luceneserver.PluginRescorer + (*QueryRescorer)(nil), // 54: luceneserver.QueryRescorer + (*Rescorer)(nil), // 55: luceneserver.Rescorer + (*ProfileResult)(nil), // 56: luceneserver.ProfileResult + (*Collector)(nil), // 57: luceneserver.Collector + (*PluginCollector)(nil), // 58: luceneserver.PluginCollector + (*TermsCollector)(nil), // 59: luceneserver.TermsCollector + (*TopHitsCollector)(nil), // 60: luceneserver.TopHitsCollector + (*FilterCollector)(nil), // 61: luceneserver.FilterCollector + (*MaxCollector)(nil), // 62: luceneserver.MaxCollector + (*CollectorResult)(nil), // 63: luceneserver.CollectorResult + (*BucketOrder)(nil), // 64: luceneserver.BucketOrder + (*BucketResult)(nil), // 65: luceneserver.BucketResult + (*HitsResult)(nil), // 66: luceneserver.HitsResult + (*FilterResult)(nil), // 67: luceneserver.FilterResult + (*Highlight)(nil), // 68: luceneserver.Highlight + (*TermInSetQuery_TextTerms)(nil), // 69: luceneserver.TermInSetQuery.TextTerms + (*TermInSetQuery_IntTerms)(nil), // 70: luceneserver.TermInSetQuery.IntTerms + (*TermInSetQuery_LongTerms)(nil), // 71: luceneserver.TermInSetQuery.LongTerms + (*TermInSetQuery_FloatTerms)(nil), // 72: luceneserver.TermInSetQuery.FloatTerms + (*TermInSetQuery_DoubleTerms)(nil), // 73: luceneserver.TermInSetQuery.DoubleTerms + nil, // 74: luceneserver.MultiMatchQuery.FieldBoostsEntry + (*MultiFunctionScoreQuery_FilterFunction)(nil), // 75: luceneserver.MultiFunctionScoreQuery.FilterFunction + nil, // 76: luceneserver.SearchRequest.CollectorsEntry + nil, // 77: luceneserver.SearchRequest.InnerHitsEntry + (*Script_ParamValue)(nil), // 78: luceneserver.Script.ParamValue + (*Script_ParamStructValue)(nil), // 79: luceneserver.Script.ParamStructValue + (*Script_ParamListValue)(nil), // 80: luceneserver.Script.ParamListValue + nil, // 81: luceneserver.Script.ParamsEntry + nil, // 82: luceneserver.Script.ParamStructValue.FieldsEntry + (*SearchResponse_Diagnostics)(nil), // 83: luceneserver.SearchResponse.Diagnostics + (*SearchResponse_Hit)(nil), // 84: luceneserver.SearchResponse.Hit + (*SearchResponse_SearchState)(nil), // 85: luceneserver.SearchResponse.SearchState + nil, // 86: luceneserver.SearchResponse.CollectorResultsEntry + nil, // 87: luceneserver.SearchResponse.Diagnostics.FacetTimeMsEntry + nil, // 88: luceneserver.SearchResponse.Diagnostics.RescorersTimeMsEntry + nil, // 89: luceneserver.SearchResponse.Diagnostics.InnerHitsDiagnosticsEntry + (*SearchResponse_Hit_FieldValue)(nil), // 90: luceneserver.SearchResponse.Hit.FieldValue + (*SearchResponse_Hit_CompositeFieldValue)(nil), // 91: luceneserver.SearchResponse.Hit.CompositeFieldValue + (*SearchResponse_Hit_Highlights)(nil), // 92: luceneserver.SearchResponse.Hit.Highlights + nil, // 93: luceneserver.SearchResponse.Hit.FieldsEntry + nil, // 94: luceneserver.SearchResponse.Hit.SortedFieldsEntry + nil, // 95: luceneserver.SearchResponse.Hit.HighlightsEntry + nil, // 96: luceneserver.SearchResponse.Hit.InnerHitsEntry + (*SearchResponse_Hit_FieldValue_Vector)(nil), // 97: luceneserver.SearchResponse.Hit.FieldValue.Vector + (*ProfileResult_AdditionalCollectorStats)(nil), // 98: luceneserver.ProfileResult.AdditionalCollectorStats + (*ProfileResult_CollectorStats)(nil), // 99: luceneserver.ProfileResult.CollectorStats + (*ProfileResult_SegmentStats)(nil), // 100: luceneserver.ProfileResult.SegmentStats + (*ProfileResult_SearchStats)(nil), // 101: luceneserver.ProfileResult.SearchStats + nil, // 102: luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry + nil, // 103: luceneserver.Collector.NestedCollectorsEntry + (*BucketResult_Bucket)(nil), // 104: luceneserver.BucketResult.Bucket + nil, // 105: luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry + nil, // 106: luceneserver.FilterResult.NestedCollectorResultsEntry + (*Highlight_Settings)(nil), // 107: luceneserver.Highlight.Settings + nil, // 108: luceneserver.Highlight.FieldSettingsEntry + (*Analyzer)(nil), // 109: luceneserver.Analyzer + (*latlng.LatLng)(nil), // 110: google.type.LatLng + (*structpb.Struct)(nil), // 111: google.protobuf.Struct + (*anypb.Any)(nil), // 112: google.protobuf.Any + (*wrapperspb.DoubleValue)(nil), // 113: google.protobuf.DoubleValue + (*wrapperspb.UInt32Value)(nil), // 114: google.protobuf.UInt32Value + (*wrapperspb.BoolValue)(nil), // 115: google.protobuf.BoolValue + (*wrapperspb.StringValue)(nil), // 116: google.protobuf.StringValue } var file_yelp_nrtsearch_search_proto_depIdxs = []int32{ 37, // 0: luceneserver.BooleanClause.query:type_name -> luceneserver.Query @@ -8421,33 +8609,33 @@ var file_yelp_nrtsearch_search_proto_depIdxs = []int32{ 14, // 2: luceneserver.BooleanQuery.clauses:type_name -> luceneserver.BooleanClause 1, // 3: luceneserver.PrefixQuery.rewrite:type_name -> luceneserver.RewriteMethod 37, // 4: luceneserver.FunctionScoreQuery.query:type_name -> luceneserver.Query - 40, // 5: luceneserver.FunctionScoreQuery.script:type_name -> luceneserver.Script - 40, // 6: luceneserver.FunctionFilterQuery.script:type_name -> luceneserver.Script + 41, // 5: luceneserver.FunctionScoreQuery.script:type_name -> luceneserver.Script + 41, // 6: luceneserver.FunctionFilterQuery.script:type_name -> luceneserver.Script 37, // 7: luceneserver.NestedQuery.query:type_name -> luceneserver.Query 6, // 8: luceneserver.NestedQuery.scoreMode:type_name -> luceneserver.NestedQuery.ScoreMode - 68, // 9: luceneserver.TermInSetQuery.textTerms:type_name -> luceneserver.TermInSetQuery.TextTerms - 69, // 10: luceneserver.TermInSetQuery.intTerms:type_name -> luceneserver.TermInSetQuery.IntTerms - 70, // 11: luceneserver.TermInSetQuery.longTerms:type_name -> luceneserver.TermInSetQuery.LongTerms - 71, // 12: luceneserver.TermInSetQuery.floatTerms:type_name -> luceneserver.TermInSetQuery.FloatTerms - 72, // 13: luceneserver.TermInSetQuery.doubleTerms:type_name -> luceneserver.TermInSetQuery.DoubleTerms + 69, // 9: luceneserver.TermInSetQuery.textTerms:type_name -> luceneserver.TermInSetQuery.TextTerms + 70, // 10: luceneserver.TermInSetQuery.intTerms:type_name -> luceneserver.TermInSetQuery.IntTerms + 71, // 11: luceneserver.TermInSetQuery.longTerms:type_name -> luceneserver.TermInSetQuery.LongTerms + 72, // 12: luceneserver.TermInSetQuery.floatTerms:type_name -> luceneserver.TermInSetQuery.FloatTerms + 73, // 13: luceneserver.TermInSetQuery.doubleTerms:type_name -> luceneserver.TermInSetQuery.DoubleTerms 37, // 14: luceneserver.DisjunctionMaxQuery.disjuncts:type_name -> luceneserver.Query 0, // 15: luceneserver.MatchQuery.operator:type_name -> luceneserver.MatchOperator - 105, // 16: luceneserver.MatchQuery.analyzer:type_name -> luceneserver.Analyzer + 109, // 16: luceneserver.MatchQuery.analyzer:type_name -> luceneserver.Analyzer 15, // 17: luceneserver.MatchQuery.fuzzyParams:type_name -> luceneserver.FuzzyParams - 105, // 18: luceneserver.MatchPhraseQuery.analyzer:type_name -> luceneserver.Analyzer - 105, // 19: luceneserver.MatchPhrasePrefixQuery.analyzer:type_name -> luceneserver.Analyzer - 73, // 20: luceneserver.MultiMatchQuery.fieldBoosts:type_name -> luceneserver.MultiMatchQuery.FieldBoostsEntry + 109, // 18: luceneserver.MatchPhraseQuery.analyzer:type_name -> luceneserver.Analyzer + 109, // 19: luceneserver.MatchPhrasePrefixQuery.analyzer:type_name -> luceneserver.Analyzer + 74, // 20: luceneserver.MultiMatchQuery.fieldBoosts:type_name -> luceneserver.MultiMatchQuery.FieldBoostsEntry 0, // 21: luceneserver.MultiMatchQuery.operator:type_name -> luceneserver.MatchOperator - 105, // 22: luceneserver.MultiMatchQuery.analyzer:type_name -> luceneserver.Analyzer + 109, // 22: luceneserver.MultiMatchQuery.analyzer:type_name -> luceneserver.Analyzer 15, // 23: luceneserver.MultiMatchQuery.fuzzyParams:type_name -> luceneserver.FuzzyParams 7, // 24: luceneserver.MultiMatchQuery.type:type_name -> luceneserver.MultiMatchQuery.MatchType - 106, // 25: luceneserver.GeoBoundingBoxQuery.topLeft:type_name -> google.type.LatLng - 106, // 26: luceneserver.GeoBoundingBoxQuery.bottomRight:type_name -> google.type.LatLng - 106, // 27: luceneserver.GeoRadiusQuery.center:type_name -> google.type.LatLng - 106, // 28: luceneserver.GeoPointQuery.point:type_name -> google.type.LatLng + 110, // 25: luceneserver.GeoBoundingBoxQuery.topLeft:type_name -> google.type.LatLng + 110, // 26: luceneserver.GeoBoundingBoxQuery.bottomRight:type_name -> google.type.LatLng + 110, // 27: luceneserver.GeoRadiusQuery.center:type_name -> google.type.LatLng + 110, // 28: luceneserver.GeoPointQuery.point:type_name -> google.type.LatLng 2, // 29: luceneserver.CompletionQuery.queryType:type_name -> luceneserver.CompletionQueryType 37, // 30: luceneserver.MultiFunctionScoreQuery.query:type_name -> luceneserver.Query - 74, // 31: luceneserver.MultiFunctionScoreQuery.functions:type_name -> luceneserver.MultiFunctionScoreQuery.FilterFunction + 75, // 31: luceneserver.MultiFunctionScoreQuery.functions:type_name -> luceneserver.MultiFunctionScoreQuery.FilterFunction 8, // 32: luceneserver.MultiFunctionScoreQuery.score_mode:type_name -> luceneserver.MultiFunctionScoreQuery.FunctionScoreMode 9, // 33: luceneserver.MultiFunctionScoreQuery.boost_mode:type_name -> luceneserver.MultiFunctionScoreQuery.BoostMode 37, // 34: luceneserver.ConstantScoreQuery.filter:type_name -> luceneserver.Query @@ -8473,108 +8661,117 @@ var file_yelp_nrtsearch_search_proto_depIdxs = []int32{ 27, // 54: luceneserver.Query.matchPhrasePrefixQuery:type_name -> luceneserver.MatchPhrasePrefixQuery 18, // 55: luceneserver.Query.prefixQuery:type_name -> luceneserver.PrefixQuery 36, // 56: luceneserver.Query.constantScoreQuery:type_name -> luceneserver.ConstantScoreQuery - 39, // 57: luceneserver.SearchRequest.virtualFields:type_name -> luceneserver.VirtualField + 40, // 57: luceneserver.SearchRequest.virtualFields:type_name -> luceneserver.VirtualField 37, // 58: luceneserver.SearchRequest.query:type_name -> luceneserver.Query - 41, // 59: luceneserver.SearchRequest.querySort:type_name -> luceneserver.QuerySortField - 48, // 60: luceneserver.SearchRequest.facets:type_name -> luceneserver.Facet - 51, // 61: luceneserver.SearchRequest.fetchTasks:type_name -> luceneserver.FetchTask - 54, // 62: luceneserver.SearchRequest.rescorers:type_name -> luceneserver.Rescorer - 75, // 63: luceneserver.SearchRequest.collectors:type_name -> luceneserver.SearchRequest.CollectorsEntry - 67, // 64: luceneserver.SearchRequest.highlight:type_name -> luceneserver.Highlight - 40, // 65: luceneserver.VirtualField.script:type_name -> luceneserver.Script - 79, // 66: luceneserver.Script.params:type_name -> luceneserver.Script.ParamsEntry - 42, // 67: luceneserver.QuerySortField.fields:type_name -> luceneserver.SortFields - 43, // 68: luceneserver.SortFields.sortedFields:type_name -> luceneserver.SortType - 4, // 69: luceneserver.SortType.selector:type_name -> luceneserver.Selector - 45, // 70: luceneserver.SortType.origin:type_name -> luceneserver.Point - 11, // 71: luceneserver.TotalHits.relation:type_name -> luceneserver.TotalHits.Relation - 81, // 72: luceneserver.SearchResponse.diagnostics:type_name -> luceneserver.SearchResponse.Diagnostics - 44, // 73: luceneserver.SearchResponse.totalHits:type_name -> luceneserver.TotalHits - 82, // 74: luceneserver.SearchResponse.hits:type_name -> luceneserver.SearchResponse.Hit - 83, // 75: luceneserver.SearchResponse.searchState:type_name -> luceneserver.SearchResponse.SearchState - 49, // 76: luceneserver.SearchResponse.facetResult:type_name -> luceneserver.FacetResult - 55, // 77: luceneserver.SearchResponse.profileResult:type_name -> luceneserver.ProfileResult - 84, // 78: luceneserver.SearchResponse.collectorResults:type_name -> luceneserver.SearchResponse.CollectorResultsEntry - 47, // 79: luceneserver.Facet.numericRange:type_name -> luceneserver.NumericRangeType - 40, // 80: luceneserver.Facet.script:type_name -> luceneserver.Script - 50, // 81: luceneserver.FacetResult.labelValues:type_name -> luceneserver.LabelAndValue - 107, // 82: luceneserver.FetchTask.params:type_name -> google.protobuf.Struct - 107, // 83: luceneserver.PluginRescorer.params:type_name -> google.protobuf.Struct - 37, // 84: luceneserver.QueryRescorer.rescoreQuery:type_name -> luceneserver.Query - 53, // 85: luceneserver.Rescorer.queryRescorer:type_name -> luceneserver.QueryRescorer - 52, // 86: luceneserver.Rescorer.pluginRescorer:type_name -> luceneserver.PluginRescorer - 97, // 87: luceneserver.ProfileResult.searchStats:type_name -> luceneserver.ProfileResult.SearchStats - 58, // 88: luceneserver.Collector.terms:type_name -> luceneserver.TermsCollector - 57, // 89: luceneserver.Collector.pluginCollector:type_name -> luceneserver.PluginCollector - 59, // 90: luceneserver.Collector.topHitsCollector:type_name -> luceneserver.TopHitsCollector - 60, // 91: luceneserver.Collector.filter:type_name -> luceneserver.FilterCollector - 61, // 92: luceneserver.Collector.max:type_name -> luceneserver.MaxCollector - 99, // 93: luceneserver.Collector.nestedCollectors:type_name -> luceneserver.Collector.NestedCollectorsEntry - 107, // 94: luceneserver.PluginCollector.params:type_name -> google.protobuf.Struct - 40, // 95: luceneserver.TermsCollector.script:type_name -> luceneserver.Script - 63, // 96: luceneserver.TermsCollector.order:type_name -> luceneserver.BucketOrder - 41, // 97: luceneserver.TopHitsCollector.querySort:type_name -> luceneserver.QuerySortField - 37, // 98: luceneserver.FilterCollector.query:type_name -> luceneserver.Query - 23, // 99: luceneserver.FilterCollector.setQuery:type_name -> luceneserver.TermInSetQuery - 40, // 100: luceneserver.MaxCollector.script:type_name -> luceneserver.Script - 64, // 101: luceneserver.CollectorResult.bucketResult:type_name -> luceneserver.BucketResult - 108, // 102: luceneserver.CollectorResult.anyResult:type_name -> google.protobuf.Any - 65, // 103: luceneserver.CollectorResult.hitsResult:type_name -> luceneserver.HitsResult - 66, // 104: luceneserver.CollectorResult.filterResult:type_name -> luceneserver.FilterResult - 109, // 105: luceneserver.CollectorResult.doubleResult:type_name -> google.protobuf.DoubleValue - 12, // 106: luceneserver.BucketOrder.order:type_name -> luceneserver.BucketOrder.OrderType - 100, // 107: luceneserver.BucketResult.buckets:type_name -> luceneserver.BucketResult.Bucket - 44, // 108: luceneserver.HitsResult.totalHits:type_name -> luceneserver.TotalHits - 82, // 109: luceneserver.HitsResult.hits:type_name -> luceneserver.SearchResponse.Hit - 102, // 110: luceneserver.FilterResult.nestedCollectorResults:type_name -> luceneserver.FilterResult.NestedCollectorResultsEntry - 103, // 111: luceneserver.Highlight.settings:type_name -> luceneserver.Highlight.Settings - 104, // 112: luceneserver.Highlight.field_settings:type_name -> luceneserver.Highlight.FieldSettingsEntry - 37, // 113: luceneserver.MultiFunctionScoreQuery.FilterFunction.filter:type_name -> luceneserver.Query - 40, // 114: luceneserver.MultiFunctionScoreQuery.FilterFunction.script:type_name -> luceneserver.Script - 56, // 115: luceneserver.SearchRequest.CollectorsEntry.value:type_name -> luceneserver.Collector - 10, // 116: luceneserver.Script.ParamValue.nullValue:type_name -> luceneserver.Script.ParamNullValue - 78, // 117: luceneserver.Script.ParamValue.listValue:type_name -> luceneserver.Script.ParamListValue - 77, // 118: luceneserver.Script.ParamValue.structValue:type_name -> luceneserver.Script.ParamStructValue - 80, // 119: luceneserver.Script.ParamStructValue.fields:type_name -> luceneserver.Script.ParamStructValue.FieldsEntry - 76, // 120: luceneserver.Script.ParamListValue.values:type_name -> luceneserver.Script.ParamValue - 76, // 121: luceneserver.Script.ParamsEntry.value:type_name -> luceneserver.Script.ParamValue - 76, // 122: luceneserver.Script.ParamStructValue.FieldsEntry.value:type_name -> luceneserver.Script.ParamValue - 85, // 123: luceneserver.SearchResponse.Diagnostics.facetTimeMs:type_name -> luceneserver.SearchResponse.Diagnostics.FacetTimeMsEntry - 86, // 124: luceneserver.SearchResponse.Diagnostics.rescorersTimeMs:type_name -> luceneserver.SearchResponse.Diagnostics.RescorersTimeMsEntry - 90, // 125: luceneserver.SearchResponse.Hit.fields:type_name -> luceneserver.SearchResponse.Hit.FieldsEntry - 91, // 126: luceneserver.SearchResponse.Hit.sortedFields:type_name -> luceneserver.SearchResponse.Hit.SortedFieldsEntry - 92, // 127: luceneserver.SearchResponse.Hit.highlights:type_name -> luceneserver.SearchResponse.Hit.HighlightsEntry - 62, // 128: luceneserver.SearchResponse.CollectorResultsEntry.value:type_name -> luceneserver.CollectorResult - 106, // 129: luceneserver.SearchResponse.Hit.FieldValue.latLngValue:type_name -> google.type.LatLng - 107, // 130: luceneserver.SearchResponse.Hit.FieldValue.structValue:type_name -> google.protobuf.Struct - 93, // 131: luceneserver.SearchResponse.Hit.FieldValue.vectorValue:type_name -> luceneserver.SearchResponse.Hit.FieldValue.Vector - 87, // 132: luceneserver.SearchResponse.Hit.CompositeFieldValue.fieldValue:type_name -> luceneserver.SearchResponse.Hit.FieldValue - 88, // 133: luceneserver.SearchResponse.Hit.FieldsEntry.value:type_name -> luceneserver.SearchResponse.Hit.CompositeFieldValue - 88, // 134: luceneserver.SearchResponse.Hit.SortedFieldsEntry.value:type_name -> luceneserver.SearchResponse.Hit.CompositeFieldValue - 89, // 135: luceneserver.SearchResponse.Hit.HighlightsEntry.value:type_name -> luceneserver.SearchResponse.Hit.Highlights - 96, // 136: luceneserver.ProfileResult.CollectorStats.segmentStats:type_name -> luceneserver.ProfileResult.SegmentStats - 98, // 137: luceneserver.ProfileResult.CollectorStats.additionalCollectorStats:type_name -> luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry - 95, // 138: luceneserver.ProfileResult.SearchStats.collectorStats:type_name -> luceneserver.ProfileResult.CollectorStats - 94, // 139: luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry.value:type_name -> luceneserver.ProfileResult.AdditionalCollectorStats - 56, // 140: luceneserver.Collector.NestedCollectorsEntry.value:type_name -> luceneserver.Collector - 101, // 141: luceneserver.BucketResult.Bucket.nestedCollectorResults:type_name -> luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry - 62, // 142: luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry.value:type_name -> luceneserver.CollectorResult - 62, // 143: luceneserver.FilterResult.NestedCollectorResultsEntry.value:type_name -> luceneserver.CollectorResult - 13, // 144: luceneserver.Highlight.Settings.highlighter_type:type_name -> luceneserver.Highlight.Type - 110, // 145: luceneserver.Highlight.Settings.fragment_size:type_name -> google.protobuf.UInt32Value - 110, // 146: luceneserver.Highlight.Settings.max_number_of_fragments:type_name -> google.protobuf.UInt32Value - 37, // 147: luceneserver.Highlight.Settings.highlight_query:type_name -> luceneserver.Query - 111, // 148: luceneserver.Highlight.Settings.field_match:type_name -> google.protobuf.BoolValue - 111, // 149: luceneserver.Highlight.Settings.score_ordered:type_name -> google.protobuf.BoolValue - 112, // 150: luceneserver.Highlight.Settings.fragmenter:type_name -> google.protobuf.StringValue - 111, // 151: luceneserver.Highlight.Settings.discrete_multivalue:type_name -> google.protobuf.BoolValue - 107, // 152: luceneserver.Highlight.Settings.custom_highlighter_params:type_name -> google.protobuf.Struct - 103, // 153: luceneserver.Highlight.FieldSettingsEntry.value:type_name -> luceneserver.Highlight.Settings - 154, // [154:154] is the sub-list for method output_type - 154, // [154:154] is the sub-list for method input_type - 154, // [154:154] is the sub-list for extension type_name - 154, // [154:154] is the sub-list for extension extendee - 0, // [0:154] is the sub-list for field type_name + 42, // 59: luceneserver.SearchRequest.querySort:type_name -> luceneserver.QuerySortField + 49, // 60: luceneserver.SearchRequest.facets:type_name -> luceneserver.Facet + 52, // 61: luceneserver.SearchRequest.fetchTasks:type_name -> luceneserver.FetchTask + 55, // 62: luceneserver.SearchRequest.rescorers:type_name -> luceneserver.Rescorer + 76, // 63: luceneserver.SearchRequest.collectors:type_name -> luceneserver.SearchRequest.CollectorsEntry + 68, // 64: luceneserver.SearchRequest.highlight:type_name -> luceneserver.Highlight + 77, // 65: luceneserver.SearchRequest.inner_hits:type_name -> luceneserver.SearchRequest.InnerHitsEntry + 37, // 66: luceneserver.InnerHit.inner_query:type_name -> luceneserver.Query + 42, // 67: luceneserver.InnerHit.query_sort:type_name -> luceneserver.QuerySortField + 68, // 68: luceneserver.InnerHit.highlight:type_name -> luceneserver.Highlight + 41, // 69: luceneserver.VirtualField.script:type_name -> luceneserver.Script + 81, // 70: luceneserver.Script.params:type_name -> luceneserver.Script.ParamsEntry + 43, // 71: luceneserver.QuerySortField.fields:type_name -> luceneserver.SortFields + 44, // 72: luceneserver.SortFields.sortedFields:type_name -> luceneserver.SortType + 4, // 73: luceneserver.SortType.selector:type_name -> luceneserver.Selector + 46, // 74: luceneserver.SortType.origin:type_name -> luceneserver.Point + 11, // 75: luceneserver.TotalHits.relation:type_name -> luceneserver.TotalHits.Relation + 83, // 76: luceneserver.SearchResponse.diagnostics:type_name -> luceneserver.SearchResponse.Diagnostics + 45, // 77: luceneserver.SearchResponse.totalHits:type_name -> luceneserver.TotalHits + 84, // 78: luceneserver.SearchResponse.hits:type_name -> luceneserver.SearchResponse.Hit + 85, // 79: luceneserver.SearchResponse.searchState:type_name -> luceneserver.SearchResponse.SearchState + 50, // 80: luceneserver.SearchResponse.facetResult:type_name -> luceneserver.FacetResult + 56, // 81: luceneserver.SearchResponse.profileResult:type_name -> luceneserver.ProfileResult + 86, // 82: luceneserver.SearchResponse.collectorResults:type_name -> luceneserver.SearchResponse.CollectorResultsEntry + 48, // 83: luceneserver.Facet.numericRange:type_name -> luceneserver.NumericRangeType + 41, // 84: luceneserver.Facet.script:type_name -> luceneserver.Script + 51, // 85: luceneserver.FacetResult.labelValues:type_name -> luceneserver.LabelAndValue + 111, // 86: luceneserver.FetchTask.params:type_name -> google.protobuf.Struct + 111, // 87: luceneserver.PluginRescorer.params:type_name -> google.protobuf.Struct + 37, // 88: luceneserver.QueryRescorer.rescoreQuery:type_name -> luceneserver.Query + 54, // 89: luceneserver.Rescorer.queryRescorer:type_name -> luceneserver.QueryRescorer + 53, // 90: luceneserver.Rescorer.pluginRescorer:type_name -> luceneserver.PluginRescorer + 101, // 91: luceneserver.ProfileResult.searchStats:type_name -> luceneserver.ProfileResult.SearchStats + 59, // 92: luceneserver.Collector.terms:type_name -> luceneserver.TermsCollector + 58, // 93: luceneserver.Collector.pluginCollector:type_name -> luceneserver.PluginCollector + 60, // 94: luceneserver.Collector.topHitsCollector:type_name -> luceneserver.TopHitsCollector + 61, // 95: luceneserver.Collector.filter:type_name -> luceneserver.FilterCollector + 62, // 96: luceneserver.Collector.max:type_name -> luceneserver.MaxCollector + 103, // 97: luceneserver.Collector.nestedCollectors:type_name -> luceneserver.Collector.NestedCollectorsEntry + 111, // 98: luceneserver.PluginCollector.params:type_name -> google.protobuf.Struct + 41, // 99: luceneserver.TermsCollector.script:type_name -> luceneserver.Script + 64, // 100: luceneserver.TermsCollector.order:type_name -> luceneserver.BucketOrder + 42, // 101: luceneserver.TopHitsCollector.querySort:type_name -> luceneserver.QuerySortField + 37, // 102: luceneserver.FilterCollector.query:type_name -> luceneserver.Query + 23, // 103: luceneserver.FilterCollector.setQuery:type_name -> luceneserver.TermInSetQuery + 41, // 104: luceneserver.MaxCollector.script:type_name -> luceneserver.Script + 65, // 105: luceneserver.CollectorResult.bucketResult:type_name -> luceneserver.BucketResult + 112, // 106: luceneserver.CollectorResult.anyResult:type_name -> google.protobuf.Any + 66, // 107: luceneserver.CollectorResult.hitsResult:type_name -> luceneserver.HitsResult + 67, // 108: luceneserver.CollectorResult.filterResult:type_name -> luceneserver.FilterResult + 113, // 109: luceneserver.CollectorResult.doubleResult:type_name -> google.protobuf.DoubleValue + 12, // 110: luceneserver.BucketOrder.order:type_name -> luceneserver.BucketOrder.OrderType + 104, // 111: luceneserver.BucketResult.buckets:type_name -> luceneserver.BucketResult.Bucket + 45, // 112: luceneserver.HitsResult.totalHits:type_name -> luceneserver.TotalHits + 84, // 113: luceneserver.HitsResult.hits:type_name -> luceneserver.SearchResponse.Hit + 106, // 114: luceneserver.FilterResult.nestedCollectorResults:type_name -> luceneserver.FilterResult.NestedCollectorResultsEntry + 107, // 115: luceneserver.Highlight.settings:type_name -> luceneserver.Highlight.Settings + 108, // 116: luceneserver.Highlight.field_settings:type_name -> luceneserver.Highlight.FieldSettingsEntry + 37, // 117: luceneserver.MultiFunctionScoreQuery.FilterFunction.filter:type_name -> luceneserver.Query + 41, // 118: luceneserver.MultiFunctionScoreQuery.FilterFunction.script:type_name -> luceneserver.Script + 57, // 119: luceneserver.SearchRequest.CollectorsEntry.value:type_name -> luceneserver.Collector + 39, // 120: luceneserver.SearchRequest.InnerHitsEntry.value:type_name -> luceneserver.InnerHit + 10, // 121: luceneserver.Script.ParamValue.nullValue:type_name -> luceneserver.Script.ParamNullValue + 80, // 122: luceneserver.Script.ParamValue.listValue:type_name -> luceneserver.Script.ParamListValue + 79, // 123: luceneserver.Script.ParamValue.structValue:type_name -> luceneserver.Script.ParamStructValue + 82, // 124: luceneserver.Script.ParamStructValue.fields:type_name -> luceneserver.Script.ParamStructValue.FieldsEntry + 78, // 125: luceneserver.Script.ParamListValue.values:type_name -> luceneserver.Script.ParamValue + 78, // 126: luceneserver.Script.ParamsEntry.value:type_name -> luceneserver.Script.ParamValue + 78, // 127: luceneserver.Script.ParamStructValue.FieldsEntry.value:type_name -> luceneserver.Script.ParamValue + 87, // 128: luceneserver.SearchResponse.Diagnostics.facetTimeMs:type_name -> luceneserver.SearchResponse.Diagnostics.FacetTimeMsEntry + 88, // 129: luceneserver.SearchResponse.Diagnostics.rescorersTimeMs:type_name -> luceneserver.SearchResponse.Diagnostics.RescorersTimeMsEntry + 89, // 130: luceneserver.SearchResponse.Diagnostics.innerHitsDiagnostics:type_name -> luceneserver.SearchResponse.Diagnostics.InnerHitsDiagnosticsEntry + 93, // 131: luceneserver.SearchResponse.Hit.fields:type_name -> luceneserver.SearchResponse.Hit.FieldsEntry + 94, // 132: luceneserver.SearchResponse.Hit.sortedFields:type_name -> luceneserver.SearchResponse.Hit.SortedFieldsEntry + 95, // 133: luceneserver.SearchResponse.Hit.highlights:type_name -> luceneserver.SearchResponse.Hit.HighlightsEntry + 96, // 134: luceneserver.SearchResponse.Hit.innerHits:type_name -> luceneserver.SearchResponse.Hit.InnerHitsEntry + 63, // 135: luceneserver.SearchResponse.CollectorResultsEntry.value:type_name -> luceneserver.CollectorResult + 83, // 136: luceneserver.SearchResponse.Diagnostics.InnerHitsDiagnosticsEntry.value:type_name -> luceneserver.SearchResponse.Diagnostics + 110, // 137: luceneserver.SearchResponse.Hit.FieldValue.latLngValue:type_name -> google.type.LatLng + 111, // 138: luceneserver.SearchResponse.Hit.FieldValue.structValue:type_name -> google.protobuf.Struct + 97, // 139: luceneserver.SearchResponse.Hit.FieldValue.vectorValue:type_name -> luceneserver.SearchResponse.Hit.FieldValue.Vector + 90, // 140: luceneserver.SearchResponse.Hit.CompositeFieldValue.fieldValue:type_name -> luceneserver.SearchResponse.Hit.FieldValue + 91, // 141: luceneserver.SearchResponse.Hit.FieldsEntry.value:type_name -> luceneserver.SearchResponse.Hit.CompositeFieldValue + 91, // 142: luceneserver.SearchResponse.Hit.SortedFieldsEntry.value:type_name -> luceneserver.SearchResponse.Hit.CompositeFieldValue + 92, // 143: luceneserver.SearchResponse.Hit.HighlightsEntry.value:type_name -> luceneserver.SearchResponse.Hit.Highlights + 66, // 144: luceneserver.SearchResponse.Hit.InnerHitsEntry.value:type_name -> luceneserver.HitsResult + 100, // 145: luceneserver.ProfileResult.CollectorStats.segmentStats:type_name -> luceneserver.ProfileResult.SegmentStats + 102, // 146: luceneserver.ProfileResult.CollectorStats.additionalCollectorStats:type_name -> luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry + 99, // 147: luceneserver.ProfileResult.SearchStats.collectorStats:type_name -> luceneserver.ProfileResult.CollectorStats + 98, // 148: luceneserver.ProfileResult.CollectorStats.AdditionalCollectorStatsEntry.value:type_name -> luceneserver.ProfileResult.AdditionalCollectorStats + 57, // 149: luceneserver.Collector.NestedCollectorsEntry.value:type_name -> luceneserver.Collector + 105, // 150: luceneserver.BucketResult.Bucket.nestedCollectorResults:type_name -> luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry + 63, // 151: luceneserver.BucketResult.Bucket.NestedCollectorResultsEntry.value:type_name -> luceneserver.CollectorResult + 63, // 152: luceneserver.FilterResult.NestedCollectorResultsEntry.value:type_name -> luceneserver.CollectorResult + 13, // 153: luceneserver.Highlight.Settings.highlighter_type:type_name -> luceneserver.Highlight.Type + 114, // 154: luceneserver.Highlight.Settings.fragment_size:type_name -> google.protobuf.UInt32Value + 114, // 155: luceneserver.Highlight.Settings.max_number_of_fragments:type_name -> google.protobuf.UInt32Value + 37, // 156: luceneserver.Highlight.Settings.highlight_query:type_name -> luceneserver.Query + 115, // 157: luceneserver.Highlight.Settings.field_match:type_name -> google.protobuf.BoolValue + 115, // 158: luceneserver.Highlight.Settings.score_ordered:type_name -> google.protobuf.BoolValue + 116, // 159: luceneserver.Highlight.Settings.fragmenter:type_name -> google.protobuf.StringValue + 115, // 160: luceneserver.Highlight.Settings.discrete_multivalue:type_name -> google.protobuf.BoolValue + 111, // 161: luceneserver.Highlight.Settings.custom_highlighter_params:type_name -> google.protobuf.Struct + 107, // 162: luceneserver.Highlight.FieldSettingsEntry.value:type_name -> luceneserver.Highlight.Settings + 163, // [163:163] is the sub-list for method output_type + 163, // [163:163] is the sub-list for method input_type + 163, // [163:163] is the sub-list for extension type_name + 163, // [163:163] is the sub-list for extension extendee + 0, // [0:163] is the sub-list for field type_name } func init() { file_yelp_nrtsearch_search_proto_init() } @@ -8885,7 +9082,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*VirtualField); i { + switch v := v.(*InnerHit); i { case 0: return &v.state case 1: @@ -8897,7 +9094,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Script); i { + switch v := v.(*VirtualField); i { case 0: return &v.state case 1: @@ -8909,7 +9106,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QuerySortField); i { + switch v := v.(*Script); i { case 0: return &v.state case 1: @@ -8921,7 +9118,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SortFields); i { + switch v := v.(*QuerySortField); i { case 0: return &v.state case 1: @@ -8933,7 +9130,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SortType); i { + switch v := v.(*SortFields); i { case 0: return &v.state case 1: @@ -8945,7 +9142,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TotalHits); i { + switch v := v.(*SortType); i { case 0: return &v.state case 1: @@ -8957,7 +9154,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Point); i { + switch v := v.(*TotalHits); i { case 0: return &v.state case 1: @@ -8969,7 +9166,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SearchResponse); i { + switch v := v.(*Point); i { case 0: return &v.state case 1: @@ -8981,7 +9178,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NumericRangeType); i { + switch v := v.(*SearchResponse); i { case 0: return &v.state case 1: @@ -8993,7 +9190,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Facet); i { + switch v := v.(*NumericRangeType); i { case 0: return &v.state case 1: @@ -9005,7 +9202,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FacetResult); i { + switch v := v.(*Facet); i { case 0: return &v.state case 1: @@ -9017,7 +9214,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LabelAndValue); i { + switch v := v.(*FacetResult); i { case 0: return &v.state case 1: @@ -9029,7 +9226,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FetchTask); i { + switch v := v.(*LabelAndValue); i { case 0: return &v.state case 1: @@ -9041,7 +9238,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PluginRescorer); i { + switch v := v.(*FetchTask); i { case 0: return &v.state case 1: @@ -9053,7 +9250,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryRescorer); i { + switch v := v.(*PluginRescorer); i { case 0: return &v.state case 1: @@ -9065,7 +9262,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Rescorer); i { + switch v := v.(*QueryRescorer); i { case 0: return &v.state case 1: @@ -9077,7 +9274,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ProfileResult); i { + switch v := v.(*Rescorer); i { case 0: return &v.state case 1: @@ -9089,7 +9286,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Collector); i { + switch v := v.(*ProfileResult); i { case 0: return &v.state case 1: @@ -9101,7 +9298,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PluginCollector); i { + switch v := v.(*Collector); i { case 0: return &v.state case 1: @@ -9113,7 +9310,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermsCollector); i { + switch v := v.(*PluginCollector); i { case 0: return &v.state case 1: @@ -9125,7 +9322,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TopHitsCollector); i { + switch v := v.(*TermsCollector); i { case 0: return &v.state case 1: @@ -9137,7 +9334,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilterCollector); i { + switch v := v.(*TopHitsCollector); i { case 0: return &v.state case 1: @@ -9149,7 +9346,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MaxCollector); i { + switch v := v.(*FilterCollector); i { case 0: return &v.state case 1: @@ -9161,7 +9358,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CollectorResult); i { + switch v := v.(*MaxCollector); i { case 0: return &v.state case 1: @@ -9173,7 +9370,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BucketOrder); i { + switch v := v.(*CollectorResult); i { case 0: return &v.state case 1: @@ -9185,7 +9382,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BucketResult); i { + switch v := v.(*BucketOrder); i { case 0: return &v.state case 1: @@ -9197,7 +9394,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[51].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HitsResult); i { + switch v := v.(*BucketResult); i { case 0: return &v.state case 1: @@ -9209,7 +9406,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FilterResult); i { + switch v := v.(*HitsResult); i { case 0: return &v.state case 1: @@ -9221,7 +9418,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[53].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Highlight); i { + switch v := v.(*FilterResult); i { case 0: return &v.state case 1: @@ -9233,7 +9430,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[54].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermInSetQuery_TextTerms); i { + switch v := v.(*Highlight); i { case 0: return &v.state case 1: @@ -9245,7 +9442,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermInSetQuery_IntTerms); i { + switch v := v.(*TermInSetQuery_TextTerms); i { case 0: return &v.state case 1: @@ -9257,7 +9454,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermInSetQuery_LongTerms); i { + switch v := v.(*TermInSetQuery_IntTerms); i { case 0: return &v.state case 1: @@ -9269,7 +9466,7 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TermInSetQuery_FloatTerms); i { + switch v := v.(*TermInSetQuery_LongTerms); i { case 0: return &v.state case 1: @@ -9281,6 +9478,18 @@ func file_yelp_nrtsearch_search_proto_init() { } } file_yelp_nrtsearch_search_proto_msgTypes[58].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TermInSetQuery_FloatTerms); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_yelp_nrtsearch_search_proto_msgTypes[59].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TermInSetQuery_DoubleTerms); i { case 0: return &v.state @@ -9292,7 +9501,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[60].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[61].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MultiFunctionScoreQuery_FilterFunction); i { case 0: return &v.state @@ -9304,7 +9513,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[62].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Script_ParamValue); i { case 0: return &v.state @@ -9316,7 +9525,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[63].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[65].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Script_ParamStructValue); i { case 0: return &v.state @@ -9328,7 +9537,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[64].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[66].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Script_ParamListValue); i { case 0: return &v.state @@ -9340,7 +9549,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[67].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Diagnostics); i { case 0: return &v.state @@ -9352,7 +9561,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[68].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[70].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Hit); i { case 0: return &v.state @@ -9364,7 +9573,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[69].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[71].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_SearchState); i { case 0: return &v.state @@ -9376,7 +9585,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[73].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[76].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Hit_FieldValue); i { case 0: return &v.state @@ -9388,7 +9597,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[74].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[77].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Hit_CompositeFieldValue); i { case 0: return &v.state @@ -9400,7 +9609,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[75].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[78].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Hit_Highlights); i { case 0: return &v.state @@ -9412,7 +9621,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[79].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*SearchResponse_Hit_FieldValue_Vector); i { case 0: return &v.state @@ -9424,7 +9633,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[80].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[84].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProfileResult_AdditionalCollectorStats); i { case 0: return &v.state @@ -9436,7 +9645,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[81].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[85].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProfileResult_CollectorStats); i { case 0: return &v.state @@ -9448,7 +9657,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[82].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProfileResult_SegmentStats); i { case 0: return &v.state @@ -9460,7 +9669,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[83].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[87].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ProfileResult_SearchStats); i { case 0: return &v.state @@ -9472,7 +9681,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[86].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[90].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*BucketResult_Bucket); i { case 0: return &v.state @@ -9484,7 +9693,7 @@ func file_yelp_nrtsearch_search_proto_init() { return nil } } - file_yelp_nrtsearch_search_proto_msgTypes[89].Exporter = func(v interface{}, i int) interface{} { + file_yelp_nrtsearch_search_proto_msgTypes[93].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Highlight_Settings); i { case 0: return &v.state @@ -9540,39 +9749,39 @@ func file_yelp_nrtsearch_search_proto_init() { (*SearchRequest_Version)(nil), (*SearchRequest_Snapshot)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[40].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[41].OneofWrappers = []interface{}{ (*Rescorer_QueryRescorer)(nil), (*Rescorer_PluginRescorer)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[42].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[43].OneofWrappers = []interface{}{ (*Collector_Terms)(nil), (*Collector_PluginCollector)(nil), (*Collector_TopHitsCollector)(nil), (*Collector_Filter)(nil), (*Collector_Max)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[44].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[45].OneofWrappers = []interface{}{ (*TermsCollector_Field)(nil), (*TermsCollector_Script)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[46].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[47].OneofWrappers = []interface{}{ (*FilterCollector_Query)(nil), (*FilterCollector_SetQuery)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[47].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[48].OneofWrappers = []interface{}{ (*MaxCollector_Script)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[48].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[49].OneofWrappers = []interface{}{ (*CollectorResult_BucketResult)(nil), (*CollectorResult_AnyResult)(nil), (*CollectorResult_HitsResult)(nil), (*CollectorResult_FilterResult)(nil), (*CollectorResult_DoubleResult)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[60].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[61].OneofWrappers = []interface{}{ (*MultiFunctionScoreQuery_FilterFunction_Script)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[62].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[64].OneofWrappers = []interface{}{ (*Script_ParamValue_TextValue)(nil), (*Script_ParamValue_BooleanValue)(nil), (*Script_ParamValue_IntValue)(nil), @@ -9583,7 +9792,7 @@ func file_yelp_nrtsearch_search_proto_init() { (*Script_ParamValue_ListValue)(nil), (*Script_ParamValue_StructValue)(nil), } - file_yelp_nrtsearch_search_proto_msgTypes[73].OneofWrappers = []interface{}{ + file_yelp_nrtsearch_search_proto_msgTypes[76].OneofWrappers = []interface{}{ (*SearchResponse_Hit_FieldValue_TextValue)(nil), (*SearchResponse_Hit_FieldValue_BooleanValue)(nil), (*SearchResponse_Hit_FieldValue_IntValue)(nil), @@ -9600,7 +9809,7 @@ func file_yelp_nrtsearch_search_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_yelp_nrtsearch_search_proto_rawDesc, NumEnums: 14, - NumMessages: 91, + NumMessages: 95, NumExtensions: 0, NumServices: 0, }, diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java index 866168ba2..03e4c11eb 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java @@ -26,6 +26,7 @@ import com.yelp.nrtsearch.server.luceneserver.field.FieldDef; import com.yelp.nrtsearch.server.luceneserver.field.FieldDefCreator; import com.yelp.nrtsearch.server.luceneserver.field.IdFieldDef; +import com.yelp.nrtsearch.server.luceneserver.field.ObjectFieldDef; import com.yelp.nrtsearch.server.luceneserver.field.TextBaseFieldDef; import com.yelp.nrtsearch.server.luceneserver.field.properties.GlobalOrdinalable; import com.yelp.nrtsearch.server.luceneserver.index.IndexSimilarity; @@ -307,6 +308,24 @@ public void verifyStarted() { } } + /** + * resolve the nested object path, and do validation if it is not _root. + * + * @param path path of the nested object + * @return resolved path + * @throws IllegalArgumentException if the non-root path is invalid + */ + public String resolveQueryNestedPath(String path) { + if (path == null || path.length() == 0 || path.equals(IndexState.ROOT)) { + return IndexState.ROOT; + } + FieldDef fieldDef = getField(path); + if ((fieldDef instanceof ObjectFieldDef) && ((ObjectFieldDef) fieldDef).isNestedDoc()) { + return path; + } + throw new IllegalArgumentException("Nested path is not a nested object field: " + path); + } + /** Get if the index is started. */ public abstract boolean isStarted(); diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/QueryNodeMapper.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/QueryNodeMapper.java index 047b7eb03..e44059f9f 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/QueryNodeMapper.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/QueryNodeMapper.java @@ -108,16 +108,20 @@ public Query getQuery(com.yelp.nrtsearch.server.grpc.Query query, IndexState sta return queryNode; } - public Query applyQueryNestedPath(Query query, String path) { - if (path == null || path.length() == 0) { - path = IndexState.ROOT; - } + public Query applyQueryNestedPath(Query query, IndexState indexState, String path) { BooleanQuery.Builder builder = new BooleanQuery.Builder(); - builder.add(new TermQuery(new Term(IndexState.NESTED_PATH, path)), BooleanClause.Occur.FILTER); + builder.add(getNestedPathQuery(indexState, path), BooleanClause.Occur.FILTER); builder.add(query, BooleanClause.Occur.MUST); return builder.build(); } + /* + * create the query to filter the parent/child document based on the path + * */ + public Query getNestedPathQuery(IndexState indexState, String path) { + return new TermQuery(new Term(IndexState.NESTED_PATH, indexState.resolveQueryNestedPath(path))); + } + private Query getQueryNode(com.yelp.nrtsearch.server.grpc.Query query, IndexState state) { switch (query.getQueryNodeCase()) { case BOOLEANQUERY: @@ -200,12 +204,10 @@ private Query getNestedQuery( Query childRawQuery = getQuery(nestedQuery.getQuery(), state); Query childQuery = new BooleanQuery.Builder() - .add( - new TermQuery(new Term(IndexState.NESTED_PATH, nestedQuery.getPath())), - BooleanClause.Occur.FILTER) + .add(getNestedPathQuery(state, nestedQuery.getPath()), BooleanClause.Occur.FILTER) .add(childRawQuery, BooleanClause.Occur.MUST) .build(); - Query parentQuery = new TermQuery(new Term(IndexState.NESTED_PATH, IndexState.ROOT)); + Query parentQuery = getNestedPathQuery(state, IndexState.ROOT); return new ToParentBlockJoinQuery( childQuery, new QueryBitSetProducer(parentQuery), getScoreMode(nestedQuery)); } diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/SearchHandler.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/SearchHandler.java index 088139c31..fea18b07e 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/SearchHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/SearchHandler.java @@ -38,6 +38,7 @@ import com.yelp.nrtsearch.server.luceneserver.field.ObjectFieldDef; import com.yelp.nrtsearch.server.luceneserver.field.PolygonfieldDef; import com.yelp.nrtsearch.server.luceneserver.field.VirtualFieldDef; +import com.yelp.nrtsearch.server.luceneserver.innerhit.InnerHitFetchTask; import com.yelp.nrtsearch.server.luceneserver.rescore.RescoreTask; import com.yelp.nrtsearch.server.luceneserver.search.FieldFetchContext; import com.yelp.nrtsearch.server.luceneserver.search.SearchContext; @@ -58,6 +59,7 @@ import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; +import java.util.stream.Collectors; import org.apache.lucene.facet.DrillDownQuery; import org.apache.lucene.facet.DrillSideways; import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; @@ -243,8 +245,18 @@ public SearchResponse handle(IndexState indexState, SearchRequest searchRequest) searchContext.getResponseBuilder().setSearchState(searchState); diagnostics.setGetFieldsTimeMs(((System.nanoTime() - t0) / 1000000.0)); - if (searchContext.getHighlightFetchTask() != null) { - diagnostics.setHighlightTimeMs(searchContext.getHighlightFetchTask().getTimeTakenMs()); + + if (searchContext.getFetchTasks().getHighlightFetchTask() != null) { + diagnostics.setHighlightTimeMs( + searchContext.getFetchTasks().getHighlightFetchTask().getTimeTakenMs()); + } + if (searchContext.getFetchTasks().getInnerHitFetchTaskList() != null) { + diagnostics.putAllInnerHitsDiagnostics( + searchContext.getFetchTasks().getInnerHitFetchTaskList().stream() + .collect( + Collectors.toMap( + task -> task.getInnerHitContext().getInnerHitName(), + InnerHitFetchTask::getDiagnostic))); } searchContext.getResponseBuilder().setDiagnostics(diagnostics); @@ -373,10 +385,6 @@ private void fetchFields(SearchContext searchContext) var hitResponse = hitBuilders.get(hitIndex); LeafReaderContext leaf = hitIdToLeaves.get(hitIndex); searchContext.getFetchTasks().processHit(searchContext, leaf, hitResponse); - // TODO: combine with custom fetch tasks - if (searchContext.getHighlightFetchTask() != null) { - searchContext.getHighlightFetchTask().processHit(searchContext, leaf, hitResponse); - } } } else if (!parallelFetchByField && fetch_thread_pool_size > 1 @@ -903,13 +911,6 @@ private static void fetchSlice( // execute any per hit fetch tasks for (Hit.Builder hit : sliceHits) { context.getFetchTasks().processHit(context.getSearchContext(), sliceSegment, hit); - // TODO: combine with custom fetch tasks - if (context.getSearchContext().getHighlightFetchTask() != null) { - context - .getSearchContext() - .getHighlightFetchTask() - .processHit(context.getSearchContext(), sliceSegment, hit); - } } } diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitContext.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitContext.java new file mode 100644 index 000000000..b9fb7da84 --- /dev/null +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitContext.java @@ -0,0 +1,344 @@ +/* + * Copyright 2023 Yelp Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yelp.nrtsearch.server.luceneserver.innerhit; + +import com.yelp.nrtsearch.server.grpc.QuerySortField; +import com.yelp.nrtsearch.server.luceneserver.IndexState; +import com.yelp.nrtsearch.server.luceneserver.QueryNodeMapper; +import com.yelp.nrtsearch.server.luceneserver.SearchHandler.SearchHandlerException; +import com.yelp.nrtsearch.server.luceneserver.ShardState; +import com.yelp.nrtsearch.server.luceneserver.field.FieldDef; +import com.yelp.nrtsearch.server.luceneserver.highlights.HighlightFetchTask; +import com.yelp.nrtsearch.server.luceneserver.search.FetchTasks; +import com.yelp.nrtsearch.server.luceneserver.search.FieldFetchContext; +import com.yelp.nrtsearch.server.luceneserver.search.SearchContext; +import com.yelp.nrtsearch.server.luceneserver.search.SortParser; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.Objects; +import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; +import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager.SearcherAndTaxonomy; +import org.apache.lucene.search.CollectorManager; +import org.apache.lucene.search.Query; +import org.apache.lucene.search.Sort; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.TopDocsCollector; +import org.apache.lucene.search.TopFieldCollector; +import org.apache.lucene.search.TopScoreDocCollector; +import org.apache.lucene.search.join.BitSetProducer; +import org.apache.lucene.search.join.QueryBitSetProducer; + +/** + * Object to store all necessary context information for {@link InnerHitFetchTask} to search and + * fetch for each hit. + */ +public class InnerHitContext implements FieldFetchContext { + + private static final int DEFAULT_INNER_HIT_TOP_HITS = 3; + + public BitSetProducer getParentFilter() { + return parentFilter; + } + + public String getInnerHitName() { + return innerHitName; + } + + private final String innerHitName; + private final BitSetProducer parentFilter; + private final String queryNestedPath; + private final Query query; + private final IndexState indexState; + private final ShardState shardState; + private final SearcherTaxonomyManager.SearcherAndTaxonomy searcherAndTaxonomy; + private final int startHit; + private final int topHits; + private final Map queryFields; + private final Map retrieveFields; + private final List sortedFieldNames; + private final Sort sort; + private final CollectorManager + topDocsCollectorManager; + private final FetchTasks fetchTasks; + private SearchContext searchContext = null; + + private InnerHitContext(InnerHitContextBuilder builder, boolean needValidation) + throws IOException { + this.innerHitName = builder.innerHitName; + this.queryNestedPath = builder.queryNestedPath; + this.indexState = builder.indexState; + this.shardState = builder.shardState; + this.searcherAndTaxonomy = builder.searcherAndTaxonomy; + this.parentFilter = + new QueryBitSetProducer( + QueryNodeMapper.getInstance() + .getNestedPathQuery(indexState, builder.parentQueryNestedPath)); + // rewrite the query in advance so that it won't be rewritten per hit. + this.query = searcherAndTaxonomy.searcher.rewrite(builder.query); + this.startHit = builder.startHit; + // TODO: implement the totalCountCollector in case (topHits == 0 || startHit >= topHits). + // Currently, return DEFAULT_INNER_HIT_TOP_HITS results in case of 0. + this.topHits = builder.topHits == 0 ? DEFAULT_INNER_HIT_TOP_HITS : builder.topHits; + this.queryFields = builder.queryFields; + this.retrieveFields = builder.retrieveFields; + this.fetchTasks = new FetchTasks(Collections.EMPTY_LIST, builder.highlightFetchTask, null); + + if (builder.querySort == null) { + // relevance collector + this.sortedFieldNames = Collections.EMPTY_LIST; + this.sort = null; + this.topDocsCollectorManager = + TopScoreDocCollector.createSharedManager(topHits, null, Integer.MAX_VALUE); + } else { + // sortedField collector + this.sortedFieldNames = + new ArrayList<>(builder.querySort.getFields().getSortedFieldsList().size()); + try { + this.sort = + SortParser.parseSort( + builder.querySort.getFields().getSortedFieldsList(), sortedFieldNames, queryFields); + this.topDocsCollectorManager = + TopFieldCollector.createSharedManager(sort, topHits, null, Integer.MAX_VALUE); + } catch (SearchHandlerException e) { + throw new IllegalArgumentException(e); + } + } + + if (needValidation) { + validate(); + } + } + + /** + * A basic and non-exhausted validation at the construction time. Fail before search so that we + * don't waste resources on invalid search request. + */ + private void validate() { + Objects.requireNonNull(indexState); + Objects.requireNonNull(shardState); + Objects.requireNonNull(searcherAndTaxonomy); + Objects.requireNonNull(queryFields); + Objects.requireNonNull(retrieveFields); + Objects.requireNonNull(query); + Objects.requireNonNull(queryNestedPath); + Objects.requireNonNull(topDocsCollectorManager); + + if (startHit < 0) { + throw new IllegalStateException( + String.format("Invalid startHit value in InnerHit [%s]: %d", innerHitName, startHit)); + } + if (topHits < 0) { + throw new IllegalStateException( + String.format("Invalid topHits value in InnerHit [%s]: %d", innerHitName, topHits)); + } + if (queryNestedPath.isEmpty()) { + throw new IllegalStateException( + String.format("queryNestedPath in InnerHit [%s] cannot be empty", innerHitName)); + } + if (!indexState.hasNestedChildFields()) { + throw new IllegalStateException("InnerHit only works with indices that have childFields"); + } + } + + /** + * Get the nested path for the innerHit query. This path is the field name of the nested object. + */ + public String getQueryNestedPath() { + return queryNestedPath; + } + + /** + * Get the query for the innerHit. Should assume this query is directly searched against the child + * documents only. Omitted this field to retrieve all children for each hit. + */ + public Query getQuery() { + return query; + } + + /** Get IndexState */ + public IndexState getIndexState() { + return indexState; + } + + /** Get ShardState */ + public ShardState getShardState() { + return shardState; + } + + /** Get SearcherAndTaxonomy */ + @Override + public SearcherAndTaxonomy getSearcherAndTaxonomy() { + return searcherAndTaxonomy; + } + + /** Get FetchTasks for the InnerHit. Currently, we only support highlight. */ + @Override + public FetchTasks getFetchTasks() { + return fetchTasks; + } + + /** Get the base SearchContext. This is not used in InnerHit, and is always null. */ + @Override + public SearchContext getSearchContext() { + return searchContext; + } + + /** Get the StartHit */ + public int getStartHit() { + return startHit; + } + + /** Get the topHits */ + public int getTopHits() { + return topHits; + } + + /** + * Get map of all fields usable for this query. This includes all fields defined in the index and + * dynamic fields from the request. This is read from the top level search. + */ + public Map getQueryFields() { + return queryFields; + } + + /** Get the fields to retrieve */ + @Override + public Map getRetrieveFields() { + return retrieveFields; + } + + /** + * Get the field names used in sort if {@link QuerySortField} is in use, otherwise returns an + * empty list. + */ + public List getSortedFieldNames() { + return sortedFieldNames; + } + + /** Get the sort object if {@link QuerySortField} is in use, otherwise returns null. */ + public Sort getSort() { + return sort; + } + + /** Get the topDocsCollectorManager to collect the search results. */ + public CollectorManager + getTopDocsCollectorManager() { + return topDocsCollectorManager; + } + + /** + * A builder class to build the {@link InnerHitContext}. Use it to avoid the constructor with a + * long arguments list. + */ + public static final class InnerHitContextBuilder { + + private String innerHitName; + private String parentQueryNestedPath; + private String queryNestedPath; + private Query query; + private IndexState indexState; + private ShardState shardState; + private SearcherAndTaxonomy searcherAndTaxonomy; + private int startHit; + private int topHits; + private Map queryFields; + private Map retrieveFields; + private HighlightFetchTask highlightFetchTask; + private QuerySortField querySort; + + private InnerHitContextBuilder() {} + + public InnerHitContext build(boolean needValidation) { + try { + return new InnerHitContext(this, needValidation); + } catch (IOException e) { + throw new RuntimeException("Failed to build the InnerHitContext", e); + } + } + + public static InnerHitContextBuilder Builder() { + return new InnerHitContextBuilder(); + } + + public InnerHitContextBuilder withInnerHitName(String innerHitName) { + this.innerHitName = innerHitName; + return this; + } + + public InnerHitContextBuilder withParentQueryNestedPath(String parentQueryNestedPath) { + this.parentQueryNestedPath = parentQueryNestedPath; + return this; + } + + public InnerHitContextBuilder withQueryNestedPath(String queryNestedPath) { + this.queryNestedPath = queryNestedPath; + return this; + } + + public InnerHitContextBuilder withQuery(Query query) { + this.query = query; + return this; + } + + public InnerHitContextBuilder withIndexState(IndexState indexState) { + this.indexState = indexState; + return this; + } + + public InnerHitContextBuilder withShardState(ShardState shardState) { + this.shardState = shardState; + return this; + } + + public InnerHitContextBuilder withSearcherAndTaxonomy(SearcherAndTaxonomy searcherAndTaxonomy) { + this.searcherAndTaxonomy = searcherAndTaxonomy; + return this; + } + + public InnerHitContextBuilder withStartHit(int startHit) { + this.startHit = startHit; + return this; + } + + public InnerHitContextBuilder withTopHits(int topHits) { + this.topHits = topHits; + return this; + } + + public InnerHitContextBuilder withQueryFields(Map queryFields) { + this.queryFields = queryFields; + return this; + } + + public InnerHitContextBuilder withRetrieveFields(Map retrieveFields) { + this.retrieveFields = retrieveFields; + return this; + } + + public InnerHitContextBuilder withHighlightFetchTask(HighlightFetchTask highlightFetchTask) { + this.highlightFetchTask = highlightFetchTask; + return this; + } + + public InnerHitContextBuilder withQuerySort(QuerySortField querySort) { + this.querySort = querySort; + return this; + } + } +} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitFetchTask.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitFetchTask.java new file mode 100644 index 000000000..43109f63f --- /dev/null +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/innerhit/InnerHitFetchTask.java @@ -0,0 +1,131 @@ +/* + * Copyright 2023 Yelp Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yelp.nrtsearch.server.luceneserver.innerhit; + +import com.yelp.nrtsearch.server.grpc.HitsResult; +import com.yelp.nrtsearch.server.grpc.SearchResponse; +import com.yelp.nrtsearch.server.grpc.SearchResponse.Diagnostics; +import com.yelp.nrtsearch.server.grpc.SearchResponse.Diagnostics.Builder; +import com.yelp.nrtsearch.server.grpc.SearchResponse.Hit; +import com.yelp.nrtsearch.server.grpc.TotalHits; +import com.yelp.nrtsearch.server.luceneserver.SearchHandler; +import com.yelp.nrtsearch.server.luceneserver.search.FetchTasks.FetchTask; +import com.yelp.nrtsearch.server.luceneserver.search.SearchContext; +import com.yelp.nrtsearch.server.luceneserver.search.SortParser; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Comparator; +import java.util.List; +import java.util.concurrent.atomic.DoubleAdder; +import org.apache.lucene.index.LeafReaderContext; +import org.apache.lucene.search.FieldDoc; +import org.apache.lucene.search.IndexSearcher; +import org.apache.lucene.search.ScoreDoc; +import org.apache.lucene.search.SortField; +import org.apache.lucene.search.TopDocs; +import org.apache.lucene.search.TopDocsCollector; +import org.apache.lucene.search.join.ParentChildrenBlockJoinQuery; + +/** + * InnerHit fetch task does a mini-scale search per hit against all child documents for this hit. + * Parallelism is at the fetchTask level. + */ +public class InnerHitFetchTask implements FetchTask { + private static final double NS_PER_MS = Math.pow(10, 6); + + public InnerHitContext getInnerHitContext() { + return innerHitContext; + } + + private final InnerHitContext innerHitContext; + + private final DoubleAdder getFieldsTimeMs = new DoubleAdder(); + private final DoubleAdder firstPassSearchTimeMs = new DoubleAdder(); + + public InnerHitFetchTask(InnerHitContext innerHitContext) { + this.innerHitContext = innerHitContext; + } + + public void processHit( + SearchContext searchContext, LeafReaderContext hitLeaf, SearchResponse.Hit.Builder hit) + throws IOException { + long startTime = System.nanoTime(); + IndexSearcher searcher = innerHitContext.getSearcherAndTaxonomy().searcher; + ParentChildrenBlockJoinQuery parentChildrenBlockJoinQuery = + new ParentChildrenBlockJoinQuery( + innerHitContext.getParentFilter(), innerHitContext.getQuery(), hit.getLuceneDocId()); + // All child documents are guaranteed to be stored in the same leaf as the parent document. + // Therefore, a single collector without reduce is sufficient to collect all. + TopDocsCollector topDocsCollector = innerHitContext.getTopDocsCollectorManager().newCollector(); + searcher.search(parentChildrenBlockJoinQuery, topDocsCollector); + TopDocs topDocs = topDocsCollector.topDocs(); + if (innerHitContext.getStartHit() > 0) { + topDocs = + SearchHandler.getHitsFromOffset( + topDocs, innerHitContext.getStartHit(), innerHitContext.getTopHits()); + } + firstPassSearchTimeMs.add(((System.nanoTime() - startTime) / NS_PER_MS)); + + startTime = System.nanoTime(); + HitsResult.Builder innerHitResultBuilder = HitsResult.newBuilder(); + TotalHits totalInnerHits = + TotalHits.newBuilder() + .setRelation(TotalHits.Relation.valueOf(topDocs.totalHits.relation.name())) + .setValue(topDocs.totalHits.value) + .build(); + innerHitResultBuilder.setTotalHits(totalInnerHits); + + for (int innerHitIndex = 0; innerHitIndex < topDocs.scoreDocs.length; innerHitIndex++) { + SearchResponse.Hit.Builder innerHitResponse = innerHitResultBuilder.addHitsBuilder(); + ScoreDoc innerHit = topDocs.scoreDocs[innerHitIndex]; + innerHitResponse.setLuceneDocId(innerHit.doc); + if (!innerHitContext.getSortedFieldNames().isEmpty()) { + // fill the sortedFields + FieldDoc fd = (FieldDoc) innerHit; + for (int i = 0; i < fd.fields.length; ++i) { + SortField sortField = innerHitContext.getSort().getSort()[i]; + innerHitResponse.putSortedFields( + innerHitContext.getSortedFieldNames().get(i), + SortParser.getValueForSortField(sortField, fd.fields[i])); + } + innerHitResponse.setScore(Double.NaN); + } else { + innerHitResponse.setScore(innerHit.score); + } + } + + // sort hits by lucene doc id + List hitBuilders = new ArrayList<>(innerHitResultBuilder.getHitsBuilderList()); + hitBuilders.sort(Comparator.comparingInt(Hit.Builder::getLuceneDocId)); + new SearchHandler.FillDocsTask(innerHitContext, hitBuilders).run(); + + hit.putInnerHits(innerHitContext.getInnerHitName(), innerHitResultBuilder.build()); + + getFieldsTimeMs.add(((System.nanoTime() - startTime) / NS_PER_MS)); + } + + public SearchResponse.Diagnostics getDiagnostic() { + Builder builder = + Diagnostics.newBuilder() + .setFirstPassSearchTimeMs(firstPassSearchTimeMs.doubleValue()) + .setGetFieldsTimeMs(getFieldsTimeMs.doubleValue()); + if (innerHitContext.getFetchTasks().getHighlightFetchTask() != null) { + builder.setHighlightTimeMs( + innerHitContext.getFetchTasks().getHighlightFetchTask().getTimeTakenMs()); + } + return builder.build(); + } +} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/FetchTasks.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/FetchTasks.java index b518baa0b..889d726d0 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/FetchTasks.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/FetchTasks.java @@ -17,6 +17,8 @@ import com.yelp.nrtsearch.server.grpc.SearchResponse; import com.yelp.nrtsearch.server.grpc.SearchResponse.Hit.Builder; +import com.yelp.nrtsearch.server.luceneserver.highlights.HighlightFetchTask; +import com.yelp.nrtsearch.server.luceneserver.innerhit.InnerHitFetchTask; import java.io.IOException; import java.util.List; import java.util.stream.Collectors; @@ -36,6 +38,11 @@ public class FetchTasks { *

b) The {@link FetchTask#processHit(SearchContext, LeafReaderContext, * SearchResponse.Hit.Builder)} method is called for each {@link FetchTask} in order * + *

c) The {@link HighlightFetchTask#processHit(SearchContext, LeafReaderContext, + * SearchResponse.Hit.Builder)} and {@link InnerHitFetchTask#processHit(SearchContext, + * LeafReaderContext, SearchResponse.Hit.Builder)} method is called for each {@link FetchTask} in + * order + * *

2) The {@link FetchTask#processAllHits(SearchContext, List)} method is called for each * {@link FetchTask} in order */ @@ -67,12 +74,47 @@ default void processHit( private final List taskList; + // TopHitsCollector supports highlightFetchTask only for now. Use this to retrieve + // highlightFetchTasks only. + private HighlightFetchTask highlightFetchTask; + private List innerHitFetchTaskList; + + public HighlightFetchTask getHighlightFetchTask() { + return highlightFetchTask; + } + + public List getInnerHitFetchTaskList() { + return innerHitFetchTaskList; + } + + public void setHighlightFetchTask(HighlightFetchTask highlightFetchTask) { + this.highlightFetchTask = highlightFetchTask; + } + + public void setInnerHitFetchTaskList(List innerHitFetchTaskList) { + this.innerHitFetchTaskList = innerHitFetchTaskList; + } + /** * Constructor. * * @param grpcTaskList fetch task definitions from search request */ public FetchTasks(List grpcTaskList) { + this(grpcTaskList, null, null); + } + + /** + * Constructor. + * + * @param grpcTaskList fetch task definitions from search request + * @param highlightFetchTask highlight fetch task + * @param innerHitFetchTaskList innerHit fetch tasks + */ + public FetchTasks( + List grpcTaskList, + HighlightFetchTask highlightFetchTask, + List innerHitFetchTaskList) { taskList = grpcTaskList.stream() .map( @@ -80,6 +122,8 @@ public FetchTasks(List grpcTaskList) { com.yelp.nrtsearch.server.luceneserver.search.FetchTaskCreator.getInstance() .createFetchTask(t)) .collect(Collectors.toList()); + this.highlightFetchTask = highlightFetchTask; + this.innerHitFetchTaskList = innerHitFetchTaskList; } /** @@ -95,6 +139,7 @@ public void processAllHits(SearchContext searchContext, List rescorers; private final SharedDocContext sharedDocContext; - private final HighlightFetchTask highlightFetchTask; private final Map extraContext; + private final String queryNestedPath; private SearchContext(Builder builder, boolean validate) { this.indexState = builder.indexState; @@ -65,8 +64,8 @@ private SearchContext(Builder builder, boolean validate) { this.fetchTasks = builder.fetchTasks; this.rescorers = builder.rescorers; this.sharedDocContext = builder.sharedDocContext; - this.highlightFetchTask = builder.highlightFetchTask; this.extraContext = builder.extraContext; + this.queryNestedPath = builder.queryNestedPath; if (validate) { validate(); @@ -149,14 +148,6 @@ public SharedDocContext getSharedDocContext() { return sharedDocContext; } - /** - * Get {@link HighlightFetchTask} which can be used to build highlights the request. Null if no - * highlights are specified in the request. - */ - public HighlightFetchTask getHighlightFetchTask() { - return highlightFetchTask; - } - /** * Get the extra custom context map which can be used for cache or data sharing. This map should * be threadsafe. @@ -165,6 +156,11 @@ public Map getExtraContext() { return extraContext; } + /** Get the query nested path. By default, it is _root * */ + public String getQueryNestedPath() { + return queryNestedPath; + } + /** Get new context builder instance * */ public static Builder newBuilder() { return new Builder(); @@ -174,7 +170,6 @@ private void validate() { Objects.requireNonNull(indexState); Objects.requireNonNull(shardState); Objects.requireNonNull(searcherAndTaxonomy); - Objects.requireNonNull(responseBuilder); Objects.requireNonNull(queryFields); Objects.requireNonNull(retrieveFields); Objects.requireNonNull(query); @@ -218,8 +213,8 @@ public static class Builder { private FetchTasks fetchTasks; private List rescorers; private SharedDocContext sharedDocContext; - private HighlightFetchTask highlightFetchTask; private Map extraContext; + private String queryNestedPath; private Builder() {} @@ -310,14 +305,13 @@ public Builder setSharedDocContext(SharedDocContext sharedDocContext) { return this; } - /** Set fetch task to generate highlights */ - public Builder setHighlightFetchTask(HighlightFetchTask highlightFetchTask) { - this.highlightFetchTask = highlightFetchTask; + public Builder setExtraContext(Map extraContext) { + this.extraContext = extraContext; return this; } - public Builder setExtraContext(Map extraContext) { - this.extraContext = extraContext; + public Builder setQueryNestedPath(String queryNestedPath) { + this.queryNestedPath = queryNestedPath; return this; } diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/SearchRequestProcessor.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/SearchRequestProcessor.java index 1115a087e..63f6dbf05 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/SearchRequestProcessor.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/SearchRequestProcessor.java @@ -17,6 +17,7 @@ import com.yelp.nrtsearch.server.grpc.CollectorResult; import com.yelp.nrtsearch.server.grpc.Highlight; +import com.yelp.nrtsearch.server.grpc.InnerHit; import com.yelp.nrtsearch.server.grpc.PluginRescorer; import com.yelp.nrtsearch.server.grpc.ProfileResult; import com.yelp.nrtsearch.server.grpc.QueryRescorer; @@ -32,6 +33,9 @@ import com.yelp.nrtsearch.server.luceneserver.field.VirtualFieldDef; import com.yelp.nrtsearch.server.luceneserver.highlights.HighlightFetchTask; import com.yelp.nrtsearch.server.luceneserver.highlights.HighlighterService; +import com.yelp.nrtsearch.server.luceneserver.innerhit.InnerHitContext; +import com.yelp.nrtsearch.server.luceneserver.innerhit.InnerHitContext.InnerHitContextBuilder; +import com.yelp.nrtsearch.server.luceneserver.innerhit.InnerHitFetchTask; import com.yelp.nrtsearch.server.luceneserver.rescore.QueryRescore; import com.yelp.nrtsearch.server.luceneserver.rescore.RescoreOperation; import com.yelp.nrtsearch.server.luceneserver.rescore.RescoreTask; @@ -59,6 +63,7 @@ import java.util.stream.Collectors; import org.apache.lucene.facet.DrillDownQuery; import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; +import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager.SearcherAndTaxonomy; import org.apache.lucene.queryparser.classic.MultiFieldQueryParser; import org.apache.lucene.queryparser.classic.QueryParserBase; import org.apache.lucene.queryparser.simple.SimpleQueryParser; @@ -122,10 +127,19 @@ public static SearchContext buildContextForRequest( addIndexFields(indexState, queryFields); contextBuilder.setQueryFields(Collections.unmodifiableMap(queryFields)); - Map retrieveFields = getRetrieveFields(searchRequest, queryFields); + Map retrieveFields = + getRetrieveFields(searchRequest.getRetrieveFieldsList(), queryFields); contextBuilder.setRetrieveFields(Collections.unmodifiableMap(retrieveFields)); - Query query = extractQuery(indexState, searchRequest); + String rootQueryNestedPath = + indexState.resolveQueryNestedPath(searchRequest.getQueryNestedPath()); + contextBuilder.setQueryNestedPath(rootQueryNestedPath); + Query query = + extractQuery( + indexState, + searchRequest.getQueryText(), + searchRequest.getQuery(), + rootQueryNestedPath); if (profileResult != null) { profileResult.setParsedQuery(query.toString()); } @@ -142,7 +156,33 @@ public static SearchContext buildContextForRequest( } } - contextBuilder.setFetchTasks(new FetchTasks(searchRequest.getFetchTasksList())); + Highlight highlight = searchRequest.getHighlight(); + HighlightFetchTask highlightFetchTask = null; + if (!highlight.getFieldsList().isEmpty()) { + highlightFetchTask = + new HighlightFetchTask(indexState, query, HighlighterService.getInstance(), highlight); + } + + List innerHitFetchTasks = null; + if (searchRequest.getInnerHitsCount() > 0) { + innerHitFetchTasks = + searchRequest.getInnerHitsMap().keySet().stream() + .map( + innerHitName -> + buildInnerHitContext( + indexState, + shardState, + queryFields, + searcherAndTaxonomy, + rootQueryNestedPath, + innerHitName, + searchRequest.getInnerHitsOrThrow(innerHitName))) + .map(InnerHitFetchTask::new) + .collect(Collectors.toList()); + } + + contextBuilder.setFetchTasks( + new FetchTasks(searchRequest.getFetchTasksList(), highlightFetchTask, innerHitFetchTasks)); contextBuilder.setQuery(query); @@ -156,12 +196,6 @@ public static SearchContext buildContextForRequest( getRescorers(indexState, searcherAndTaxonomy.searcher, searchRequest)); contextBuilder.setSharedDocContext(new DefaultSharedDocContext()); - Highlight highlight = searchRequest.getHighlight(); - if (!highlight.getFieldsList().isEmpty()) { - HighlightFetchTask highlightFetchTask = - new HighlightFetchTask(indexState, query, HighlighterService.getInstance(), highlight); - contextBuilder.setHighlightFetchTask(highlightFetchTask); - } contextBuilder.setExtraContext(new ConcurrentHashMap<>()); SearchContext searchContext = contextBuilder.build(true); // Give underlying collectors access to the search context @@ -199,15 +233,15 @@ private static Map getVirtualFields( /** * Get map of fields that need to be retrieved for the given request. * - * @param request search requests + * @param fieldList fields to retrieve * @param queryFields all valid fields for this query * @return map of all fields to retrieve * @throws IllegalArgumentException if a field does not exist, or is not retrievable */ private static Map getRetrieveFields( - SearchRequest request, Map queryFields) { + List fieldList, Map queryFields) { Map retrieveFields = new HashMap<>(); - if (request.getRetrieveFieldsCount() == 1 && request.getRetrieveFields(0).equals(WILDCARD)) { + if (fieldList.size() == 1 && fieldList.get(0).equals(WILDCARD)) { for (Entry entry : queryFields.entrySet()) { if (isRetrievable(entry.getValue())) { retrieveFields.put(entry.getKey(), entry.getValue()); @@ -215,7 +249,7 @@ private static Map getRetrieveFields( } return retrieveFields; } - for (String field : request.getRetrieveFieldsList()) { + for (String field : fieldList) { FieldDef fieldDef = queryFields.get(field); if (fieldDef == null) { throw new IllegalArgumentException("RetrieveFields: " + field + " does not exist"); @@ -265,16 +299,20 @@ private static boolean isRetrievable(FieldDef fieldDef) { * Get the lucene {@link Query} represented by this request. * * @param state index state - * @param searchRequest request + * @param queryText query in text + * @param query query in query objects + * @param queryNestedPath queryNestedPath to query nested fields directly * @return lucene query */ - private static Query extractQuery(IndexState state, SearchRequest searchRequest) { + private static Query extractQuery( + IndexState state, + String queryText, + com.yelp.nrtsearch.server.grpc.Query query, + String queryNestedPath) { Query q; - if (!searchRequest.getQueryText().isEmpty()) { + if (!queryText.isEmpty()) { QueryBuilder queryParser = createQueryParser(state, null); - String queryText = searchRequest.getQueryText(); - try { q = parseQuery(queryParser, queryText); } catch (Exception e) { @@ -282,11 +320,11 @@ private static Query extractQuery(IndexState state, SearchRequest searchRequest) String.format("could not parse queryText: %s", queryText)); } } else { - q = QUERY_NODE_MAPPER.getQuery(searchRequest.getQuery(), state); + q = QUERY_NODE_MAPPER.getQuery(query, state); } if (state.hasNestedChildFields()) { - return QUERY_NODE_MAPPER.applyQueryNestedPath(q, searchRequest.getQueryNestedPath()); + return QUERY_NODE_MAPPER.applyQueryNestedPath(q, state, queryNestedPath); } return q; } @@ -407,4 +445,39 @@ private static List getRescorers( } return rescorers; } + + /** build the {@link InnerHitContext}. */ + private static InnerHitContext buildInnerHitContext( + IndexState indexState, + ShardState shardState, + Map queryFields, + SearcherAndTaxonomy searcherAndTaxonomy, + String parentQueryNestedPath, + String innerHitName, + InnerHit innerHit) { + Query childQuery = + extractQuery(indexState, "", innerHit.getInnerQuery(), innerHit.getQueryNestedPath()); + return InnerHitContextBuilder.Builder() + .withInnerHitName(innerHitName) + .withQuery(childQuery) + .withParentQueryNestedPath(parentQueryNestedPath) + .withQueryNestedPath(innerHit.getQueryNestedPath()) + .withStartHit(innerHit.getStartHit()) + .withTopHits(innerHit.getTopHits()) + .withIndexState(indexState) + .withShardState(shardState) + .withSearcherAndTaxonomy(searcherAndTaxonomy) + .withRetrieveFields(getRetrieveFields(innerHit.getRetrieveFieldsList(), queryFields)) + .withQueryFields(queryFields) + .withQuerySort(innerHit.hasQuerySort() ? innerHit.getQuerySort() : null) + .withHighlightFetchTask( + innerHit.hasHighlight() + ? new HighlightFetchTask( + indexState, + childQuery, + HighlighterService.getInstance(), + innerHit.getHighlight()) + : null) + .build(true); + } } diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TopHitsCollectorManager.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TopHitsCollectorManager.java index e309235cf..5647971e4 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TopHitsCollectorManager.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TopHitsCollectorManager.java @@ -149,6 +149,9 @@ public String getName() { @Override public void setSearchContext(SearchContext searchContext) { this.searchContext = searchContext; + // Backward compatibility: We reuse the highlightFetchTask from the SearchContext + this.retrievalContext.fetchTasks.setHighlightFetchTask( + searchContext.getFetchTasks().getHighlightFetchTask()); } @Override diff --git a/src/test/java/com/yelp/nrtsearch/server/luceneserver/field/ObjectFieldDefTest.java b/src/test/java/com/yelp/nrtsearch/server/luceneserver/field/ObjectFieldDefTest.java index 7fd8f1b41..39741ce8b 100644 --- a/src/test/java/com/yelp/nrtsearch/server/luceneserver/field/ObjectFieldDefTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/luceneserver/field/ObjectFieldDefTest.java @@ -15,6 +15,7 @@ */ package com.yelp.nrtsearch.server.luceneserver.field; +import static org.assertj.core.api.AssertionsForClassTypes.assertThatThrownBy; import static org.junit.Assert.assertEquals; import com.google.gson.Gson; @@ -24,6 +25,7 @@ import com.google.protobuf.Value; import com.yelp.nrtsearch.server.grpc.*; import com.yelp.nrtsearch.server.luceneserver.ServerTestCase; +import io.grpc.StatusRuntimeException; import io.grpc.testing.GrpcCleanupRule; import java.io.IOException; import java.util.ArrayList; @@ -499,6 +501,21 @@ public void testQueryNestedPath() { assertDataFields(response, "pickup_partners.name", "AAA", "BBB"); } + @Test + public void testQueryNestedPath_notNested() { + assertThatThrownBy( + () -> + doQueryWithNestedPath( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("real_id").setTextValue("1").build()) + .build(), + List.of("pickup_partners.name"), + "doc_id")) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining("Nested path is not a nested object field: doc_id"); + } + @Test public void testRetrieveObjectField() throws IOException { SearchResponse response = diff --git a/src/test/java/com/yelp/nrtsearch/server/luceneserver/innerhit/innerHitTest.java b/src/test/java/com/yelp/nrtsearch/server/luceneserver/innerhit/innerHitTest.java new file mode 100644 index 000000000..0b85e89de --- /dev/null +++ b/src/test/java/com/yelp/nrtsearch/server/luceneserver/innerhit/innerHitTest.java @@ -0,0 +1,1026 @@ +/* + * Copyright 2020 Yelp Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package com.yelp.nrtsearch.server.luceneserver.innerhit; + +import static org.assertj.core.api.AssertionsForClassTypes.*; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.yelp.nrtsearch.server.grpc.*; +import com.yelp.nrtsearch.server.luceneserver.ServerTestCase; +import io.grpc.StatusRuntimeException; +import io.grpc.testing.GrpcCleanupRule; +import java.io.IOException; +import java.util.*; +import org.junit.ClassRule; +import org.junit.Test; + +public class innerHitTest extends ServerTestCase { + + @ClassRule public static final GrpcCleanupRule grpcCleanup = new GrpcCleanupRule(); + + protected List getIndices() { + return Collections.singletonList(DEFAULT_TEST_INDEX); + } + + protected Gson gson = new GsonBuilder().serializeNulls().create(); + + protected FieldDefRequest getIndexDef(String name) throws IOException { + return getFieldsFromResourceFile("/registerFieldsInnerHit.json"); + } + + protected void initIndex(String name) throws Exception { + List docs = new ArrayList<>(); + + AddDocumentRequest request = + AddDocumentRequest.newBuilder() + .setIndexName(name) + .putFields( + "real_id", AddDocumentRequest.MultiValuedField.newBuilder().addValue("1").build()) + .putFields( + "branch_id", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("101").build()) + .putFields( + "location", + AddDocumentRequest.MultiValuedField.newBuilder() + .addAllValue(Arrays.asList("1.234", "1.567")) + .build()) + .putFields( + "street_number", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("6").build()) + .putFields( + "street_name", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("nice street").build()) + .putFields( + "employees", + AddDocumentRequest.MultiValuedField.newBuilder() + .addValue( + gson.toJson( + Map.of( + "employee_id", + "12", + "name", + "Tom", + "age", + "26", + "motto", + "I love my work place and my work culture."))) + .addValue( + gson.toJson( + Map.of( + "employee_id", + "13", + "name", + "Lily", + "age", + "45", + "motto", + "work hard play hard"))) + .build()) + .putFields( + "food", + AddDocumentRequest.MultiValuedField.newBuilder() + .addValue( + gson.toJson( + Map.of( + "price", + "1.2", + "name", + "ice cone", + "description", + "Best dessert that everyone loves so much."))) + .addValue( + gson.toJson( + Map.of( + "price", + "1.3", + "name", + "cheeseburger", + "description", + "Who doesn't love such a juicy burger. Just love it."))) + .build()) + .build(); + docs.add(request); + + request = + AddDocumentRequest.newBuilder() + .setIndexName(name) + .putFields( + "real_id", AddDocumentRequest.MultiValuedField.newBuilder().addValue("2").build()) + .putFields( + "branch_id", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("102").build()) + .putFields( + "location", + AddDocumentRequest.MultiValuedField.newBuilder() + .addAllValue(Arrays.asList("-1.234", "-1.567")) + .build()) + .putFields( + "street_number", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("86").build()) + .putFields( + "street_name", + AddDocumentRequest.MultiValuedField.newBuilder().addValue("good avenue").build()) + .putFields( + "employees", + AddDocumentRequest.MultiValuedField.newBuilder() + .addValue( + gson.toJson( + Map.of( + "employee_id", + "48", + "name", + "Jack", + "age", + "26", + "motto", + "I am into the work vibe here."))) + .addValue( + gson.toJson( + Map.of( + "employee_id", + "19", + "name", + "Rose", + "age", + "45", + "motto", + "No pain no gain."))) + .build()) + .putFields( + "food", + AddDocumentRequest.MultiValuedField.newBuilder() + .addValue( + gson.toJson( + Map.of( + "price", + "1.4", + "name", + "deluxe ice cone", + "description", + "Best edition of the most loved ice cone."))) + .addValue( + gson.toJson( + Map.of( + "price", + "1.1", + "name", + "hamburger", + "description", + "No cheese, but in great value. Love its yummy taste."))) + .build()) + .build(); + docs.add(request); + + addDocuments(docs.stream()); + } + + @Test + public void testEmptyParentQuery() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(2); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("101"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("ice cone"); + + assertThat(response.getHits(1).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(1).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(1) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + } + + @Test + public void testEmptyChildQuery() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(2); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("deluxe ice cone"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(1) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + } + + @Test + public void testEmptyParentAndChildQuery() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(2); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("101"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(2); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("ice cone"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(1) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("cheeseburger"); + + assertThat(response.getHits(1).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(1).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(2); + assertThat( + response + .getHits(1) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("deluxe ice cone"); + assertThat( + response + .getHits(1) + .getInnerHitsMap() + .get("menu") + .getHits(1) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + } + + @Test + public void testBasic() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + } + + @Test + public void testTwoInnerHits() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .putInnerHits( + "staff", + InnerHit.newBuilder() + .setQueryNestedPath("employees") + .setStartHit(0) + .setTopHits(10) + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("employees.age") + .setLower("30"))) + .addAllRetrieveFields(List.of("employees.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + assertThat(response.getHits(0).getInnerHitsMap().get("staff").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("staff") + .getHits(0) + .getFieldsOrThrow("employees.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("Rose"); + } + + @Test + public void testNoNestedQueryPath() { + assertThatThrownBy( + () -> + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder() + .setField("branch_id") + .setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setStartHit(0) + .setTopHits(10) + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build())) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining("queryNestedPath in InnerHit [menu] cannot be empty"); + } + + @Test + public void test_nestedQueryPath_notRegistered() { + assertThatThrownBy( + () -> + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder() + .setField("branch_id") + .setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setStartHit(0) + .setTopHits(10) + .setQueryNestedPath("abcdefg") + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build())) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining( + "field \"abcdefg\" is unknown: it was not registered with registerField"); + } + + @Test + public void test_nestedQueryPath_notNested() { + assertThatThrownBy( + () -> + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder() + .setField("branch_id") + .setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setStartHit(0) + .setTopHits(10) + .setQueryNestedPath("food_not_nested") + .setInnerQuery( + Query.newBuilder() + .setRangeQuery( + RangeQuery.newBuilder() + .setField("food.price") + .setUpper("1.2"))) + .addAllRetrieveFields(List.of("food_not_nested.name")) + .build()) + .build())) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining("Nested path is not a nested object field: food_not_nested"); + } + + @Test + public void testStartHit() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(1) + .setTopHits(10) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + } + + @Test + public void testLargeStartHit() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(8) + .setTopHits(10) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(0); + } + + @Test + public void testTopHits() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(1) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("deluxe ice cone"); + } + + @Test + public void testTopHitsSmallerThanStartHit() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(2) + .setTopHits(1) + .addAllRetrieveFields(List.of("food.name")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(0); + } + + @Test + public void testRetrieveFields() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(1) + .addAllRetrieveFields( + List.of( + "food.name", + "food.price", + "food.description", + "real_id", + "branch_id")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("deluxe ice cone"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.price") + .getFieldValue(0) + .getDoubleValue()) + .isEqualTo(1.4); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.description") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("Best edition of the most loved ice cone."); + + // parent's field: only _ID field can be retrieved from the innerHit + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("real_id") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("2"); + + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("branch_id") + .getFieldValueCount()) + .isEqualTo(0); + } + + @Test + public void testBadRetrieveFields() { + assertThatThrownBy( + () -> + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder() + .setField("branch_id") + .setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(1) + .addAllRetrieveFields(List.of("food.abcdefg")) + .build()) + .build())) + .isInstanceOf(StatusRuntimeException.class) + .hasMessageContaining("RetrieveFields: food.abcdefg does not exist"); + } + + @Test + public void testSortedFields() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "menu", + InnerHit.newBuilder() + .setQueryNestedPath("food") + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("food.name", "food.price")) + .setQuerySort( + QuerySortField.newBuilder() + .setFields( + SortFields.newBuilder() + .addSortedFields( + SortType.newBuilder().setFieldName("food.price")))) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("menu").getHitsCount()).isEqualTo(2); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("hamburger"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(0) + .getFieldsOrThrow("food.price") + .getFieldValue(0) + .getDoubleValue()) + .isEqualTo(1.1); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(1) + .getFieldsOrThrow("food.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("deluxe ice cone"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("menu") + .getHits(1) + .getFieldsOrThrow("food.price") + .getFieldValue(0) + .getDoubleValue()) + .isEqualTo(1.4); + } + + @Test + public void testHighlightFields() { + SearchResponse response = + getGrpcServer() + .getBlockingStub() + .search( + SearchRequest.newBuilder() + .setIndexName(DEFAULT_TEST_INDEX) + .setStartHit(0) + .setTopHits(10) + .setQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder().setField("branch_id").setTextValue("102"))) + .addAllRetrieveFields(List.of("branch_id")) + .putInnerHits( + "staff", + InnerHit.newBuilder() + .setQueryNestedPath("employees") + .setStartHit(0) + .setTopHits(10) + .addAllRetrieveFields(List.of("employees.name")) + .setHighlight( + Highlight.newBuilder() + .setSettings( + Highlight.Settings.newBuilder() + .setHighlighterType(Highlight.Type.FAST_VECTOR) + .setHighlightQuery( + Query.newBuilder() + .setTermQuery( + TermQuery.newBuilder() + .setField("employees.motto") + .setTextValue("work")))) + .addFields("employees.motto")) + .build()) + .build()); + + assertThat(response.getHitsCount()).isEqualTo(1); + + assertThat(response.getHits(0).getFieldsOrThrow("branch_id").getFieldValue(0).getTextValue()) + .isEqualTo("102"); + assertThat(response.getHits(0).getInnerHitsMap().get("staff").getHitsCount()).isEqualTo(2); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("staff") + .getHits(0) + .getFieldsOrThrow("employees.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("Jack"); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("staff") + .getHits(0) + .getHighlightsOrThrow("employees.motto") + .getFragmentsList()) + .isEqualTo(List.of("I am into the work vibe here.")); + assertThat( + response + .getHits(0) + .getInnerHitsMap() + .get("staff") + .getHits(1) + .getFieldsOrThrow("employees.name") + .getFieldValue(0) + .getTextValue()) + .isEqualTo("Rose"); + assertThat(response.getHits(0).getInnerHitsMap().get("staff").getHits(1).getHighlightsCount()) + .isEqualTo(0); + } +} diff --git a/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/SearchContextTest.java b/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/SearchContextTest.java index f01d8d462..346f12071 100644 --- a/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/SearchContextTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/SearchContextTest.java @@ -120,11 +120,6 @@ public void testMissingSearcher() throws Exception { getCompleteBuilder().setSearcherAndTaxonomy(null).build(true); } - @Test(expected = NullPointerException.class) - public void testMissingResponseBuilder() throws Exception { - getCompleteBuilder().setResponseBuilder(null).build(true); - } - @Test(expected = IllegalStateException.class) public void testMissingTimestamp() throws Exception { getCompleteBuilder().setTimestampSec(-1).build(true); diff --git a/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TermsCollectorManagerTest.java b/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TermsCollectorManagerTest.java index f049ecf60..9e248d589 100644 --- a/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TermsCollectorManagerTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/luceneserver/search/collectors/additional/TermsCollectorManagerTest.java @@ -20,6 +20,7 @@ import com.yelp.nrtsearch.server.collectors.BucketOrder; import com.yelp.nrtsearch.server.grpc.FieldDefRequest; +import com.yelp.nrtsearch.server.grpc.SearchRequest; import com.yelp.nrtsearch.server.grpc.TermsCollector; import com.yelp.nrtsearch.server.luceneserver.IndexState; import com.yelp.nrtsearch.server.luceneserver.ServerTestCase; @@ -47,7 +48,12 @@ public void testFieldNotExist() throws IOException { try { s = shardState.acquire(); CollectorCreatorContext context = - new CollectorCreatorContext(null, indexState, shardState, indexState.getAllFields(), s); + new CollectorCreatorContext( + SearchRequest.newBuilder().build(), + indexState, + shardState, + indexState.getAllFields(), + s); TermsCollector termsCollector = TermsCollector.newBuilder().setField("not_exist").setSize(10).build(); try { @@ -76,7 +82,12 @@ public void testNoDocValues() throws IOException { try { s = shardState.acquire(); CollectorCreatorContext context = - new CollectorCreatorContext(null, indexState, shardState, indexState.getAllFields(), s); + new CollectorCreatorContext( + SearchRequest.newBuilder().build(), + indexState, + shardState, + indexState.getAllFields(), + s); TermsCollector termsCollector = TermsCollector.newBuilder().setField("no_doc_values").setSize(10).build(); try { diff --git a/src/test/resources/registerFieldsInnerHit.json b/src/test/resources/registerFieldsInnerHit.json new file mode 100644 index 000000000..4158b2c81 --- /dev/null +++ b/src/test/resources/registerFieldsInnerHit.json @@ -0,0 +1,123 @@ +{ + "indexName": "test_index", + "field": [ + { + "name": "real_id", + "type": "_ID", + "search": true, + "store": true + }, + { + "name": "branch_id", + "type": "ATOM", + "search": true, + "storeDocValues": true + }, + { + "name": "location", + "type": "LAT_LON", + "search": true, + "storeDocValues": true + }, + { + "name": "street_name", + "type": "TEXT", + "search": true, + "store": true + }, + { + "name": "street_number", + "type": "INT", + "search": true, + "storeDocValues": true + }, + { + "name": "employees", + "type": "OBJECT", + "nestedDoc": true, + "multiValued": true, + "childFields": [ + { + "name": "employee_id", + "type": "ATOM", + "search": true, + "storeDocValues": true + }, + { + "name": "name", + "type": "TEXT", + "search": true, + "store": true + }, + { + "name": "age", + "type": "INT", + "search": true, + "storeDocValues": true + }, + { + "name": "motto", + "type": "TEXT", + "search": true, + "store": true, + "tokenize": true, + "termVectors": "TERMS_POSITIONS_OFFSETS" + } + ] + },{ + "name": "food", + "type": "OBJECT", + "nestedDoc": true, + "multiValued": true, + "childFields": [ + { + "name": "name", + "type": "TEXT", + "search": true, + "store": true + }, + { + "name": "price", + "type": "DOUBLE", + "search": true, + "storeDocValues": true + }, + { + "name": "description", + "type": "TEXT", + "search": true, + "store": true, + "tokenize": true, + "termVectors": "TERMS_POSITIONS_OFFSETS" + } + ] + },{ + "name": "food_not_nested", + "type": "OBJECT", + "nestedDoc": false, + "multiValued": true, + "childFields": [ + { + "name": "name", + "type": "TEXT", + "search": true, + "store": true + }, + { + "name": "price", + "type": "DOUBLE", + "search": true, + "storeDocValues": true + }, + { + "name": "description", + "type": "TEXT", + "search": true, + "store": true, + "tokenize": true, + "termVectors": "TERMS_POSITIONS_OFFSETS" + } + ] + } + ] +} \ No newline at end of file