diff --git a/clientlib/src/main/proto/yelp/nrtsearch/search.proto b/clientlib/src/main/proto/yelp/nrtsearch/search.proto index ba5e67231..a36a03744 100644 --- a/clientlib/src/main/proto/yelp/nrtsearch/search.proto +++ b/clientlib/src/main/proto/yelp/nrtsearch/search.proto @@ -868,7 +868,7 @@ message Facet { string dim = 1; //Dimension (field) repeated string paths = 2; //Prefix path to facet 'under' repeated NumericRangeType numericRange = 3; //Custom numeric ranges. Field must be indexed with facet=numericRange. - bool useOrdsCache = 4; // True if the ordinals cache should be used + bool useOrdsCache = 4 [deprecated = true]; // True if the ordinals cache should be used repeated string labels = 5; // Specific facet labels to retrieve int32 topN = 6; //How many top facets to return Script script = 7; //FacetScript definition to use in place of index facet diff --git a/grpc-gateway/search.pb.go b/grpc-gateway/search.pb.go index 35cd2478b..9b57f8664 100644 --- a/grpc-gateway/search.pb.go +++ b/grpc-gateway/search.pb.go @@ -5173,15 +5173,16 @@ type Facet struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Dim string `protobuf:"bytes,1,opt,name=dim,proto3" json:"dim,omitempty"` //Dimension (field) - Paths []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` //Prefix path to facet 'under' - NumericRange []*NumericRangeType `protobuf:"bytes,3,rep,name=numericRange,proto3" json:"numericRange,omitempty"` //Custom numeric ranges. Field must be indexed with facet=numericRange. - UseOrdsCache bool `protobuf:"varint,4,opt,name=useOrdsCache,proto3" json:"useOrdsCache,omitempty"` // True if the ordinals cache should be used - Labels []string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty"` // Specific facet labels to retrieve - TopN int32 `protobuf:"varint,6,opt,name=topN,proto3" json:"topN,omitempty"` //How many top facets to return - Script *Script `protobuf:"bytes,7,opt,name=script,proto3" json:"script,omitempty"` //FacetScript definition to use in place of index facet - SampleTopDocs int32 `protobuf:"varint,8,opt,name=sampleTopDocs,proto3" json:"sampleTopDocs,omitempty"` //Facet over the top N ranked documents, instead of all hits. Only works with field doc values. - Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` //Name for this facet + Dim string `protobuf:"bytes,1,opt,name=dim,proto3" json:"dim,omitempty"` //Dimension (field) + Paths []string `protobuf:"bytes,2,rep,name=paths,proto3" json:"paths,omitempty"` //Prefix path to facet 'under' + NumericRange []*NumericRangeType `protobuf:"bytes,3,rep,name=numericRange,proto3" json:"numericRange,omitempty"` //Custom numeric ranges. Field must be indexed with facet=numericRange. + // Deprecated: Do not use. + UseOrdsCache bool `protobuf:"varint,4,opt,name=useOrdsCache,proto3" json:"useOrdsCache,omitempty"` // True if the ordinals cache should be used + Labels []string `protobuf:"bytes,5,rep,name=labels,proto3" json:"labels,omitempty"` // Specific facet labels to retrieve + TopN int32 `protobuf:"varint,6,opt,name=topN,proto3" json:"topN,omitempty"` //How many top facets to return + Script *Script `protobuf:"bytes,7,opt,name=script,proto3" json:"script,omitempty"` //FacetScript definition to use in place of index facet + SampleTopDocs int32 `protobuf:"varint,8,opt,name=sampleTopDocs,proto3" json:"sampleTopDocs,omitempty"` //Facet over the top N ranked documents, instead of all hits. Only works with field doc values. + Name string `protobuf:"bytes,9,opt,name=name,proto3" json:"name,omitempty"` //Name for this facet } func (x *Facet) Reset() { @@ -5237,6 +5238,7 @@ func (x *Facet) GetNumericRange() []*NumericRangeType { return nil } +// Deprecated: Do not use. func (x *Facet) GetUseOrdsCache() bool { if x != nil { return x.UseOrdsCache @@ -10196,483 +10198,483 @@ var file_yelp_nrtsearch_search_proto_rawDesc = []byte{ 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, + 0x22, 0xaf, 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, - 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, 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, - 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, + 0x63, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x26, 0x0a, 0x0c, 0x75, 0x73, 0x65, 0x4f, 0x72, 0x64, + 0x73, 0x43, 0x61, 0x63, 0x68, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, + 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, 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, 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, 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, + 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, 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, 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, - 0xba, 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, 0x2e, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x48, 0x00, - 0x52, 0x03, 0x6d, 0x69, 0x6e, 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, - 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, + 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, 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, 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, 0xba, 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, 0x2e, 0x0a, 0x03, 0x6d, 0x69, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, 0x69, 0x6e, 0x43, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x69, 0x6e, 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, 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, 0x42, 0x0d, 0x0a, 0x0b, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x22, 0x4d, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, 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, + 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, 0x4d, 0x0a, 0x0c, 0x4d, 0x69, 0x6e, 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, 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, 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, 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, 0x52, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x67, 0x69, 0x6e, 0x67, 0x48, 0x69, - 0x74, 0x73, 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, 0xfd, 0x0a, 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, + 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, 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, 0x52, 0x0a, 0x0b, 0x4c, 0x6f, 0x67, 0x67, 0x69, + 0x6e, 0x67, 0x48, 0x69, 0x74, 0x73, 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, 0xfd, 0x0a, 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, 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, 0xa5, - 0x08, 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, + 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, 0xa5, 0x08, 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, 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, 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, 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, 0x12, 0x47, 0x0a, 0x10, 0x62, 0x6f, 0x75, 0x6e, - 0x64, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x18, 0x0d, 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, 0x0f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, - 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x63, 0x68, - 0x61, 0x72, 0x73, 0x18, 0x0e, 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, 0x0d, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, - 0x79, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x11, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, - 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x18, 0x0f, 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, - 0x0f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x53, 0x63, 0x61, 0x6e, - 0x12, 0x54, 0x0a, 0x17, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x63, 0x61, - 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, 0x10, 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, - 0x15, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x53, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x72, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 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, 0x22, 0xe7, 0x01, 0x0a, 0x08, 0x4b, 0x6e, 0x6e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 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, - 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x6b, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x01, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, 0x5f, 0x63, 0x61, 0x6e, - 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6e, - 0x75, 0x6d, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x03, - 0x28, 0x02, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x2a, 0x0a, 0x11, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x5f, 0x76, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x42, 0x79, 0x74, 0x65, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x62, - 0x6f, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x62, 0x6f, 0x6f, 0x73, - 0x74, 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, 0xb0, 0x01, 0x0a, 0x0a, 0x52, - 0x65, 0x67, 0x65, 0x78, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x47, - 0x45, 0x58, 0x50, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x47, - 0x45, 0x58, 0x50, 0x5f, 0x41, 0x4e, 0x59, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x01, 0x12, - 0x14, 0x0a, 0x10, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x41, 0x55, 0x54, 0x4f, 0x4d, 0x41, - 0x54, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, - 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, - 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x04, 0x12, 0x17, - 0x0a, 0x13, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x53, 0x45, - 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, 0x47, 0x45, 0x58, - 0x50, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x10, 0x06, 0x12, 0x0f, 0x0a, 0x0b, - 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x07, 0x2a, 0xa6, 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, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x45, 0x4f, 0x5f, 0x50, 0x4f, 0x4c, - 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x15, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x50, 0x41, 0x4e, 0x5f, 0x51, - 0x55, 0x45, 0x52, 0x59, 0x10, 0x16, 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, + 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, 0x12, 0x47, 0x0a, 0x10, + 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x72, + 0x18, 0x0d, 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, 0x0f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x53, 0x63, + 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x12, 0x43, 0x0a, 0x0e, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, + 0x79, 0x5f, 0x63, 0x68, 0x61, 0x72, 0x73, 0x18, 0x0e, 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, 0x0d, 0x62, 0x6f, 0x75, + 0x6e, 0x64, 0x61, 0x72, 0x79, 0x43, 0x68, 0x61, 0x72, 0x73, 0x12, 0x48, 0x0a, 0x11, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x18, + 0x0f, 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, 0x0f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x4d, 0x61, 0x78, + 0x53, 0x63, 0x61, 0x6e, 0x12, 0x54, 0x0a, 0x17, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, + 0x5f, 0x73, 0x63, 0x61, 0x6e, 0x6e, 0x65, 0x72, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 0x18, + 0x10, 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, 0x15, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x61, 0x72, 0x79, 0x53, 0x63, 0x61, + 0x6e, 0x6e, 0x65, 0x72, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x65, 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, 0x22, 0xe7, 0x01, 0x0a, 0x08, + 0x4b, 0x6e, 0x6e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2b, + 0x0a, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 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, 0x06, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x6b, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x6b, 0x12, 0x25, 0x0a, 0x0e, 0x6e, 0x75, 0x6d, + 0x5f, 0x63, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x43, 0x61, 0x6e, 0x64, 0x69, 0x64, 0x61, 0x74, 0x65, 0x73, + 0x12, 0x21, 0x0a, 0x0c, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x18, 0x05, 0x20, 0x03, 0x28, 0x02, 0x52, 0x0b, 0x71, 0x75, 0x65, 0x72, 0x79, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x12, 0x2a, 0x0a, 0x11, 0x71, 0x75, 0x65, 0x72, 0x79, 0x5f, 0x62, 0x79, 0x74, + 0x65, 0x5f, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x42, 0x79, 0x74, 0x65, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x62, 0x6f, 0x6f, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, + 0x62, 0x6f, 0x6f, 0x73, 0x74, 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, 0xb0, + 0x01, 0x0a, 0x0a, 0x52, 0x65, 0x67, 0x65, 0x78, 0x70, 0x46, 0x6c, 0x61, 0x67, 0x12, 0x0e, 0x0a, + 0x0a, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, + 0x10, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x41, 0x4e, 0x59, 0x53, 0x54, 0x52, 0x49, 0x4e, + 0x47, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x41, 0x55, + 0x54, 0x4f, 0x4d, 0x41, 0x54, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x52, 0x45, 0x47, + 0x45, 0x58, 0x50, 0x5f, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x03, + 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x45, 0x4d, 0x50, 0x54, 0x59, + 0x10, 0x04, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x53, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x13, 0x0a, 0x0f, 0x52, + 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x56, 0x41, 0x4c, 0x10, 0x06, + 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x47, 0x45, 0x58, 0x50, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, + 0x07, 0x2a, 0xa6, 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, 0x12, 0x0f, 0x0a, 0x0b, 0x47, 0x45, 0x4f, + 0x5f, 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x15, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x50, + 0x41, 0x4e, 0x5f, 0x51, 0x55, 0x45, 0x52, 0x59, 0x10, 0x16, 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 ( diff --git a/src/main/java/com/yelp/nrtsearch/server/doc/LoadedDocValues.java b/src/main/java/com/yelp/nrtsearch/server/doc/LoadedDocValues.java index 048926251..f10bc7251 100644 --- a/src/main/java/com/yelp/nrtsearch/server/doc/LoadedDocValues.java +++ b/src/main/java/com/yelp/nrtsearch/server/doc/LoadedDocValues.java @@ -920,10 +920,10 @@ public SortedStrings(SortedSetDocValues docValues) { public void setDocId(int docID) throws IOException { values.clear(); if (docValues.advanceExact(docID)) { - long ord = docValues.nextOrd(); - while (ord != SortedSetDocValues.NO_MORE_ORDS) { + int count = docValues.docValueCount(); + for (int i = 0; i < count; ++i) { + long ord = docValues.nextOrd(); values.add(docValues.lookupOrd(ord).utf8ToString()); - ord = docValues.nextOrd(); } } } diff --git a/src/main/java/com/yelp/nrtsearch/server/facet/DrillSidewaysImpl.java b/src/main/java/com/yelp/nrtsearch/server/facet/DrillSidewaysImpl.java index 85db9516c..051f486ba 100644 --- a/src/main/java/com/yelp/nrtsearch/server/facet/DrillSidewaysImpl.java +++ b/src/main/java/com/yelp/nrtsearch/server/facet/DrillSidewaysImpl.java @@ -56,7 +56,6 @@ import org.apache.lucene.facet.sortedset.SortedSetDocValuesFacetCounts; import org.apache.lucene.facet.taxonomy.FastTaxonomyFacetCounts; import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; -import org.apache.lucene.facet.taxonomy.TaxonomyFacetCounts; import org.apache.lucene.facet.taxonomy.TaxonomyReader; import org.apache.lucene.search.DocIdSetIterator; import org.apache.lucene.search.IndexSearcher; @@ -454,7 +453,6 @@ private static com.yelp.nrtsearch.server.grpc.FacetResult getFieldFacetResult( } FacetsCollector c = dsDimMap.get(fieldDef.getName()); - boolean useCachedOrds = facet.getUseOrdsCache(); Facets luceneFacets; if (c != null) { @@ -463,21 +461,12 @@ private static com.yelp.nrtsearch.server.grpc.FacetResult getFieldFacetResult( // drill-sideways collector: String indexFieldName = indexState.getFacetsConfig().getDimConfig(fieldDef.getName()).indexFieldName; - if (useCachedOrds) { - luceneFacets = - new TaxonomyFacetCounts( - shardState.getOrdsCache(indexFieldName), - searcherAndTaxonomyManager.taxonomyReader, - indexState.getFacetsConfig(), - c); - } else { - luceneFacets = - new FastTaxonomyFacetCounts( - indexFieldName, - searcherAndTaxonomyManager.taxonomyReader, - indexState.getFacetsConfig(), - c); - } + luceneFacets = + new FastTaxonomyFacetCounts( + indexFieldName, + searcherAndTaxonomyManager.taxonomyReader, + indexState.getFacetsConfig(), + c); } else { // nocommit test both normal & ssdv facets in same index @@ -489,21 +478,12 @@ private static com.yelp.nrtsearch.server.grpc.FacetResult getFieldFacetResult( Map facetsMap = indexFieldNameToFacets; luceneFacets = facetsMap.get(indexFieldName); if (luceneFacets == null) { - if (useCachedOrds) { - luceneFacets = - new TaxonomyFacetCounts( - shardState.getOrdsCache(indexFieldName), - searcherAndTaxonomyManager.taxonomyReader, - indexState.getFacetsConfig(), - drillDowns); - } else { - luceneFacets = - new FastTaxonomyFacetCounts( - indexFieldName, - searcherAndTaxonomyManager.taxonomyReader, - indexState.getFacetsConfig(), - drillDowns); - } + luceneFacets = + new FastTaxonomyFacetCounts( + indexFieldName, + searcherAndTaxonomyManager.taxonomyReader, + indexState.getFacetsConfig(), + drillDowns); facetsMap.put(indexFieldName, luceneFacets); } } diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/AddDocumentHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/AddDocumentHandler.java index 39032b631..39fea137d 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/AddDocumentHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/AddDocumentHandler.java @@ -394,7 +394,7 @@ public long runIndexingJob() throws Exception { logger.debug( String.format( "running indexing job on threadId: %s", - Thread.currentThread().getName() + Thread.currentThread().getId())); + Thread.currentThread().getName() + Thread.currentThread().threadId())); Queue documents = new LinkedBlockingDeque<>(); IndexState indexState; ShardState shardState; @@ -425,7 +425,7 @@ public long runIndexingJob() throws Exception { logger.warn( String.format( "ThreadId: %s, IndexWriter.addDocuments failed", - Thread.currentThread().getName() + Thread.currentThread().getId())); + Thread.currentThread().getName() + Thread.currentThread().threadId())); throw new IOException(e); } } else { @@ -448,13 +448,13 @@ public long runIndexingJob() throws Exception { logger.warn( String.format( "ThreadId: %s, IndexWriter.addDocuments failed", - Thread.currentThread().getName() + Thread.currentThread().getId())); + Thread.currentThread().getName() + Thread.currentThread().threadId())); throw new IOException(e); } logger.debug( String.format( "indexing job on threadId: %s done with SequenceId: %s", - Thread.currentThread().getName() + Thread.currentThread().getId(), + Thread.currentThread().getName() + Thread.currentThread().threadId(), shardState.writer.getMaxCompletedSequenceNumber())); return shardState.writer.getMaxCompletedSequenceNumber(); } diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteAllDocumentsHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteAllDocumentsHandler.java index f28731ad6..f75b6e7c1 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteAllDocumentsHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteAllDocumentsHandler.java @@ -52,7 +52,7 @@ private DeleteAllDocumentsResponse handle(IndexState indexState) } catch (IOException e) { logger.warn( "ThreadId: {}, writer.deleteAll failed", - Thread.currentThread().getName() + Thread.currentThread().getId()); + Thread.currentThread().getName() + Thread.currentThread().threadId()); throw new DeleteAllDocumentsHandlerException(e); } return DeleteAllDocumentsResponse.newBuilder().setGenId(String.valueOf(gen)).build(); diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteByQueryHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteByQueryHandler.java index 980fdac5c..ccef17372 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteByQueryHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteByQueryHandler.java @@ -59,7 +59,7 @@ private AddDocumentResponse handle( } catch (IOException e) { logger.warn( "ThreadId: {}, writer.deleteDocuments failed", - Thread.currentThread().getName() + Thread.currentThread().getId()); + Thread.currentThread().getName() + Thread.currentThread().threadId()); throw new DeleteByQueryHandlerException(e); } long genId = shardState.writer.getMaxCompletedSequenceNumber(); diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteDocumentsHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteDocumentsHandler.java index 687365f50..aaa45a9be 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteDocumentsHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteDocumentsHandler.java @@ -68,7 +68,7 @@ private AddDocumentResponse handleInternal( } catch (IOException e) { logger.warn( "ThreadId: {}, writer.deleteDocuments failed", - Thread.currentThread().getName() + Thread.currentThread().getId()); + Thread.currentThread().getName() + Thread.currentThread().threadId()); throw new DeleteDocumentsHandlerException(e); } long genId = shardState.writer.getMaxCompletedSequenceNumber(); diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteIndexHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteIndexHandler.java index 88e420a3d..9d7477056 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/DeleteIndexHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/DeleteIndexHandler.java @@ -46,7 +46,7 @@ private DeleteIndexResponse handle(IndexState indexState) throws DeleteIndexHand } catch (IOException e) { logger.warn( "ThreadId: {}, deleteIndex failed", - Thread.currentThread().getName() + Thread.currentThread().getId()); + Thread.currentThread().getName() + Thread.currentThread().threadId()); throw new DeleteIndexHandlerException(e); } return DeleteIndexResponse.newBuilder().setOk("ok").build(); diff --git a/src/main/java/com/yelp/nrtsearch/server/handler/SearchHandler.java b/src/main/java/com/yelp/nrtsearch/server/handler/SearchHandler.java index 108171a18..6eb023f34 100644 --- a/src/main/java/com/yelp/nrtsearch/server/handler/SearchHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/handler/SearchHandler.java @@ -61,13 +61,16 @@ import java.util.ArrayList; import java.util.Comparator; import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.*; 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.document.Document; import org.apache.lucene.facet.DrillDownQuery; import org.apache.lucene.facet.DrillSideways; import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; @@ -780,12 +783,15 @@ private List> fillFields( for (int hitIndex = 0; hitIndex < hitBuilders.size(); ++hitIndex) { values.add(new HashMap<>()); } + + StoredFields storedFields = s.storedFields(); for (String field : fields) { for (int hitIndex = 0; hitIndex < hitBuilders.size(); ++hitIndex) { var hitResponse = hitBuilders.get(hitIndex); LeafReaderContext leaf = hitIdToleaves.get(hitIndex); CompositeFieldValue v = - getFieldForHit(s, hitResponse, leaf, field, searchContext.getRetrieveFields()); + getFieldForHit( + s, hitResponse, leaf, field, searchContext.getRetrieveFields(), storedFields); values.get(hitIndex).put(field, v); } } @@ -802,7 +808,8 @@ private CompositeFieldValue getFieldForHit( Hit.Builder hit, LeafReaderContext leaf, String field, - Map dynamicFields) + Map dynamicFields, + StoredFields storedFields) throws IOException { assert field != null; CompositeFieldValue.Builder compositeFieldValue = CompositeFieldValue.newBuilder(); @@ -856,7 +863,8 @@ public boolean advanceExact(int doc) throws IOException { } // retrieve stored fields else if (fd instanceof IndexableFieldDef indexableFieldDef && indexableFieldDef.isStored()) { - IndexableField[] values = s.doc(hit.getLuceneDocId()).getFields(field); + IndexableField[] values = + storedFields.document(hit.getLuceneDocId(), Set.of(field)).getFields(field); for (IndexableField fieldValue : values) { compositeFieldValue.addFieldValue( indexableFieldDef.getStoredFieldValue(fieldValue.storedValue())); @@ -881,6 +889,31 @@ public static class FillDocsTask implements Runnable { private final List docChunk; private final Query explainQuery; + record NameAndFieldDef(String name, IndexableFieldDef fieldDef) {} + + record StoredFieldFetchContext( + StoredFields storedFields, + Set fieldNames, + List nameAndFieldDefs) {} + + static StoredFieldFetchContext getStoredFieldFetchContext(FieldFetchContext fieldFetchContext) + throws IOException { + List storedFieldEntries = new ArrayList<>(); + Set storedFieldNames = new HashSet<>(); + for (Map.Entry fieldDefEntry : + fieldFetchContext.getRetrieveFields().entrySet()) { + if (fieldDefEntry.getValue() instanceof IndexableFieldDef indexableFieldDef + && indexableFieldDef.isStored()) { + storedFieldEntries.add(new NameAndFieldDef(fieldDefEntry.getKey(), indexableFieldDef)); + storedFieldNames.add(fieldDefEntry.getKey()); + } + } + return new StoredFieldFetchContext( + fieldFetchContext.getSearcherAndTaxonomy().searcher.storedFields(), + storedFieldNames, + storedFieldEntries); + } + /** * Constructor. * @@ -902,6 +935,13 @@ public FillDocsTask( public void run() { List leaves = fieldFetchContext.getSearcherAndTaxonomy().searcher.getIndexReader().leaves(); + StoredFieldFetchContext storedFieldFetchContext; + try { + storedFieldFetchContext = getStoredFieldFetchContext(fieldFetchContext); + } catch (IOException e) { + throw new RuntimeException(e); + } + int hitIndex = 0; // process documents, grouped by lucene segment while (hitIndex < docChunk.size()) { @@ -911,7 +951,8 @@ public void run() { // get all hits in the same segment and process them together for better resource reuse List sliceHits = getSliceHits(docChunk, hitIndex, sliceSegment); try { - fetchSlice(fieldFetchContext, explainQuery, sliceHits, sliceSegment); + fetchSlice( + fieldFetchContext, explainQuery, sliceHits, sliceSegment, storedFieldFetchContext); } catch (IOException e) { throw new RuntimeException("Error fetching field data", e); } @@ -949,7 +990,8 @@ private static void fetchSlice( FieldFetchContext context, Query explainQuery, List sliceHits, - LeafReaderContext sliceSegment) + LeafReaderContext sliceSegment, + StoredFieldFetchContext storedFieldFetchContext) throws IOException { for (Map.Entry fieldDefEntry : context.getRetrieveFields().entrySet()) { if (fieldDefEntry.getValue() instanceof VirtualFieldDef) { @@ -968,9 +1010,7 @@ private static void fetchSlice( IndexableFieldDef indexableFieldDef = (IndexableFieldDef) fieldDefEntry.getValue(); if (indexableFieldDef.hasDocValues()) { fetchFromDocVales(sliceHits, sliceSegment, fieldDefEntry.getKey(), indexableFieldDef); - } else if (indexableFieldDef.isStored()) { - fetchFromStored(context, sliceHits, fieldDefEntry.getKey(), indexableFieldDef); - } else { + } else if (!indexableFieldDef.isStored()) { throw new IllegalStateException( "No valid method to retrieve indexable field: " + fieldDefEntry.getKey()); } @@ -980,6 +1020,16 @@ private static void fetchSlice( } } + // fetch stored fields by document + if (!storedFieldFetchContext.fieldNames.isEmpty()) { + for (Hit.Builder hit : sliceHits) { + Document document = + storedFieldFetchContext.storedFields.document( + hit.getLuceneDocId(), storedFieldFetchContext.fieldNames); + fetchFromStored(hit, storedFieldFetchContext.nameAndFieldDefs, document); + } + } + // execute any per hit fetch tasks Query resolvedExplainQuery = null; if (context.isExplain()) { @@ -1071,19 +1121,15 @@ private static void fetchFromDocVales( /** Fetch field value stored in the index */ private static void fetchFromStored( - FieldFetchContext context, - List sliceHits, - String name, - IndexableFieldDef indexableFieldDef) - throws IOException { - for (SearchResponse.Hit.Builder hit : sliceHits) { + Hit.Builder hit, List nameAndFieldDefs, Document document) { + for (NameAndFieldDef nameAndFieldDef : nameAndFieldDefs) { + String name = nameAndFieldDef.name(); + IndexableField[] values = document.getFields(name); SearchResponse.Hit.CompositeFieldValue.Builder compositeFieldValue = SearchResponse.Hit.CompositeFieldValue.newBuilder(); - IndexableField[] values = - context.getSearcherAndTaxonomy().searcher.doc(hit.getLuceneDocId()).getFields(name); for (IndexableField fieldValue : values) { compositeFieldValue.addFieldValue( - indexableFieldDef.getStoredFieldValue(fieldValue.storedValue())); + nameAndFieldDef.fieldDef().getStoredFieldValue(fieldValue.storedValue())); } hit.putFields(name, compositeFieldValue.build()); } diff --git a/src/main/java/com/yelp/nrtsearch/server/index/ShardState.java b/src/main/java/com/yelp/nrtsearch/server/index/ShardState.java index 492f417dd..ffe2fe336 100644 --- a/src/main/java/com/yelp/nrtsearch/server/index/ShardState.java +++ b/src/main/java/com/yelp/nrtsearch/server/index/ShardState.java @@ -48,9 +48,6 @@ import org.apache.lucene.facet.FacetsConfig; import org.apache.lucene.facet.sortedset.DefaultSortedSetDocValuesReaderState; import org.apache.lucene.facet.sortedset.SortedSetDocValuesReaderState; -import org.apache.lucene.facet.taxonomy.CachedOrdinalsReader; -import org.apache.lucene.facet.taxonomy.DocValuesOrdinalsReader; -import org.apache.lucene.facet.taxonomy.OrdinalsReader; import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; import org.apache.lucene.facet.taxonomy.directory.DirectoryTaxonomyWriter; import org.apache.lucene.index.DirectoryReader; @@ -127,12 +124,6 @@ public class ShardState implements Closeable { /** Maps snapshot gen -> version. */ public final Map snapshotGenToVersion = new ConcurrentHashMap<>(); - /** - * Holds cached ordinals; doesn't use any RAM unless it's actually used when a caller sets - * useOrdsCache=true. - */ - private final Map ordsCache = new HashMap<>(); - /** * Enables lookup of previously used searchers, so follow-on actions (next page, drill * down/sideways/up, etc.) use the same searcher as the original search, as long as that searcher @@ -841,16 +832,6 @@ public IndexSearcher newSearcher(IndexReader r, IndexReader previousReader) { } }; - /** Returns cached ordinals for the specified index field name. */ - public synchronized OrdinalsReader getOrdsCache(String indexFieldName) { - OrdinalsReader ords = ordsCache.get(indexFieldName); - if (ords == null) { - ords = new CachedOrdinalsReader(new DocValuesOrdinalsReader(indexFieldName)); - ordsCache.put(indexFieldName, ords); - } - return ords; - } - public SortedSetDocValuesReaderState getSSDVState( IndexState indexState, SearcherTaxonomyManager.SearcherAndTaxonomy s, FieldDef fd) throws IOException { @@ -889,7 +870,8 @@ public SortedSetDocValuesReaderState getSSDVStateForReader( } if (ssdvState == null) { ssdvState = - new DefaultSortedSetDocValuesReaderState(reader, dimConfig.indexFieldName) { + new DefaultSortedSetDocValuesReaderState( + reader, dimConfig.indexFieldName, indexState.getFacetsConfig()) { @Override public SortedSetDocValues getDocValues() throws IOException { SortedSetDocValues values = super.getDocValues(); diff --git a/src/main/java/com/yelp/nrtsearch/server/innerhit/InnerHitContext.java b/src/main/java/com/yelp/nrtsearch/server/innerhit/InnerHitContext.java index 87fb02789..1adc30ec3 100644 --- a/src/main/java/com/yelp/nrtsearch/server/innerhit/InnerHitContext.java +++ b/src/main/java/com/yelp/nrtsearch/server/innerhit/InnerHitContext.java @@ -36,8 +36,8 @@ import org.apache.lucene.search.Query; 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.TopFieldCollectorManager; +import org.apache.lucene.search.TopScoreDocCollectorManager; /** * Object to store all necessary context information for {@link InnerHitFetchTask} to search and @@ -93,13 +93,12 @@ private InnerHitContext(InnerHitContextBuilder builder, boolean needValidation) // relevance collector this.sortContext = null; this.topDocsCollectorManager = - TopScoreDocCollector.createSharedManager(topHits, null, Integer.MAX_VALUE); + new TopScoreDocCollectorManager(topHits, null, Integer.MAX_VALUE); } else { // sortedField collector this.sortContext = new SortContext(builder.querySort, queryFields); this.topDocsCollectorManager = - TopFieldCollector.createSharedManager( - sortContext.getSort(), topHits, null, Integer.MAX_VALUE); + new TopFieldCollectorManager(sortContext.getSort(), topHits, null, Integer.MAX_VALUE); } if (needValidation) { diff --git a/src/main/java/com/yelp/nrtsearch/server/query/QueryNodeMapper.java b/src/main/java/com/yelp/nrtsearch/server/query/QueryNodeMapper.java index 20879e5c1..bf122a377 100644 --- a/src/main/java/com/yelp/nrtsearch/server/query/QueryNodeMapper.java +++ b/src/main/java/com/yelp/nrtsearch/server/query/QueryNodeMapper.java @@ -619,12 +619,10 @@ private static Query getPrefixQuery(PrefixQuery prefixQuery, IndexState state) { "Field \"" + prefixQuery.getField() + "\" is not indexed with terms"); } - org.apache.lucene.search.PrefixQuery query = - new org.apache.lucene.search.PrefixQuery( - new Term(prefixQuery.getField(), prefixQuery.getPrefix())); - query.setRewriteMethod( - getRewriteMethod(prefixQuery.getRewrite(), prefixQuery.getRewriteTopTermsSize())); - return query; + MultiTermQuery.RewriteMethod rewriteMethod = + getRewriteMethod(prefixQuery.getRewrite(), prefixQuery.getRewriteTopTermsSize()); + return new org.apache.lucene.search.PrefixQuery( + new Term(prefixQuery.getField(), prefixQuery.getPrefix()), rewriteMethod); } private static MultiTermQuery.RewriteMethod getRewriteMethod( @@ -695,15 +693,17 @@ private SpanMultiTermQueryWrapper getSpanMultiTermQueryWrapper( switch (wrappedQueryCase) { case WILDCARDQUERY: + MultiTermQuery.RewriteMethod rewriteMethod = + getRewriteMethod( + protoSpanMultiTermQuery.getWildcardQuery().getRewrite(), + protoSpanMultiTermQuery.getWildcardQuery().getRewriteTopTermsSize()); WildcardQuery wildcardQuery = new WildcardQuery( new Term( protoSpanMultiTermQuery.getWildcardQuery().getField(), - protoSpanMultiTermQuery.getWildcardQuery().getText())); - wildcardQuery.setRewriteMethod( - getRewriteMethod( - protoSpanMultiTermQuery.getWildcardQuery().getRewrite(), - protoSpanMultiTermQuery.getWildcardQuery().getRewriteTopTermsSize())); + protoSpanMultiTermQuery.getWildcardQuery().getText()), + Operations.DEFAULT_DETERMINIZE_WORK_LIMIT, + rewriteMethod); return new SpanMultiTermQueryWrapper<>(wildcardQuery); case FUZZYQUERY: FuzzyQuery fuzzyQuery = getFuzzyQuery(protoSpanMultiTermQuery); @@ -755,11 +755,10 @@ private static FuzzyQuery getFuzzyQuery( ? protoFuzzyQuery.getTranspositions() : FuzzyQuery.defaultTranspositions; - FuzzyQuery fuzzyQuery = - new FuzzyQuery(term, maxEdits, prefixLength, maxExpansions, transpositions); - fuzzyQuery.setRewriteMethod( - getRewriteMethod(protoFuzzyQuery.getRewrite(), protoFuzzyQuery.getRewriteTopTermsSize())); - return fuzzyQuery; + MultiTermQuery.RewriteMethod rewriteMethod = + getRewriteMethod(protoFuzzyQuery.getRewrite(), protoFuzzyQuery.getRewriteTopTermsSize()); + return new FuzzyQuery( + term, maxEdits, prefixLength, maxExpansions, transpositions, rewriteMethod); } private static RegexpQuery getRegexpQuery( @@ -788,25 +787,24 @@ private static RegexpQuery getRegexpQuery( ? protoRegexpQuery.getMaxDeterminizedStates() : Operations.DEFAULT_DETERMINIZE_WORK_LIMIT; - RegexpQuery regexpQuery = new RegexpQuery(term, flags, maxDeterminizedStates); - regexpQuery.setRewriteMethod( - getRewriteMethod(protoRegexpQuery.getRewrite(), protoRegexpQuery.getRewriteTopTermsSize())); - return regexpQuery; + MultiTermQuery.RewriteMethod rewriteMethod = + getRewriteMethod(protoRegexpQuery.getRewrite(), protoRegexpQuery.getRewriteTopTermsSize()); + return new RegexpQuery( + term, flags, 0, RegexpQuery.DEFAULT_PROVIDER, maxDeterminizedStates, rewriteMethod); } private static TermRangeQuery getTermRangeQuery( com.yelp.nrtsearch.server.grpc.TermRangeQuery protoTermRangeQuery) { - TermRangeQuery termRangeQuery = - new TermRangeQuery( - protoTermRangeQuery.getField(), - new BytesRef(protoTermRangeQuery.getLowerTerm()), - new BytesRef(protoTermRangeQuery.getUpperTerm()), - protoTermRangeQuery.getIncludeLower(), - protoTermRangeQuery.getIncludeUpper()); - termRangeQuery.setRewriteMethod( + MultiTermQuery.RewriteMethod rewriteMethod = getRewriteMethod( - protoTermRangeQuery.getRewrite(), protoTermRangeQuery.getRewriteTopTermsSize())); - return termRangeQuery; + protoTermRangeQuery.getRewrite(), protoTermRangeQuery.getRewriteTopTermsSize()); + return new TermRangeQuery( + protoTermRangeQuery.getField(), + new BytesRef(protoTermRangeQuery.getLowerTerm()), + new BytesRef(protoTermRangeQuery.getUpperTerm()), + protoTermRangeQuery.getIncludeLower(), + protoTermRangeQuery.getIncludeUpper(), + rewriteMethod); } } diff --git a/src/main/java/com/yelp/nrtsearch/server/search/MyIndexSearcher.java b/src/main/java/com/yelp/nrtsearch/server/search/MyIndexSearcher.java index 43884ee0f..85134de95 100644 --- a/src/main/java/com/yelp/nrtsearch/server/search/MyIndexSearcher.java +++ b/src/main/java/com/yelp/nrtsearch/server/search/MyIndexSearcher.java @@ -258,7 +258,8 @@ protected void search(List leaves, Weight weight, Collector c BulkScorer scorer = weight.bulkScorer(ctx); if (scorer != null) { try { - scorer.score(leafCollector, ctx.reader().getLiveDocs()); + scorer.score( + leafCollector, ctx.reader().getLiveDocs(), 0, DocIdSetIterator.NO_MORE_DOCS); } catch (CollectionTerminatedException e) { // collection was terminated prematurely // continue with the following leaf diff --git a/src/main/java/com/yelp/nrtsearch/server/search/collectors/RelevanceCollector.java b/src/main/java/com/yelp/nrtsearch/server/search/collectors/RelevanceCollector.java index ffa9b6bfb..59f915d07 100644 --- a/src/main/java/com/yelp/nrtsearch/server/search/collectors/RelevanceCollector.java +++ b/src/main/java/com/yelp/nrtsearch/server/search/collectors/RelevanceCollector.java @@ -26,6 +26,7 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TopScoreDocCollector; +import org.apache.lucene.search.TopScoreDocCollectorManager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -52,7 +53,7 @@ public RelevanceCollector( } else if (context.getRequest().getTotalHitsThreshold() != 0) { totalHitsThreshold = context.getRequest().getTotalHitsThreshold(); } - manager = TopScoreDocCollector.createSharedManager(topHits, searchAfter, totalHitsThreshold); + manager = new TopScoreDocCollectorManager(topHits, searchAfter, totalHitsThreshold); } @Override diff --git a/src/main/java/com/yelp/nrtsearch/server/search/collectors/SortFieldCollector.java b/src/main/java/com/yelp/nrtsearch/server/search/collectors/SortFieldCollector.java index 48306a0b5..4f83d719e 100644 --- a/src/main/java/com/yelp/nrtsearch/server/search/collectors/SortFieldCollector.java +++ b/src/main/java/com/yelp/nrtsearch/server/search/collectors/SortFieldCollector.java @@ -28,6 +28,7 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.TopDocs; import org.apache.lucene.search.TopFieldCollector; +import org.apache.lucene.search.TopFieldCollectorManager; import org.apache.lucene.search.TopFieldDocs; import org.apache.lucene.util.BytesRef; import org.slf4j.Logger; @@ -68,7 +69,7 @@ public SortFieldCollector( sortContext = new SortContext(context.getRequest().getQuerySort(), context.getQueryFields()); manager = - TopFieldCollector.createSharedManager( + new TopFieldCollectorManager( sortContext.getSort(), topHits, searchAfter, totalHitsThreshold); } diff --git a/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/OrdinalTermsCollectorManager.java b/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/OrdinalTermsCollectorManager.java index bcb6c0d98..3994e0bf6 100644 --- a/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/OrdinalTermsCollectorManager.java +++ b/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/OrdinalTermsCollectorManager.java @@ -15,8 +15,6 @@ */ package com.yelp.nrtsearch.server.search.collectors.additional; -import static org.apache.lucene.index.SortedSetDocValues.NO_MORE_ORDS; - import com.yelp.nrtsearch.server.collectors.BucketOrder; import com.yelp.nrtsearch.server.field.IndexableFieldDef; import com.yelp.nrtsearch.server.field.properties.GlobalOrdinalable; @@ -212,14 +210,14 @@ public void setScorer(Scorable scorer) throws IOException { @Override public void collect(int doc) throws IOException { if (docValues.advanceExact(doc)) { - long ord = docValues.nextOrd(); - while (ord != NO_MORE_ORDS) { + int count = docValues.docValueCount(); + for (int i = 0; i < count; i++) { + long ord = docValues.nextOrd(); long globalOrd = segmentOrdsMapping.get(ord); countsMap.addTo(globalOrd, 1); if (nestedLeafCollectors != null) { nestedLeafCollectors.collect(globalOrd, doc); } - ord = docValues.nextOrd(); } } } diff --git a/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/TopHitsCollectorManager.java b/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/TopHitsCollectorManager.java index 46540075e..4287b6f25 100644 --- a/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/TopHitsCollectorManager.java +++ b/src/main/java/com/yelp/nrtsearch/server/search/collectors/additional/TopHitsCollectorManager.java @@ -47,8 +47,8 @@ import org.apache.lucene.search.ScoreDoc; import org.apache.lucene.search.ScoreMode; import org.apache.lucene.search.TopDocs; -import org.apache.lucene.search.TopFieldCollector; -import org.apache.lucene.search.TopScoreDocCollector; +import org.apache.lucene.search.TopFieldCollectorManager; +import org.apache.lucene.search.TopScoreDocCollectorManager; /** Additional collector that collects top hits based on relevance score or sorting. */ public class TopHitsCollectorManager @@ -122,11 +122,11 @@ public TopHitsCollectorManager( if (grpcTopHitsCollector.hasQuerySort()) { sortContext = new SortContext(grpcTopHitsCollector.getQuerySort(), context.getQueryFields()); collectorManager = - TopFieldCollector.createSharedManager( + new TopFieldCollectorManager( sortContext.getSort(), grpcTopHitsCollector.getTopHits(), null, Integer.MAX_VALUE); } else { collectorManager = - TopScoreDocCollector.createSharedManager( + new TopScoreDocCollectorManager( grpcTopHitsCollector.getTopHits(), null, Integer.MAX_VALUE); sortContext = null; } diff --git a/src/main/java/com/yelp/nrtsearch/server/state/GlobalState.java b/src/main/java/com/yelp/nrtsearch/server/state/GlobalState.java index ccc621bcb..ca6178606 100644 --- a/src/main/java/com/yelp/nrtsearch/server/state/GlobalState.java +++ b/src/main/java/com/yelp/nrtsearch/server/state/GlobalState.java @@ -38,7 +38,6 @@ import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Future; -import org.apache.lucene.search.TimeLimitingCollector; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -144,12 +143,6 @@ public CountDownLatch getShutdownLatch() { @Override public void close() throws IOException { indexExecutor.shutdown(); - TimeLimitingCollector.getGlobalTimerThread().stopTimer(); - try { - TimeLimitingCollector.getGlobalTimerThread().join(); - } catch (InterruptedException ie) { - throw new RuntimeException(ie); - } } /** Get base directory for all index data. */ diff --git a/src/main/java/com/yelp/nrtsearch/tools/cli/AddDocumentsCommand.java b/src/main/java/com/yelp/nrtsearch/tools/cli/AddDocumentsCommand.java index 35a8f2ffb..f55d59a80 100644 --- a/src/main/java/com/yelp/nrtsearch/tools/cli/AddDocumentsCommand.java +++ b/src/main/java/com/yelp/nrtsearch/tools/cli/AddDocumentsCommand.java @@ -89,7 +89,9 @@ public Integer call() throws Exception { Path filePath = Paths.get(getFileName()); if (fileType.equalsIgnoreCase("csv")) { Reader reader = Files.newBufferedReader(filePath); - CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader()); + CSVParser csvParser = + new CSVParser( + reader, CSVFormat.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()); addDocumentRequestStream = new NrtsearchClientBuilder.AddDocumentsClientBuilder(indexName, csvParser) .buildRequest(filePath); diff --git a/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/LegacyVersionManager.java b/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/LegacyVersionManager.java index 586dda480..e77110931 100644 --- a/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/LegacyVersionManager.java +++ b/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/LegacyVersionManager.java @@ -20,6 +20,7 @@ import com.amazonaws.services.s3.model.S3Object; import com.google.inject.Inject; import java.io.IOException; +import java.nio.charset.StandardCharsets; import org.apache.commons.io.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -68,8 +69,9 @@ long getListedLatestVersionNumber(String versionPath) throws IOException { String latestVersionFile = String.format("%s/_latest_version", versionPath); if (s3.doesObjectExist(bucketName, latestVersionFile)) { try (final S3Object s3Object = s3.getObject(bucketName, latestVersionFile); ) { - final String versionString = IOUtils.toString(s3Object.getObjectContent()); - return Integer.valueOf(versionString); + final String versionString = + IOUtils.toString(s3Object.getObjectContent(), StandardCharsets.UTF_8); + return Integer.parseInt(versionString); } } return version; @@ -162,7 +164,7 @@ public String getVersionString( final String absoluteResourcePath = String.format("%s/_version/%s/%s", serviceName, resource, version); try (final S3Object s3Object = s3.getObject(bucketName, absoluteResourcePath)) { - return IOUtils.toString(s3Object.getObjectContent()); + return IOUtils.toString(s3Object.getObjectContent(), StandardCharsets.UTF_8); } } } diff --git a/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/state/LegacyStateCommandUtils.java b/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/state/LegacyStateCommandUtils.java index 701df11ff..555d4d2b2 100644 --- a/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/state/LegacyStateCommandUtils.java +++ b/src/main/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/state/LegacyStateCommandUtils.java @@ -42,7 +42,7 @@ import org.apache.commons.compress.archivers.tar.TarArchiveEntry; import org.apache.commons.compress.archivers.tar.TarArchiveInputStream; import org.apache.commons.compress.archivers.tar.TarArchiveOutputStream; -import org.apache.commons.compress.utils.IOUtils; +import org.apache.commons.io.IOUtils; public class LegacyStateCommandUtils { private static final String INDEX_STATE_SUFFIX = "-state"; @@ -170,9 +170,9 @@ public static String getStateFileContentsFromS3( String stateStr = null; try (TarArchiveInputStream tarArchiveInputStream = new TarArchiveInputStream(new LZ4FrameInputStream(contents))) { - for (TarArchiveEntry tarArchiveEntry = tarArchiveInputStream.getNextTarEntry(); + for (TarArchiveEntry tarArchiveEntry = tarArchiveInputStream.getNextEntry(); tarArchiveEntry != null; - tarArchiveEntry = tarArchiveInputStream.getNextTarEntry()) { + tarArchiveEntry = tarArchiveInputStream.getNextEntry()) { if (tarArchiveEntry.getName().endsWith(stateFileName)) { byte[] fileData = tarArchiveInputStream.readNBytes((int) tarArchiveEntry.getSize()); stateStr = fromUTF8(fileData); diff --git a/src/test/java/com/yelp/nrtsearch/server/ServerTestCase.java b/src/test/java/com/yelp/nrtsearch/server/ServerTestCase.java index 731efe8b3..bc26cdbfe 100644 --- a/src/test/java/com/yelp/nrtsearch/server/ServerTestCase.java +++ b/src/test/java/com/yelp/nrtsearch/server/ServerTestCase.java @@ -169,7 +169,9 @@ public void onCompleted() { public static void addDocsFromResourceFile(String index, String resourceFile) throws Exception { Path filePath = Paths.get(ServerTestCase.class.getResource(resourceFile).toURI()); Reader reader = Files.newBufferedReader(filePath); - CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader()); + CSVParser csvParser = + new CSVParser( + reader, CSVFormat.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()); Stream requestStream = new NrtsearchClientBuilder.AddDocumentsClientBuilder(index, csvParser) .buildRequest(filePath); diff --git a/src/test/java/com/yelp/nrtsearch/server/facet/FacetTopHitsTest.java b/src/test/java/com/yelp/nrtsearch/server/facet/FacetTopHitsTest.java index 2e7f0889d..5c66f9134 100644 --- a/src/test/java/com/yelp/nrtsearch/server/facet/FacetTopHitsTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/facet/FacetTopHitsTest.java @@ -540,7 +540,6 @@ public void testWithNonTopDocsFacet() { Facet.newBuilder() .setName("numeric_range") .setDim("long_field") - .setUseOrdsCache(false) .addAllNumericRange(numericRangeTypes) .setTopN(20) .build(); diff --git a/src/test/java/com/yelp/nrtsearch/server/facet/NumberFieldFacetsTest.java b/src/test/java/com/yelp/nrtsearch/server/facet/NumberFieldFacetsTest.java index e7070397f..bee7263e5 100644 --- a/src/test/java/com/yelp/nrtsearch/server/facet/NumberFieldFacetsTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/facet/NumberFieldFacetsTest.java @@ -31,7 +31,6 @@ import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; -import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; @@ -49,8 +48,7 @@ public class NumberFieldFacetsTest extends ServerTestCase { "long_number_facet_field", "double_number_facet_field" }); - private static final List numericValues = - Arrays.asList(new String[] {"1", "10", "20", "30"}); + private static final List numericValues = Arrays.asList("1", "10", "20", "30"); private Map getFieldsMapForOneDocument( String value) { @@ -85,21 +83,10 @@ public void initIndex(String name) throws Exception { addDocuments(documents.stream()); } - private SearchResponse getSearchResponse(String dimension, String... paths) { - return getSearchResponse(dimension, false, Collections.emptyList(), paths); - } - private SearchResponse getSearchResponse( - String dimension, - boolean useOrdsCache, - List numericRangeTypes, - String... paths) { + String dimension, List numericRangeTypes, String... paths) { Facet.Builder facetBuilder = - Facet.newBuilder() - .setDim(dimension) - .setTopN(10) - .setUseOrdsCache(useOrdsCache) - .addAllNumericRange(numericRangeTypes); + Facet.newBuilder().setDim(dimension).setTopN(10).addAllNumericRange(numericRangeTypes); facetBuilder.addAllPaths(Arrays.asList(paths)); return getGrpcServer() .getBlockingStub() @@ -149,13 +136,13 @@ private void assertNumericRangeFacet(String fieldName) { .setMax(20L) .setMaxInclusive(true) .build()); - SearchResponse response = getSearchResponse(fieldName, false, numericRangeTypes); + SearchResponse response = getSearchResponse(fieldName, numericRangeTypes); assertEquals(1, response.getFacetResultCount()); List facetResults = response.getFacetResultList(); List expectedLabelAndValues = new ArrayList<>(); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("1-10").setValue(2.0).build()); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("11-20").setValue(1.0).build()); - assertFacetResult(facetResults.get(0), fieldName, 3, 2L, expectedLabelAndValues); + assertFacetResult(facetResults.getFirst(), fieldName, 3, 2L, expectedLabelAndValues); } static void assertFacetResult( diff --git a/src/test/java/com/yelp/nrtsearch/server/facet/TextFieldFacetsTest.java b/src/test/java/com/yelp/nrtsearch/server/facet/TextFieldFacetsTest.java index 58147b231..9868d5fcc 100644 --- a/src/test/java/com/yelp/nrtsearch/server/facet/TextFieldFacetsTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/facet/TextFieldFacetsTest.java @@ -175,13 +175,7 @@ public void initIndex(String name) throws Exception { } private SearchResponse getSearchResponse(String dimension, String... paths) { - return getSearchResponse(dimension, false, paths); - } - - private SearchResponse getSearchResponse( - String dimension, boolean useOrdsCache, String... paths) { - Facet.Builder facetBuilder = - Facet.newBuilder().setDim(dimension).setTopN(10).setUseOrdsCache(useOrdsCache); + Facet.Builder facetBuilder = Facet.newBuilder().setDim(dimension).setTopN(10); facetBuilder.addAllPaths(Arrays.asList(paths)); return getGrpcServer() .getBlockingStub() @@ -203,7 +197,7 @@ public void testSortedDocValuesFacet() { expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("Doe").setValue(1.0).build()); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("Smith").setValue(1.0).build()); assertFacetResult( - facetResults.get(0), "sorted_doc_values_facet_field", 4, 3L, expectedLabelAndValues); + facetResults.getFirst(), "sorted_doc_values_facet_field", -1, 3L, expectedLabelAndValues); } @Test @@ -214,7 +208,7 @@ public void testSortedDocValuesSingleValued() { List expectedLabelAndValues = new ArrayList<>(); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("John").setValue(3.0).build()); assertFacetResult( - facetResults.get(0), + facetResults.getFirst(), "sorted_doc_values_facet_field_single_valued", 3, 1L, @@ -264,13 +258,8 @@ public void assertFacetResultMatch(SearchResponse response) { expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("home").setValue(1.0).build()); // NOTE: total number of buckets/value returned by FastTaxonomyFacetCounts is -1 on multivalued // fields. - assertFacetResult(facetResults.get(0), "hierarchy_facet_field", -1, 4L, expectedLabelAndValues); - } - - @Test - public void testHierarchyMultivaluedNoPathUseOrdinalsCache() { - SearchResponse response = getSearchResponse("hierarchy_facet_field", true); - assertFacetResultMatch(response); + assertFacetResult( + facetResults.getFirst(), "hierarchy_facet_field", -1, 4L, expectedLabelAndValues); } @Test @@ -283,7 +272,7 @@ public void testHierarchyWithPath() { // NOTE: total number of buckets/value returned by FastTaxonomyFacetCounts is -1 on multivalued // fields. assertFacetResult( - facetResults.get(0), "hierarchy_facet_field", -1, 2L, expectedLabelAndValues, "home"); + facetResults.getFirst(), "hierarchy_facet_field", -1, 2L, expectedLabelAndValues, "home"); response = getSearchResponse("hierarchy_facet_field", "home", "john"); facetResults = response.getFacetResultList(); @@ -294,7 +283,7 @@ public void testHierarchyWithPath() { // NOTE: total number of buckets/value returned by FastTaxonomyFacetCounts is -1 on multivalued // fields. assertFacetResult( - facetResults.get(0), + facetResults.getFirst(), "hierarchy_facet_field", -1, 2L, @@ -311,7 +300,11 @@ public void testHierarchySingleValued() { List expectedLabelAndValues = new ArrayList<>(); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("John").setValue(3.0).build()); assertFacetResult( - facetResults.get(0), "hierarchy_facet_field_single_valued", 3, 1L, expectedLabelAndValues); + facetResults.getFirst(), + "hierarchy_facet_field_single_valued", + 3, + 1L, + expectedLabelAndValues); } @Test @@ -325,7 +318,7 @@ public void testFlatMultivalued() { expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("Smith").setValue(1.0).build()); // NOTE: total number of buckets/value returned by FastTaxonomyFacetCounts is -1 on multivalued // fields. - assertFacetResult(facetResults.get(0), "flat_facet_field", -1, 3L, expectedLabelAndValues); + assertFacetResult(facetResults.getFirst(), "flat_facet_field", -1, 3L, expectedLabelAndValues); } @Test @@ -336,7 +329,7 @@ public void testFlatSingleValued() { List expectedLabelAndValues = new ArrayList<>(); expectedLabelAndValues.add(LabelAndValue.newBuilder().setLabel("John").setValue(3.0).build()); assertFacetResult( - facetResults.get(0), "flat_facet_field_single_valued", 3, 1L, expectedLabelAndValues); + facetResults.getFirst(), "flat_facet_field_single_valued", 3, 1L, expectedLabelAndValues); } private void assertFacetResult( diff --git a/src/test/java/com/yelp/nrtsearch/server/facet/VirtualFieldFacetsTest.java b/src/test/java/com/yelp/nrtsearch/server/facet/VirtualFieldFacetsTest.java index f2978a622..24881a64c 100644 --- a/src/test/java/com/yelp/nrtsearch/server/facet/VirtualFieldFacetsTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/facet/VirtualFieldFacetsTest.java @@ -69,17 +69,12 @@ private List buildDocuments(String indexName) { private SearchResponse getSearchResponse( String dimension, - boolean useOrdsCache, List numericRangeTypes, String scriptSource, Map params, String... paths) { Facet.Builder facetBuilder = - Facet.newBuilder() - .setDim(dimension) - .setTopN(10) - .setUseOrdsCache(useOrdsCache) - .addAllNumericRange(numericRangeTypes); + Facet.newBuilder().setDim(dimension).setTopN(10).addAllNumericRange(numericRangeTypes); facetBuilder.addAllPaths(Arrays.asList(paths)); return getGrpcServer() @@ -136,7 +131,7 @@ public void testVirtualField() { String dim = "virtual_field_js_script"; SearchResponse response = getSearchResponse( - dim, false, numericRangeTypes, "int_number_facet_field*5.0", Collections.emptyMap()); + dim, numericRangeTypes, "int_number_facet_field*5.0", Collections.emptyMap()); assertEquals(1, response.getFacetResultCount()); List facetResults = response.getFacetResultList(); List expectedLabelAndValues = new ArrayList<>(); diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/GrpcServer.java b/src/test/java/com/yelp/nrtsearch/server/grpc/GrpcServer.java index c59d7f296..a174d735c 100644 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/GrpcServer.java +++ b/src/test/java/com/yelp/nrtsearch/server/grpc/GrpcServer.java @@ -400,7 +400,9 @@ private Stream getAddDocumentRequestStream(String fileName) String addDocsFile = fileName == null ? "addDocs.csv" : fileName; Path filePath = Paths.get("src", "test", "resources", addDocsFile); Reader reader = Files.newBufferedReader(filePath); - CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader()); + CSVParser csvParser = + new CSVParser( + reader, CSVFormat.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()); return new NrtsearchClientBuilder.AddDocumentsClientBuilder( grpcServer.getTestIndex(), csvParser) .buildRequest(filePath); diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/MultiIndexAddDocumentsTest.java b/src/test/java/com/yelp/nrtsearch/server/grpc/MultiIndexAddDocumentsTest.java index bad9bf665..f4119c2db 100644 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/MultiIndexAddDocumentsTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/grpc/MultiIndexAddDocumentsTest.java @@ -121,7 +121,9 @@ private Stream getAddDocumentRequestStream(String index) String docsResourceFile = INDEX_TO_DOCS.get(index); Path filePath = Paths.get(ServerTestCase.class.getResource(docsResourceFile).toURI()); Reader reader = Files.newBufferedReader(filePath); - CSVParser csvParser = new CSVParser(reader, CSVFormat.DEFAULT.withFirstRecordAsHeader()); + CSVParser csvParser = + new CSVParser( + reader, CSVFormat.DEFAULT.builder().setHeader().setSkipHeaderRecord(true).build()); return new NrtsearchClientBuilder.AddDocumentsClientBuilder(index, csvParser) .buildRequest(filePath); } diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerIdFieldTest.java b/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerIdFieldTest.java index d16df63c9..6ee2e4815 100644 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerIdFieldTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerIdFieldTest.java @@ -33,7 +33,6 @@ import org.junit.Before; import org.junit.Rule; import org.junit.Test; -import org.junit.rules.ExpectedException; import org.junit.rules.TemporaryFolder; import org.junit.runner.RunWith; import org.junit.runners.JUnit4; @@ -52,8 +51,6 @@ public class NrtsearchServerIdFieldTest { */ @Rule public final TemporaryFolder folder = new TemporaryFolder(); - @Rule public ExpectedException thrown = ExpectedException.none(); - private GrpcServer grpcServer; @After diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerTest.java b/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerTest.java index 242145b4d..e778f86b5 100644 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/grpc/NrtsearchServerTest.java @@ -20,7 +20,6 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; @@ -62,7 +61,6 @@ import java.util.stream.Stream; import org.apache.lucene.search.IndexSearcher; import org.apache.lucene.search.QueryCache; -import org.hamcrest.core.IsCollectionContaining; import org.junit.After; import org.junit.Before; import org.junit.Rule; @@ -1160,8 +1158,8 @@ public void testGetAllSnapshotIndexGen() throws IOException, InterruptedExceptio GetAllSnapshotGenResponse getAllSnapshotGenResponse = grpcServer.getBlockingStub().getAllSnapshotIndexGen(getAllSnapshotGenRequest); - assertThat( - getAllSnapshotGenResponse.getIndexGensList(), IsCollectionContaining.hasItems(2L, 3L)); + assertTrue(getAllSnapshotGenResponse.getIndexGensList().contains(2L)); + assertTrue(getAllSnapshotGenResponse.getIndexGensList().contains(3L)); } @Test diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/TestServer.java b/src/test/java/com/yelp/nrtsearch/server/grpc/TestServer.java index b389d04f6..f8f623971 100644 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/TestServer.java +++ b/src/test/java/com/yelp/nrtsearch/server/grpc/TestServer.java @@ -19,9 +19,7 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -41,6 +39,7 @@ import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.GlobalState; import com.yelp.nrtsearch.server.utils.FileUtils; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import io.findify.s3mock.S3Mock; import io.grpc.Server; import io.grpc.ServerBuilder; @@ -136,8 +135,7 @@ public TestServer( } private RemoteBackend createRemoteBackend() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return new S3Backend(configuration, s3); } diff --git a/src/test/java/com/yelp/nrtsearch/server/remote/s3/S3BackendTest.java b/src/test/java/com/yelp/nrtsearch/server/remote/s3/S3BackendTest.java index d00cd55fb..b331e04f4 100644 --- a/src/test/java/com/yelp/nrtsearch/server/remote/s3/S3BackendTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/remote/s3/S3BackendTest.java @@ -888,7 +888,7 @@ private void putMultiPart(String key, List partsData) { private String convertToString(InputStream inputStream) throws IOException { StringWriter writer = new StringWriter(); - IOUtils.copy(inputStream, writer); + IOUtils.copy(inputStream, writer, StandardCharsets.UTF_8); return writer.toString(); } } diff --git a/src/test/java/com/yelp/nrtsearch/test_utils/AmazonS3Provider.java b/src/test/java/com/yelp/nrtsearch/test_utils/AmazonS3Provider.java index 43a7e5083..219263eec 100644 --- a/src/test/java/com/yelp/nrtsearch/test_utils/AmazonS3Provider.java +++ b/src/test/java/com/yelp/nrtsearch/test_utils/AmazonS3Provider.java @@ -53,6 +53,13 @@ public class AmazonS3Provider extends ExternalResource { private AmazonS3 s3; private String s3Path; + public static AmazonS3 createTestS3Client(String endpoint) { + return AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(new AnonymousAWSCredentials())) + .withEndpointConfiguration(new EndpointConfiguration(endpoint, "")) + .build(); + } + public AmazonS3Provider(String bucketName) { this.bucketName = bucketName; this.temporaryFolder = new TemporaryFolder(); @@ -65,11 +72,7 @@ protected void before() throws Throwable { s3Path = temporaryFolder.newFolder("s3").toString(); api = S3Mock.create(8011, s3Path); api.start(); - s3 = - AmazonS3ClientBuilder.standard() - .withCredentials(new AWSStaticCredentialsProvider(new AnonymousAWSCredentials())) - .withEndpointConfiguration(new EndpointConfiguration("http://127.0.0.1:8011", "")) - .build(); + s3 = createTestS3Client("http://127.0.0.1:8011"); s3.createBucket(bucketName); } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/CleanupSnapshotsCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/CleanupSnapshotsCommandTest.java index f16bb3d52..c56d1310e 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/CleanupSnapshotsCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/CleanupSnapshotsCommandTest.java @@ -21,11 +21,10 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.yelp.nrtsearch.server.grpc.TestServer; import com.yelp.nrtsearch.server.utils.TimeStringUtils; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -55,8 +54,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/SnapshotRestoreCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/SnapshotRestoreCommandTest.java index 68be2b68d..c8f801aaa 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/SnapshotRestoreCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/backup/SnapshotRestoreCommandTest.java @@ -22,9 +22,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3Object; import com.amazonaws.services.s3.model.S3ObjectSummary; @@ -45,6 +43,7 @@ import com.yelp.nrtsearch.server.state.BackendGlobalState; import com.yelp.nrtsearch.server.state.StateUtils; import com.yelp.nrtsearch.server.utils.TimeStringUtils; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; @@ -70,8 +69,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/cleanup/CleanupDataCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/cleanup/CleanupDataCommandTest.java index 3f33df932..f7800565b 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/cleanup/CleanupDataCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/cleanup/CleanupDataCommandTest.java @@ -24,9 +24,7 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.ListObjectsV2Result; import com.amazonaws.services.s3.model.S3ObjectSummary; import com.yelp.nrtsearch.server.config.IndexStartConfig.IndexDataLocationType; @@ -37,6 +35,7 @@ import com.yelp.nrtsearch.server.remote.RemoteUtils; import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.utils.TimeStringUtils; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; @@ -59,8 +58,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/incremental/IncrementalDataCleanupCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/incremental/IncrementalDataCleanupCommandTest.java index 2e6546163..440038280 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/incremental/IncrementalDataCleanupCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/legacy/incremental/IncrementalDataCleanupCommandTest.java @@ -31,6 +31,7 @@ import com.yelp.nrtsearch.tools.nrt_utils.legacy.state.LegacyStateCommandUtils; import java.io.ByteArrayInputStream; import java.io.IOException; +import java.nio.charset.StandardCharsets; import java.util.HashSet; import java.util.Set; import java.util.UUID; @@ -151,7 +152,8 @@ private String getAndDeleteVersion(AmazonS3 s3Client, int currentVersion) throws SERVICE_NAME, IncrementalCommandUtils.getIndexDataResource(indexResource)); String currentId = IOUtils.toString( - s3Client.getObject(TEST_BUCKET, versionPrefix + currentVersion).getObjectContent()); + s3Client.getObject(TEST_BUCKET, versionPrefix + currentVersion).getObjectContent(), + StandardCharsets.UTF_8); s3Client.deleteObject(TEST_BUCKET, versionPrefix + currentVersion); return currentId; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetRemoteStateCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetRemoteStateCommandTest.java index 116fc7327..5c8578da5 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetRemoteStateCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetRemoteStateCommandTest.java @@ -22,9 +22,7 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.google.protobuf.util.JsonFormat; import com.yelp.nrtsearch.server.config.IndexStartConfig.IndexDataLocationType; import com.yelp.nrtsearch.server.grpc.GlobalStateInfo; @@ -34,6 +32,7 @@ import com.yelp.nrtsearch.server.index.ImmutableIndexState; import com.yelp.nrtsearch.server.state.StateUtils; import com.yelp.nrtsearch.server.state.backend.RemoteStateBackend; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -54,8 +53,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetResourceVersionCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetResourceVersionCommandTest.java index 7d4ce3887..7caf4480d 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetResourceVersionCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/GetResourceVersionCommandTest.java @@ -21,15 +21,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.yelp.nrtsearch.server.config.IndexStartConfig; import com.yelp.nrtsearch.server.grpc.Mode; import com.yelp.nrtsearch.server.grpc.TestServer; import com.yelp.nrtsearch.server.remote.RemoteBackend; import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.BackendGlobalState; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -64,8 +63,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/ListResourceVersionsTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/ListResourceVersionsTest.java index 2e3e174f0..2837632c8 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/ListResourceVersionsTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/ListResourceVersionsTest.java @@ -22,15 +22,14 @@ import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.yelp.nrtsearch.server.config.IndexStartConfig; import com.yelp.nrtsearch.server.grpc.Mode; import com.yelp.nrtsearch.server.grpc.TestServer; import com.yelp.nrtsearch.server.remote.RemoteBackend; import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.BackendGlobalState; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -65,8 +64,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/PutRemoteStateCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/PutRemoteStateCommandTest.java index 552823660..0480c14a6 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/PutRemoteStateCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/PutRemoteStateCommandTest.java @@ -25,9 +25,7 @@ import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.google.protobuf.Int32Value; import com.google.protobuf.util.JsonFormat; import com.yelp.nrtsearch.server.config.IndexStartConfig.IndexDataLocationType; @@ -40,6 +38,7 @@ import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.StateUtils; import com.yelp.nrtsearch.server.state.backend.RemoteStateBackend; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.File; import java.io.IOException; import java.nio.file.Files; @@ -59,8 +58,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/SetResourceVersionCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/SetResourceVersionCommandTest.java index 75c0472f4..142430e83 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/SetResourceVersionCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/SetResourceVersionCommandTest.java @@ -21,15 +21,14 @@ import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.yelp.nrtsearch.server.config.IndexStartConfig; import com.yelp.nrtsearch.server.grpc.Mode; import com.yelp.nrtsearch.server.grpc.TestServer; import com.yelp.nrtsearch.server.remote.RemoteBackend; import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.BackendGlobalState; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.PrintStream; @@ -64,8 +63,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/StateCommandUtilsTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/StateCommandUtilsTest.java index 4df204169..974a53596 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/StateCommandUtilsTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/StateCommandUtilsTest.java @@ -30,9 +30,7 @@ import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.google.protobuf.Int32Value; import com.google.protobuf.InvalidProtocolBufferException; import com.google.protobuf.util.JsonFormat; @@ -47,6 +45,7 @@ import com.yelp.nrtsearch.server.remote.s3.S3Backend; import com.yelp.nrtsearch.server.state.StateUtils; import com.yelp.nrtsearch.server.state.backend.RemoteStateBackend; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; @@ -67,8 +66,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/UpdateGlobalIndexStateCommandTest.java b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/UpdateGlobalIndexStateCommandTest.java index 7bd06b8c2..507ee9616 100644 --- a/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/UpdateGlobalIndexStateCommandTest.java +++ b/src/test/java/com/yelp/nrtsearch/tools/nrt_utils/state/UpdateGlobalIndexStateCommandTest.java @@ -23,12 +23,11 @@ import static org.junit.Assert.assertNotEquals; import static org.junit.Assert.assertTrue; -import com.amazonaws.auth.AnonymousAWSCredentials; import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3Client; import com.yelp.nrtsearch.server.config.IndexStartConfig.IndexDataLocationType; import com.yelp.nrtsearch.server.grpc.Mode; import com.yelp.nrtsearch.server.grpc.TestServer; +import com.yelp.nrtsearch.test_utils.AmazonS3Provider; import java.io.IOException; import org.junit.After; import org.junit.Rule; @@ -46,8 +45,7 @@ public void cleanup() { } private AmazonS3 getS3() { - AmazonS3 s3 = new AmazonS3Client(new AnonymousAWSCredentials()); - s3.setEndpoint(S3_ENDPOINT); + AmazonS3 s3 = AmazonS3Provider.createTestS3Client(S3_ENDPOINT); s3.createBucket(TEST_BUCKET); return s3; } diff --git a/src/test/java/com/yelp/nrtsearch/yelp_reviews/YelpReviewsTest.java b/src/test/java/com/yelp/nrtsearch/yelp_reviews/YelpReviewsTest.java index e24376444..018635b1e 100644 --- a/src/test/java/com/yelp/nrtsearch/yelp_reviews/YelpReviewsTest.java +++ b/src/test/java/com/yelp/nrtsearch/yelp_reviews/YelpReviewsTest.java @@ -625,7 +625,7 @@ public double getSearchTotalHits(long searcherVersion) { this.luceneServerClient.getBlockingStub().search(searchRequest); long timeMs = (System.nanoTime() - t1) / (1000 * 1000); long totalHits = searchResponse.getTotalHits().getValue(); - String threadId = Thread.currentThread().getName() + Thread.currentThread().getId(); + String threadId = Thread.currentThread().getName() + Thread.currentThread().threadId(); logger.info( "Search returned totalHits: {} on threadId: {} in {} milliSecs", totalHits, diff --git a/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/DocumentGeneratorAndIndexer.java b/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/DocumentGeneratorAndIndexer.java index e18a370de..a7dbf90c5 100644 --- a/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/DocumentGeneratorAndIndexer.java +++ b/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/DocumentGeneratorAndIndexer.java @@ -57,7 +57,7 @@ public Long call() throws Exception { Stream addDocumentRequestStream = buildDocs(); long t2 = System.nanoTime(); long timeMilliSecs = (t2 - t1) / (1000 * 100); - String threadId = Thread.currentThread().getName() + Thread.currentThread().getId(); + String threadId = Thread.currentThread().getName() + Thread.currentThread().threadId(); logger.info( String.format("threadId: %s took %s milliSecs to buildDocs ", threadId, timeMilliSecs)); diff --git a/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/IndexerTask.java b/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/IndexerTask.java index 109b7cc76..3d8ac9e0c 100644 --- a/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/IndexerTask.java +++ b/src/test/java/com/yelp/nrtsearch/yelp_reviews/utils/IndexerTask.java @@ -32,7 +32,7 @@ public class IndexerTask { public Long index( NrtsearchClient luceneServerClient, Stream addDocumentRequestStream) throws Exception { - String threadId = Thread.currentThread().getName() + Thread.currentThread().getId(); + String threadId = Thread.currentThread().getName() + Thread.currentThread().threadId(); final CountDownLatch finishLatch = new CountDownLatch(1);