diff --git a/README.md b/README.md index 11ec60a64..0e21dcd97 100644 --- a/README.md +++ b/README.md @@ -161,9 +161,3 @@ This tool indexes yelp reviews available at [Yelp dataset challenge](https://www ``` ./gradlew clean installDist :test -PincludePerfTests=* --tests "com.yelp.nrtsearch.server.YelpReviewsTest.runYelpReviews" --info ``` - -# Suggestions - -This test indexes businesses, creates an Infix Suggester and fetches suggestions. It requires a host, a port and a writeable directory in a standalone nrtSearch server. - -```./gradlew :test -DsuggestTmp=remoteServerDir -DsuggestHost=yourStandaloneServerHost -DsuggestPort=yourStandaloneServerHost --tests "com.yelp.nrtsearch.server.YelpSuggestTest"``` diff --git a/build.gradle b/build.gradle index 4e795e899..435fe1543 100644 --- a/build.gradle +++ b/build.gradle @@ -179,7 +179,6 @@ test { } else { if (!project.hasProperty('includePerfTests')) { exclude '**/YelpReviewsTest.class' - exclude '**/YelpSuggestTest.class' exclude '**/MergeBehaviorTests.class' exclude '**/IncrementalDataCleanupCommandTest.class' filter { diff --git a/clientlib/src/main/proto/yelp/nrtsearch/luceneserver.proto b/clientlib/src/main/proto/yelp/nrtsearch/luceneserver.proto index 41c6811c7..99d9b31b1 100644 --- a/clientlib/src/main/proto/yelp/nrtsearch/luceneserver.proto +++ b/clientlib/src/main/proto/yelp/nrtsearch/luceneserver.proto @@ -3,7 +3,6 @@ syntax = "proto3"; import "yelp/nrtsearch/search.proto"; import "yelp/nrtsearch/analysis.proto"; -import "yelp/nrtsearch/suggest.proto"; import "google/api/annotations.proto"; import "google/api/httpbody.proto"; import "google/protobuf/any.proto"; @@ -215,31 +214,6 @@ service LuceneServer { } - /* Builds a new auto-suggester, loading suggestions via the provided local file path.*/ - rpc buildSuggest (BuildSuggestRequest) returns (BuildSuggestResponse) { - option (google.api.http) = { - post: "/v1/suggest_build" - body: "*" - }; - - } - /* Perform an auto-suggest lookup.*/ - rpc suggestLookup (SuggestLookupRequest) returns (SuggestLookupResponse) { - option (google.api.http) = { - post: "/v1/suggest_lookup" - body: "*" - }; - - } - /* Updates existing suggestions, if the suggester supports near-real-time changes. */ - rpc updateSuggest (BuildSuggestRequest) returns (BuildSuggestResponse) { - option (google.api.http) = { - post: "/v1/suggest_update" - body: "*" - }; - - } - /* Creates a snapshot in the index, which is saved point-in-time view of the last commit in the index such that no files referenced by that snapshot will be deleted by ongoing @@ -298,7 +272,7 @@ service LuceneServer { }; } - /* Gets the state of a started index, includes settings, live_settings, search schema, suggest schema */ + /* Gets the state of a started index, includes settings, live_settings, search schema */ rpc state (StateRequest) returns (StateResponse) { option (google.api.http) = { post: "/v1/state" diff --git a/clientlib/src/main/proto/yelp/nrtsearch/suggest.proto b/clientlib/src/main/proto/yelp/nrtsearch/suggest.proto deleted file mode 100644 index 9988c9aac..000000000 --- a/clientlib/src/main/proto/yelp/nrtsearch/suggest.proto +++ /dev/null @@ -1,162 +0,0 @@ -/* Description of message types for search request and response */ -syntax = "proto3"; - -option java_multiple_files = true; -option java_package = "com.yelp.nrtsearch.server.grpc"; -option java_outer_classname = "SuggestResponseProto"; -option objc_class_prefix = "HLW"; - -option go_package = "github.com/Yelp/nrtsearch"; - -package luceneserver; - - -message BuildSuggestRequest { - string indexName = 1; //index name - oneof Suggester { - // A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester) - InfixSuggester infixSuggester = 2; - // Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester - AnalyzingSuggester analyzingSuggester = 3; - // Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester - FuzzySuggester fuzzySuggester = 4; - // A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester - CompletionInfixSuggester completionInfixSuggester = 5; - // A suggester that matches fuzzy terms in the input text. - FuzzyInfixSuggester fuzzyInfixSuggester = 6; - } - oneof Source { - SuggestLocalSource localSource = 7; - SuggestNonLocalSource nonLocalSource = 8; - } - string suggestName = 9; //Unique name for this suggest build. -} - -message BuildSuggestResponse { - int64 sizeInBytes = 1; //size in bytes in RAM if using AnalyzingSuggester - int64 count = 2; //total number of suggester entries -} - -message SuggestLookupRequest { - string indexName = 1; //Index name - string suggestName = 2; //Which suggester to use - string text = 3; //Text to suggest from - bool highlight = 4; //True if the suggestions should be highlighted (currently only works with AnalyzingInfixSuggester) - bool allTermsRequired = 5; //If true then all terms must be found (this only applies to InfixSuggester currently) - repeated string contexts = 6; //Which contexts to filter by - int32 count = 7; //How many suggestions to return, default = 5 -} - -message SuggestLookupResponse { - repeated OneSuggestLookupResponse results = 1; //SuggestLookup results as an array -} - -message OneSuggestLookupResponse { - oneof HighlightKey { - /* Expert: custom Object to hold the result of a highlighted suggestion (currently only works with AnalyzingInfixSuggester) */ - SuggestLookupHighlight suggestLookupHighlight = 1; - /* the key's text */ - string key = 2; - } - int64 weight = 3; //the key's weight - string payload = 4; //the key's payload (null if not present) -} - -message SuggestLookupHighlight { - repeated OneHighlight oneHighlight = 1; -} - -message OneHighlight { - bool isHit = 1; - string text = 2; -} - -message SuggestLocalSource { - /* Local file (to the server) to read suggestions + weights from; format is weight U+001F suggestion U+001F payload, - one per line, with suggestion UTF-8 encoded. If this option is used then searcher, suggestField, - weightField/Expression, payloadField should not be specified.*/ - string localFile = 1; - bool hasContexts = 2; //True if this file provides per-suggestion contexts - bool hasPayload = 3; //True if this file provides per-suggestion payload - bool hasMultiSearchText = 4; //True if this file is required to parsed by SuggestInputIterator -} - -message SuggestNonLocalSource { - /* Specific searcher version to use for pull suggestions to build. There are three different ways to specify a searcher version.*/ - oneof Searcher { - int64 indexGen = 1; //Search a generation previously returned by an indexing operation such as #addDocument. Use this to search a non-committed (near-real-time) view of the index. - int64 version = 2; //Search a specific searcher version. This is typically used by follow-on searches (e.g., user clicks next page, drills down, or changes sort, etc.) to get the same searcher used by the original search. - string snapshot = 3; //Search a snapshot previously created with #createSnapshot - } - string suggestField = 4; //Field (from stored documents) containing the suggestion text - oneof Weight { - string weightField = 5; //Numeric field (from stored documents) containing the weight - string weightExpression = 6; //Alternative to weightField, an expression that's evaluated to the weight. Note that any fields referenced in the expression must have been indexed with sort=true - - } - string payloadField = 7; //Optional binary or string field (from stored documents) containing the payload - string contextField = 8; //Numeric field (from stored documents) containing the context which can be later filtered on during lookup - string searchTextField = 9; //Binary or string field (from stored documents) containing the multiple search texts -} - -/* A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester)*/ -message InfixSuggester { - string analyzer = 1; //Index and query analyzer - string indexAnalyzer = 2; // Index Analyzer - string queryAnalyzer = 3; // Query Analyzer -} - -/* Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester*/ -message AnalyzingSuggester { - string analyzer = 1; //Index and query analyzer - string indexAnalyzer = 2; // Index Analyzer - string queryAnalyzer = 3; // Query Analyzer - int32 maxSurfaceFormsPerAnalyzedForm = 4; //Maximum number of surface forms to keep for a single analyzed form - int32 maxGraphExpansions = 5; //Maximum number of graph paths to expand from the analyzed from - bool preserveSep = 6; //True if token separators should be preserved when matching - bool exactFirst = 7; //True if the exact match should always be returned first regardless of score -} - -/* Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester*/ -message FuzzySuggester { - string analyzer = 1; //Index and query analyzer - string indexAnalyzer = 2; // Index Analyzer - string queryAnalyzer = 3; // Query Analyzer - int32 maxSurfaceFormsPerAnalyzedForm = 4; //Maximum number of surface forms to keep for a single analyzed form - int32 maxGraphExpansions = 5; //Maximum number of graph paths to expand from the analyzed from - bool preserveSep = 6; //True if token separators should be preserved when matching - bool exactFirst = 7; //True if the exact match should always be returned first regardless of score - int32 minFuzzyLength = 8; //Minimum key length before edits are allowed, - int32 nonFuzzyPrefix = 9; //Key prefix where edits are not allowed, - int32 maxEdits = 10; //Maximum number of edits for fuzzy suggestions - bool transpositions = 11; //Whether transpositions are allowed - bool unicodeAware = 12; //True if all edits are measured in unicode characters, not UTF-8 bytes -} - -/* A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester*/ -message CompletionInfixSuggester { - string analyzer = 1; //Index and query analyzer - string indexAnalyzer = 2; //Index Analyzer - string queryAnalyzer = 3; //Query Analyzer -} - -/* A suggester that matches fuzzy terms in the input text*/ -message FuzzyInfixSuggester { - string analyzer = 1; - string indexAnalyzer = 2; // Index Analyzer - string queryAnalyzer = 3; // Query Analyzer - int32 minFuzzyLength = 4; //Minimum key length before edits are allowed, - int32 nonFuzzyPrefix = 5; //Key prefix where edits are not allowed, - int32 maxEdits = 6; //Maximum number of edits for fuzzy suggestions - bool transpositions = 7; //Whether transpositions are allowed - bool unicodeAware = 8; //True if all edits are measured in unicode characters, not UTF-8 bytes -} - -/* The schema of suggest item to build suggest index*/ -message NrtsearchIndex { - int64 uniqueId = 1; - repeated string searchTexts = 2; - int64 score = 3; - repeated string contexts = 4; - bytes payload = 5; -} \ No newline at end of file diff --git a/grpc-gateway/Dockerfile b/grpc-gateway/Dockerfile index ff377fcaa..06101d550 100644 --- a/grpc-gateway/Dockerfile +++ b/grpc-gateway/Dockerfile @@ -70,8 +70,7 @@ RUN protoc \ --go_out=plugins=grpc:$OUTPATH \ $PROTO_PATH/yelp/nrtsearch/analysis.proto \ $PROTO_PATH/yelp/nrtsearch/luceneserver.proto \ -$PROTO_PATH/yelp/nrtsearch/search.proto \ -$PROTO_PATH/yelp/nrtsearch/suggest.proto +$PROTO_PATH/yelp/nrtsearch/search.proto RUN protoc \ -I $PROTO_PATH \ @@ -81,8 +80,7 @@ RUN protoc \ --grpc-gateway_out=logtostderr=true:$OUTPATH \ $PROTO_PATH/yelp/nrtsearch/analysis.proto \ $PROTO_PATH/yelp/nrtsearch/luceneserver.proto \ -$PROTO_PATH/yelp/nrtsearch/search.proto \ -$PROTO_PATH/yelp/nrtsearch/suggest.proto +$PROTO_PATH/yelp/nrtsearch/search.proto RUN protoc \ -I $PROTO_PATH \ @@ -92,8 +90,7 @@ RUN protoc \ --openapiv2_out=logtostderr=true:$OUTPATH \ $PROTO_PATH/yelp/nrtsearch/analysis.proto \ $PROTO_PATH/yelp/nrtsearch/luceneserver.proto \ -$PROTO_PATH/yelp/nrtsearch/search.proto \ -$PROTO_PATH/yelp/nrtsearch/suggest.proto +$PROTO_PATH/yelp/nrtsearch/search.proto RUN cp $OUTPATH/yelp/nrtsearch/* grpc-gateway/ RUN cp $OUTPATH/github.com/Yelp/nrtsearch/* grpc-gateway/ diff --git a/grpc-gateway/luceneserver.pb.go b/grpc-gateway/luceneserver.pb.go index caeecd1a6..c326c0982 100644 --- a/grpc-gateway/luceneserver.pb.go +++ b/grpc-gateway/luceneserver.pb.go @@ -6169,1258 +6169,1233 @@ var file_yelp_nrtsearch_luceneserver_proto_rawDesc = []byte{ 0x72, 0x1a, 0x1b, 0x79, 0x65, 0x6c, 0x70, 0x2f, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1d, 0x79, 0x65, 0x6c, 0x70, 0x2f, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x61, - 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x79, - 0x65, 0x6c, 0x70, 0x2f, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x2f, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, - 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, - 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, - 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x02, 0x0a, 0x12, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x6e, 0x61, 0x6c, 0x79, 0x73, 0x69, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x68, 0x74, 0x74, 0x70, 0x62, 0x6f, 0x64, 0x79, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x61, 0x6e, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, + 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x97, 0x02, 0x0a, + 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x22, 0x0a, 0x0c, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x57, + 0x69, 0x74, 0x68, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, + 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x22, 0x31, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa5, 0x05, 0x0a, 0x13, 0x4c, 0x69, + 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x22, 0x0a, 0x0c, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x57, 0x69, 0x74, - 0x68, 0x49, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, 0x0a, 0x0c, - 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x12, 0x2b, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x14, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x22, 0x31, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa5, 0x05, 0x0a, 0x13, 0x4c, 0x69, 0x76, 0x65, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x66, 0x72, + 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x69, + 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x11, 0x6d, + 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x14, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x52, 0x61, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, + 0x42, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x61, + 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x3a, 0x0a, + 0x18, 0x61, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x18, 0x61, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, + 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x2a, 0x0a, + 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, + 0x78, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x69, 0x72, + 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, + 0x2e, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x61, 0x78, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x12, + 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, + 0x65, 0x72, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x17, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x53, 0x65, 0x63, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, + 0x53, 0x65, 0x63, 0x12, 0x46, 0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, + 0x45, 0x76, 0x65, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, + 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, + 0x72, 0x22, 0x32, 0x0a, 0x14, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x24, 0x0a, - 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x65, 0x63, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x53, 0x65, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x52, - 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x11, 0x6d, 0x61, 0x78, - 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x01, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x12, 0x32, 0x0a, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x61, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x61, 0x6d, 0x42, - 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x3a, 0x0a, 0x18, 0x61, - 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x18, 0x61, - 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, - 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, - 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x73, - 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x73, - 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x53, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x24, 0x0a, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, - 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x2e, 0x0a, - 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x42, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x12, 0x28, 0x0a, - 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, 0x65, 0x72, - 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x50, 0x65, 0x72, 0x54, 0x69, 0x65, 0x72, 0x12, 0x38, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, - 0x65, 0x63, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, - 0x63, 0x12, 0x46, 0x0a, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, - 0x65, 0x72, 0x79, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, - 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, 0x79, 0x12, 0x34, 0x0a, 0x15, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, - 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x22, - 0x32, 0x0a, 0x14, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x90, 0x01, 0x0a, 0x15, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6c, - 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x0a, 0x16, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa2, 0x0d, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x6f, 0x63, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, 0x12, 0x1e, - 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, - 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x12, 0x18, - 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, - 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x09, 0x68, 0x69, - 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1c, 0x0a, 0x09, - 0x6f, 0x6d, 0x69, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x09, 0x6f, 0x6d, 0x69, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x64, 0x61, - 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x6d, - 0x61, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x0f, 0x64, 0x6f, - 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0e, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x18, 0x10, - 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, 0x32, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x52, 0x08, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x52, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, - 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, - 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x66, 0x61, 0x63, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x66, 0x61, 0x63, 0x65, 0x74, - 0x12, 0x30, 0x0a, 0x13, 0x66, 0x61, 0x63, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, 0x13, 0x66, - 0x61, 0x63, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, - 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, 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, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x12, - 0x43, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x18, 0x19, 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, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x0b, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x13, 0x65, - 0x61, 0x67, 0x65, 0x72, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, 0x6e, 0x61, - 0x6c, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x61, 0x67, 0x65, 0x72, 0x47, - 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x1c, 0x0a, - 0x09, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x18, 0x1c, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x09, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x12, 0x2a, 0x0a, 0x10, 0x76, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x69, 0x6d, - 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x61, 0x67, 0x65, 0x72, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x6c, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x61, 0x67, 0x65, 0x72, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, 0x6e, - 0x61, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x69, 0x6d, - 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x76, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x59, 0x0a, 0x15, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, - 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, - 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x11, 0x74, 0x65, - 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x18, - 0x21, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x74, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4d, 0x0a, 0x11, 0x76, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x18, 0x22, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, - 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x6f, 0x73, 0x69, + 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x43, 0x0a, + 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x05, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x22, 0x5d, 0x0a, 0x16, 0x4c, 0x69, 0x76, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, + 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0xa2, 0x0d, 0x0a, 0x05, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x44, + 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x12, 0x16, 0x0a, 0x04, 0x73, 0x6f, 0x72, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x04, 0x73, 0x6f, 0x72, 0x74, + 0x12, 0x1e, 0x0a, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x08, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x69, 0x7a, 0x65, + 0x12, 0x18, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x09, + 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x42, + 0x02, 0x18, 0x01, 0x52, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1c, + 0x0a, 0x09, 0x6f, 0x6d, 0x69, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x09, 0x6f, 0x6d, 0x69, 0x74, 0x4e, 0x6f, 0x72, 0x6d, 0x73, 0x12, 0x26, 0x0a, 0x0e, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0c, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x46, 0x6f, + 0x72, 0x6d, 0x61, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x6f, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x6f, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x0f, + 0x64, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x64, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x18, 0x10, 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, 0x32, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, + 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x52, 0x08, + 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, + 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x52, 0x0e, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x41, 0x6e, + 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x56, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x19, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x0b, 0x74, 0x65, 0x72, 0x6d, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x18, 0x15, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x66, 0x61, 0x63, 0x65, 0x74, 0x18, 0x16, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x05, 0x66, 0x61, 0x63, + 0x65, 0x74, 0x12, 0x30, 0x0a, 0x13, 0x66, 0x61, 0x63, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x17, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x13, 0x66, 0x61, 0x63, 0x65, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x14, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x18, 0x18, 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, 0x14, 0x61, 0x64, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x43, 0x0a, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x19, 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, 0x10, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x35, 0x0a, 0x0b, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x1a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x52, 0x0b, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x30, 0x0a, + 0x13, 0x65, 0x61, 0x67, 0x65, 0x72, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, + 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x65, 0x61, 0x67, 0x65, + 0x72, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, 0x69, 0x6e, 0x61, 0x6c, 0x73, 0x12, + 0x1c, 0x0a, 0x09, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x18, 0x1c, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x09, 0x6e, 0x65, 0x73, 0x74, 0x65, 0x64, 0x44, 0x6f, 0x63, 0x12, 0x2a, 0x0a, + 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x18, 0x1d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x44, + 0x69, 0x6d, 0x65, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x65, 0x61, 0x67, + 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x73, 0x18, 0x1e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65, 0x61, 0x67, + 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x4f, 0x72, 0x64, + 0x69, 0x6e, 0x61, 0x6c, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, + 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x1f, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x10, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x53, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x69, 0x74, + 0x79, 0x12, 0x59, 0x0a, 0x15, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x20, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x4f, 0x70, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x15, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x4d, 0x0a, 0x11, + 0x74, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x54, 0x79, 0x70, + 0x65, 0x18, 0x21, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x74, 0x65, 0x78, 0x74, 0x44, 0x6f, + 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x4d, 0x0a, 0x11, 0x76, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, + 0x18, 0x22, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, + 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x11, 0x76, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, + 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x37, 0x0a, 0x14, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, + 0x61, 0x70, 0x18, 0x23, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x14, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x70, - 0x18, 0x23, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x14, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x70, 0x88, 0x01, - 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x70, 0x22, 0xe1, 0x03, 0x0a, 0x15, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x4f, 0x70, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, 0x1a, 0x0a, - 0x06, 0x68, 0x6e, 0x73, 0x77, 0x5f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x01, 0x52, - 0x05, 0x68, 0x6e, 0x73, 0x77, 0x4d, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x68, 0x6e, 0x73, - 0x77, 0x5f, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x12, 0x68, 0x6e, 0x73, 0x77, 0x45, - 0x66, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, 0x01, 0x01, - 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x72, 0x67, 0x65, - 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1d, 0x71, 0x75, - 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x02, 0x48, 0x04, 0x52, 0x1b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, 0x0d, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x32, 0x0a, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x11, 0x71, - 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, - 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, 0x0a, 0x07, - 0x5f, 0x68, 0x6e, 0x73, 0x77, 0x5f, 0x6d, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x6e, 0x73, 0x77, - 0x5f, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x65, - 0x72, 0x73, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, - 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, - 0x72, 0x76, 0x61, 0x6c, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, - 0x65, 0x64, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x71, 0x75, 0x61, 0x6e, - 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x22, 0x5a, - 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x29, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x2e, 0x0a, 0x10, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x85, 0x05, 0x0a, 0x0f, 0x53, - 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, 0x0a, 0x10, - 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x42, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4d, 0x61, 0x78, - 0x4d, 0x42, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x21, 0x6e, 0x72, 0x74, 0x43, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, - 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, - 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x42, 0x0a, 0x1c, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, - 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, - 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, 0x6e, 0x72, + 0x88, 0x01, 0x01, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x70, 0x22, 0xe1, 0x03, 0x0a, + 0x15, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x69, 0x6e, 0x67, 0x4f, + 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x17, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x88, 0x01, 0x01, 0x12, + 0x1a, 0x0a, 0x06, 0x68, 0x6e, 0x73, 0x77, 0x5f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, + 0x01, 0x52, 0x05, 0x68, 0x6e, 0x73, 0x77, 0x4d, 0x88, 0x01, 0x01, 0x12, 0x35, 0x0a, 0x14, 0x68, + 0x6e, 0x73, 0x77, 0x5f, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x48, 0x02, 0x52, 0x12, 0x68, 0x6e, 0x73, + 0x77, 0x45, 0x66, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x88, + 0x01, 0x01, 0x12, 0x28, 0x0a, 0x0d, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x77, 0x6f, 0x72, 0x6b, + 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x03, 0x52, 0x0c, 0x6d, 0x65, 0x72, + 0x67, 0x65, 0x57, 0x6f, 0x72, 0x6b, 0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x47, 0x0a, 0x1d, + 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x02, 0x48, 0x04, 0x52, 0x1b, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, + 0x61, 0x6c, 0x88, 0x01, 0x01, 0x12, 0x2a, 0x0a, 0x0e, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x48, 0x05, 0x52, + 0x0d, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x42, 0x69, 0x74, 0x73, 0x88, 0x01, + 0x01, 0x12, 0x32, 0x0a, 0x12, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, + 0x11, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x70, 0x72, 0x65, + 0x73, 0x73, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x42, 0x09, + 0x0a, 0x07, 0x5f, 0x68, 0x6e, 0x73, 0x77, 0x5f, 0x6d, 0x42, 0x17, 0x0a, 0x15, 0x5f, 0x68, 0x6e, + 0x73, 0x77, 0x5f, 0x65, 0x66, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x10, 0x0a, 0x0e, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x77, 0x6f, 0x72, + 0x6b, 0x65, 0x72, 0x73, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x7a, + 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x11, 0x0a, 0x0f, 0x5f, 0x71, 0x75, 0x61, 0x6e, 0x74, + 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x62, 0x69, 0x74, 0x73, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x71, 0x75, + 0x61, 0x6e, 0x74, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x5a, 0x0a, 0x0f, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x29, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x22, 0x2e, 0x0a, 0x10, + 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x85, 0x05, 0x0a, + 0x0f, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x2a, + 0x0a, 0x10, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4d, 0x61, 0x78, 0x4d, 0x42, 0x50, 0x65, 0x72, 0x53, + 0x65, 0x63, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x4d, + 0x61, 0x78, 0x4d, 0x42, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x56, 0x0a, 0x26, 0x63, 0x6f, + 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x01, 0x52, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, + 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, + 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x42, 0x0a, 0x1c, 0x6e, 0x72, 0x74, 0x43, + 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, + 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x1c, + 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x56, 0x0a, 0x26, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x26, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x26, 0x63, 0x6f, 0x6e, 0x63, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, - 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, - 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x53, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, 0x74, - 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, - 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, - 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x46, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x46, 0x6f, - 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x79, 0x22, 0x2e, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x6a, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x4d, - 0x0a, 0x12, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x9f, 0x02, - 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x54, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, + 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, + 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, + 0x72, 0x74, 0x12, 0x26, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x65, 0x72, 0x62, 0x6f, + 0x73, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x56, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, + 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x18, 0x09, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x1f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, + 0x74, 0x74, 0x6c, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x73, 0x46, 0x6f, 0x72, + 0x6d, 0x61, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6e, 0x6f, 0x72, 0x6d, 0x73, + 0x46, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x79, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x79, 0x22, 0x2e, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x0a, 0x11, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x22, 0x4d, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, + 0x9f, 0x02, 0x0a, 0x11, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x12, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x32, 0x0a, + 0x14, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x46, 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x69, + 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x69, 0x6c, + 0x65, 0x22, 0x33, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, + 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, + 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, + 0x52, 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x22, 0xe2, 0x02, + 0x0a, 0x12, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x7a, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, + 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x12, 0x50, 0x0a, 0x12, 0x66, 0x61, 0x63, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, + 0x63, 0x68, 0x79, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x61, + 0x63, 0x65, 0x74, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x50, 0x61, 0x74, 0x68, + 0x52, 0x12, 0x66, 0x61, 0x63, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x50, + 0x61, 0x74, 0x68, 0x73, 0x1a, 0x6c, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0x2a, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x65, 0x74, 0x48, 0x69, 0x65, 0x72, 0x61, + 0x72, 0x63, 0x68, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x49, + 0x0a, 0x13, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x37, 0x0a, 0x0f, 0x52, 0x65, 0x66, + 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, + 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, + 0x4d, 0x53, 0x22, 0x2d, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x26, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x12, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4d, - 0x6f, 0x64, 0x65, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x26, 0x0a, 0x0e, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0e, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x34, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x07, 0x72, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x32, 0x0a, 0x14, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, - 0x69, 0x6c, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x14, 0x70, 0x72, 0x69, 0x6d, 0x61, - 0x72, 0x79, 0x44, 0x69, 0x73, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x22, - 0x33, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x32, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x12, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 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, 0x1a, 0x0a, - 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x22, 0xe2, 0x02, 0x0a, 0x12, - 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x44, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x7a, 0x0a, 0x10, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, - 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, - 0x12, 0x50, 0x0a, 0x12, 0x66, 0x61, 0x63, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, - 0x79, 0x50, 0x61, 0x74, 0x68, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x61, 0x63, 0x65, - 0x74, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x50, 0x61, 0x74, 0x68, 0x52, 0x12, - 0x66, 0x61, 0x63, 0x65, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, 0x68, 0x79, 0x50, 0x61, 0x74, - 0x68, 0x73, 0x1a, 0x6c, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x2e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x64, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x2a, 0x0a, 0x12, 0x46, 0x61, 0x63, 0x65, 0x74, 0x48, 0x69, 0x65, 0x72, 0x61, 0x72, 0x63, - 0x68, 0x79, 0x50, 0x61, 0x74, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x49, 0x0a, 0x13, - 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, - 0x69, 0x6d, 0x61, 0x72, 0x79, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x0e, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x37, 0x0a, 0x0f, 0x52, 0x65, 0x66, 0x72, 0x65, - 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x24, 0x0a, 0x0d, 0x72, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x0d, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x4d, 0x53, - 0x22, 0x2d, 0x0a, 0x0d, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x40, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, - 0x67, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x49, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x49, - 0x64, 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x65, 0x22, 0x40, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, + 0x79, 0x49, 0x64, 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0xaf, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x03, 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x12, 0x18, 0x0a, + 0x07, 0x6e, 0x75, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, + 0x6e, 0x75, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x72, 0x53, 0x69, + 0x7a, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x64, 0x69, 0x72, 0x53, 0x69, 0x7a, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x78, 0x6f, 0x6e, + 0x6f, 0x6d, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, + 0x79, 0x52, 0x08, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x12, 0x34, 0x0a, 0x09, 0x73, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, + 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, + 0x73, 0x12, 0x40, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x22, 0x40, 0x0a, 0x08, 0x54, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x41, 0x67, 0x65, 0x53, 0x65, + 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x73, 0x74, 0x61, + 0x6c, 0x65, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x39, + 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x32, 0x0a, + 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x22, 0x25, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x1f, 0x0a, 0x0d, 0x44, 0x75, 0x6d, 0x6d, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x30, 0x0a, 0x10, 0x53, 0x74, 0x6f, + 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x52, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0xaf, 0x02, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x6f, 0x72, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x06, 0x6d, 0x61, 0x78, 0x44, 0x6f, 0x63, 0x12, 0x18, 0x0a, 0x07, 0x6e, - 0x75, 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x75, - 0x6d, 0x44, 0x6f, 0x63, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x69, 0x72, 0x53, 0x69, 0x7a, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x64, 0x69, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x12, - 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, - 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x52, - 0x08, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x12, 0x34, 0x0a, 0x09, 0x73, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, - 0x63, 0x68, 0x65, 0x72, 0x52, 0x09, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x73, 0x12, - 0x40, 0x0a, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x52, 0x0f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x22, 0x40, 0x0a, 0x08, 0x54, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x12, 0x18, 0x0a, - 0x07, 0x6e, 0x75, 0x6d, 0x4f, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, - 0x6e, 0x75, 0x6d, 0x4f, 0x72, 0x64, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0xa6, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x1a, 0x0a, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x6c, 0x65, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, - 0x6e, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0f, 0x73, 0x74, 0x61, 0x6c, 0x65, - 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6e, 0x75, - 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x6e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x39, 0x0a, 0x19, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, + 0x68, 0x65, 0x72, 0x22, 0xb8, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, + 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x24, + 0x0a, 0x0d, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, + 0x49, 0x64, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0x66, + 0x0a, 0x0a, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x61, 0x78, 0x6f, + 0x6e, 0x6f, 0x6d, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, + 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, + 0x61, 0x74, 0x65, 0x47, 0x65, 0x6e, 0x22, 0x70, 0x0a, 0x16, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, + 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, + 0x0a, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x0a, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x17, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x38, 0x0a, + 0x18, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, + 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x32, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x67, 0x65, 0x6e, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x12, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, - 0x25, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x1f, 0x0a, 0x0d, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x6b, 0x22, 0x30, 0x0a, 0x10, 0x53, 0x74, 0x6f, 0x70, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x14, 0x0a, 0x12, 0x52, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x15, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x0a, 0x15, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0c, 0x6f, 0x70, 0x65, 0x6e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, - 0x72, 0x22, 0xb8, 0x01, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1e, 0x0a, 0x0a, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, - 0x52, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x24, 0x0a, 0x0d, - 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x74, 0x65, 0x46, 0x69, 0x6c, - 0x65, 0x73, 0x12, 0x38, 0x0a, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, - 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0x66, 0x0a, 0x0a, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x12, 0x20, 0x0a, 0x0b, 0x74, 0x61, 0x78, 0x6f, 0x6e, 0x6f, - 0x6d, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x61, 0x78, - 0x6f, 0x6e, 0x6f, 0x6d, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, - 0x65, 0x47, 0x65, 0x6e, 0x22, 0x70, 0x0a, 0x16, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x38, 0x0a, 0x0a, - 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x52, 0x0a, 0x73, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x49, 0x64, 0x22, 0x33, 0x0a, 0x17, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x07, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x22, 0x38, 0x0a, 0x18, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x73, - 0x22, 0xbf, 0x01, 0x0a, 0x1b, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, - 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, - 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, 0x6d, 0x51, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x36, 0x0a, 0x16, 0x75, 0x70, + 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x39, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x03, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, + 0x6e, 0x73, 0x22, 0xbf, 0x01, 0x0a, 0x1b, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, + 0x6d, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x13, 0x6e, 0x75, + 0x6d, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x6e, 0x75, 0x6d, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x36, 0x0a, 0x16, + 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x16, 0x75, 0x70, 0x74, 0x69, - 0x6d, 0x65, 0x4d, 0x69, 0x6e, 0x75, 0x74, 0x65, 0x73, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, - 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x75, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, 0x0c, 0x52, - 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, 0x0b, 0x73, - 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x22, 0x0a, - 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x64, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, - 0x61, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x13, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, - 0x0a, 0x0c, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x2b, - 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbb, 0x01, 0x0a, 0x11, - 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, - 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, - 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x12, - 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x24, 0x0a, 0x12, 0x41, 0x64, 0x64, - 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, 0x6b, 0x22, - 0xce, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x28, 0x0a, - 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, - 0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x6f, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x6f, - 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, - 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x30, - 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, - 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, - 0x22, 0x6b, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x3e, 0x0a, - 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, - 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x01, - 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, - 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x6c, 0x65, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x68, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, 0x4c, 0x65, - 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x6f, 0x6f, 0x74, - 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, 0x6f, 0x74, - 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, - 0x22, 0xc8, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x20, - 0x0a, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, - 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x41, - 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x8a, 0x01, 0x0a, 0x10, - 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, + 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5d, 0x0a, 0x0f, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x0f, 0x69, 0x6e, 0x64, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x75, 0x0a, 0x12, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0d, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0d, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x01, 0x0a, + 0x0c, 0x52, 0x65, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x0a, + 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x22, 0x0a, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x2e, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x69, + 0x73, 0x74, 0x69, 0x6e, 0x67, 0x44, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x12, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x45, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x44, + 0x61, 0x74, 0x61, 0x22, 0x14, 0x0a, 0x12, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x13, 0x47, 0x6c, 0x6f, + 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x40, 0x0a, 0x0c, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x22, 0x2c, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x22, 0x2b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbb, 0x01, + 0x0a, 0x11, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, + 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, + 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, + 0x74, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x24, 0x0a, 0x12, 0x41, + 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x6f, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x6f, + 0x6b, 0x22, 0xce, 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, + 0x28, 0x0a, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x4c, 0x65, 0x6e, 0x67, + 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x42, 0x79, + 0x74, 0x65, 0x73, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x66, + 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, + 0x66, 0x6f, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, + 0x74, 0x65, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x7a, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x17, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, + 0x65, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x30, 0x0a, 0x13, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x72, + 0x67, 0x65, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x13, 0x63, + 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x46, 0x69, 0x6c, + 0x65, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, + 0x65, 0x6e, 0x22, 0x6b, 0x0a, 0x0d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x75, 0x6d, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, + 0x3e, 0x0a, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x52, 0x0c, 0x66, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x22, + 0xd0, 0x01, 0x0a, 0x0c, 0x46, 0x69, 0x6c, 0x65, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x6c, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x6c, 0x65, 0x6e, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x08, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x73, 0x75, 0x6d, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, + 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, + 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x22, 0x0a, 0x0c, 0x66, 0x6f, 0x6f, 0x74, 0x65, 0x72, + 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x66, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x16, 0x0a, 0x06, 0x66, 0x6f, + 0x6f, 0x74, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x66, 0x6f, 0x6f, 0x74, + 0x65, 0x72, 0x22, 0xc8, 0x01, 0x0a, 0x09, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, - 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x12, 0x18, - 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x96, 0x01, 0x0a, 0x08, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, - 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x07, 0x66, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x63, 0x6b, - 0x53, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x61, 0x63, - 0x6b, 0x53, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, - 0x64, 0x22, 0x52, 0x0a, 0x0c, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x73, - 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, - 0x4e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x03, 0x61, 0x63, 0x6b, 0x22, 0x2a, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x68, 0x65, 0x63, - 0x6b, 0x22, 0x4f, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x06, 0x68, 0x65, 0x61, 0x6c, - 0x74, 0x68, 0x22, 0x33, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x64, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x6e, 0x73, - 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x4d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, - 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x4e, 0x65, - 0x77, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x67, - 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, - 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, - 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, - 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x4b, 0x0a, - 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, - 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x0f, 0x53, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x64, 0x52, 0x65, - 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, 0x69, 0x64, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x22, 0x2f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x08, 0x4e, 0x6f, - 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x5f, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, 0x0a, 0x05, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x71, 0x0a, 0x11, 0x46, 0x6f, 0x72, 0x63, 0x65, - 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, + 0x12, 0x1e, 0x0a, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, + 0x12, 0x41, 0x0a, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x0d, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x8a, 0x01, + 0x0a, 0x10, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, + 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, + 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x49, 0x64, + 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, 0x96, 0x01, 0x0a, 0x08, 0x46, + 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x66, 0x69, 0x6c, 0x65, 0x4e, + 0x61, 0x6d, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x66, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x66, 0x70, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, + 0x63, 0x6b, 0x53, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x61, 0x63, 0x6b, 0x53, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x49, 0x64, 0x22, 0x52, 0x0a, 0x0c, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, + 0x75, 0x6e, 0x6b, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x16, 0x0a, + 0x06, 0x73, 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, + 0x65, 0x71, 0x4e, 0x75, 0x6d, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x6b, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x03, 0x61, 0x63, 0x6b, 0x22, 0x2a, 0x0a, 0x12, 0x48, 0x65, 0x61, 0x6c, 0x74, + 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x22, 0x4f, 0x0a, 0x13, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x06, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x06, 0x68, 0x65, + 0x61, 0x6c, 0x74, 0x68, 0x22, 0x33, 0x0a, 0x11, 0x52, 0x65, 0x61, 0x64, 0x79, 0x43, 0x68, 0x65, + 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x0e, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x22, 0xa1, 0x01, 0x0a, 0x0b, + 0x4e, 0x65, 0x77, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x6d, + 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x1e, 0x0a, 0x0a, 0x70, + 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x70, 0x72, 0x69, 0x6d, 0x61, 0x72, 0x79, 0x47, 0x65, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x49, 0x64, 0x22, + 0x4b, 0x0a, 0x09, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, + 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x6d, 0x61, 0x67, 0x69, 0x63, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x4b, 0x0a, 0x0f, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, + 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1e, 0x0a, 0x0a, 0x64, 0x69, 0x64, + 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x64, + 0x69, 0x64, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x22, 0x2f, 0x0a, 0x0f, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, 0x6d, 0x61, - 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, - 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x06, 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x95, 0x01, 0x0a, 0x12, 0x46, - 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x22, 0x3e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, 0x0a, 0x15, - 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x4f, 0x52, 0x43, 0x45, - 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, - 0x10, 0x01, 0x22, 0x50, 0x0a, 0x18, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, + 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x47, 0x65, + 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, + 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x6f, 0x64, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x0a, 0x08, + 0x4e, 0x6f, 0x64, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1a, 0x0a, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x68, 0x6f, 0x73, 0x74, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x04, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x5f, 0x0a, 0x14, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x29, + 0x0a, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x52, 0x05, 0x71, 0x75, 0x65, 0x72, 0x79, 0x22, 0x71, 0x0a, 0x11, 0x46, 0x6f, 0x72, + 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, - 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x6f, - 0x57, 0x61, 0x69, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4e, 0x0a, 0x06, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x45, - 0x52, 0x47, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x43, 0x4f, 0x4d, 0x50, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x4f, 0x52, 0x43, 0x45, - 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x53, - 0x55, 0x42, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x01, 0x22, 0x9f, 0x05, 0x0a, 0x0d, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x6a, 0x0a, 0x21, + 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0e, + 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x4e, 0x75, 0x6d, 0x53, 0x65, 0x67, 0x6d, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0x95, 0x01, 0x0a, + 0x12, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x3e, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x19, + 0x0a, 0x15, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x43, 0x4f, + 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x19, 0x0a, 0x15, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x54, + 0x45, 0x44, 0x10, 0x01, 0x22, 0x50, 0x0a, 0x18, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, + 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, + 0x0a, 0x06, 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, + 0x64, 0x6f, 0x57, 0x61, 0x69, 0x74, 0x22, 0xb3, 0x01, 0x0a, 0x19, 0x46, 0x6f, 0x72, 0x63, 0x65, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x4e, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x4f, 0x52, 0x43, 0x45, 0x5f, + 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x53, 0x5f, 0x43, 0x4f, + 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x46, 0x4f, 0x52, + 0x43, 0x45, 0x5f, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x53, + 0x5f, 0x53, 0x55, 0x42, 0x4d, 0x49, 0x54, 0x54, 0x45, 0x44, 0x10, 0x01, 0x22, 0x9f, 0x05, 0x0a, + 0x0d, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x6a, + 0x0a, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x69, 0x7a, + 0x65, 0x4d, 0x42, 0x18, 0x01, 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, 0x52, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x60, 0x0a, 0x1c, 0x6e, 0x72, + 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, + 0x79, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, 0x02, 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, 0x52, 0x1c, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, - 0x42, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x73, 0x0a, 0x26, + 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, + 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x26, 0x63, 0x6f, 0x6e, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x71, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, + 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x25, 0x63, + 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x64, 0x0a, 0x1f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x1f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, + 0x6c, 0x65, 0x12, 0x3a, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, + 0x07, 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, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xa5, + 0x09, 0x0a, 0x11, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, + 0x73, 0x68, 0x53, 0x65, 0x63, 0x18, 0x01, 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, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x52, + 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x18, 0x02, 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, 0x52, 0x0d, 0x6d, + 0x69, 0x6e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x4a, 0x0a, 0x11, + 0x6d, 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, + 0x63, 0x18, 0x03, 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, 0x52, 0x21, 0x6e, 0x72, 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, - 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, - 0x67, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x60, 0x0a, 0x1c, 0x6e, 0x72, 0x74, 0x43, - 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x4d, - 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x18, 0x02, 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, 0x52, 0x1c, 0x6e, 0x72, - 0x74, 0x43, 0x61, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x79, 0x4d, 0x61, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x73, 0x0a, 0x26, 0x63, 0x6f, - 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x26, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x4d, 0x61, 0x78, 0x54, 0x68, 0x72, 0x65, 0x61, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x71, 0x0a, 0x25, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, - 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x4d, 0x65, - 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x14, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x52, 0x61, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, + 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, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x52, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x61, 0x6d, 0x42, 0x75, + 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x57, 0x0a, 0x18, 0x61, 0x64, + 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, 0x66, + 0x66, 0x65, 0x72, 0x4c, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x61, 0x64, 0x64, 0x44, 0x6f, + 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, + 0x4c, 0x65, 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, + 0x6f, 0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, + 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, + 0x44, 0x6f, 0x63, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, + 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x25, 0x63, 0x6f, 0x6e, - 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, - 0x64, 0x75, 0x6c, 0x65, 0x72, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x36, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x52, - 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x64, 0x0a, 0x1f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, - 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x42, 0x6f, 0x6f, 0x6c, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x1f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x72, 0x41, 0x75, 0x74, 0x6f, 0x54, 0x68, 0x72, 0x6f, 0x74, 0x74, 0x6c, 0x65, - 0x12, 0x3a, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 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, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xa5, 0x09, 0x0a, - 0x11, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, - 0x67, 0x73, 0x12, 0x42, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, - 0x53, 0x65, 0x63, 0x18, 0x01, 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, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0d, 0x6d, 0x69, 0x6e, 0x52, 0x65, 0x66, - 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x18, 0x02, 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, 0x52, 0x0d, 0x6d, 0x69, 0x6e, - 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x53, 0x65, 0x63, 0x12, 0x4a, 0x0a, 0x11, 0x6d, 0x61, - 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x18, - 0x03, 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, 0x52, 0x11, 0x6d, 0x61, 0x78, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, - 0x41, 0x67, 0x65, 0x53, 0x65, 0x63, 0x12, 0x50, 0x0a, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, - 0x61, 0x6d, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 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, 0x44, 0x6f, 0x75, 0x62, 0x6c, 0x65, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x52, 0x14, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x61, 0x6d, 0x42, 0x75, 0x66, 0x66, - 0x65, 0x72, 0x53, 0x69, 0x7a, 0x65, 0x4d, 0x42, 0x12, 0x57, 0x0a, 0x18, 0x61, 0x64, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, - 0x72, 0x4c, 0x65, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x18, 0x61, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x4d, 0x61, 0x78, 0x42, 0x75, 0x66, 0x66, 0x65, 0x72, 0x4c, 0x65, - 0x6e, 0x12, 0x3f, 0x0a, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, 0x6f, 0x63, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0c, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x44, 0x6f, - 0x63, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, 0x4d, 0x61, 0x78, 0x53, 0x65, - 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, + 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x73, 0x6c, 0x69, + 0x63, 0x65, 0x4d, 0x61, 0x78, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x41, 0x0a, + 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, + 0x65, 0x52, 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, + 0x12, 0x4b, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, + 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, - 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x10, 0x73, 0x6c, 0x69, 0x63, 0x65, - 0x4d, 0x61, 0x78, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x0d, 0x76, - 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x0d, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x53, 0x68, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4b, - 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, - 0x6e, 0x74, 0x4d, 0x42, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, - 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, - 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x12, 0x45, 0x0a, 0x0f, 0x73, - 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, 0x65, 0x72, 0x18, 0x0a, + 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x4d, 0x65, + 0x72, 0x67, 0x65, 0x64, 0x53, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x42, 0x12, 0x45, 0x0a, + 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, 0x65, 0x72, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x52, 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, + 0x54, 0x69, 0x65, 0x72, 0x12, 0x56, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x18, + 0x0b, 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, 0x52, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, + 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x12, 0x63, 0x0a, 0x1e, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x52, 0x0f, 0x73, 0x65, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x50, 0x65, 0x72, 0x54, 0x69, - 0x65, 0x72, 0x12, 0x56, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, - 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x18, 0x0b, 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, 0x52, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x63, 0x12, 0x63, 0x0a, 0x1e, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, 0x79, 0x18, 0x0c, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, - 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, 0x79, 0x12, - 0x51, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, - 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, - 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x72, - 0x65, 0x43, 0x6f, 0x70, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, - 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, 0x55, 0x49, 0x6e, 0x74, 0x36, 0x34, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x50, 0x72, - 0x65, 0x43, 0x6f, 0x70, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x63, - 0x12, 0x42, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, - 0x63, 0x73, 0x18, 0x0f, 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, 0x0e, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4d, 0x65, 0x74, - 0x72, 0x69, 0x63, 0x73, 0x22, 0xee, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x43, - 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, 0x06, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, - 0x6f, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x66, - 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4e, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x10, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x6c, - 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x65, 0x64, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x07, 0x69, 0x6e, 0x64, - 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x1a, - 0x5a, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 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, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x01, 0x0a, 0x0d, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, - 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, 0x61, 0x74, - 0x68, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, + 0x65, 0x52, 0x1e, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x45, 0x76, 0x65, 0x72, + 0x79, 0x12, 0x51, 0x0a, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, + 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, 0x66, 0x74, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x15, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x41, + 0x66, 0x74, 0x65, 0x72, 0x12, 0x5c, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x50, 0x72, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x63, 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, 0x55, 0x49, 0x6e, 0x74, 0x36, + 0x34, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x1a, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x72, 0x67, 0x65, + 0x50, 0x72, 0x65, 0x43, 0x6f, 0x70, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x63, 0x12, 0x42, 0x0a, 0x0e, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4d, 0x65, 0x74, + 0x72, 0x69, 0x63, 0x73, 0x18, 0x0f, 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, 0x0e, 0x76, 0x65, 0x72, 0x62, 0x6f, 0x73, 0x65, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x22, 0xee, 0x02, 0x0a, 0x0e, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x74, 0x65, 0x64, 0x12, 0x37, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4c, 0x69, 0x76, 0x65, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x40, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x1a, 0x4e, 0x0a, 0x0b, 0x46, 0x69, 0x65, 0x6c, 0x64, + 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x3c, 0x0a, 0x10, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x65, 0x64, 0x22, 0xc5, 0x01, 0x0a, 0x0f, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x10, 0x0a, 0x03, 0x67, 0x65, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x67, 0x65, 0x6e, 0x12, 0x44, 0x0a, 0x07, 0x69, + 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x49, 0x6e, 0x64, 0x69, + 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, + 0x73, 0x1a, 0x5a, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, - 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x95, 0x01, - 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x46, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0xe9, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, 0x4c, 0x45, - 0x41, 0x4e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x07, - 0x0a, 0x03, 0x49, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, 0x42, 0x4c, - 0x45, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x06, 0x12, 0x0b, - 0x0a, 0x07, 0x4c, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x44, - 0x41, 0x54, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x56, 0x49, - 0x52, 0x54, 0x55, 0x41, 0x4c, 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x54, 0x45, 0x52, - 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, 0x4d, 0x10, - 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4f, - 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, 0x45, 0x43, - 0x54, 0x10, 0x0e, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, 0x0f, 0x12, - 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x53, 0x55, 0x47, 0x47, 0x45, - 0x53, 0x54, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, 0x45, 0x10, - 0x11, 0x2a, 0x71, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x44, 0x4f, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, 0x43, 0x53, - 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x4f, 0x43, 0x53, - 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, - 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x4f, 0x43, 0x53, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, + 0x6b, 0x65, 0x79, 0x12, 0x34, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x65, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xaf, 0x01, + 0x0a, 0x0d, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x12, 0x0a, 0x04, 0x70, 0x61, 0x74, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x70, + 0x61, 0x74, 0x68, 0x12, 0x3f, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x03, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x39, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, + 0x95, 0x01, 0x0a, 0x0e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x52, 0x08, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x3b, 0x0a, 0x0d, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x2a, 0xe9, 0x01, 0x0a, 0x09, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x54, 0x4f, 0x4d, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x54, 0x45, 0x58, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x4f, 0x4f, + 0x4c, 0x45, 0x41, 0x4e, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x03, + 0x12, 0x07, 0x0a, 0x03, 0x49, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x4f, 0x55, + 0x42, 0x4c, 0x45, 0x10, 0x05, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x06, + 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x41, 0x54, 0x5f, 0x4c, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x0d, 0x0a, + 0x09, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, + 0x56, 0x49, 0x52, 0x54, 0x55, 0x41, 0x4c, 0x10, 0x09, 0x12, 0x0c, 0x0a, 0x08, 0x49, 0x4e, 0x54, + 0x45, 0x52, 0x4e, 0x41, 0x4c, 0x10, 0x0a, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x55, 0x53, 0x54, 0x4f, + 0x4d, 0x10, 0x0b, 0x12, 0x07, 0x0a, 0x03, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x12, 0x0b, 0x0a, 0x07, + 0x50, 0x4f, 0x4c, 0x59, 0x47, 0x4f, 0x4e, 0x10, 0x0d, 0x12, 0x0a, 0x0a, 0x06, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x10, 0x0e, 0x12, 0x0a, 0x0a, 0x06, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x10, + 0x0f, 0x12, 0x13, 0x0a, 0x0f, 0x43, 0x4f, 0x4e, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x53, 0x55, 0x47, + 0x47, 0x45, 0x53, 0x54, 0x10, 0x10, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x55, 0x4e, 0x54, 0x49, 0x4d, + 0x45, 0x10, 0x11, 0x2a, 0x71, 0x0a, 0x0c, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4f, 0x70, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x10, 0x00, + 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x43, 0x53, 0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x4f, + 0x43, 0x53, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x10, 0x02, 0x12, 0x18, 0x0a, 0x14, 0x44, 0x4f, + 0x43, 0x53, 0x5f, 0x46, 0x52, 0x45, 0x51, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x53, 0x10, 0x03, 0x12, 0x20, 0x0a, 0x1c, 0x44, 0x4f, 0x43, 0x53, 0x5f, 0x46, 0x52, 0x45, + 0x51, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x46, 0x46, + 0x53, 0x45, 0x54, 0x53, 0x10, 0x04, 0x2a, 0x84, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x72, 0x6d, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x5f, 0x54, 0x45, 0x52, + 0x4d, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x53, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x45, + 0x52, 0x4d, 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x50, + 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x45, + 0x52, 0x4d, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x46, + 0x46, 0x53, 0x45, 0x54, 0x53, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, - 0x54, 0x53, 0x10, 0x04, 0x2a, 0x84, 0x01, 0x0a, 0x0b, 0x54, 0x65, 0x72, 0x6d, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x73, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f, 0x5f, 0x54, 0x45, 0x52, 0x4d, 0x56, - 0x45, 0x43, 0x54, 0x4f, 0x52, 0x53, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x45, 0x52, 0x4d, - 0x53, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x50, 0x4f, 0x53, - 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x45, 0x52, 0x4d, - 0x53, 0x5f, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x46, 0x46, 0x53, - 0x45, 0x54, 0x53, 0x10, 0x03, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x45, 0x52, 0x4d, 0x53, 0x5f, 0x50, - 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x53, 0x5f, 0x4f, 0x46, 0x46, 0x53, 0x45, 0x54, 0x53, - 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x53, 0x10, 0x04, 0x2a, 0x61, 0x0a, 0x09, 0x46, - 0x61, 0x63, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x46, - 0x41, 0x43, 0x45, 0x54, 0x53, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4c, 0x41, 0x54, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x45, 0x52, 0x41, 0x52, 0x43, 0x48, 0x59, 0x10, 0x02, - 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x41, 0x4e, 0x47, - 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, 0x53, 0x45, - 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x10, 0x04, 0x2a, 0x7b, - 0x0a, 0x11, 0x54, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, - 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x45, 0x58, - 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, - 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, 0x54, 0x45, - 0x58, 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x54, 0x59, - 0x50, 0x45, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x46, 0x0a, 0x11, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x18, 0x0a, 0x14, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, - 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x45, - 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x59, 0x54, - 0x45, 0x10, 0x01, 0x2a, 0x30, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, 0x0a, 0x53, - 0x54, 0x41, 0x4e, 0x44, 0x41, 0x4c, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x50, - 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x50, 0x4c, - 0x49, 0x43, 0x41, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x6f, 0x6e, 0x65, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, 0x12, 0x0b, - 0x0a, 0x07, 0x4f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x32, 0x94, 0x21, 0x0a, 0x0c, - 0x4c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x6f, 0x0a, 0x0b, - 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x54, 0x53, 0x5f, 0x50, 0x41, 0x59, 0x4c, 0x4f, 0x41, 0x44, 0x53, 0x10, 0x04, 0x2a, 0x61, 0x0a, + 0x09, 0x46, 0x61, 0x63, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, + 0x5f, 0x46, 0x41, 0x43, 0x45, 0x54, 0x53, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x4c, 0x41, + 0x54, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x48, 0x49, 0x45, 0x52, 0x41, 0x52, 0x43, 0x48, 0x59, + 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x55, 0x4d, 0x45, 0x52, 0x49, 0x43, 0x5f, 0x52, 0x41, + 0x4e, 0x47, 0x45, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x53, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x5f, + 0x53, 0x45, 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x10, 0x04, + 0x2a, 0x7b, 0x0a, 0x11, 0x54, 0x65, 0x78, 0x74, 0x44, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x73, 0x54, 0x79, 0x70, 0x65, 0x12, 0x24, 0x0a, 0x20, 0x54, 0x45, 0x58, 0x54, 0x5f, 0x44, 0x4f, + 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1f, 0x0a, 0x1b, 0x54, + 0x45, 0x58, 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x42, 0x49, 0x4e, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x1f, 0x0a, 0x1b, + 0x54, 0x45, 0x58, 0x54, 0x5f, 0x44, 0x4f, 0x43, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x53, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x53, 0x4f, 0x52, 0x54, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x46, 0x0a, + 0x11, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x45, 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x12, 0x18, 0x0a, 0x14, 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4c, 0x45, + 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x46, 0x4c, 0x4f, 0x41, 0x54, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, + 0x56, 0x45, 0x43, 0x54, 0x4f, 0x52, 0x5f, 0x45, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x42, + 0x59, 0x54, 0x45, 0x10, 0x01, 0x2a, 0x30, 0x0a, 0x04, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x0e, 0x0a, + 0x0a, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, 0x4c, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, + 0x07, 0x50, 0x52, 0x49, 0x4d, 0x41, 0x52, 0x59, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, + 0x50, 0x4c, 0x49, 0x43, 0x41, 0x10, 0x02, 0x2a, 0x44, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x0b, 0x0a, + 0x07, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x6f, + 0x6e, 0x65, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x61, 0x69, 0x6c, 0x65, 0x64, 0x10, 0x02, + 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x6e, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x10, 0x03, 0x32, 0xaf, 0x1e, + 0x0a, 0x0c, 0x4c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x6f, + 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, - 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x21, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x76, - 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, - 0x31, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, - 0x01, 0x2a, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x69, - 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x1f, - 0x12, 0x1d, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, - 0x6f, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, 0x69, 0x65, 0x6c, 0x64, - 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, 0x01, 0x2a, - 0x12, 0x6b, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x73, - 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, - 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x62, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x11, - 0x22, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, - 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, - 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x0c, 0x2f, 0x76, 0x32, - 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x1a, 0x12, 0x18, - 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x6b, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x56, 0x32, 0x12, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, - 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, + 0x72, 0x65, 0x61, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, + 0x73, 0x0a, 0x0c, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, + 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, + 0x2f, 0x76, 0x31, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x9a, 0x01, 0x0a, 0x0e, 0x6c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x12, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x76, 0x65, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4c, 0x69, 0x76, 0x65, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x22, 0x11, 0x2f, 0x76, 0x32, 0x2f, + 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, + 0x5a, 0x1f, 0x12, 0x1d, 0x2f, 0x76, 0x32, 0x2f, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x7d, 0x12, 0x6f, 0x0a, 0x0e, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x46, 0x69, 0x65, + 0x6c, 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, + 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, + 0x01, 0x2a, 0x12, 0x6b, 0x0a, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x46, 0x69, 0x65, 0x6c, + 0x64, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x44, 0x65, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x3a, 0x01, 0x2a, 0x12, + 0x62, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x1d, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x11, 0x22, 0x0c, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x3a, 0x01, 0x2a, 0x12, 0x84, 0x01, 0x0a, 0x0a, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x56, 0x32, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x56, 0x32, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x33, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x22, 0x0c, 0x2f, + 0x76, 0x32, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x1a, + 0x12, 0x18, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x2f, 0x7b, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x6b, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0b, 0x72, - 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x61, 0x64, - 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, + 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x56, 0x32, 0x12, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x56, 0x32, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x63, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, + 0x0b, 0x72, 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x6c, 0x6f, - 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x6c, - 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0c, - 0x61, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x6c, 0x6f, 0x61, 0x64, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x72, + 0x65, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x73, + 0x0a, 0x0c, 0x61, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, - 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x61, - 0x64, 0x64, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x28, - 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x1c, 0x2e, 0x6c, + 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x31, + 0x2f, 0x61, 0x64, 0x64, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x01, + 0x2a, 0x28, 0x01, 0x12, 0x5e, 0x0a, 0x07, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x12, 0x1c, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, + 0x66, 0x72, 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x72, - 0x65, 0x73, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x66, 0x72, 0x65, 0x73, - 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x10, 0x22, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x3a, 0x01, - 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, - 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, - 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x5a, - 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x16, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x10, 0x22, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, + 0x3a, 0x01, 0x2a, 0x12, 0x5a, 0x0a, 0x06, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x1b, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, + 0x22, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x3a, 0x01, 0x2a, 0x12, + 0x6f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x17, 0x12, 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, + 0x12, 0x5a, 0x0a, 0x06, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 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, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, + 0x76, 0x31, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x54, 0x0a, 0x08, + 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x56, 0x32, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 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, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x76, 0x31, - 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, 0x12, 0x54, 0x0a, 0x08, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x56, 0x32, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x0f, 0x22, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, 0x01, 0x2a, - 0x12, 0x64, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x41, 0x6e, 0x79, 0x22, 0x15, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x76, 0x32, 0x2f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x3a, + 0x01, 0x2a, 0x12, 0x64, 0x0a, 0x06, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, - 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x76, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, 0x79, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x44, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, 0x12, 0x79, - 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x27, 0x2e, 0x6c, 0x75, - 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x19, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0b, 0x64, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, + 0x64, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0f, 0x22, 0x0a, 0x2f, 0x76, 0x31, 0x2f, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x76, 0x0a, 0x0d, 0x64, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x42, 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x42, + 0x79, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, + 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x62, 0x79, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x79, 0x3a, 0x01, 0x2a, + 0x12, 0x79, 0x0a, 0x09, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x27, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x6c, 0x6c, 0x44, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x19, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x13, 0x22, 0x0e, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x61, 0x6c, 0x6c, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0b, 0x64, + 0x65, 0x6c, 0x65, 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x73, 0x0a, 0x0c, 0x62, 0x75, - 0x69, 0x6c, 0x64, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x12, 0x21, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x1c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x16, 0x22, 0x11, 0x2f, 0x76, 0x31, 0x2f, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x3a, 0x01, 0x2a, 0x12, - 0x77, 0x0a, 0x0d, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, - 0x12, 0x22, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, - 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x17, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x6c, - 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x3a, 0x01, 0x2a, 0x12, 0x75, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x12, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x75, 0x69, 0x6c, - 0x64, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x1d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x22, 0x12, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x7b, 0x0a, 0x0e, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, - 0x74, 0x12, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x0f, - 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, - 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, - 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, - 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x19, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, - 0x65, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x9d, 0x01, - 0x0a, 0x16, 0x67, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x12, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, - 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x27, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2c, 0x12, 0x2a, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, - 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x67, 0x65, - 0x6e, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x94, 0x01, - 0x0a, 0x14, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x51, - 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, - 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x51, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, - 0x70, 0x5f, 0x77, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, - 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, - 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, - 0x09, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x5a, 0x17, 0x12, - 0x15, 0x2f, 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x61, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, 0x76, 0x31, 0x2f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0x7b, 0x0a, 0x0e, + 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x23, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1e, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x18, 0x22, 0x13, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x7f, 0x0a, 0x0f, 0x72, 0x65, 0x6c, + 0x65, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x24, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x65, 0x6c, 0x65, + 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x52, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1f, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x19, 0x22, 0x14, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x5f, 0x73, + 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x3a, 0x01, 0x2a, 0x12, 0x9d, 0x01, 0x0a, 0x16, 0x67, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x47, 0x65, 0x6e, 0x12, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x47, 0x65, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, + 0x2f, 0x76, 0x31, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x67, 0x65, 0x6e, 0x2f, 0x7b, + 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x7d, 0x12, 0x94, 0x01, 0x0a, 0x14, 0x62, + 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, + 0x69, 0x65, 0x73, 0x12, 0x29, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x2e, 0x42, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, + 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x42, 0x61, + 0x63, 0x6b, 0x75, 0x70, 0x57, 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x51, 0x75, 0x65, 0x72, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x25, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x1f, 0x22, 0x1a, 0x2f, 0x76, 0x31, 0x2f, 0x62, 0x61, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x77, + 0x61, 0x72, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x3a, 0x01, + 0x2a, 0x12, 0x6f, 0x0a, 0x0b, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, - 0x76, 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x78, 0x0a, 0x05, 0x72, 0x65, 0x61, - 0x64, 0x79, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x09, - 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5a, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, - 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, - 0x65, 0x73, 0x7d, 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x16, - 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, - 0x61, 0x70, 0x69, 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x17, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x11, 0x12, 0x0f, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x6d, 0x65, - 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x5b, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, - 0x12, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, - 0x64, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x64, 0x69, 0x63, - 0x65, 0x73, 0x12, 0x6b, 0x0a, 0x0a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, - 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x31, - 0x2f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, - 0x88, 0x01, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, + 0x72, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x15, 0x22, 0x10, 0x2f, + 0x76, 0x31, 0x2f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, + 0x01, 0x2a, 0x12, 0x6f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x09, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x3a, 0x01, 0x2a, 0x5a, 0x17, 0x12, 0x15, 0x2f, 0x76, + 0x31, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, + 0x6d, 0x65, 0x7d, 0x12, 0x61, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x20, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, 0x65, 0x61, + 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x48, + 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x12, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x12, 0x0a, 0x2f, 0x76, 0x31, 0x2f, + 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x78, 0x0a, 0x05, 0x72, 0x65, 0x61, 0x64, 0x79, 0x12, + 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, + 0x65, 0x61, 0x64, 0x79, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x48, 0x65, 0x61, 0x6c, 0x74, 0x68, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x12, 0x09, 0x2f, 0x76, 0x31, + 0x2f, 0x72, 0x65, 0x61, 0x64, 0x79, 0x5a, 0x18, 0x12, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x72, 0x65, + 0x61, 0x64, 0x79, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x7d, + 0x12, 0x50, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x16, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, + 0x70, 0x74, 0x79, 0x1a, 0x14, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x48, 0x74, 0x74, 0x70, 0x42, 0x6f, 0x64, 0x79, 0x22, 0x17, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x11, 0x12, 0x0f, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2f, 0x6d, 0x65, 0x74, 0x72, 0x69, + 0x63, 0x73, 0x12, 0x5b, 0x0a, 0x07, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x12, 0x1c, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, + 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x13, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x0d, 0x12, 0x0b, 0x2f, 0x76, 0x31, 0x2f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x12, + 0x6b, 0x0a, 0x0a, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, - 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, - 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x66, 0x0a, 0x06, 0x63, 0x75, - 0x73, 0x74, 0x6f, 0x6d, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x21, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x75, 0x73, - 0x74, 0x6f, 0x6d, 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x3a, - 0x01, 0x2a, 0x32, 0x9c, 0x06, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x52, - 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x73, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0d, - 0x72, 0x65, 0x63, 0x76, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x70, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x70, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0b, 0x73, 0x65, 0x6e, 0x64, - 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, - 0x75, 0x6e, 0x6b, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x22, 0x00, 0x28, 0x01, 0x12, 0x45, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x76, 0x52, 0x61, 0x77, - 0x46, 0x69, 0x6c, 0x65, 0x12, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x6c, - 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, - 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x0d, - 0x72, 0x65, 0x63, 0x76, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x56, 0x32, 0x12, 0x16, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, - 0x6b, 0x22, 0x00, 0x28, 0x01, 0x30, 0x01, 0x12, 0x46, 0x0a, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x46, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x1c, 0x2e, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, - 0x48, 0x0a, 0x0b, 0x6e, 0x65, 0x77, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, - 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, - 0x77, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0d, 0x77, 0x72, 0x69, - 0x74, 0x65, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, - 0x61, 0x6d, 0x65, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x11, 0x67, - 0x65, 0x74, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, - 0x47, 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1e, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, - 0x65, 0x74, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x56, 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, 0x11, 0x4c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 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, + 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, + 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x22, 0x0f, 0x2f, 0x76, 0x31, 0x2f, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x3a, 0x01, 0x2a, 0x12, 0x88, 0x01, 0x0a, + 0x11, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x73, 0x12, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x6f, 0x72, 0x63, 0x65, 0x4d, + 0x65, 0x72, 0x67, 0x65, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x22, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x22, 0x17, 0x2f, 0x76, 0x31, + 0x2f, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x72, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x66, 0x0a, 0x06, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x12, 0x1b, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x75, + 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x21, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x1b, 0x22, 0x16, 0x2f, 0x76, 0x31, 0x2f, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, + 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x74, 0x68, 0x7d, 0x3a, 0x01, 0x2a, 0x32, + 0x9c, 0x06, 0x0a, 0x11, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0b, 0x61, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, + 0x69, 0x63, 0x61, 0x73, 0x12, 0x1f, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x64, 0x64, 0x52, 0x65, 0x70, 0x6c, 0x69, 0x63, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x4a, 0x0a, 0x0d, 0x72, 0x65, 0x63, + 0x76, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1e, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x65, 0x22, 0x00, 0x12, 0x4b, 0x0a, 0x0b, 0x73, 0x65, 0x6e, 0x64, 0x52, 0x61, 0x77, + 0x46, 0x69, 0x6c, 0x65, 0x12, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, + 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, + 0x28, 0x01, 0x12, 0x45, 0x0a, 0x0b, 0x72, 0x65, 0x63, 0x76, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, + 0x65, 0x12, 0x16, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, + 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, + 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, 0x30, 0x01, 0x12, 0x49, 0x0a, 0x0d, 0x72, 0x65, 0x63, + 0x76, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x56, 0x32, 0x12, 0x16, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x69, 0x6c, 0x65, 0x49, 0x6e, + 0x66, 0x6f, 0x1a, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x2e, 0x52, 0x61, 0x77, 0x46, 0x69, 0x6c, 0x65, 0x43, 0x68, 0x75, 0x6e, 0x6b, 0x22, 0x00, + 0x28, 0x01, 0x30, 0x01, 0x12, 0x46, 0x0a, 0x09, 0x63, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, + 0x73, 0x12, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x2e, 0x43, 0x6f, 0x70, 0x79, 0x46, 0x69, 0x6c, 0x65, 0x73, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, + 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x30, 0x01, 0x12, 0x48, 0x0a, 0x0b, + 0x6e, 0x65, 0x77, 0x4e, 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x2e, 0x6c, 0x75, + 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4e, 0x65, 0x77, 0x4e, 0x52, + 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x22, 0x00, 0x12, 0x49, 0x0a, 0x0d, 0x77, 0x72, 0x69, 0x74, 0x65, 0x4e, + 0x52, 0x54, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x17, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, + 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, + 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, + 0x00, 0x12, 0x55, 0x0a, 0x19, 0x67, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x1a, 0x1d, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x00, 0x12, 0x54, 0x0a, 0x11, 0x67, 0x65, 0x74, 0x43, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x1d, 0x2e, + 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6c, + 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x47, 0x65, 0x74, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x56, + 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, 0x11, 0x4c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 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 ( @@ -7549,14 +7524,10 @@ var file_yelp_nrtsearch_luceneserver_proto_goTypes = []interface{}{ (*wrapperspb.StringValue)(nil), // 108: google.protobuf.StringValue (*wrapperspb.UInt64Value)(nil), // 109: google.protobuf.UInt64Value (*SearchRequest)(nil), // 110: luceneserver.SearchRequest - (*BuildSuggestRequest)(nil), // 111: luceneserver.BuildSuggestRequest - (*SuggestLookupRequest)(nil), // 112: luceneserver.SuggestLookupRequest - (*emptypb.Empty)(nil), // 113: google.protobuf.Empty - (*SearchResponse)(nil), // 114: luceneserver.SearchResponse - (*anypb.Any)(nil), // 115: google.protobuf.Any - (*BuildSuggestResponse)(nil), // 116: luceneserver.BuildSuggestResponse - (*SuggestLookupResponse)(nil), // 117: luceneserver.SuggestLookupResponse - (*httpbody.HttpBody)(nil), // 118: google.api.HttpBody + (*emptypb.Empty)(nil), // 111: google.protobuf.Empty + (*SearchResponse)(nil), // 112: luceneserver.SearchResponse + (*anypb.Any)(nil), // 113: google.protobuf.Any + (*httpbody.HttpBody)(nil), // 114: google.api.HttpBody } var file_yelp_nrtsearch_luceneserver_proto_depIdxs = []int32{ 87, // 0: luceneserver.CreateIndexRequest.settings:type_name -> luceneserver.IndexSettings @@ -7655,81 +7626,75 @@ var file_yelp_nrtsearch_luceneserver_proto_depIdxs = []int32{ 82, // 93: luceneserver.LuceneServer.deleteByQuery:input_type -> luceneserver.DeleteByQueryRequest 38, // 94: luceneserver.LuceneServer.deleteAll:input_type -> luceneserver.DeleteAllDocumentsRequest 40, // 95: luceneserver.LuceneServer.deleteIndex:input_type -> luceneserver.DeleteIndexRequest - 111, // 96: luceneserver.LuceneServer.buildSuggest:input_type -> luceneserver.BuildSuggestRequest - 112, // 97: luceneserver.LuceneServer.suggestLookup:input_type -> luceneserver.SuggestLookupRequest - 111, // 98: luceneserver.LuceneServer.updateSuggest:input_type -> luceneserver.BuildSuggestRequest - 46, // 99: luceneserver.LuceneServer.createSnapshot:input_type -> luceneserver.CreateSnapshotRequest - 49, // 100: luceneserver.LuceneServer.releaseSnapshot:input_type -> luceneserver.ReleaseSnapshotRequest - 51, // 101: luceneserver.LuceneServer.getAllSnapshotIndexGen:input_type -> luceneserver.GetAllSnapshotGenRequest - 53, // 102: luceneserver.LuceneServer.backupWarmingQueries:input_type -> luceneserver.BackupWarmingQueriesRequest - 59, // 103: luceneserver.LuceneServer.globalState:input_type -> luceneserver.GlobalStateRequest - 61, // 104: luceneserver.LuceneServer.state:input_type -> luceneserver.StateRequest - 72, // 105: luceneserver.LuceneServer.status:input_type -> luceneserver.HealthCheckRequest - 74, // 106: luceneserver.LuceneServer.ready:input_type -> luceneserver.ReadyCheckRequest - 113, // 107: luceneserver.LuceneServer.metrics:input_type -> google.protobuf.Empty - 55, // 108: luceneserver.LuceneServer.indices:input_type -> luceneserver.IndicesRequest - 83, // 109: luceneserver.LuceneServer.forceMerge:input_type -> luceneserver.ForceMergeRequest - 85, // 110: luceneserver.LuceneServer.forceMergeDeletes:input_type -> luceneserver.ForceMergeDeletesRequest - 92, // 111: luceneserver.LuceneServer.custom:input_type -> luceneserver.CustomRequest - 63, // 112: luceneserver.ReplicationServer.addReplicas:input_type -> luceneserver.AddReplicaRequest - 69, // 113: luceneserver.ReplicationServer.recvCopyState:input_type -> luceneserver.CopyStateRequest - 71, // 114: luceneserver.ReplicationServer.sendRawFile:input_type -> luceneserver.RawFileChunk - 70, // 115: luceneserver.ReplicationServer.recvRawFile:input_type -> luceneserver.FileInfo - 70, // 116: luceneserver.ReplicationServer.recvRawFileV2:input_type -> luceneserver.FileInfo - 68, // 117: luceneserver.ReplicationServer.copyFiles:input_type -> luceneserver.CopyFiles - 76, // 118: luceneserver.ReplicationServer.newNRTPoint:input_type -> luceneserver.NewNRTPoint - 77, // 119: luceneserver.ReplicationServer.writeNRTPoint:input_type -> luceneserver.IndexName - 77, // 120: luceneserver.ReplicationServer.getCurrentSearcherVersion:input_type -> luceneserver.IndexName - 79, // 121: luceneserver.ReplicationServer.getConnectedNodes:input_type -> luceneserver.GetNodesRequest - 11, // 122: luceneserver.LuceneServer.createIndex:output_type -> luceneserver.CreateIndexResponse - 13, // 123: luceneserver.LuceneServer.liveSettings:output_type -> luceneserver.LiveSettingsResponse - 15, // 124: luceneserver.LuceneServer.liveSettingsV2:output_type -> luceneserver.LiveSettingsV2Response - 19, // 125: luceneserver.LuceneServer.registerFields:output_type -> luceneserver.FieldDefResponse - 19, // 126: luceneserver.LuceneServer.updateFields:output_type -> luceneserver.FieldDefResponse - 21, // 127: luceneserver.LuceneServer.settings:output_type -> luceneserver.SettingsResponse - 23, // 128: luceneserver.LuceneServer.settingsV2:output_type -> luceneserver.SettingsV2Response - 26, // 129: luceneserver.LuceneServer.startIndex:output_type -> luceneserver.StartIndexResponse - 26, // 130: luceneserver.LuceneServer.startIndexV2:output_type -> luceneserver.StartIndexResponse - 42, // 131: luceneserver.LuceneServer.stopIndex:output_type -> luceneserver.DummyResponse - 45, // 132: luceneserver.LuceneServer.reloadState:output_type -> luceneserver.ReloadStateResponse - 29, // 133: luceneserver.LuceneServer.addDocuments:output_type -> luceneserver.AddDocumentResponse - 31, // 134: luceneserver.LuceneServer.refresh:output_type -> luceneserver.RefreshResponse - 33, // 135: luceneserver.LuceneServer.commit:output_type -> luceneserver.CommitResponse - 35, // 136: luceneserver.LuceneServer.stats:output_type -> luceneserver.StatsResponse - 114, // 137: luceneserver.LuceneServer.search:output_type -> luceneserver.SearchResponse - 115, // 138: luceneserver.LuceneServer.searchV2:output_type -> google.protobuf.Any - 29, // 139: luceneserver.LuceneServer.delete:output_type -> luceneserver.AddDocumentResponse - 29, // 140: luceneserver.LuceneServer.deleteByQuery:output_type -> luceneserver.AddDocumentResponse - 39, // 141: luceneserver.LuceneServer.deleteAll:output_type -> luceneserver.DeleteAllDocumentsResponse - 41, // 142: luceneserver.LuceneServer.deleteIndex:output_type -> luceneserver.DeleteIndexResponse - 116, // 143: luceneserver.LuceneServer.buildSuggest:output_type -> luceneserver.BuildSuggestResponse - 117, // 144: luceneserver.LuceneServer.suggestLookup:output_type -> luceneserver.SuggestLookupResponse - 116, // 145: luceneserver.LuceneServer.updateSuggest:output_type -> luceneserver.BuildSuggestResponse - 47, // 146: luceneserver.LuceneServer.createSnapshot:output_type -> luceneserver.CreateSnapshotResponse - 50, // 147: luceneserver.LuceneServer.releaseSnapshot:output_type -> luceneserver.ReleaseSnapshotResponse - 52, // 148: luceneserver.LuceneServer.getAllSnapshotIndexGen:output_type -> luceneserver.GetAllSnapshotGenResponse - 54, // 149: luceneserver.LuceneServer.backupWarmingQueries:output_type -> luceneserver.BackupWarmingQueriesResponse - 60, // 150: luceneserver.LuceneServer.globalState:output_type -> luceneserver.GlobalStateResponse - 62, // 151: luceneserver.LuceneServer.state:output_type -> luceneserver.StateResponse - 73, // 152: luceneserver.LuceneServer.status:output_type -> luceneserver.HealthCheckResponse - 73, // 153: luceneserver.LuceneServer.ready:output_type -> luceneserver.HealthCheckResponse - 118, // 154: luceneserver.LuceneServer.metrics:output_type -> google.api.HttpBody - 56, // 155: luceneserver.LuceneServer.indices:output_type -> luceneserver.IndicesResponse - 84, // 156: luceneserver.LuceneServer.forceMerge:output_type -> luceneserver.ForceMergeResponse - 86, // 157: luceneserver.LuceneServer.forceMergeDeletes:output_type -> luceneserver.ForceMergeDeletesResponse - 93, // 158: luceneserver.LuceneServer.custom:output_type -> luceneserver.CustomResponse - 64, // 159: luceneserver.ReplicationServer.addReplicas:output_type -> luceneserver.AddReplicaResponse - 65, // 160: luceneserver.ReplicationServer.recvCopyState:output_type -> luceneserver.CopyState - 75, // 161: luceneserver.ReplicationServer.sendRawFile:output_type -> luceneserver.TransferStatus - 71, // 162: luceneserver.ReplicationServer.recvRawFile:output_type -> luceneserver.RawFileChunk - 71, // 163: luceneserver.ReplicationServer.recvRawFileV2:output_type -> luceneserver.RawFileChunk - 75, // 164: luceneserver.ReplicationServer.copyFiles:output_type -> luceneserver.TransferStatus - 75, // 165: luceneserver.ReplicationServer.newNRTPoint:output_type -> luceneserver.TransferStatus - 78, // 166: luceneserver.ReplicationServer.writeNRTPoint:output_type -> luceneserver.SearcherVersion - 78, // 167: luceneserver.ReplicationServer.getCurrentSearcherVersion:output_type -> luceneserver.SearcherVersion - 80, // 168: luceneserver.ReplicationServer.getConnectedNodes:output_type -> luceneserver.GetNodesResponse - 122, // [122:169] is the sub-list for method output_type - 75, // [75:122] is the sub-list for method input_type + 46, // 96: luceneserver.LuceneServer.createSnapshot:input_type -> luceneserver.CreateSnapshotRequest + 49, // 97: luceneserver.LuceneServer.releaseSnapshot:input_type -> luceneserver.ReleaseSnapshotRequest + 51, // 98: luceneserver.LuceneServer.getAllSnapshotIndexGen:input_type -> luceneserver.GetAllSnapshotGenRequest + 53, // 99: luceneserver.LuceneServer.backupWarmingQueries:input_type -> luceneserver.BackupWarmingQueriesRequest + 59, // 100: luceneserver.LuceneServer.globalState:input_type -> luceneserver.GlobalStateRequest + 61, // 101: luceneserver.LuceneServer.state:input_type -> luceneserver.StateRequest + 72, // 102: luceneserver.LuceneServer.status:input_type -> luceneserver.HealthCheckRequest + 74, // 103: luceneserver.LuceneServer.ready:input_type -> luceneserver.ReadyCheckRequest + 111, // 104: luceneserver.LuceneServer.metrics:input_type -> google.protobuf.Empty + 55, // 105: luceneserver.LuceneServer.indices:input_type -> luceneserver.IndicesRequest + 83, // 106: luceneserver.LuceneServer.forceMerge:input_type -> luceneserver.ForceMergeRequest + 85, // 107: luceneserver.LuceneServer.forceMergeDeletes:input_type -> luceneserver.ForceMergeDeletesRequest + 92, // 108: luceneserver.LuceneServer.custom:input_type -> luceneserver.CustomRequest + 63, // 109: luceneserver.ReplicationServer.addReplicas:input_type -> luceneserver.AddReplicaRequest + 69, // 110: luceneserver.ReplicationServer.recvCopyState:input_type -> luceneserver.CopyStateRequest + 71, // 111: luceneserver.ReplicationServer.sendRawFile:input_type -> luceneserver.RawFileChunk + 70, // 112: luceneserver.ReplicationServer.recvRawFile:input_type -> luceneserver.FileInfo + 70, // 113: luceneserver.ReplicationServer.recvRawFileV2:input_type -> luceneserver.FileInfo + 68, // 114: luceneserver.ReplicationServer.copyFiles:input_type -> luceneserver.CopyFiles + 76, // 115: luceneserver.ReplicationServer.newNRTPoint:input_type -> luceneserver.NewNRTPoint + 77, // 116: luceneserver.ReplicationServer.writeNRTPoint:input_type -> luceneserver.IndexName + 77, // 117: luceneserver.ReplicationServer.getCurrentSearcherVersion:input_type -> luceneserver.IndexName + 79, // 118: luceneserver.ReplicationServer.getConnectedNodes:input_type -> luceneserver.GetNodesRequest + 11, // 119: luceneserver.LuceneServer.createIndex:output_type -> luceneserver.CreateIndexResponse + 13, // 120: luceneserver.LuceneServer.liveSettings:output_type -> luceneserver.LiveSettingsResponse + 15, // 121: luceneserver.LuceneServer.liveSettingsV2:output_type -> luceneserver.LiveSettingsV2Response + 19, // 122: luceneserver.LuceneServer.registerFields:output_type -> luceneserver.FieldDefResponse + 19, // 123: luceneserver.LuceneServer.updateFields:output_type -> luceneserver.FieldDefResponse + 21, // 124: luceneserver.LuceneServer.settings:output_type -> luceneserver.SettingsResponse + 23, // 125: luceneserver.LuceneServer.settingsV2:output_type -> luceneserver.SettingsV2Response + 26, // 126: luceneserver.LuceneServer.startIndex:output_type -> luceneserver.StartIndexResponse + 26, // 127: luceneserver.LuceneServer.startIndexV2:output_type -> luceneserver.StartIndexResponse + 42, // 128: luceneserver.LuceneServer.stopIndex:output_type -> luceneserver.DummyResponse + 45, // 129: luceneserver.LuceneServer.reloadState:output_type -> luceneserver.ReloadStateResponse + 29, // 130: luceneserver.LuceneServer.addDocuments:output_type -> luceneserver.AddDocumentResponse + 31, // 131: luceneserver.LuceneServer.refresh:output_type -> luceneserver.RefreshResponse + 33, // 132: luceneserver.LuceneServer.commit:output_type -> luceneserver.CommitResponse + 35, // 133: luceneserver.LuceneServer.stats:output_type -> luceneserver.StatsResponse + 112, // 134: luceneserver.LuceneServer.search:output_type -> luceneserver.SearchResponse + 113, // 135: luceneserver.LuceneServer.searchV2:output_type -> google.protobuf.Any + 29, // 136: luceneserver.LuceneServer.delete:output_type -> luceneserver.AddDocumentResponse + 29, // 137: luceneserver.LuceneServer.deleteByQuery:output_type -> luceneserver.AddDocumentResponse + 39, // 138: luceneserver.LuceneServer.deleteAll:output_type -> luceneserver.DeleteAllDocumentsResponse + 41, // 139: luceneserver.LuceneServer.deleteIndex:output_type -> luceneserver.DeleteIndexResponse + 47, // 140: luceneserver.LuceneServer.createSnapshot:output_type -> luceneserver.CreateSnapshotResponse + 50, // 141: luceneserver.LuceneServer.releaseSnapshot:output_type -> luceneserver.ReleaseSnapshotResponse + 52, // 142: luceneserver.LuceneServer.getAllSnapshotIndexGen:output_type -> luceneserver.GetAllSnapshotGenResponse + 54, // 143: luceneserver.LuceneServer.backupWarmingQueries:output_type -> luceneserver.BackupWarmingQueriesResponse + 60, // 144: luceneserver.LuceneServer.globalState:output_type -> luceneserver.GlobalStateResponse + 62, // 145: luceneserver.LuceneServer.state:output_type -> luceneserver.StateResponse + 73, // 146: luceneserver.LuceneServer.status:output_type -> luceneserver.HealthCheckResponse + 73, // 147: luceneserver.LuceneServer.ready:output_type -> luceneserver.HealthCheckResponse + 114, // 148: luceneserver.LuceneServer.metrics:output_type -> google.api.HttpBody + 56, // 149: luceneserver.LuceneServer.indices:output_type -> luceneserver.IndicesResponse + 84, // 150: luceneserver.LuceneServer.forceMerge:output_type -> luceneserver.ForceMergeResponse + 86, // 151: luceneserver.LuceneServer.forceMergeDeletes:output_type -> luceneserver.ForceMergeDeletesResponse + 93, // 152: luceneserver.LuceneServer.custom:output_type -> luceneserver.CustomResponse + 64, // 153: luceneserver.ReplicationServer.addReplicas:output_type -> luceneserver.AddReplicaResponse + 65, // 154: luceneserver.ReplicationServer.recvCopyState:output_type -> luceneserver.CopyState + 75, // 155: luceneserver.ReplicationServer.sendRawFile:output_type -> luceneserver.TransferStatus + 71, // 156: luceneserver.ReplicationServer.recvRawFile:output_type -> luceneserver.RawFileChunk + 71, // 157: luceneserver.ReplicationServer.recvRawFileV2:output_type -> luceneserver.RawFileChunk + 75, // 158: luceneserver.ReplicationServer.copyFiles:output_type -> luceneserver.TransferStatus + 75, // 159: luceneserver.ReplicationServer.newNRTPoint:output_type -> luceneserver.TransferStatus + 78, // 160: luceneserver.ReplicationServer.writeNRTPoint:output_type -> luceneserver.SearcherVersion + 78, // 161: luceneserver.ReplicationServer.getCurrentSearcherVersion:output_type -> luceneserver.SearcherVersion + 80, // 162: luceneserver.ReplicationServer.getConnectedNodes:output_type -> luceneserver.GetNodesResponse + 119, // [119:163] is the sub-list for method output_type + 75, // [75:119] is the sub-list for method input_type 75, // [75:75] is the sub-list for extension type_name 75, // [75:75] is the sub-list for extension extendee 0, // [0:75] is the sub-list for field type_name @@ -7742,7 +7707,6 @@ func file_yelp_nrtsearch_luceneserver_proto_init() { } file_yelp_nrtsearch_search_proto_init() file_yelp_nrtsearch_analysis_proto_init() - file_yelp_nrtsearch_suggest_proto_init() if !protoimpl.UnsafeEnabled { file_yelp_nrtsearch_luceneserver_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*CreateIndexRequest); i { @@ -8850,12 +8814,6 @@ type LuceneServerClient interface { DeleteAll(ctx context.Context, in *DeleteAllDocumentsRequest, opts ...grpc.CallOption) (*DeleteAllDocumentsResponse, error) // Delete index DeleteIndex(ctx context.Context, in *DeleteIndexRequest, opts ...grpc.CallOption) (*DeleteIndexResponse, error) - // Builds a new auto-suggester, loading suggestions via the provided local file path. - BuildSuggest(ctx context.Context, in *BuildSuggestRequest, opts ...grpc.CallOption) (*BuildSuggestResponse, error) - // Perform an auto-suggest lookup. - SuggestLookup(ctx context.Context, in *SuggestLookupRequest, opts ...grpc.CallOption) (*SuggestLookupResponse, error) - // Updates existing suggestions, if the suggester supports near-real-time changes. - UpdateSuggest(ctx context.Context, in *BuildSuggestRequest, opts ...grpc.CallOption) (*BuildSuggestResponse, error) // Creates a snapshot in the index, which is saved point-in-time view of the last commit // in the index such that no files referenced by that snapshot will be deleted by ongoing // indexing until the snapshot is released with @releaseSnapshot. Note that this will @@ -8880,7 +8838,7 @@ type LuceneServerClient interface { BackupWarmingQueries(ctx context.Context, in *BackupWarmingQueriesRequest, opts ...grpc.CallOption) (*BackupWarmingQueriesResponse, error) // Get the global state of the cluster GlobalState(ctx context.Context, in *GlobalStateRequest, opts ...grpc.CallOption) (*GlobalStateResponse, error) - // Gets the state of a started index, includes settings, live_settings, search schema, suggest schema + // Gets the state of a started index, includes settings, live_settings, search schema State(ctx context.Context, in *StateRequest, opts ...grpc.CallOption) (*StateResponse, error) // healthcheck Status(ctx context.Context, in *HealthCheckRequest, opts ...grpc.CallOption) (*HealthCheckResponse, error) @@ -9129,33 +9087,6 @@ func (c *luceneServerClient) DeleteIndex(ctx context.Context, in *DeleteIndexReq return out, nil } -func (c *luceneServerClient) BuildSuggest(ctx context.Context, in *BuildSuggestRequest, opts ...grpc.CallOption) (*BuildSuggestResponse, error) { - out := new(BuildSuggestResponse) - err := c.cc.Invoke(ctx, "/luceneserver.LuceneServer/buildSuggest", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *luceneServerClient) SuggestLookup(ctx context.Context, in *SuggestLookupRequest, opts ...grpc.CallOption) (*SuggestLookupResponse, error) { - out := new(SuggestLookupResponse) - err := c.cc.Invoke(ctx, "/luceneserver.LuceneServer/suggestLookup", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - -func (c *luceneServerClient) UpdateSuggest(ctx context.Context, in *BuildSuggestRequest, opts ...grpc.CallOption) (*BuildSuggestResponse, error) { - out := new(BuildSuggestResponse) - err := c.cc.Invoke(ctx, "/luceneserver.LuceneServer/updateSuggest", in, out, opts...) - if err != nil { - return nil, err - } - return out, nil -} - func (c *luceneServerClient) CreateSnapshot(ctx context.Context, in *CreateSnapshotRequest, opts ...grpc.CallOption) (*CreateSnapshotResponse, error) { out := new(CreateSnapshotResponse) err := c.cc.Invoke(ctx, "/luceneserver.LuceneServer/createSnapshot", in, out, opts...) @@ -9325,12 +9256,6 @@ type LuceneServerServer interface { DeleteAll(context.Context, *DeleteAllDocumentsRequest) (*DeleteAllDocumentsResponse, error) // Delete index DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) - // Builds a new auto-suggester, loading suggestions via the provided local file path. - BuildSuggest(context.Context, *BuildSuggestRequest) (*BuildSuggestResponse, error) - // Perform an auto-suggest lookup. - SuggestLookup(context.Context, *SuggestLookupRequest) (*SuggestLookupResponse, error) - // Updates existing suggestions, if the suggester supports near-real-time changes. - UpdateSuggest(context.Context, *BuildSuggestRequest) (*BuildSuggestResponse, error) // Creates a snapshot in the index, which is saved point-in-time view of the last commit // in the index such that no files referenced by that snapshot will be deleted by ongoing // indexing until the snapshot is released with @releaseSnapshot. Note that this will @@ -9355,7 +9280,7 @@ type LuceneServerServer interface { BackupWarmingQueries(context.Context, *BackupWarmingQueriesRequest) (*BackupWarmingQueriesResponse, error) // Get the global state of the cluster GlobalState(context.Context, *GlobalStateRequest) (*GlobalStateResponse, error) - // Gets the state of a started index, includes settings, live_settings, search schema, suggest schema + // Gets the state of a started index, includes settings, live_settings, search schema State(context.Context, *StateRequest) (*StateResponse, error) // healthcheck Status(context.Context, *HealthCheckRequest) (*HealthCheckResponse, error) @@ -9449,15 +9374,6 @@ func (*UnimplementedLuceneServerServer) DeleteAll(context.Context, *DeleteAllDoc func (*UnimplementedLuceneServerServer) DeleteIndex(context.Context, *DeleteIndexRequest) (*DeleteIndexResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteIndex not implemented") } -func (*UnimplementedLuceneServerServer) BuildSuggest(context.Context, *BuildSuggestRequest) (*BuildSuggestResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method BuildSuggest not implemented") -} -func (*UnimplementedLuceneServerServer) SuggestLookup(context.Context, *SuggestLookupRequest) (*SuggestLookupResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method SuggestLookup not implemented") -} -func (*UnimplementedLuceneServerServer) UpdateSuggest(context.Context, *BuildSuggestRequest) (*BuildSuggestResponse, error) { - return nil, status.Errorf(codes.Unimplemented, "method UpdateSuggest not implemented") -} func (*UnimplementedLuceneServerServer) CreateSnapshot(context.Context, *CreateSnapshotRequest) (*CreateSnapshotResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method CreateSnapshot not implemented") } @@ -9888,60 +9804,6 @@ func _LuceneServer_DeleteIndex_Handler(srv interface{}, ctx context.Context, dec return interceptor(ctx, in, info, handler) } -func _LuceneServer_BuildSuggest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BuildSuggestRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LuceneServerServer).BuildSuggest(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/luceneserver.LuceneServer/BuildSuggest", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LuceneServerServer).BuildSuggest(ctx, req.(*BuildSuggestRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _LuceneServer_SuggestLookup_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(SuggestLookupRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LuceneServerServer).SuggestLookup(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/luceneserver.LuceneServer/SuggestLookup", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LuceneServerServer).SuggestLookup(ctx, req.(*SuggestLookupRequest)) - } - return interceptor(ctx, in, info, handler) -} - -func _LuceneServer_UpdateSuggest_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(BuildSuggestRequest) - if err := dec(in); err != nil { - return nil, err - } - if interceptor == nil { - return srv.(LuceneServerServer).UpdateSuggest(ctx, in) - } - info := &grpc.UnaryServerInfo{ - Server: srv, - FullMethod: "/luceneserver.LuceneServer/UpdateSuggest", - } - handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(LuceneServerServer).UpdateSuggest(ctx, req.(*BuildSuggestRequest)) - } - return interceptor(ctx, in, info, handler) -} - func _LuceneServer_CreateSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(CreateSnapshotRequest) if err := dec(in); err != nil { @@ -10260,18 +10122,6 @@ var _LuceneServer_serviceDesc = grpc.ServiceDesc{ MethodName: "deleteIndex", Handler: _LuceneServer_DeleteIndex_Handler, }, - { - MethodName: "buildSuggest", - Handler: _LuceneServer_BuildSuggest_Handler, - }, - { - MethodName: "suggestLookup", - Handler: _LuceneServer_SuggestLookup_Handler, - }, - { - MethodName: "updateSuggest", - Handler: _LuceneServer_UpdateSuggest_Handler, - }, { MethodName: "createSnapshot", Handler: _LuceneServer_CreateSnapshot_Handler, diff --git a/grpc-gateway/luceneserver.pb.gw.go b/grpc-gateway/luceneserver.pb.gw.go index 2d32b0577..168c045a8 100644 --- a/grpc-gateway/luceneserver.pb.gw.go +++ b/grpc-gateway/luceneserver.pb.gw.go @@ -948,108 +948,6 @@ func local_request_LuceneServer_DeleteIndex_0(ctx context.Context, marshaler run } -func request_LuceneServer_BuildSuggest_0(ctx context.Context, marshaler runtime.Marshaler, client LuceneServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq BuildSuggestRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.BuildSuggest(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_LuceneServer_BuildSuggest_0(ctx context.Context, marshaler runtime.Marshaler, server LuceneServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq BuildSuggestRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.BuildSuggest(ctx, &protoReq) - return msg, metadata, err - -} - -func request_LuceneServer_SuggestLookup_0(ctx context.Context, marshaler runtime.Marshaler, client LuceneServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SuggestLookupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.SuggestLookup(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_LuceneServer_SuggestLookup_0(ctx context.Context, marshaler runtime.Marshaler, server LuceneServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq SuggestLookupRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.SuggestLookup(ctx, &protoReq) - return msg, metadata, err - -} - -func request_LuceneServer_UpdateSuggest_0(ctx context.Context, marshaler runtime.Marshaler, client LuceneServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq BuildSuggestRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := client.UpdateSuggest(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) - return msg, metadata, err - -} - -func local_request_LuceneServer_UpdateSuggest_0(ctx context.Context, marshaler runtime.Marshaler, server LuceneServerServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq BuildSuggestRequest - var metadata runtime.ServerMetadata - - newReader, berr := utilities.IOReaderFactory(req.Body) - if berr != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr) - } - if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF { - return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) - } - - msg, err := server.UpdateSuggest(ctx, &protoReq) - return msg, metadata, err - -} - func request_LuceneServer_CreateSnapshot_0(ctx context.Context, marshaler runtime.Marshaler, client LuceneServerClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq CreateSnapshotRequest var metadata runtime.ServerMetadata @@ -2205,78 +2103,6 @@ func RegisterLuceneServerHandlerServer(ctx context.Context, mux *runtime.ServeMu }) - mux.Handle("POST", pattern_LuceneServer_BuildSuggest_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/luceneserver.LuceneServer/BuildSuggest", runtime.WithHTTPPathPattern("/v1/suggest_build")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_LuceneServer_BuildSuggest_0(ctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_BuildSuggest_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_LuceneServer_SuggestLookup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/luceneserver.LuceneServer/SuggestLookup", runtime.WithHTTPPathPattern("/v1/suggest_lookup")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_LuceneServer_SuggestLookup_0(ctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_SuggestLookup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_LuceneServer_UpdateSuggest_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - var stream runtime.ServerTransportStream - ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/luceneserver.LuceneServer/UpdateSuggest", runtime.WithHTTPPathPattern("/v1/suggest_update")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := local_request_LuceneServer_UpdateSuggest_0(ctx, inboundMarshaler, server, req, pathParams) - md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_UpdateSuggest_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_LuceneServer_CreateSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3182,69 +3008,6 @@ func RegisterLuceneServerHandlerClient(ctx context.Context, mux *runtime.ServeMu }) - mux.Handle("POST", pattern_LuceneServer_BuildSuggest_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateContext(ctx, mux, req, "/luceneserver.LuceneServer/BuildSuggest", runtime.WithHTTPPathPattern("/v1/suggest_build")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_LuceneServer_BuildSuggest_0(ctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_BuildSuggest_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_LuceneServer_SuggestLookup_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateContext(ctx, mux, req, "/luceneserver.LuceneServer/SuggestLookup", runtime.WithHTTPPathPattern("/v1/suggest_lookup")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_LuceneServer_SuggestLookup_0(ctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_SuggestLookup_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - - mux.Handle("POST", pattern_LuceneServer_UpdateSuggest_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { - ctx, cancel := context.WithCancel(req.Context()) - defer cancel() - inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - var err error - ctx, err = runtime.AnnotateContext(ctx, mux, req, "/luceneserver.LuceneServer/UpdateSuggest", runtime.WithHTTPPathPattern("/v1/suggest_update")) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - resp, md, err := request_LuceneServer_UpdateSuggest_0(ctx, inboundMarshaler, client, req, pathParams) - ctx = runtime.NewServerMetadataContext(ctx, md) - if err != nil { - runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) - return - } - - forward_LuceneServer_UpdateSuggest_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) - - }) - mux.Handle("POST", pattern_LuceneServer_CreateSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -3612,12 +3375,6 @@ var ( pattern_LuceneServer_DeleteIndex_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "delete_index"}, "")) - pattern_LuceneServer_BuildSuggest_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "suggest_build"}, "")) - - pattern_LuceneServer_SuggestLookup_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "suggest_lookup"}, "")) - - pattern_LuceneServer_UpdateSuggest_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "suggest_update"}, "")) - pattern_LuceneServer_CreateSnapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "create_snapshot"}, "")) pattern_LuceneServer_ReleaseSnapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "release_snapshot"}, "")) @@ -3698,12 +3455,6 @@ var ( forward_LuceneServer_DeleteIndex_0 = runtime.ForwardResponseMessage - forward_LuceneServer_BuildSuggest_0 = runtime.ForwardResponseMessage - - forward_LuceneServer_SuggestLookup_0 = runtime.ForwardResponseMessage - - forward_LuceneServer_UpdateSuggest_0 = runtime.ForwardResponseMessage - forward_LuceneServer_CreateSnapshot_0 = runtime.ForwardResponseMessage forward_LuceneServer_ReleaseSnapshot_0 = runtime.ForwardResponseMessage diff --git a/grpc-gateway/luceneserver.swagger.json b/grpc-gateway/luceneserver.swagger.json index 5e368bcb4..2f066be63 100644 --- a/grpc-gateway/luceneserver.swagger.json +++ b/grpc-gateway/luceneserver.swagger.json @@ -874,7 +874,7 @@ }, "/v1/state": { "post": { - "summary": "Gets the state of a started index, includes settings, live_settings, search schema, suggest schema", + "summary": "Gets the state of a started index, includes settings, live_settings, search schema", "operationId": "LuceneServer_state", "responses": { "200": { @@ -907,7 +907,7 @@ }, "/v1/state/{indexName}": { "get": { - "summary": "Gets the state of a started index, includes settings, live_settings, search schema, suggest schema", + "summary": "Gets the state of a started index, includes settings, live_settings, search schema", "operationId": "LuceneServer_state2", "responses": { "200": { @@ -1064,105 +1064,6 @@ ] } }, - "/v1/suggest_build": { - "post": { - "summary": "Builds a new auto-suggester, loading suggestions via the provided local file path.", - "operationId": "LuceneServer_buildSuggest", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/luceneserverBuildSuggestResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/googlerpcStatus" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/luceneserverBuildSuggestRequest" - } - } - ], - "tags": [ - "LuceneServer" - ] - } - }, - "/v1/suggest_lookup": { - "post": { - "summary": "Perform an auto-suggest lookup.", - "operationId": "LuceneServer_suggestLookup", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/luceneserverSuggestLookupResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/googlerpcStatus" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/luceneserverSuggestLookupRequest" - } - } - ], - "tags": [ - "LuceneServer" - ] - } - }, - "/v1/suggest_update": { - "post": { - "summary": "Updates existing suggestions, if the suggester supports near-real-time changes.", - "operationId": "LuceneServer_updateSuggest", - "responses": { - "200": { - "description": "A successful response.", - "schema": { - "$ref": "#/definitions/luceneserverBuildSuggestResponse" - } - }, - "default": { - "description": "An unexpected error response.", - "schema": { - "$ref": "#/definitions/googlerpcStatus" - } - } - }, - "parameters": [ - { - "name": "body", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/luceneserverBuildSuggestRequest" - } - } - ], - "tags": [ - "LuceneServer" - ] - } - }, "/v1/update_fields": { "post": { "summary": "Adds one or more fields. Fields must be registered before they can be added in a document (via @addDocument).\nPass a list of Fields and an indexName. Any number of fields may be registered in a single request,\nand once a field is registered it cannot be changed (write-once).\nThis returns the full set of fields currently registered.", @@ -2397,35 +2298,6 @@ } } }, - "luceneserverAnalyzingSuggester": { - "type": "object", - "properties": { - "analyzer": { - "type": "string" - }, - "indexAnalyzer": { - "type": "string" - }, - "queryAnalyzer": { - "type": "string" - }, - "maxSurfaceFormsPerAnalyzedForm": { - "type": "integer", - "format": "int32" - }, - "maxGraphExpansions": { - "type": "integer", - "format": "int32" - }, - "preserveSep": { - "type": "boolean" - }, - "exactFirst": { - "type": "boolean" - } - }, - "title": "Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester" - }, "luceneserverBackupWarmingQueriesRequest": { "type": "object", "properties": { @@ -2511,56 +2383,6 @@ } } }, - "luceneserverBuildSuggestRequest": { - "type": "object", - "properties": { - "indexName": { - "type": "string" - }, - "infixSuggester": { - "$ref": "#/definitions/luceneserverInfixSuggester", - "title": "A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester)" - }, - "analyzingSuggester": { - "$ref": "#/definitions/luceneserverAnalyzingSuggester", - "title": "Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester" - }, - "fuzzySuggester": { - "$ref": "#/definitions/luceneserverFuzzySuggester", - "title": "Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester" - }, - "completionInfixSuggester": { - "$ref": "#/definitions/luceneserverCompletionInfixSuggester", - "title": "A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester" - }, - "fuzzyInfixSuggester": { - "$ref": "#/definitions/luceneserverFuzzyInfixSuggester", - "description": "A suggester that matches fuzzy terms in the input text." - }, - "localSource": { - "$ref": "#/definitions/luceneserverSuggestLocalSource" - }, - "nonLocalSource": { - "$ref": "#/definitions/luceneserverSuggestNonLocalSource" - }, - "suggestName": { - "type": "string" - } - } - }, - "luceneserverBuildSuggestResponse": { - "type": "object", - "properties": { - "sizeInBytes": { - "type": "string", - "format": "int64" - }, - "count": { - "type": "string", - "format": "int64" - } - } - }, "luceneserverCollector": { "type": "object", "properties": { @@ -2645,21 +2467,6 @@ } } }, - "luceneserverCompletionInfixSuggester": { - "type": "object", - "properties": { - "analyzer": { - "type": "string" - }, - "indexAnalyzer": { - "type": "string" - }, - "queryAnalyzer": { - "type": "string" - } - }, - "title": "A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester" - }, "luceneserverCompletionQuery": { "type": "object", "properties": { @@ -3399,39 +3206,6 @@ }, "description": "A query that wraps another query and uses custom scoring logic to compute the wrapped query's score." }, - "luceneserverFuzzyInfixSuggester": { - "type": "object", - "properties": { - "analyzer": { - "type": "string" - }, - "indexAnalyzer": { - "type": "string" - }, - "queryAnalyzer": { - "type": "string" - }, - "minFuzzyLength": { - "type": "integer", - "format": "int32" - }, - "nonFuzzyPrefix": { - "type": "integer", - "format": "int32" - }, - "maxEdits": { - "type": "integer", - "format": "int32" - }, - "transpositions": { - "type": "boolean" - }, - "unicodeAware": { - "type": "boolean" - } - }, - "title": "A suggester that matches fuzzy terms in the input text" - }, "luceneserverFuzzyParams": { "type": "object", "properties": { @@ -3498,53 +3272,6 @@ }, "description": "A query that matches documents containing terms similar to the specified term." }, - "luceneserverFuzzySuggester": { - "type": "object", - "properties": { - "analyzer": { - "type": "string" - }, - "indexAnalyzer": { - "type": "string" - }, - "queryAnalyzer": { - "type": "string" - }, - "maxSurfaceFormsPerAnalyzedForm": { - "type": "integer", - "format": "int32" - }, - "maxGraphExpansions": { - "type": "integer", - "format": "int32" - }, - "preserveSep": { - "type": "boolean" - }, - "exactFirst": { - "type": "boolean" - }, - "minFuzzyLength": { - "type": "integer", - "format": "int32" - }, - "nonFuzzyPrefix": { - "type": "integer", - "format": "int32" - }, - "maxEdits": { - "type": "integer", - "format": "int32" - }, - "transpositions": { - "type": "boolean" - }, - "unicodeAware": { - "type": "boolean" - } - }, - "title": "Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester" - }, "luceneserverGeoBoundingBoxQuery": { "type": "object", "properties": { @@ -3878,21 +3605,6 @@ } } }, - "luceneserverInfixSuggester": { - "type": "object", - "properties": { - "analyzer": { - "type": "string" - }, - "indexAnalyzer": { - "type": "string" - }, - "queryAnalyzer": { - "type": "string" - } - }, - "title": "A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester)" - }, "luceneserverInnerHit": { "type": "object", "properties": { @@ -4399,37 +4111,6 @@ } } }, - "luceneserverOneHighlight": { - "type": "object", - "properties": { - "isHit": { - "type": "boolean" - }, - "text": { - "type": "string" - } - } - }, - "luceneserverOneSuggestLookupResponse": { - "type": "object", - "properties": { - "suggestLookupHighlight": { - "$ref": "#/definitions/luceneserverSuggestLookupHighlight", - "title": "Expert: custom Object to hold the result of a highlighted suggestion (currently only works with AnalyzingInfixSuggester)" - }, - "key": { - "type": "string", - "title": "the key's text" - }, - "weight": { - "type": "string", - "format": "int64" - }, - "payload": { - "type": "string" - } - } - }, "luceneserverPhraseQuery": { "type": "object", "properties": { @@ -5458,110 +5139,6 @@ } } }, - "luceneserverSuggestLocalSource": { - "type": "object", - "properties": { - "localFile": { - "type": "string", - "description": "Local file (to the server) to read suggestions + weights from; format is weight U+001F suggestion U+001F payload,\none per line, with suggestion UTF-8 encoded. If this option is used then searcher, suggestField,\nweightField/Expression, payloadField should not be specified." - }, - "hasContexts": { - "type": "boolean" - }, - "hasPayload": { - "type": "boolean" - }, - "hasMultiSearchText": { - "type": "boolean" - } - } - }, - "luceneserverSuggestLookupHighlight": { - "type": "object", - "properties": { - "oneHighlight": { - "type": "array", - "items": { - "$ref": "#/definitions/luceneserverOneHighlight" - } - } - } - }, - "luceneserverSuggestLookupRequest": { - "type": "object", - "properties": { - "indexName": { - "type": "string" - }, - "suggestName": { - "type": "string" - }, - "text": { - "type": "string" - }, - "highlight": { - "type": "boolean" - }, - "allTermsRequired": { - "type": "boolean" - }, - "contexts": { - "type": "array", - "items": { - "type": "string" - } - }, - "count": { - "type": "integer", - "format": "int32" - } - } - }, - "luceneserverSuggestLookupResponse": { - "type": "object", - "properties": { - "results": { - "type": "array", - "items": { - "$ref": "#/definitions/luceneserverOneSuggestLookupResponse" - } - } - } - }, - "luceneserverSuggestNonLocalSource": { - "type": "object", - "properties": { - "indexGen": { - "type": "string", - "format": "int64" - }, - "version": { - "type": "string", - "format": "int64" - }, - "snapshot": { - "type": "string" - }, - "suggestField": { - "type": "string" - }, - "weightField": { - "type": "string" - }, - "weightExpression": { - "type": "string" - }, - "payloadField": { - "type": "string" - }, - "contextField": { - "type": "string" - }, - "searchTextField": { - "type": "string" - } - } - }, "luceneserverTaxonomy": { "type": "object", "properties": { diff --git a/grpc-gateway/suggest.pb.go b/grpc-gateway/suggest.pb.go deleted file mode 100644 index 7df941d48..000000000 --- a/grpc-gateway/suggest.pb.go +++ /dev/null @@ -1,1903 +0,0 @@ -// Description of message types for search request and response - -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.26.0 -// protoc v4.24.3 -// source: yelp/nrtsearch/suggest.proto - -package nrtsearch - -import ( - protoreflect "google.golang.org/protobuf/reflect/protoreflect" - protoimpl "google.golang.org/protobuf/runtime/protoimpl" - reflect "reflect" - sync "sync" -) - -const ( - // Verify that this generated code is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) - // Verify that runtime/protoimpl is sufficiently up-to-date. - _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) -) - -type BuildSuggestRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IndexName string `protobuf:"bytes,1,opt,name=indexName,proto3" json:"indexName,omitempty"` //index name - // Types that are assignable to Suggester: - // - // *BuildSuggestRequest_InfixSuggester - // *BuildSuggestRequest_AnalyzingSuggester - // *BuildSuggestRequest_FuzzySuggester - // *BuildSuggestRequest_CompletionInfixSuggester - // *BuildSuggestRequest_FuzzyInfixSuggester - Suggester isBuildSuggestRequest_Suggester `protobuf_oneof:"Suggester"` - // Types that are assignable to Source: - // - // *BuildSuggestRequest_LocalSource - // *BuildSuggestRequest_NonLocalSource - Source isBuildSuggestRequest_Source `protobuf_oneof:"Source"` - SuggestName string `protobuf:"bytes,9,opt,name=suggestName,proto3" json:"suggestName,omitempty"` //Unique name for this suggest build. -} - -func (x *BuildSuggestRequest) Reset() { - *x = BuildSuggestRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BuildSuggestRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BuildSuggestRequest) ProtoMessage() {} - -func (x *BuildSuggestRequest) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[0] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BuildSuggestRequest.ProtoReflect.Descriptor instead. -func (*BuildSuggestRequest) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{0} -} - -func (x *BuildSuggestRequest) GetIndexName() string { - if x != nil { - return x.IndexName - } - return "" -} - -func (m *BuildSuggestRequest) GetSuggester() isBuildSuggestRequest_Suggester { - if m != nil { - return m.Suggester - } - return nil -} - -func (x *BuildSuggestRequest) GetInfixSuggester() *InfixSuggester { - if x, ok := x.GetSuggester().(*BuildSuggestRequest_InfixSuggester); ok { - return x.InfixSuggester - } - return nil -} - -func (x *BuildSuggestRequest) GetAnalyzingSuggester() *AnalyzingSuggester { - if x, ok := x.GetSuggester().(*BuildSuggestRequest_AnalyzingSuggester); ok { - return x.AnalyzingSuggester - } - return nil -} - -func (x *BuildSuggestRequest) GetFuzzySuggester() *FuzzySuggester { - if x, ok := x.GetSuggester().(*BuildSuggestRequest_FuzzySuggester); ok { - return x.FuzzySuggester - } - return nil -} - -func (x *BuildSuggestRequest) GetCompletionInfixSuggester() *CompletionInfixSuggester { - if x, ok := x.GetSuggester().(*BuildSuggestRequest_CompletionInfixSuggester); ok { - return x.CompletionInfixSuggester - } - return nil -} - -func (x *BuildSuggestRequest) GetFuzzyInfixSuggester() *FuzzyInfixSuggester { - if x, ok := x.GetSuggester().(*BuildSuggestRequest_FuzzyInfixSuggester); ok { - return x.FuzzyInfixSuggester - } - return nil -} - -func (m *BuildSuggestRequest) GetSource() isBuildSuggestRequest_Source { - if m != nil { - return m.Source - } - return nil -} - -func (x *BuildSuggestRequest) GetLocalSource() *SuggestLocalSource { - if x, ok := x.GetSource().(*BuildSuggestRequest_LocalSource); ok { - return x.LocalSource - } - return nil -} - -func (x *BuildSuggestRequest) GetNonLocalSource() *SuggestNonLocalSource { - if x, ok := x.GetSource().(*BuildSuggestRequest_NonLocalSource); ok { - return x.NonLocalSource - } - return nil -} - -func (x *BuildSuggestRequest) GetSuggestName() string { - if x != nil { - return x.SuggestName - } - return "" -} - -type isBuildSuggestRequest_Suggester interface { - isBuildSuggestRequest_Suggester() -} - -type BuildSuggestRequest_InfixSuggester struct { - // A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester) - InfixSuggester *InfixSuggester `protobuf:"bytes,2,opt,name=infixSuggester,proto3,oneof"` -} - -type BuildSuggestRequest_AnalyzingSuggester struct { - // Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester - AnalyzingSuggester *AnalyzingSuggester `protobuf:"bytes,3,opt,name=analyzingSuggester,proto3,oneof"` -} - -type BuildSuggestRequest_FuzzySuggester struct { - // Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester - FuzzySuggester *FuzzySuggester `protobuf:"bytes,4,opt,name=fuzzySuggester,proto3,oneof"` -} - -type BuildSuggestRequest_CompletionInfixSuggester struct { - // A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester - CompletionInfixSuggester *CompletionInfixSuggester `protobuf:"bytes,5,opt,name=completionInfixSuggester,proto3,oneof"` -} - -type BuildSuggestRequest_FuzzyInfixSuggester struct { - // A suggester that matches fuzzy terms in the input text. - FuzzyInfixSuggester *FuzzyInfixSuggester `protobuf:"bytes,6,opt,name=fuzzyInfixSuggester,proto3,oneof"` -} - -func (*BuildSuggestRequest_InfixSuggester) isBuildSuggestRequest_Suggester() {} - -func (*BuildSuggestRequest_AnalyzingSuggester) isBuildSuggestRequest_Suggester() {} - -func (*BuildSuggestRequest_FuzzySuggester) isBuildSuggestRequest_Suggester() {} - -func (*BuildSuggestRequest_CompletionInfixSuggester) isBuildSuggestRequest_Suggester() {} - -func (*BuildSuggestRequest_FuzzyInfixSuggester) isBuildSuggestRequest_Suggester() {} - -type isBuildSuggestRequest_Source interface { - isBuildSuggestRequest_Source() -} - -type BuildSuggestRequest_LocalSource struct { - LocalSource *SuggestLocalSource `protobuf:"bytes,7,opt,name=localSource,proto3,oneof"` -} - -type BuildSuggestRequest_NonLocalSource struct { - NonLocalSource *SuggestNonLocalSource `protobuf:"bytes,8,opt,name=nonLocalSource,proto3,oneof"` -} - -func (*BuildSuggestRequest_LocalSource) isBuildSuggestRequest_Source() {} - -func (*BuildSuggestRequest_NonLocalSource) isBuildSuggestRequest_Source() {} - -type BuildSuggestResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - SizeInBytes int64 `protobuf:"varint,1,opt,name=sizeInBytes,proto3" json:"sizeInBytes,omitempty"` //size in bytes in RAM if using AnalyzingSuggester - Count int64 `protobuf:"varint,2,opt,name=count,proto3" json:"count,omitempty"` //total number of suggester entries -} - -func (x *BuildSuggestResponse) Reset() { - *x = BuildSuggestResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *BuildSuggestResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*BuildSuggestResponse) ProtoMessage() {} - -func (x *BuildSuggestResponse) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[1] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use BuildSuggestResponse.ProtoReflect.Descriptor instead. -func (*BuildSuggestResponse) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{1} -} - -func (x *BuildSuggestResponse) GetSizeInBytes() int64 { - if x != nil { - return x.SizeInBytes - } - return 0 -} - -func (x *BuildSuggestResponse) GetCount() int64 { - if x != nil { - return x.Count - } - return 0 -} - -type SuggestLookupRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IndexName string `protobuf:"bytes,1,opt,name=indexName,proto3" json:"indexName,omitempty"` //Index name - SuggestName string `protobuf:"bytes,2,opt,name=suggestName,proto3" json:"suggestName,omitempty"` //Which suggester to use - Text string `protobuf:"bytes,3,opt,name=text,proto3" json:"text,omitempty"` //Text to suggest from - Highlight bool `protobuf:"varint,4,opt,name=highlight,proto3" json:"highlight,omitempty"` //True if the suggestions should be highlighted (currently only works with AnalyzingInfixSuggester) - AllTermsRequired bool `protobuf:"varint,5,opt,name=allTermsRequired,proto3" json:"allTermsRequired,omitempty"` //If true then all terms must be found (this only applies to InfixSuggester currently) - Contexts []string `protobuf:"bytes,6,rep,name=contexts,proto3" json:"contexts,omitempty"` //Which contexts to filter by - Count int32 `protobuf:"varint,7,opt,name=count,proto3" json:"count,omitempty"` //How many suggestions to return, default = 5 -} - -func (x *SuggestLookupRequest) Reset() { - *x = SuggestLookupRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SuggestLookupRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SuggestLookupRequest) ProtoMessage() {} - -func (x *SuggestLookupRequest) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[2] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SuggestLookupRequest.ProtoReflect.Descriptor instead. -func (*SuggestLookupRequest) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{2} -} - -func (x *SuggestLookupRequest) GetIndexName() string { - if x != nil { - return x.IndexName - } - return "" -} - -func (x *SuggestLookupRequest) GetSuggestName() string { - if x != nil { - return x.SuggestName - } - return "" -} - -func (x *SuggestLookupRequest) GetText() string { - if x != nil { - return x.Text - } - return "" -} - -func (x *SuggestLookupRequest) GetHighlight() bool { - if x != nil { - return x.Highlight - } - return false -} - -func (x *SuggestLookupRequest) GetAllTermsRequired() bool { - if x != nil { - return x.AllTermsRequired - } - return false -} - -func (x *SuggestLookupRequest) GetContexts() []string { - if x != nil { - return x.Contexts - } - return nil -} - -func (x *SuggestLookupRequest) GetCount() int32 { - if x != nil { - return x.Count - } - return 0 -} - -type SuggestLookupResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Results []*OneSuggestLookupResponse `protobuf:"bytes,1,rep,name=results,proto3" json:"results,omitempty"` //SuggestLookup results as an array -} - -func (x *SuggestLookupResponse) Reset() { - *x = SuggestLookupResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SuggestLookupResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SuggestLookupResponse) ProtoMessage() {} - -func (x *SuggestLookupResponse) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[3] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SuggestLookupResponse.ProtoReflect.Descriptor instead. -func (*SuggestLookupResponse) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{3} -} - -func (x *SuggestLookupResponse) GetResults() []*OneSuggestLookupResponse { - if x != nil { - return x.Results - } - return nil -} - -type OneSuggestLookupResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Types that are assignable to HighlightKey: - // - // *OneSuggestLookupResponse_SuggestLookupHighlight - // *OneSuggestLookupResponse_Key - HighlightKey isOneSuggestLookupResponse_HighlightKey `protobuf_oneof:"HighlightKey"` - Weight int64 `protobuf:"varint,3,opt,name=weight,proto3" json:"weight,omitempty"` //the key's weight - Payload string `protobuf:"bytes,4,opt,name=payload,proto3" json:"payload,omitempty"` //the key's payload (null if not present) -} - -func (x *OneSuggestLookupResponse) Reset() { - *x = OneSuggestLookupResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OneSuggestLookupResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OneSuggestLookupResponse) ProtoMessage() {} - -func (x *OneSuggestLookupResponse) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[4] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OneSuggestLookupResponse.ProtoReflect.Descriptor instead. -func (*OneSuggestLookupResponse) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{4} -} - -func (m *OneSuggestLookupResponse) GetHighlightKey() isOneSuggestLookupResponse_HighlightKey { - if m != nil { - return m.HighlightKey - } - return nil -} - -func (x *OneSuggestLookupResponse) GetSuggestLookupHighlight() *SuggestLookupHighlight { - if x, ok := x.GetHighlightKey().(*OneSuggestLookupResponse_SuggestLookupHighlight); ok { - return x.SuggestLookupHighlight - } - return nil -} - -func (x *OneSuggestLookupResponse) GetKey() string { - if x, ok := x.GetHighlightKey().(*OneSuggestLookupResponse_Key); ok { - return x.Key - } - return "" -} - -func (x *OneSuggestLookupResponse) GetWeight() int64 { - if x != nil { - return x.Weight - } - return 0 -} - -func (x *OneSuggestLookupResponse) GetPayload() string { - if x != nil { - return x.Payload - } - return "" -} - -type isOneSuggestLookupResponse_HighlightKey interface { - isOneSuggestLookupResponse_HighlightKey() -} - -type OneSuggestLookupResponse_SuggestLookupHighlight struct { - // Expert: custom Object to hold the result of a highlighted suggestion (currently only works with AnalyzingInfixSuggester) - SuggestLookupHighlight *SuggestLookupHighlight `protobuf:"bytes,1,opt,name=suggestLookupHighlight,proto3,oneof"` -} - -type OneSuggestLookupResponse_Key struct { - // the key's text - Key string `protobuf:"bytes,2,opt,name=key,proto3,oneof"` -} - -func (*OneSuggestLookupResponse_SuggestLookupHighlight) isOneSuggestLookupResponse_HighlightKey() {} - -func (*OneSuggestLookupResponse_Key) isOneSuggestLookupResponse_HighlightKey() {} - -type SuggestLookupHighlight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - OneHighlight []*OneHighlight `protobuf:"bytes,1,rep,name=oneHighlight,proto3" json:"oneHighlight,omitempty"` -} - -func (x *SuggestLookupHighlight) Reset() { - *x = SuggestLookupHighlight{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SuggestLookupHighlight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SuggestLookupHighlight) ProtoMessage() {} - -func (x *SuggestLookupHighlight) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[5] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SuggestLookupHighlight.ProtoReflect.Descriptor instead. -func (*SuggestLookupHighlight) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{5} -} - -func (x *SuggestLookupHighlight) GetOneHighlight() []*OneHighlight { - if x != nil { - return x.OneHighlight - } - return nil -} - -type OneHighlight struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - IsHit bool `protobuf:"varint,1,opt,name=isHit,proto3" json:"isHit,omitempty"` - Text string `protobuf:"bytes,2,opt,name=text,proto3" json:"text,omitempty"` -} - -func (x *OneHighlight) Reset() { - *x = OneHighlight{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *OneHighlight) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*OneHighlight) ProtoMessage() {} - -func (x *OneHighlight) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use OneHighlight.ProtoReflect.Descriptor instead. -func (*OneHighlight) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{6} -} - -func (x *OneHighlight) GetIsHit() bool { - if x != nil { - return x.IsHit - } - return false -} - -func (x *OneHighlight) GetText() string { - if x != nil { - return x.Text - } - return "" -} - -type SuggestLocalSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Local file (to the server) to read suggestions + weights from; format is weight U+001F suggestion U+001F payload, - // one per line, with suggestion UTF-8 encoded. If this option is used then searcher, suggestField, - // weightField/Expression, payloadField should not be specified. - LocalFile string `protobuf:"bytes,1,opt,name=localFile,proto3" json:"localFile,omitempty"` - HasContexts bool `protobuf:"varint,2,opt,name=hasContexts,proto3" json:"hasContexts,omitempty"` //True if this file provides per-suggestion contexts - HasPayload bool `protobuf:"varint,3,opt,name=hasPayload,proto3" json:"hasPayload,omitempty"` //True if this file provides per-suggestion payload - HasMultiSearchText bool `protobuf:"varint,4,opt,name=hasMultiSearchText,proto3" json:"hasMultiSearchText,omitempty"` //True if this file is required to parsed by SuggestInputIterator -} - -func (x *SuggestLocalSource) Reset() { - *x = SuggestLocalSource{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SuggestLocalSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SuggestLocalSource) ProtoMessage() {} - -func (x *SuggestLocalSource) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SuggestLocalSource.ProtoReflect.Descriptor instead. -func (*SuggestLocalSource) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{7} -} - -func (x *SuggestLocalSource) GetLocalFile() string { - if x != nil { - return x.LocalFile - } - return "" -} - -func (x *SuggestLocalSource) GetHasContexts() bool { - if x != nil { - return x.HasContexts - } - return false -} - -func (x *SuggestLocalSource) GetHasPayload() bool { - if x != nil { - return x.HasPayload - } - return false -} - -func (x *SuggestLocalSource) GetHasMultiSearchText() bool { - if x != nil { - return x.HasMultiSearchText - } - return false -} - -type SuggestNonLocalSource struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // Specific searcher version to use for pull suggestions to build. There are three different ways to specify a searcher version. - // Types that are assignable to Searcher: - // - // *SuggestNonLocalSource_IndexGen - // *SuggestNonLocalSource_Version - // *SuggestNonLocalSource_Snapshot - Searcher isSuggestNonLocalSource_Searcher `protobuf_oneof:"Searcher"` - SuggestField string `protobuf:"bytes,4,opt,name=suggestField,proto3" json:"suggestField,omitempty"` //Field (from stored documents) containing the suggestion text - // Types that are assignable to Weight: - // - // *SuggestNonLocalSource_WeightField - // *SuggestNonLocalSource_WeightExpression - Weight isSuggestNonLocalSource_Weight `protobuf_oneof:"Weight"` - PayloadField string `protobuf:"bytes,7,opt,name=payloadField,proto3" json:"payloadField,omitempty"` //Optional binary or string field (from stored documents) containing the payload - ContextField string `protobuf:"bytes,8,opt,name=contextField,proto3" json:"contextField,omitempty"` //Numeric field (from stored documents) containing the context which can be later filtered on during lookup - SearchTextField string `protobuf:"bytes,9,opt,name=searchTextField,proto3" json:"searchTextField,omitempty"` //Binary or string field (from stored documents) containing the multiple search texts -} - -func (x *SuggestNonLocalSource) Reset() { - *x = SuggestNonLocalSource{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *SuggestNonLocalSource) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*SuggestNonLocalSource) ProtoMessage() {} - -func (x *SuggestNonLocalSource) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[8] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use SuggestNonLocalSource.ProtoReflect.Descriptor instead. -func (*SuggestNonLocalSource) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{8} -} - -func (m *SuggestNonLocalSource) GetSearcher() isSuggestNonLocalSource_Searcher { - if m != nil { - return m.Searcher - } - return nil -} - -func (x *SuggestNonLocalSource) GetIndexGen() int64 { - if x, ok := x.GetSearcher().(*SuggestNonLocalSource_IndexGen); ok { - return x.IndexGen - } - return 0 -} - -func (x *SuggestNonLocalSource) GetVersion() int64 { - if x, ok := x.GetSearcher().(*SuggestNonLocalSource_Version); ok { - return x.Version - } - return 0 -} - -func (x *SuggestNonLocalSource) GetSnapshot() string { - if x, ok := x.GetSearcher().(*SuggestNonLocalSource_Snapshot); ok { - return x.Snapshot - } - return "" -} - -func (x *SuggestNonLocalSource) GetSuggestField() string { - if x != nil { - return x.SuggestField - } - return "" -} - -func (m *SuggestNonLocalSource) GetWeight() isSuggestNonLocalSource_Weight { - if m != nil { - return m.Weight - } - return nil -} - -func (x *SuggestNonLocalSource) GetWeightField() string { - if x, ok := x.GetWeight().(*SuggestNonLocalSource_WeightField); ok { - return x.WeightField - } - return "" -} - -func (x *SuggestNonLocalSource) GetWeightExpression() string { - if x, ok := x.GetWeight().(*SuggestNonLocalSource_WeightExpression); ok { - return x.WeightExpression - } - return "" -} - -func (x *SuggestNonLocalSource) GetPayloadField() string { - if x != nil { - return x.PayloadField - } - return "" -} - -func (x *SuggestNonLocalSource) GetContextField() string { - if x != nil { - return x.ContextField - } - return "" -} - -func (x *SuggestNonLocalSource) GetSearchTextField() string { - if x != nil { - return x.SearchTextField - } - return "" -} - -type isSuggestNonLocalSource_Searcher interface { - isSuggestNonLocalSource_Searcher() -} - -type SuggestNonLocalSource_IndexGen struct { - IndexGen int64 `protobuf:"varint,1,opt,name=indexGen,proto3,oneof"` //Search a generation previously returned by an indexing operation such as #addDocument. Use this to search a non-committed (near-real-time) view of the index. -} - -type SuggestNonLocalSource_Version struct { - Version int64 `protobuf:"varint,2,opt,name=version,proto3,oneof"` //Search a specific searcher version. This is typically used by follow-on searches (e.g., user clicks next page, drills down, or changes sort, etc.) to get the same searcher used by the original search. -} - -type SuggestNonLocalSource_Snapshot struct { - Snapshot string `protobuf:"bytes,3,opt,name=snapshot,proto3,oneof"` //Search a snapshot previously created with #createSnapshot -} - -func (*SuggestNonLocalSource_IndexGen) isSuggestNonLocalSource_Searcher() {} - -func (*SuggestNonLocalSource_Version) isSuggestNonLocalSource_Searcher() {} - -func (*SuggestNonLocalSource_Snapshot) isSuggestNonLocalSource_Searcher() {} - -type isSuggestNonLocalSource_Weight interface { - isSuggestNonLocalSource_Weight() -} - -type SuggestNonLocalSource_WeightField struct { - WeightField string `protobuf:"bytes,5,opt,name=weightField,proto3,oneof"` //Numeric field (from stored documents) containing the weight -} - -type SuggestNonLocalSource_WeightExpression struct { - WeightExpression string `protobuf:"bytes,6,opt,name=weightExpression,proto3,oneof"` //Alternative to weightField, an expression that's evaluated to the weight. Note that any fields referenced in the expression must have been indexed with sort=true -} - -func (*SuggestNonLocalSource_WeightField) isSuggestNonLocalSource_Weight() {} - -func (*SuggestNonLocalSource_WeightExpression) isSuggestNonLocalSource_Weight() {} - -// A suggester that matches terms anywhere in the input text, not just as a prefix. (see @lucene:org:server.InfixSuggester) -type InfixSuggester struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Analyzer string `protobuf:"bytes,1,opt,name=analyzer,proto3" json:"analyzer,omitempty"` //Index and query analyzer - IndexAnalyzer string `protobuf:"bytes,2,opt,name=indexAnalyzer,proto3" json:"indexAnalyzer,omitempty"` // Index Analyzer - QueryAnalyzer string `protobuf:"bytes,3,opt,name=queryAnalyzer,proto3" json:"queryAnalyzer,omitempty"` // Query Analyzer -} - -func (x *InfixSuggester) Reset() { - *x = InfixSuggester{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[9] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InfixSuggester) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InfixSuggester) ProtoMessage() {} - -func (x *InfixSuggester) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[9] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use InfixSuggester.ProtoReflect.Descriptor instead. -func (*InfixSuggester) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{9} -} - -func (x *InfixSuggester) GetAnalyzer() string { - if x != nil { - return x.Analyzer - } - return "" -} - -func (x *InfixSuggester) GetIndexAnalyzer() string { - if x != nil { - return x.IndexAnalyzer - } - return "" -} - -func (x *InfixSuggester) GetQueryAnalyzer() string { - if x != nil { - return x.QueryAnalyzer - } - return "" -} - -// Suggester that first analyzes the surface form, adds the analyzed form to a weighted FST, and then does the same thing at lookup time (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester -type AnalyzingSuggester struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Analyzer string `protobuf:"bytes,1,opt,name=analyzer,proto3" json:"analyzer,omitempty"` //Index and query analyzer - IndexAnalyzer string `protobuf:"bytes,2,opt,name=indexAnalyzer,proto3" json:"indexAnalyzer,omitempty"` // Index Analyzer - QueryAnalyzer string `protobuf:"bytes,3,opt,name=queryAnalyzer,proto3" json:"queryAnalyzer,omitempty"` // Query Analyzer - MaxSurfaceFormsPerAnalyzedForm int32 `protobuf:"varint,4,opt,name=maxSurfaceFormsPerAnalyzedForm,proto3" json:"maxSurfaceFormsPerAnalyzedForm,omitempty"` //Maximum number of surface forms to keep for a single analyzed form - MaxGraphExpansions int32 `protobuf:"varint,5,opt,name=maxGraphExpansions,proto3" json:"maxGraphExpansions,omitempty"` //Maximum number of graph paths to expand from the analyzed from - PreserveSep bool `protobuf:"varint,6,opt,name=preserveSep,proto3" json:"preserveSep,omitempty"` //True if token separators should be preserved when matching - ExactFirst bool `protobuf:"varint,7,opt,name=exactFirst,proto3" json:"exactFirst,omitempty"` //True if the exact match should always be returned first regardless of score -} - -func (x *AnalyzingSuggester) Reset() { - *x = AnalyzingSuggester{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[10] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *AnalyzingSuggester) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*AnalyzingSuggester) ProtoMessage() {} - -func (x *AnalyzingSuggester) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[10] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use AnalyzingSuggester.ProtoReflect.Descriptor instead. -func (*AnalyzingSuggester) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{10} -} - -func (x *AnalyzingSuggester) GetAnalyzer() string { - if x != nil { - return x.Analyzer - } - return "" -} - -func (x *AnalyzingSuggester) GetIndexAnalyzer() string { - if x != nil { - return x.IndexAnalyzer - } - return "" -} - -func (x *AnalyzingSuggester) GetQueryAnalyzer() string { - if x != nil { - return x.QueryAnalyzer - } - return "" -} - -func (x *AnalyzingSuggester) GetMaxSurfaceFormsPerAnalyzedForm() int32 { - if x != nil { - return x.MaxSurfaceFormsPerAnalyzedForm - } - return 0 -} - -func (x *AnalyzingSuggester) GetMaxGraphExpansions() int32 { - if x != nil { - return x.MaxGraphExpansions - } - return 0 -} - -func (x *AnalyzingSuggester) GetPreserveSep() bool { - if x != nil { - return x.PreserveSep - } - return false -} - -func (x *AnalyzingSuggester) GetExactFirst() bool { - if x != nil { - return x.ExactFirst - } - return false -} - -// Implements a fuzzy AnalyzingSuggester (see @lucene:suggest:org.apache.lucene.search.suggest.analyzing.FuzzySuggester -type FuzzySuggester struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Analyzer string `protobuf:"bytes,1,opt,name=analyzer,proto3" json:"analyzer,omitempty"` //Index and query analyzer - IndexAnalyzer string `protobuf:"bytes,2,opt,name=indexAnalyzer,proto3" json:"indexAnalyzer,omitempty"` // Index Analyzer - QueryAnalyzer string `protobuf:"bytes,3,opt,name=queryAnalyzer,proto3" json:"queryAnalyzer,omitempty"` // Query Analyzer - MaxSurfaceFormsPerAnalyzedForm int32 `protobuf:"varint,4,opt,name=maxSurfaceFormsPerAnalyzedForm,proto3" json:"maxSurfaceFormsPerAnalyzedForm,omitempty"` //Maximum number of surface forms to keep for a single analyzed form - MaxGraphExpansions int32 `protobuf:"varint,5,opt,name=maxGraphExpansions,proto3" json:"maxGraphExpansions,omitempty"` //Maximum number of graph paths to expand from the analyzed from - PreserveSep bool `protobuf:"varint,6,opt,name=preserveSep,proto3" json:"preserveSep,omitempty"` //True if token separators should be preserved when matching - ExactFirst bool `protobuf:"varint,7,opt,name=exactFirst,proto3" json:"exactFirst,omitempty"` //True if the exact match should always be returned first regardless of score - MinFuzzyLength int32 `protobuf:"varint,8,opt,name=minFuzzyLength,proto3" json:"minFuzzyLength,omitempty"` //Minimum key length before edits are allowed, - NonFuzzyPrefix int32 `protobuf:"varint,9,opt,name=nonFuzzyPrefix,proto3" json:"nonFuzzyPrefix,omitempty"` //Key prefix where edits are not allowed, - MaxEdits int32 `protobuf:"varint,10,opt,name=maxEdits,proto3" json:"maxEdits,omitempty"` //Maximum number of edits for fuzzy suggestions - Transpositions bool `protobuf:"varint,11,opt,name=transpositions,proto3" json:"transpositions,omitempty"` //Whether transpositions are allowed - UnicodeAware bool `protobuf:"varint,12,opt,name=unicodeAware,proto3" json:"unicodeAware,omitempty"` //True if all edits are measured in unicode characters, not UTF-8 bytes -} - -func (x *FuzzySuggester) Reset() { - *x = FuzzySuggester{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[11] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FuzzySuggester) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FuzzySuggester) ProtoMessage() {} - -func (x *FuzzySuggester) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[11] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FuzzySuggester.ProtoReflect.Descriptor instead. -func (*FuzzySuggester) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{11} -} - -func (x *FuzzySuggester) GetAnalyzer() string { - if x != nil { - return x.Analyzer - } - return "" -} - -func (x *FuzzySuggester) GetIndexAnalyzer() string { - if x != nil { - return x.IndexAnalyzer - } - return "" -} - -func (x *FuzzySuggester) GetQueryAnalyzer() string { - if x != nil { - return x.QueryAnalyzer - } - return "" -} - -func (x *FuzzySuggester) GetMaxSurfaceFormsPerAnalyzedForm() int32 { - if x != nil { - return x.MaxSurfaceFormsPerAnalyzedForm - } - return 0 -} - -func (x *FuzzySuggester) GetMaxGraphExpansions() int32 { - if x != nil { - return x.MaxGraphExpansions - } - return 0 -} - -func (x *FuzzySuggester) GetPreserveSep() bool { - if x != nil { - return x.PreserveSep - } - return false -} - -func (x *FuzzySuggester) GetExactFirst() bool { - if x != nil { - return x.ExactFirst - } - return false -} - -func (x *FuzzySuggester) GetMinFuzzyLength() int32 { - if x != nil { - return x.MinFuzzyLength - } - return 0 -} - -func (x *FuzzySuggester) GetNonFuzzyPrefix() int32 { - if x != nil { - return x.NonFuzzyPrefix - } - return 0 -} - -func (x *FuzzySuggester) GetMaxEdits() int32 { - if x != nil { - return x.MaxEdits - } - return 0 -} - -func (x *FuzzySuggester) GetTranspositions() bool { - if x != nil { - return x.Transpositions - } - return false -} - -func (x *FuzzySuggester) GetUnicodeAware() bool { - if x != nil { - return x.UnicodeAware - } - return false -} - -// A suggester that matches terms anywhere in the input text. The implementation is different from InfixSuggester -type CompletionInfixSuggester struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Analyzer string `protobuf:"bytes,1,opt,name=analyzer,proto3" json:"analyzer,omitempty"` //Index and query analyzer - IndexAnalyzer string `protobuf:"bytes,2,opt,name=indexAnalyzer,proto3" json:"indexAnalyzer,omitempty"` //Index Analyzer - QueryAnalyzer string `protobuf:"bytes,3,opt,name=queryAnalyzer,proto3" json:"queryAnalyzer,omitempty"` //Query Analyzer -} - -func (x *CompletionInfixSuggester) Reset() { - *x = CompletionInfixSuggester{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[12] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *CompletionInfixSuggester) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*CompletionInfixSuggester) ProtoMessage() {} - -func (x *CompletionInfixSuggester) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[12] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use CompletionInfixSuggester.ProtoReflect.Descriptor instead. -func (*CompletionInfixSuggester) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{12} -} - -func (x *CompletionInfixSuggester) GetAnalyzer() string { - if x != nil { - return x.Analyzer - } - return "" -} - -func (x *CompletionInfixSuggester) GetIndexAnalyzer() string { - if x != nil { - return x.IndexAnalyzer - } - return "" -} - -func (x *CompletionInfixSuggester) GetQueryAnalyzer() string { - if x != nil { - return x.QueryAnalyzer - } - return "" -} - -// A suggester that matches fuzzy terms in the input text -type FuzzyInfixSuggester struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Analyzer string `protobuf:"bytes,1,opt,name=analyzer,proto3" json:"analyzer,omitempty"` - IndexAnalyzer string `protobuf:"bytes,2,opt,name=indexAnalyzer,proto3" json:"indexAnalyzer,omitempty"` // Index Analyzer - QueryAnalyzer string `protobuf:"bytes,3,opt,name=queryAnalyzer,proto3" json:"queryAnalyzer,omitempty"` // Query Analyzer - MinFuzzyLength int32 `protobuf:"varint,4,opt,name=minFuzzyLength,proto3" json:"minFuzzyLength,omitempty"` //Minimum key length before edits are allowed, - NonFuzzyPrefix int32 `protobuf:"varint,5,opt,name=nonFuzzyPrefix,proto3" json:"nonFuzzyPrefix,omitempty"` //Key prefix where edits are not allowed, - MaxEdits int32 `protobuf:"varint,6,opt,name=maxEdits,proto3" json:"maxEdits,omitempty"` //Maximum number of edits for fuzzy suggestions - Transpositions bool `protobuf:"varint,7,opt,name=transpositions,proto3" json:"transpositions,omitempty"` //Whether transpositions are allowed - UnicodeAware bool `protobuf:"varint,8,opt,name=unicodeAware,proto3" json:"unicodeAware,omitempty"` //True if all edits are measured in unicode characters, not UTF-8 bytes -} - -func (x *FuzzyInfixSuggester) Reset() { - *x = FuzzyInfixSuggester{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[13] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *FuzzyInfixSuggester) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*FuzzyInfixSuggester) ProtoMessage() {} - -func (x *FuzzyInfixSuggester) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[13] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use FuzzyInfixSuggester.ProtoReflect.Descriptor instead. -func (*FuzzyInfixSuggester) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{13} -} - -func (x *FuzzyInfixSuggester) GetAnalyzer() string { - if x != nil { - return x.Analyzer - } - return "" -} - -func (x *FuzzyInfixSuggester) GetIndexAnalyzer() string { - if x != nil { - return x.IndexAnalyzer - } - return "" -} - -func (x *FuzzyInfixSuggester) GetQueryAnalyzer() string { - if x != nil { - return x.QueryAnalyzer - } - return "" -} - -func (x *FuzzyInfixSuggester) GetMinFuzzyLength() int32 { - if x != nil { - return x.MinFuzzyLength - } - return 0 -} - -func (x *FuzzyInfixSuggester) GetNonFuzzyPrefix() int32 { - if x != nil { - return x.NonFuzzyPrefix - } - return 0 -} - -func (x *FuzzyInfixSuggester) GetMaxEdits() int32 { - if x != nil { - return x.MaxEdits - } - return 0 -} - -func (x *FuzzyInfixSuggester) GetTranspositions() bool { - if x != nil { - return x.Transpositions - } - return false -} - -func (x *FuzzyInfixSuggester) GetUnicodeAware() bool { - if x != nil { - return x.UnicodeAware - } - return false -} - -// The schema of suggest item to build suggest index -type NrtsearchIndex struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - UniqueId int64 `protobuf:"varint,1,opt,name=uniqueId,proto3" json:"uniqueId,omitempty"` - SearchTexts []string `protobuf:"bytes,2,rep,name=searchTexts,proto3" json:"searchTexts,omitempty"` - Score int64 `protobuf:"varint,3,opt,name=score,proto3" json:"score,omitempty"` - Contexts []string `protobuf:"bytes,4,rep,name=contexts,proto3" json:"contexts,omitempty"` - Payload []byte `protobuf:"bytes,5,opt,name=payload,proto3" json:"payload,omitempty"` -} - -func (x *NrtsearchIndex) Reset() { - *x = NrtsearchIndex{} - if protoimpl.UnsafeEnabled { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[14] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *NrtsearchIndex) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*NrtsearchIndex) ProtoMessage() {} - -func (x *NrtsearchIndex) ProtoReflect() protoreflect.Message { - mi := &file_yelp_nrtsearch_suggest_proto_msgTypes[14] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use NrtsearchIndex.ProtoReflect.Descriptor instead. -func (*NrtsearchIndex) Descriptor() ([]byte, []int) { - return file_yelp_nrtsearch_suggest_proto_rawDescGZIP(), []int{14} -} - -func (x *NrtsearchIndex) GetUniqueId() int64 { - if x != nil { - return x.UniqueId - } - return 0 -} - -func (x *NrtsearchIndex) GetSearchTexts() []string { - if x != nil { - return x.SearchTexts - } - return nil -} - -func (x *NrtsearchIndex) GetScore() int64 { - if x != nil { - return x.Score - } - return 0 -} - -func (x *NrtsearchIndex) GetContexts() []string { - if x != nil { - return x.Contexts - } - return nil -} - -func (x *NrtsearchIndex) GetPayload() []byte { - if x != nil { - return x.Payload - } - return nil -} - -var File_yelp_nrtsearch_suggest_proto protoreflect.FileDescriptor - -var file_yelp_nrtsearch_suggest_proto_rawDesc = []byte{ - 0x0a, 0x1c, 0x79, 0x65, 0x6c, 0x70, 0x2f, 0x6e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, - 0x2f, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0c, - 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x22, 0xa2, 0x05, 0x0a, - 0x13, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, - 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0e, 0x69, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, - 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x69, 0x6e, 0x66, 0x69, - 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x12, 0x61, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x69, 0x6e, 0x67, 0x53, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x12, 0x61, 0x6e, 0x61, 0x6c, - 0x79, 0x7a, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x46, - 0x0a, 0x0e, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x0e, 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x53, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x64, 0x0a, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, - 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x48, 0x00, 0x52, 0x18, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x55, 0x0a, 0x13, - 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6c, 0x75, 0x63, 0x65, - 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x49, 0x6e, - 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x48, 0x00, 0x52, 0x13, - 0x66, 0x75, 0x7a, 0x7a, 0x79, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x0b, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, - 0x63, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, - 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x0b, 0x6c, 0x6f, - 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x4d, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, - 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x23, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, - 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x01, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0x0a, 0x09, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x53, 0x6f, 0x75, 0x72, 0x63, - 0x65, 0x22, 0x4e, 0x0a, 0x14, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x69, 0x7a, - 0x65, 0x49, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x73, 0x69, 0x7a, 0x65, 0x49, 0x6e, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0xe6, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, - 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, - 0x78, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x09, 0x68, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2a, 0x0a, 0x10, - 0x61, 0x6c, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x10, 0x61, 0x6c, 0x6c, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x59, 0x0a, 0x15, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x07, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x2e, 0x4f, 0x6e, 0x65, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, - 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x07, 0x72, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x73, 0x22, 0xd0, 0x01, 0x0a, 0x18, 0x4f, 0x6e, 0x65, 0x53, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x16, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, - 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x48, 0x00, 0x52, 0x16, 0x73, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x12, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x48, 0x69, 0x67, 0x68, - 0x6c, 0x69, 0x67, 0x68, 0x74, 0x4b, 0x65, 0x79, 0x22, 0x58, 0x0a, 0x16, 0x53, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x3e, 0x0a, 0x0c, 0x6f, 0x6e, 0x65, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6c, 0x75, 0x63, 0x65, 0x6e, - 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2e, 0x4f, 0x6e, 0x65, 0x48, 0x69, 0x67, 0x68, 0x6c, - 0x69, 0x67, 0x68, 0x74, 0x52, 0x0c, 0x6f, 0x6e, 0x65, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x38, 0x0a, 0x0c, 0x4f, 0x6e, 0x65, 0x48, 0x69, 0x67, 0x68, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x73, 0x48, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x05, 0x69, 0x73, 0x48, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0xa4, 0x01, 0x0a, - 0x12, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, - 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x46, 0x69, 0x6c, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x46, 0x69, 0x6c, - 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x68, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x68, 0x61, 0x73, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x68, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6c, 0x6f, 0x61, - 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x68, 0x61, 0x73, 0x50, 0x61, 0x79, 0x6c, - 0x6f, 0x61, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x68, 0x61, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, - 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x12, 0x68, 0x61, 0x73, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, - 0x65, 0x78, 0x74, 0x22, 0xed, 0x02, 0x0a, 0x15, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x4e, - 0x6f, 0x6e, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x53, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x12, 0x1c, 0x0a, - 0x08, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, - 0x00, 0x52, 0x08, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x47, 0x65, 0x6e, 0x12, 0x1a, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, - 0x68, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x08, 0x73, 0x6e, 0x61, - 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x22, 0x0a, 0x0c, 0x73, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, - 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x75, 0x67, - 0x67, 0x65, 0x73, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x22, 0x0a, 0x0b, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, - 0x52, 0x0b, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, 0x2c, 0x0a, - 0x10, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, - 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x10, 0x77, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x45, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x0a, 0x0c, 0x70, - 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0c, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x12, - 0x22, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x12, 0x28, 0x0a, 0x0f, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, - 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x73, 0x65, - 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x42, 0x0a, 0x0a, - 0x08, 0x53, 0x65, 0x61, 0x72, 0x63, 0x68, 0x65, 0x72, 0x42, 0x08, 0x0a, 0x06, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0x78, 0x0a, 0x0e, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, - 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, - 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, - 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x22, 0xb6, 0x02, - 0x0a, 0x12, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x69, 0x6e, 0x67, 0x53, 0x75, 0x67, 0x67, 0x65, - 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, - 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, - 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x46, 0x0a, 0x1e, - 0x6d, 0x61, 0x78, 0x53, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x73, 0x50, - 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x6d, 0x61, 0x78, 0x53, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x46, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, - 0x46, 0x6f, 0x72, 0x6d, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x61, 0x78, 0x47, 0x72, 0x61, 0x70, 0x68, - 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x12, 0x6d, 0x61, 0x78, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x53, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x72, 0x65, 0x73, 0x65, - 0x72, 0x76, 0x65, 0x53, 0x65, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x65, 0x78, 0x61, 0x63, 0x74, 0x46, - 0x69, 0x72, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x65, 0x78, 0x61, 0x63, - 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x22, 0xea, 0x03, 0x0a, 0x0e, 0x46, 0x75, 0x7a, 0x7a, 0x79, - 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x61, - 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, - 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, - 0x72, 0x12, 0x46, 0x0a, 0x1e, 0x6d, 0x61, 0x78, 0x53, 0x75, 0x72, 0x66, 0x61, 0x63, 0x65, 0x46, - 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x65, 0x72, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x46, - 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, 0x6d, 0x61, 0x78, 0x53, 0x75, - 0x72, 0x66, 0x61, 0x63, 0x65, 0x46, 0x6f, 0x72, 0x6d, 0x73, 0x50, 0x65, 0x72, 0x41, 0x6e, 0x61, - 0x6c, 0x79, 0x7a, 0x65, 0x64, 0x46, 0x6f, 0x72, 0x6d, 0x12, 0x2e, 0x0a, 0x12, 0x6d, 0x61, 0x78, - 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x6d, 0x61, 0x78, 0x47, 0x72, 0x61, 0x70, 0x68, 0x45, - 0x78, 0x70, 0x61, 0x6e, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x65, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x53, 0x65, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, - 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x53, 0x65, 0x70, 0x12, 0x1e, 0x0a, 0x0a, 0x65, - 0x78, 0x61, 0x63, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0a, 0x65, 0x78, 0x61, 0x63, 0x74, 0x46, 0x69, 0x72, 0x73, 0x74, 0x12, 0x26, 0x0a, 0x0e, 0x6d, - 0x69, 0x6e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x4c, 0x65, 0x6e, - 0x67, 0x74, 0x68, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x50, - 0x72, 0x65, 0x66, 0x69, 0x78, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, - 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x6d, - 0x61, 0x78, 0x45, 0x64, 0x69, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, - 0x61, 0x78, 0x45, 0x64, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x22, 0x0a, 0x0c, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x18, - 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x77, - 0x61, 0x72, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x18, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, - 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x22, 0xb5, 0x02, 0x0a, 0x13, 0x46, 0x75, 0x7a, - 0x7a, 0x79, 0x49, 0x6e, 0x66, 0x69, 0x78, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0d, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, - 0x65, 0x72, 0x12, 0x24, 0x0a, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6e, 0x61, 0x6c, 0x79, - 0x7a, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x46, - 0x75, 0x7a, 0x7a, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0e, 0x6d, 0x69, 0x6e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, - 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x6f, 0x6e, 0x46, 0x75, 0x7a, 0x7a, 0x79, 0x50, 0x72, 0x65, 0x66, - 0x69, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x6f, 0x6e, 0x46, 0x75, 0x7a, - 0x7a, 0x79, 0x50, 0x72, 0x65, 0x66, 0x69, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x45, - 0x64, 0x69, 0x74, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x45, - 0x64, 0x69, 0x74, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x0a, 0x0c, - 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x63, 0x6f, 0x64, 0x65, 0x41, 0x77, 0x61, 0x72, 0x65, - 0x22, 0x9a, 0x01, 0x0a, 0x0e, 0x4e, 0x72, 0x74, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x1a, 0x0a, 0x08, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x49, 0x64, 0x12, - 0x20, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x54, 0x65, 0x78, 0x74, - 0x73, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x52, 0x08, 0x63, 0x6f, 0x6e, 0x74, 0x65, - 0x78, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x70, 0x61, 0x79, 0x6c, 0x6f, 0x61, 0x64, 0x42, 0x59, 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, - 0x14, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 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 ( - file_yelp_nrtsearch_suggest_proto_rawDescOnce sync.Once - file_yelp_nrtsearch_suggest_proto_rawDescData = file_yelp_nrtsearch_suggest_proto_rawDesc -) - -func file_yelp_nrtsearch_suggest_proto_rawDescGZIP() []byte { - file_yelp_nrtsearch_suggest_proto_rawDescOnce.Do(func() { - file_yelp_nrtsearch_suggest_proto_rawDescData = protoimpl.X.CompressGZIP(file_yelp_nrtsearch_suggest_proto_rawDescData) - }) - return file_yelp_nrtsearch_suggest_proto_rawDescData -} - -var file_yelp_nrtsearch_suggest_proto_msgTypes = make([]protoimpl.MessageInfo, 15) -var file_yelp_nrtsearch_suggest_proto_goTypes = []interface{}{ - (*BuildSuggestRequest)(nil), // 0: luceneserver.BuildSuggestRequest - (*BuildSuggestResponse)(nil), // 1: luceneserver.BuildSuggestResponse - (*SuggestLookupRequest)(nil), // 2: luceneserver.SuggestLookupRequest - (*SuggestLookupResponse)(nil), // 3: luceneserver.SuggestLookupResponse - (*OneSuggestLookupResponse)(nil), // 4: luceneserver.OneSuggestLookupResponse - (*SuggestLookupHighlight)(nil), // 5: luceneserver.SuggestLookupHighlight - (*OneHighlight)(nil), // 6: luceneserver.OneHighlight - (*SuggestLocalSource)(nil), // 7: luceneserver.SuggestLocalSource - (*SuggestNonLocalSource)(nil), // 8: luceneserver.SuggestNonLocalSource - (*InfixSuggester)(nil), // 9: luceneserver.InfixSuggester - (*AnalyzingSuggester)(nil), // 10: luceneserver.AnalyzingSuggester - (*FuzzySuggester)(nil), // 11: luceneserver.FuzzySuggester - (*CompletionInfixSuggester)(nil), // 12: luceneserver.CompletionInfixSuggester - (*FuzzyInfixSuggester)(nil), // 13: luceneserver.FuzzyInfixSuggester - (*NrtsearchIndex)(nil), // 14: luceneserver.NrtsearchIndex -} -var file_yelp_nrtsearch_suggest_proto_depIdxs = []int32{ - 9, // 0: luceneserver.BuildSuggestRequest.infixSuggester:type_name -> luceneserver.InfixSuggester - 10, // 1: luceneserver.BuildSuggestRequest.analyzingSuggester:type_name -> luceneserver.AnalyzingSuggester - 11, // 2: luceneserver.BuildSuggestRequest.fuzzySuggester:type_name -> luceneserver.FuzzySuggester - 12, // 3: luceneserver.BuildSuggestRequest.completionInfixSuggester:type_name -> luceneserver.CompletionInfixSuggester - 13, // 4: luceneserver.BuildSuggestRequest.fuzzyInfixSuggester:type_name -> luceneserver.FuzzyInfixSuggester - 7, // 5: luceneserver.BuildSuggestRequest.localSource:type_name -> luceneserver.SuggestLocalSource - 8, // 6: luceneserver.BuildSuggestRequest.nonLocalSource:type_name -> luceneserver.SuggestNonLocalSource - 4, // 7: luceneserver.SuggestLookupResponse.results:type_name -> luceneserver.OneSuggestLookupResponse - 5, // 8: luceneserver.OneSuggestLookupResponse.suggestLookupHighlight:type_name -> luceneserver.SuggestLookupHighlight - 6, // 9: luceneserver.SuggestLookupHighlight.oneHighlight:type_name -> luceneserver.OneHighlight - 10, // [10:10] is the sub-list for method output_type - 10, // [10:10] is the sub-list for method input_type - 10, // [10:10] is the sub-list for extension type_name - 10, // [10:10] is the sub-list for extension extendee - 0, // [0:10] is the sub-list for field type_name -} - -func init() { file_yelp_nrtsearch_suggest_proto_init() } -func file_yelp_nrtsearch_suggest_proto_init() { - if File_yelp_nrtsearch_suggest_proto != nil { - return - } - if !protoimpl.UnsafeEnabled { - file_yelp_nrtsearch_suggest_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildSuggestRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildSuggestResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestLookupRequest); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestLookupResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneSuggestLookupResponse); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestLookupHighlight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*OneHighlight); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestLocalSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SuggestNonLocalSource); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InfixSuggester); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AnalyzingSuggester); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FuzzySuggester); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CompletionInfixSuggester); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*FuzzyInfixSuggester); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NrtsearchIndex); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - } - file_yelp_nrtsearch_suggest_proto_msgTypes[0].OneofWrappers = []interface{}{ - (*BuildSuggestRequest_InfixSuggester)(nil), - (*BuildSuggestRequest_AnalyzingSuggester)(nil), - (*BuildSuggestRequest_FuzzySuggester)(nil), - (*BuildSuggestRequest_CompletionInfixSuggester)(nil), - (*BuildSuggestRequest_FuzzyInfixSuggester)(nil), - (*BuildSuggestRequest_LocalSource)(nil), - (*BuildSuggestRequest_NonLocalSource)(nil), - } - file_yelp_nrtsearch_suggest_proto_msgTypes[4].OneofWrappers = []interface{}{ - (*OneSuggestLookupResponse_SuggestLookupHighlight)(nil), - (*OneSuggestLookupResponse_Key)(nil), - } - file_yelp_nrtsearch_suggest_proto_msgTypes[8].OneofWrappers = []interface{}{ - (*SuggestNonLocalSource_IndexGen)(nil), - (*SuggestNonLocalSource_Version)(nil), - (*SuggestNonLocalSource_Snapshot)(nil), - (*SuggestNonLocalSource_WeightField)(nil), - (*SuggestNonLocalSource_WeightExpression)(nil), - } - type x struct{} - out := protoimpl.TypeBuilder{ - File: protoimpl.DescBuilder{ - GoPackagePath: reflect.TypeOf(x{}).PkgPath(), - RawDescriptor: file_yelp_nrtsearch_suggest_proto_rawDesc, - NumEnums: 0, - NumMessages: 15, - NumExtensions: 0, - NumServices: 0, - }, - GoTypes: file_yelp_nrtsearch_suggest_proto_goTypes, - DependencyIndexes: file_yelp_nrtsearch_suggest_proto_depIdxs, - MessageInfos: file_yelp_nrtsearch_suggest_proto_msgTypes, - }.Build() - File_yelp_nrtsearch_suggest_proto = out.File - file_yelp_nrtsearch_suggest_proto_rawDesc = nil - file_yelp_nrtsearch_suggest_proto_goTypes = nil - file_yelp_nrtsearch_suggest_proto_depIdxs = nil -} diff --git a/grpc-gateway/suggest.swagger.json b/grpc-gateway/suggest.swagger.json deleted file mode 100644 index 050f63901..000000000 --- a/grpc-gateway/suggest.swagger.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "swagger": "2.0", - "info": { - "title": "yelp/nrtsearch/suggest.proto", - "version": "version not set" - }, - "consumes": [ - "application/json" - ], - "produces": [ - "application/json" - ], - "paths": {}, - "definitions": { - "googlerpcStatus": { - "type": "object", - "properties": { - "code": { - "type": "integer", - "format": "int32" - }, - "message": { - "type": "string" - }, - "details": { - "type": "array", - "items": { - "$ref": "#/definitions/protobufAny" - } - } - } - }, - "protobufAny": { - "type": "object", - "properties": { - "@type": { - "type": "string", - "description": "A URL/resource name that uniquely identifies the type of the serialized\nprotocol buffer message. This string must contain at least\none \"/\" character. The last segment of the URL's path must represent\nthe fully qualified name of the type (as in\n`path/google.protobuf.Duration`). The name should be in a canonical form\n(e.g., leading \".\" is not accepted).\n\nIn practice, teams usually precompile into the binary all types that they\nexpect it to use in the context of Any. However, for URLs which use the\nscheme `http`, `https`, or no scheme, one can optionally set up a type\nserver that maps type URLs to message definitions as follows:\n\n* If no scheme is provided, `https` is assumed.\n* An HTTP GET on the URL must yield a [google.protobuf.Type][]\n value in binary format, or produce an error.\n* Applications are allowed to cache lookup results based on the\n URL, or have them precompiled into a binary to avoid any\n lookup. Therefore, binary compatibility needs to be preserved\n on changes to types. (Use versioned type names to manage\n breaking changes.)\n\nNote: this functionality is not currently available in the official\nprotobuf release, and it is not used for type URLs beginning with\ntype.googleapis.com. As of May 2023, there are no widely used type server\nimplementations and no plans to implement one.\n\nSchemes other than `http`, `https` (or the empty scheme) might be\nused with implementation specific semantics." - } - }, - "additionalProperties": {}, - "description": "`Any` contains an arbitrary serialized protocol buffer message along with a\nURL that describes the type of the serialized message.\n\nProtobuf library provides support to pack/unpack Any values in the form\nof utility functions or additional generated methods of the Any type.\n\nExample 1: Pack and unpack a message in C++.\n\n Foo foo = ...;\n Any any;\n any.PackFrom(foo);\n ...\n if (any.UnpackTo(\u0026foo)) {\n ...\n }\n\nExample 2: Pack and unpack a message in Java.\n\n Foo foo = ...;\n Any any = Any.pack(foo);\n ...\n if (any.is(Foo.class)) {\n foo = any.unpack(Foo.class);\n }\n // or ...\n if (any.isSameTypeAs(Foo.getDefaultInstance())) {\n foo = any.unpack(Foo.getDefaultInstance());\n }\n\n Example 3: Pack and unpack a message in Python.\n\n foo = Foo(...)\n any = Any()\n any.Pack(foo)\n ...\n if any.Is(Foo.DESCRIPTOR):\n any.Unpack(foo)\n ...\n\n Example 4: Pack and unpack a message in Go\n\n foo := \u0026pb.Foo{...}\n any, err := anypb.New(foo)\n if err != nil {\n ...\n }\n ...\n foo := \u0026pb.Foo{}\n if err := any.UnmarshalTo(foo); err != nil {\n ...\n }\n\nThe pack methods provided by protobuf library will by default use\n'type.googleapis.com/full.type.name' as the type URL and the unpack\nmethods only use the fully qualified type name after the last '/'\nin the type URL, for example \"foo.bar.com/x/y.z\" will yield type\nname \"y.z\".\n\nJSON\n====\nThe JSON representation of an `Any` value uses the regular\nrepresentation of the deserialized, embedded message, with an\nadditional field `@type` which contains the type URL. Example:\n\n package google.profile;\n message Person {\n string first_name = 1;\n string last_name = 2;\n }\n\n {\n \"@type\": \"type.googleapis.com/google.profile.Person\",\n \"firstName\": \u003cstring\u003e,\n \"lastName\": \u003cstring\u003e\n }\n\nIf the embedded message type is well-known and has a custom JSON\nrepresentation, that representation will be embedded adding a field\n`value` which holds the custom JSON in addition to the `@type`\nfield. Example (for message [google.protobuf.Duration][]):\n\n {\n \"@type\": \"type.googleapis.com/google.protobuf.Duration\",\n \"value\": \"1.212s\"\n }" - } - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/grpc/LuceneServer.java b/src/main/java/com/yelp/nrtsearch/server/grpc/LuceneServer.java index 273ef1474..c0245da09 100644 --- a/src/main/java/com/yelp/nrtsearch/server/grpc/LuceneServer.java +++ b/src/main/java/com/yelp/nrtsearch/server/grpc/LuceneServer.java @@ -1388,90 +1388,6 @@ public void ready( } } - @Override - public void buildSuggest( - BuildSuggestRequest buildSuggestRequest, - StreamObserver responseObserver) { - try { - IndexState indexState = globalState.getIndex(buildSuggestRequest.getIndexName()); - BuildSuggestHandler buildSuggestHandler = new BuildSuggestHandler(searchThreadPoolExecutor); - BuildSuggestResponse reply = buildSuggestHandler.handle(indexState, buildSuggestRequest); - logger.info(String.format("BuildSuggestHandler returned results %s", reply.toString())); - responseObserver.onNext(reply); - responseObserver.onCompleted(); - } catch (Exception e) { - logger.warn( - String.format( - "error while trying to build suggester %s for index %s", - buildSuggestRequest.getSuggestName(), buildSuggestRequest.getIndexName()), - e); - responseObserver.onError( - Status.UNKNOWN - .withDescription( - String.format( - "error while trying to build suggester %s for index %s", - buildSuggestRequest.getSuggestName(), buildSuggestRequest.getIndexName())) - .augmentDescription(e.getMessage()) - .asRuntimeException()); - } - } - - @Override - public void suggestLookup( - SuggestLookupRequest suggestLookupRequest, - StreamObserver responseObserver) { - try { - IndexState indexState = globalState.getIndex(suggestLookupRequest.getIndexName()); - SuggestLookupHandler suggestLookupHandler = new SuggestLookupHandler(); - SuggestLookupResponse reply = suggestLookupHandler.handle(indexState, suggestLookupRequest); - logger.info(String.format("SuggestLookupHandler returned results %s", reply.toString())); - responseObserver.onNext(reply); - responseObserver.onCompleted(); - } catch (Exception e) { - logger.warn( - String.format( - "error while trying to lookup suggester %s for index %s", - suggestLookupRequest.getSuggestName(), suggestLookupRequest.getIndexName()), - e); - responseObserver.onError( - Status.UNKNOWN - .withDescription( - String.format( - "error while trying to lookup suggester %s for index %s", - suggestLookupRequest.getSuggestName(), suggestLookupRequest.getIndexName())) - .augmentDescription(e.getMessage()) - .asRuntimeException()); - } - } - - @Override - public void updateSuggest( - BuildSuggestRequest buildSuggestRequest, - StreamObserver responseObserver) { - try { - IndexState indexState = globalState.getIndex(buildSuggestRequest.getIndexName()); - UpdateSuggestHandler updateSuggestHandler = new UpdateSuggestHandler(); - BuildSuggestResponse reply = updateSuggestHandler.handle(indexState, buildSuggestRequest); - logger.info(String.format("UpdateSuggestHandler returned results %s", reply.toString())); - responseObserver.onNext(reply); - responseObserver.onCompleted(); - } catch (Exception e) { - logger.warn( - String.format( - "error while trying to update suggester %s for index %s", - buildSuggestRequest.getSuggestName(), buildSuggestRequest.getIndexName()), - e); - responseObserver.onError( - Status.UNKNOWN - .withDescription( - String.format( - "error while trying to update suggester %s for index %s", - buildSuggestRequest.getSuggestName(), buildSuggestRequest.getIndexName())) - .augmentDescription(e.getMessage()) - .asRuntimeException()); - } - } - @Override public void createSnapshot( CreateSnapshotRequest createSnapshotRequest, diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/BuildSuggestHandler.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/BuildSuggestHandler.java deleted file mode 100644 index 9f5d58a34..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/BuildSuggestHandler.java +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver; - -import com.google.gson.Gson; -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import com.google.gson.JsonParser; -import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.util.JsonFormat; -import com.yelp.nrtsearch.server.config.IndexPreloadConfig; -import com.yelp.nrtsearch.server.grpc.BuildSuggestRequest; -import com.yelp.nrtsearch.server.grpc.BuildSuggestResponse; -import com.yelp.nrtsearch.server.grpc.FuzzySuggester; -import com.yelp.nrtsearch.server.grpc.OneHighlight; -import com.yelp.nrtsearch.server.grpc.SearchRequest; -import com.yelp.nrtsearch.server.grpc.SuggestLookupHighlight; -import com.yelp.nrtsearch.server.grpc.SuggestNonLocalSource; -import com.yelp.nrtsearch.server.luceneserver.analysis.AnalyzerCreator; -import com.yelp.nrtsearch.server.luceneserver.suggest.CompletionInfixSuggester; -import com.yelp.nrtsearch.server.luceneserver.suggest.FuzzyInfixSuggester; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.FromProtobufFileSuggestItemIterator; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.SuggestDocumentDictionary; -import java.io.Closeable; -import java.io.File; -import java.io.IOException; -import java.io.StringReader; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ThreadPoolExecutor; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.TokenStream; -import org.apache.lucene.analysis.tokenattributes.CharTermAttribute; -import org.apache.lucene.analysis.tokenattributes.OffsetAttribute; -import org.apache.lucene.expressions.Expression; -import org.apache.lucene.expressions.js.JavascriptCompiler; -import org.apache.lucene.facet.taxonomy.SearcherTaxonomyManager; -import org.apache.lucene.search.suggest.DocumentDictionary; -import org.apache.lucene.search.suggest.DocumentValueSourceDictionary; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.search.suggest.Lookup; -import org.apache.lucene.search.suggest.analyzing.AnalyzingInfixSuggester; -import org.apache.lucene.search.suggest.analyzing.AnalyzingSuggester; -import org.apache.lucene.search.suggest.document.FuzzyCompletionQuery; -import org.apache.lucene.store.IOContext; -import org.apache.lucene.store.IndexInput; -import org.apache.lucene.store.IndexOutput; -import org.apache.lucene.util.BytesRef; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -/** Handles {@code buildSuggest}. */ -public class BuildSuggestHandler implements Handler { - private final ThreadPoolExecutor threadPoolExecutor; - Logger logger = LoggerFactory.getLogger(BuildSuggestHandler.class); - private final JsonParser jsonParser = new JsonParser(); - private final Gson gson = new Gson(); - - /** Load all previously built suggesters. */ - public void load(IndexState indexState, JsonObject saveState) throws IOException { - ShardState shardState = indexState.getShard(0); - for (Map.Entry ent : saveState.entrySet()) { - String suggestName = ent.getKey(); - JsonObject buildSuggestRequestAsJsonObject = ent.getValue().getAsJsonObject(); - String jsonStr = gson.toJson(buildSuggestRequestAsJsonObject); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - try { - JsonFormat.parser().merge(jsonStr, buildSuggestRequestBuilder); - } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); - } - BuildSuggestRequest buildSuggestRequest = buildSuggestRequestBuilder.build(); - Lookup suggester = getSuggester(indexState, buildSuggestRequest); - - if ((suggester instanceof AnalyzingInfixSuggester) == false) { - // nocommit store suggesters 1 dir up: - try (IndexInput in = - shardState.origIndexDir.openInput("suggest." + suggestName, IOContext.DEFAULT)) { - suggester.load(in); - } - } - indexState.addSuggest(suggestName, buildSuggestRequestAsJsonObject); - } - } - - private Lookup getSuggester(IndexState indexState, BuildSuggestRequest buildSuggestRequest) - throws IOException { - String suggestName = buildSuggestRequest.getSuggestName(); - - ShardState shardState = indexState.getShard(0); - - Lookup oldSuggester = indexState.getSuggesters().get(suggestName); - if (oldSuggester != null && oldSuggester instanceof Closeable) { - ((Closeable) oldSuggester).close(); - indexState.getSuggesters().remove(suggestName); - } - - Analyzer indexAnalyzer; - Analyzer queryAnalyzer; - final Lookup suggester; - - if (buildSuggestRequest.hasFuzzySuggester()) { - int options = 0; - FuzzySuggester fuzzySuggester = buildSuggestRequest.getFuzzySuggester(); - if (fuzzySuggester.getAnalyzer() != null) { - indexAnalyzer = queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } else { - indexAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } - if (indexAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or indexAnalyzer must be specified"); - } - if (queryAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or queryAnalyzer must be specified"); - } - - if (fuzzySuggester.getPreserveSep()) { - options |= AnalyzingSuggester.PRESERVE_SEP; - } - if (fuzzySuggester.getExactFirst()) { - options |= AnalyzingSuggester.EXACT_FIRST; - } - // default values - int maxSurfaceFormsPerAnalyzedForm = - fuzzySuggester.getMaxSurfaceFormsPerAnalyzedForm() == 0 - ? 156 - : fuzzySuggester.getMaxSurfaceFormsPerAnalyzedForm(); - int maxGraphExpansions = - fuzzySuggester.getMaxGraphExpansions() == 0 ? -1 : fuzzySuggester.getMaxGraphExpansions(); - int minFuzzyLength = - fuzzySuggester.getMinFuzzyLength() == 0 - ? org.apache.lucene.search.suggest.analyzing.FuzzySuggester.DEFAULT_MIN_FUZZY_LENGTH - : fuzzySuggester.getMinFuzzyLength(); - int nonFuzzyPrefix = - fuzzySuggester.getNonFuzzyPrefix() == 0 - ? org.apache.lucene.search.suggest.analyzing.FuzzySuggester.DEFAULT_NON_FUZZY_PREFIX - : fuzzySuggester.getNonFuzzyPrefix(); - int maxEdits = - fuzzySuggester.getMaxEdits() == 0 - ? org.apache.lucene.search.suggest.analyzing.FuzzySuggester.DEFAULT_MAX_EDITS - : fuzzySuggester.getMaxEdits(); - - suggester = - new org.apache.lucene.search.suggest.analyzing.FuzzySuggester( - shardState.origIndexDir, - "FuzzySuggester", - indexAnalyzer, - queryAnalyzer, - options, - maxSurfaceFormsPerAnalyzedForm, - maxGraphExpansions, - true, - maxEdits, - fuzzySuggester.getTranspositions(), - nonFuzzyPrefix, - minFuzzyLength, - fuzzySuggester.getUnicodeAware()); - } else if (buildSuggestRequest.hasAnalyzingSuggester()) { - int options = 0; - com.yelp.nrtsearch.server.grpc.AnalyzingSuggester analyzingSuggester = - buildSuggestRequest.getAnalyzingSuggester(); - if (analyzingSuggester.getAnalyzer() != null) { - indexAnalyzer = queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } else { - indexAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } - if (indexAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or indexAnalyzer must be specified"); - } - if (queryAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or queryAnalyzer must be specified"); - } - - if (analyzingSuggester.getPreserveSep()) { - options |= AnalyzingSuggester.PRESERVE_SEP; - } - if (analyzingSuggester.getExactFirst()) { - options |= AnalyzingSuggester.EXACT_FIRST; - } - // default values - int maxSurfaceFormsPerAnalyzedForm = - analyzingSuggester.getMaxSurfaceFormsPerAnalyzedForm() == 0 - ? 256 - : analyzingSuggester.getMaxSurfaceFormsPerAnalyzedForm(); - int maxGraphExpansions = - analyzingSuggester.getMaxGraphExpansions() == 0 - ? -1 - : analyzingSuggester.getMaxGraphExpansions(); - suggester = - new AnalyzingSuggester( - shardState.origIndexDir, - "AnalyzingSuggester", - indexAnalyzer, - queryAnalyzer, - options, - maxSurfaceFormsPerAnalyzedForm, - maxGraphExpansions, - true); - } else if (buildSuggestRequest.hasInfixSuggester()) { - if (buildSuggestRequest.getInfixSuggester().getAnalyzer() != null) { - indexAnalyzer = queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } else { - indexAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } - if (indexAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or indexAnalyzer must be specified"); - } - if (queryAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or queryAnalyzer must be specified"); - } - - suggester = - new AnalyzingInfixSuggester( - indexState - .getDirectoryFactory() - .open( - indexState.getRootDir().resolve("suggest." + suggestName + ".infix"), - IndexPreloadConfig.PRELOAD_ALL), - indexAnalyzer, - queryAnalyzer, - AnalyzingInfixSuggester.DEFAULT_MIN_PREFIX_CHARS, - true) { - @Override - protected Object highlight(String text, Set matchedTokens, String prefixToken) - throws IOException { - - // We override the entire highlight method, to - // render directly to JSONArray instead of html - // string: - - // nocommit push this fix (queryAnalyzer -> indexAnalyzer) back: - TokenStream ts = indexAnalyzer.tokenStream("text", new StringReader(text)); - CharTermAttribute termAtt = ts.addAttribute(CharTermAttribute.class); - OffsetAttribute offsetAtt = ts.addAttribute(OffsetAttribute.class); - ts.reset(); - SuggestLookupHighlight.Builder suggestLookupHighlightBuilder = - SuggestLookupHighlight.newBuilder(); - int upto = 0; - while (ts.incrementToken()) { - String token = termAtt.toString(); - int startOffset = offsetAtt.startOffset(); - int endOffset = offsetAtt.endOffset(); - if (upto < startOffset) { - OneHighlight.Builder oneHighlightBuilder = OneHighlight.newBuilder(); - oneHighlightBuilder.setIsHit(false); - oneHighlightBuilder.setText(text.substring(upto, startOffset)); - suggestLookupHighlightBuilder.addOneHighlight(oneHighlightBuilder); - upto = startOffset; - } else if (upto > startOffset) { - continue; - } - - if (matchedTokens.contains(token)) { - // Token matches. - OneHighlight.Builder oneHighlightBuilder = OneHighlight.newBuilder(); - oneHighlightBuilder.setIsHit(true); - oneHighlightBuilder.setText(text.substring(startOffset, endOffset)); - suggestLookupHighlightBuilder.addOneHighlight(oneHighlightBuilder); - upto = endOffset; - } else if (prefixToken != null && token.startsWith(prefixToken)) { - OneHighlight.Builder oneHighlightBuilder = OneHighlight.newBuilder(); - oneHighlightBuilder.setIsHit(true); - oneHighlightBuilder.setText( - text.substring(startOffset, startOffset + prefixToken.length())); - suggestLookupHighlightBuilder.addOneHighlight(oneHighlightBuilder); - if (prefixToken.length() < token.length()) { - OneHighlight.Builder oneMoreHighlightBuilder = OneHighlight.newBuilder(); - oneMoreHighlightBuilder.setIsHit(false); - oneMoreHighlightBuilder.setText( - text.substring( - startOffset + prefixToken.length(), startOffset + token.length())); - suggestLookupHighlightBuilder.addOneHighlight(oneMoreHighlightBuilder); - } - upto = endOffset; - } - } - ts.end(); - int endOffset = offsetAtt.endOffset(); - if (upto < endOffset) { - OneHighlight.Builder oneHighlightBuilder = OneHighlight.newBuilder(); - oneHighlightBuilder.setIsHit(false); - oneHighlightBuilder.setText(text.substring(upto)); - suggestLookupHighlightBuilder.addOneHighlight(oneHighlightBuilder); - } - ts.close(); - - return suggestLookupHighlightBuilder.build(); - } - }; - } else if (buildSuggestRequest.hasCompletionInfixSuggester()) { - com.yelp.nrtsearch.server.grpc.CompletionInfixSuggester completionInfixSuggester = - buildSuggestRequest.getCompletionInfixSuggester(); - // Todo: use standard analyzer by default. Different analyzers will be considered later - if (completionInfixSuggester.getAnalyzer() != null) { - indexAnalyzer = queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } else { - indexAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } - if (indexAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or indexAnalyzer must be specified"); - } - if (queryAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or queryAnalyzer must be specified"); - } - - suggester = - new CompletionInfixSuggester( - indexState - .getDirectoryFactory() - .open( - indexState.getRootDir().resolve("suggest." + suggestName + ".infix"), - IndexPreloadConfig.PRELOAD_ALL), - indexAnalyzer, - queryAnalyzer); - } else if (buildSuggestRequest.hasFuzzyInfixSuggester()) { - com.yelp.nrtsearch.server.grpc.FuzzyInfixSuggester fuzzyInfixSuggester = - buildSuggestRequest.getFuzzyInfixSuggester(); - // Todo: use standard analyzer by default. Different analyzers will be considered later - if (fuzzyInfixSuggester.getAnalyzer() != null) { - indexAnalyzer = queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } else { - indexAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - queryAnalyzer = AnalyzerCreator.getStandardAnalyzer(); - } - if (indexAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or indexAnalyzer must be specified"); - } - if (queryAnalyzer == null) { - throw new RuntimeException("analyzer analyzer or queryAnalyzer must be specified"); - } - - int maxEdits = - fuzzyInfixSuggester.getMaxEdits() == 0 - ? FuzzyCompletionQuery.DEFAULT_MAX_EDITS - : fuzzyInfixSuggester.getMaxEdits(); - boolean transpositions = fuzzyInfixSuggester.getTranspositions(); - int nonFuzzyPrefix = - fuzzyInfixSuggester.getNonFuzzyPrefix() == 0 - ? FuzzyCompletionQuery.DEFAULT_NON_FUZZY_PREFIX - : fuzzyInfixSuggester.getNonFuzzyPrefix(); - int minFuzzyLength = - fuzzyInfixSuggester.getMinFuzzyLength() == 0 - ? FuzzyCompletionQuery.DEFAULT_MIN_FUZZY_LENGTH - : fuzzyInfixSuggester.getMinFuzzyLength(); - boolean unicodeAware = fuzzyInfixSuggester.getUnicodeAware(); - - suggester = - new FuzzyInfixSuggester( - indexState - .getDirectoryFactory() - .open( - indexState.getRootDir().resolve("suggest." + suggestName + ".infix"), - IndexPreloadConfig.PRELOAD_ALL), - indexAnalyzer, - queryAnalyzer, - maxEdits, - transpositions, - nonFuzzyPrefix, - minFuzzyLength, - unicodeAware); - } else { - throw new RuntimeException( - "Suggester provided must be one of AnalyzingSuggester, InfixSuggester, FuzzySuggester"); - } - - indexState.getSuggesters().put(suggestName, suggester); - - return suggester; - } - - /** Used to return highlighted result; see {@link Lookup.LookupResult#highlightKey} */ - public static final class LookupHighlightFragment { - /** Portion of text for this fragment. */ - public final String text; - - /** True if this text matched a part of the user's query. */ - public final boolean isHit; - - /** Sole constructor. */ - public LookupHighlightFragment(String text, boolean isHit) { - this.text = text; - this.isHit = isHit; - } - - @Override - public String toString() { - return "LookupHighlightFragment(text=" + text + " isHit=" + isHit + ")"; - } - } - - /** Wraps another {@link InputIterator} and counts how many suggestions were seen. */ - private static class CountingInputIterator implements InputIterator { - - private final InputIterator other; - private int count; - - public CountingInputIterator(InputIterator other) { - this.other = other; - } - - @Override - public boolean hasContexts() { - return other.hasContexts(); - } - - @Override - public Set contexts() { - return other.contexts(); - } - - @Override - public long weight() { - return other.weight(); - } - - @Override - public BytesRef next() throws IOException { - BytesRef result = other.next(); - if (result != null) { - count++; - } - - return result; - } - - @Override - public BytesRef payload() { - return other.payload(); - } - - @Override - public boolean hasPayloads() { - return other.hasPayloads(); - } - - public int getCount() { - return count; - } - } - - public BuildSuggestHandler(ThreadPoolExecutor threadPoolExecutor) { - this.threadPoolExecutor = threadPoolExecutor; - } - - @Override - public BuildSuggestResponse handle(IndexState indexState, BuildSuggestRequest buildSuggestRequest) - throws HandlerException { - - ShardState shardState = indexState.getShard(0); - final JsonObject buildSuggestRequestAsJsonObject; - try { - // convert Proto object to Json String - String jsonOrig = JsonFormat.printer().print(buildSuggestRequest); - buildSuggestRequestAsJsonObject = jsonParser.parse(jsonOrig).getAsJsonObject(); - } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); - } - - final String suggestName = buildSuggestRequest.getSuggestName(); - if (!IndexState.isSimpleName(suggestName)) { - throw new RuntimeException( - "suggestName: invalid suggestName \"" - + suggestName - + "\": must be [a-zA-Z_][a-zA-Z0-9]*"); - } - - final Lookup suggester; - try { - suggester = getSuggester(indexState, buildSuggestRequest); - } catch (IOException e) { - throw new RuntimeException(e); - } - - InputIterator iterator = null; - final SearcherTaxonomyManager.SearcherAndTaxonomy searcher; - - if (buildSuggestRequest.hasLocalSource()) { - final File localFile = new File(buildSuggestRequest.getLocalSource().getLocalFile()); - if (!localFile.exists()) { - throw new RuntimeException( - String.format( - "localFile %s does not exist", - buildSuggestRequest.getLocalSource().getLocalFile())); - } - if (!localFile.canRead()) { - throw new RuntimeException( - String.format( - "localFile %s cannot read file", - buildSuggestRequest.getLocalSource().getLocalFile())); - } - boolean hasContexts = buildSuggestRequest.getLocalSource().getHasContexts(); - boolean hasPayload = buildSuggestRequest.getLocalSource().getHasPayload(); - boolean hasMultiSearchTexts = buildSuggestRequest.getLocalSource().getHasMultiSearchText(); - searcher = null; - // Pull suggestions from local file: - try { - if (hasMultiSearchTexts) { - iterator = - new FromProtobufFileSuggestItemIterator( - localFile, hasContexts, hasPayload, hasMultiSearchTexts); - } else { - iterator = new FromFileTermFreqIterator(localFile, hasContexts); - } - } catch (IOException ioe) { - throw new RuntimeException("localFile cannot open file", ioe); - } - } else { - indexState.verifyStarted(); - SuggestNonLocalSource nonLocalSource = buildSuggestRequest.getNonLocalSource(); - // Pull suggestions from stored docs: - SuggestNonLocalSource.WeightCase weightCase = - buildSuggestRequest.getNonLocalSource().getWeightCase(); - SuggestNonLocalSource.SearcherCase searcherCase = - buildSuggestRequest.getNonLocalSource().getSearcherCase(); - SearchRequest.Builder searchRequestBuilder = SearchRequest.newBuilder(); - if (searcherCase.equals(SuggestNonLocalSource.SearcherCase.INDEXGEN)) { - searchRequestBuilder.setIndexGen(buildSuggestRequest.getNonLocalSource().getIndexGen()); - } else if (searcherCase.equals(SuggestNonLocalSource.SearcherCase.VERSION)) { - searchRequestBuilder.setVersion(buildSuggestRequest.getNonLocalSource().getVersion()); - } else if (searcherCase.equals(SuggestNonLocalSource.SearcherCase.SNAPSHOT)) { - searchRequestBuilder.setSnapshot(buildSuggestRequest.getNonLocalSource().getSnapshot()); - } else { - logger.info("using current searcher version to build suggest index"); - } - - try { - if (!searcherCase.equals(SuggestNonLocalSource.SearcherCase.SEARCHER_NOT_SET)) { - // Specific searcher version: - searcher = - SearchHandler.getSearcherAndTaxonomy( - searchRequestBuilder.build(), indexState, shardState, null, threadPoolExecutor); - } else { - searcher = shardState.acquire(); - } - } catch (IOException | InterruptedException e) { - throw new RuntimeException(e); - } - - String suggestField = nonLocalSource.getSuggestField(); - - String payloadField = nonLocalSource.getPayloadField(); - String contextField = nonLocalSource.getContextField(); - String searchTextField = nonLocalSource.getSearchTextField(); - - DocumentDictionary dict; - - if (weightCase.equals(SuggestNonLocalSource.WeightCase.WEIGHTFIELD)) { - // Weight is a field - String weightField = nonLocalSource.getWeightField(); - if (!payloadField.isEmpty() && !contextField.isEmpty() && !searchTextField.isEmpty()) { - try { - dict = - new SuggestDocumentDictionary( - searcher.searcher.getIndexReader(), - suggestField, - weightField, - payloadField, - contextField, - searchTextField); - } catch (IOException e) { - throw new HandlerException(e); - } - } else if (contextField.isEmpty()) { - try { - dict = - new DocumentDictionary( - searcher.searcher.getIndexReader(), suggestField, weightField, payloadField); - } catch (IOException e) { - throw new HandlerException(e); - } - } else { - try { - dict = - new DocumentDictionary( - searcher.searcher.getIndexReader(), - suggestField, - weightField, - payloadField, - contextField); - } catch (IOException e) { - throw new HandlerException(e); - } - } - } else { - // Weight is an expression; add bindings for all - // numeric DV fields: - Expression expr; - try { - expr = JavascriptCompiler.compile(nonLocalSource.getWeightExpression()); - } catch (Exception e) { - throw new RuntimeException("weightExpression: expression does not compile", e); - } - - if (contextField.isEmpty()) { - try { - dict = - new DocumentValueSourceDictionary( - searcher.searcher.getIndexReader(), - suggestField, - expr.getDoubleValuesSource(indexState.getExpressionBindings()) - .toLongValuesSource(), - payloadField); - } catch (IOException e) { - throw new HandlerException(e); - } - } else { - try { - dict = - new DocumentValueSourceDictionary( - searcher.searcher.getIndexReader(), - suggestField, - expr.getDoubleValuesSource(indexState.getExpressionBindings()) - .toLongValuesSource(), - payloadField, - contextField); - } catch (IOException e) { - throw new HandlerException(e); - } - } - } - - try { - iterator = dict.getEntryIterator(); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - // nocommit return error if suggester already exists? - // nocommit need a DeleteSuggestHandler - try { - return getBuildSuggestResponse( - suggester, - indexState, - shardState, - iterator, - suggestName, - buildSuggestRequestAsJsonObject, - searcher); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private BuildSuggestResponse getBuildSuggestResponse( - Lookup suggester, - IndexState indexState, - ShardState shardState, - InputIterator iterator, - String suggestName, - JsonObject buildSuggestRequestAsJsonObject, - SearcherTaxonomyManager.SearcherAndTaxonomy searcher) - throws IOException { - final InputIterator iterator0 = iterator; - try { - suggester.build(iterator0); - } catch (IOException e) { - logger.info("error while building suggest index"); - throw new RuntimeException(e); - } finally { - if (iterator0 instanceof Closeable) { - ((Closeable) iterator0).close(); - } - if (searcher != null) { - shardState.release(searcher); - } - } - - boolean success = false; - try (IndexOutput out = - shardState.origIndexDir.createOutput("suggest." + suggestName, IOContext.DEFAULT)) { - // nocommit look @ return value - suggester.store(out); - success = true; - } finally { - if (success == false) { - shardState.origIndexDir.deleteFile("suggest." + suggestName); - } - } - - indexState.addSuggest(suggestName, buildSuggestRequestAsJsonObject); - - BuildSuggestResponse.Builder buildSuggestResponseBuilder = BuildSuggestResponse.newBuilder(); - if (suggester instanceof AnalyzingSuggester) { - buildSuggestResponseBuilder.setSizeInBytes(((AnalyzingSuggester) suggester).ramBytesUsed()); - } - if (suggester instanceof AnalyzingInfixSuggester) { - ((AnalyzingInfixSuggester) suggester).commit(); - } - - buildSuggestResponseBuilder.setCount(suggester.getCount()); - return buildSuggestResponseBuilder.build(); - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/CreateSnapshotHandler.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/CreateSnapshotHandler.java index 126cfcd6e..96ccf8d70 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/CreateSnapshotHandler.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/CreateSnapshotHandler.java @@ -93,10 +93,6 @@ public CreateSnapshotResponse createSnapshot( } } - // TODO: suggest state? - // nocommit must also snapshot snapshots state!? - // hard to think about - SnapshotId.Builder snapshotIdBuilder = SnapshotId.newBuilder().setIndexGen(c.getGeneration()).setStateGen(stateGen); if (!shardState.isPrimary() && !shardState.isReplica()) { diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/FromFileTermFreqIterator.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/FromFileTermFreqIterator.java deleted file mode 100644 index 112855c8b..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/FromFileTermFreqIterator.java +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver; - -import java.io.BufferedReader; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStreamReader; -import java.util.HashSet; -import java.util.Set; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.util.BytesRef; - -/** - * An {@link InputIterator} that pulls from a line file, using U+001f to join the suggestion, weight - * and payload. - */ -public class FromFileTermFreqIterator implements InputIterator, Closeable { - private final BufferedReader reader; - private long weight; - private int lineCount; - final boolean hasContexts; - - /** How many suggestions were found. */ - public int suggestCount; - - private BytesRef extra; - private final Set contexts = new HashSet<>(); - - /** Sole constructor. */ - public FromFileTermFreqIterator(File sourceFile, boolean hasContexts) throws IOException { - reader = - new BufferedReader(new InputStreamReader(new FileInputStream(sourceFile), "UTF-8"), 65536); - this.hasContexts = hasContexts; - } - - @Override - public boolean hasContexts() { - return hasContexts; - } - - @Override - public Set contexts() { - return contexts; - } - - @Override - public boolean hasPayloads() { - return true; - } - - @Override - public BytesRef next() { - while (true) { - String line; - try { - line = reader.readLine(); - } catch (IOException ioe) { - throw new RuntimeException("readLine failed", ioe); - } - if (line == null) { - return null; - } - lineCount++; - line = line.trim(); - if (line.length() == 0 || line.charAt(0) == '#') { - continue; - } - int spot = line.indexOf('\u001f'); - if (spot == -1) { - throw new RuntimeException("line " + lineCount + " is malformed"); - } - weight = Long.parseLong(line.substring(0, spot)); - suggestCount++; - int spot2 = line.indexOf('\u001f', spot + 1); - if (spot2 == -1) { - throw new RuntimeException("line " + lineCount + " is malformed"); - } - BytesRef text = new BytesRef(line.substring(spot + 1, spot2)); - - int spot3 = line.indexOf('\u001f', spot2 + 1); - if (spot3 == -1) { - extra = new BytesRef(line.substring(spot2 + 1)); - } else { - extra = new BytesRef(line.substring(spot2 + 1, spot3)); - - contexts.clear(); - - int upto = spot3 + 1; - while (true) { - int nextUpto = line.indexOf('\u001f', upto); - if (nextUpto == -1) { - contexts.add(new BytesRef(line.substring(upto))); - break; - } else { - contexts.add(new BytesRef(line.substring(upto, nextUpto))); - upto = nextUpto + 1; - } - } - // System.out.println("CONTEXTS: " + text.utf8ToString() + " -> " + contexts); - } - - return text; - } - } - - @Override - public BytesRef payload() { - return extra; - } - - @Override - public long weight() { - return weight; - } - - @Override - public void close() throws IOException { - reader.close(); - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java index a3ea14ed6..d22b57bbe 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/IndexState.java @@ -49,7 +49,6 @@ import org.apache.lucene.index.IndexWriterConfig; import org.apache.lucene.search.similarities.PerFieldSimilarityWrapper; import org.apache.lucene.search.similarities.Similarity; -import org.apache.lucene.search.suggest.Lookup; import org.apache.lucene.store.Directory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -472,10 +471,6 @@ public abstract IndexWriterConfig getIndexWriterConfig( /** Get the max merge precopy duration (in seconds). */ public abstract long getMaxMergePreCopyDurationSec(); - public abstract void addSuggest(String name, JsonObject o); - - public abstract Map getSuggesters(); - /** Get if additional index metrics should be collected and published. */ public abstract boolean getVerboseMetrics(); diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/SuggestLookupHandler.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/SuggestLookupHandler.java deleted file mode 100644 index c5e561fea..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/SuggestLookupHandler.java +++ /dev/null @@ -1,91 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver; - -import com.yelp.nrtsearch.server.grpc.OneSuggestLookupResponse; -import com.yelp.nrtsearch.server.grpc.SuggestLookupHighlight; -import com.yelp.nrtsearch.server.grpc.SuggestLookupRequest; -import com.yelp.nrtsearch.server.grpc.SuggestLookupResponse; -import java.io.IOException; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.lucene.search.suggest.Lookup; -import org.apache.lucene.search.suggest.analyzing.AnalyzingInfixSuggester; -import org.apache.lucene.util.BytesRef; - -public class SuggestLookupHandler implements Handler { - @Override - public SuggestLookupResponse handle( - IndexState indexState, SuggestLookupRequest suggestLookupRequest) throws HandlerException { - String suggestName = suggestLookupRequest.getSuggestName(); - final Lookup lookup = indexState.getSuggesters().get(suggestName); - if (lookup == null) { - throw new RuntimeException( - "suggestName: this suggester (\"" - + suggestName - + "\") was not yet built; valid suggestNames: " - + indexState.getSuggesters().keySet()); - } - final String text = suggestLookupRequest.getText(); - final int count = suggestLookupRequest.getCount() == 0 ? 5 : suggestLookupRequest.getCount(); - final boolean allTermsRequired = suggestLookupRequest.getAllTermsRequired(); - final boolean highlight = suggestLookupRequest.getHighlight(); - - final Set contexts; - if (!suggestLookupRequest.getContextsList().isEmpty()) { - contexts = new HashSet<>(); - for (String each : suggestLookupRequest.getContextsList()) { - contexts.add(new BytesRef(each)); - } - } else { - contexts = null; - } - - List results; - try { - // Make sure lookup object is not a subclass of AnalyzingInfixSuggester. - if (lookup instanceof AnalyzingInfixSuggester - && lookup.getClass() == AnalyzingInfixSuggester.class) { - results = - ((AnalyzingInfixSuggester) lookup) - .lookup(text, contexts, count, allTermsRequired, highlight); - } else { - results = lookup.lookup(text, contexts, false, count); - } - } catch (IOException e) { - throw new RuntimeException(e); - } - - SuggestLookupResponse.Builder suggestLookupResponseBuilder = SuggestLookupResponse.newBuilder(); - for (Lookup.LookupResult result : results) { - OneSuggestLookupResponse.Builder oneSuggestLookupResponseBuilder = - OneSuggestLookupResponse.newBuilder(); - if (result.highlightKey != null) { - oneSuggestLookupResponseBuilder.setSuggestLookupHighlight( - (SuggestLookupHighlight) result.highlightKey); - } else { - oneSuggestLookupResponseBuilder.setKey(result.key.toString()); - } - oneSuggestLookupResponseBuilder.setWeight(result.value); - if (result.payload != null) { - oneSuggestLookupResponseBuilder.setPayload(result.payload.utf8ToString()); - } - suggestLookupResponseBuilder.addResults(oneSuggestLookupResponseBuilder); - } - return suggestLookupResponseBuilder.build(); - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/UpdateSuggestHandler.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/UpdateSuggestHandler.java deleted file mode 100644 index d8413bc7f..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/UpdateSuggestHandler.java +++ /dev/null @@ -1,88 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver; - -import com.yelp.nrtsearch.server.grpc.BuildSuggestRequest; -import com.yelp.nrtsearch.server.grpc.BuildSuggestResponse; -import com.yelp.nrtsearch.server.grpc.SuggestLocalSource; -import java.io.File; -import java.io.IOException; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.search.suggest.Lookup; -import org.apache.lucene.search.suggest.analyzing.AnalyzingInfixSuggester; -import org.apache.lucene.util.BytesRef; - -/* Updates existing suggestions, if the suggester supports near-real-time changes. */ -public class UpdateSuggestHandler implements Handler { - @Override - public BuildSuggestResponse handle(IndexState indexState, BuildSuggestRequest buildSuggestRequest) - throws HandlerException { - final String suggestName = buildSuggestRequest.getSuggestName(); - Lookup lookup = indexState.getSuggesters().get(suggestName); - if (lookup == null) { - throw new RuntimeException( - "suggestName: this suggester (\"" - + suggestName - + "\") was not yet built; valid suggestNames: " - + indexState.getSuggesters().keySet()); - } - if ((lookup instanceof AnalyzingInfixSuggester) == false) { - throw new UnsupportedOperationException( - "suggestName: can only update AnalyzingInfixSuggester; got " + lookup); - } - - if (buildSuggestRequest.hasNonLocalSource()) { - throw new UnsupportedOperationException( - "Does not yet support pulling from index/expressions, like BuildSuggest"); - } - if (!buildSuggestRequest.hasLocalSource()) { - throw new UnsupportedOperationException("Only supports pulling suggestions from local file"); - } - - final AnalyzingInfixSuggester lookup2 = (AnalyzingInfixSuggester) lookup; - SuggestLocalSource localSource = buildSuggestRequest.getLocalSource(); - final File localFile = new File(localSource.getLocalFile()); - final boolean hasContexts = localSource.getHasContexts(); - - try { - return updateSuggestions(localFile, hasContexts, lookup2); - } catch (IOException e) { - throw new RuntimeException(e); - } - } - - private BuildSuggestResponse updateSuggestions( - File localFile, boolean hasContexts, AnalyzingInfixSuggester lookup) throws IOException { - InputIterator iterator = new FromFileTermFreqIterator(localFile, hasContexts); - boolean hasPayloads = iterator.hasPayloads(); - int count = 0; - while (true) { - BytesRef term = iterator.next(); - if (term == null) { - break; - } - lookup.update( - term, - iterator.hasContexts() ? iterator.contexts() : null, - iterator.weight(), - hasPayloads ? iterator.payload() : null); - count++; - } - lookup.refresh(); - - return BuildSuggestResponse.newBuilder().setCount(count).build(); - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/analysis/AnalyzerCreator.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/analysis/AnalyzerCreator.java index aae7a6713..59d4146ec 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/analysis/AnalyzerCreator.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/analysis/AnalyzerCreator.java @@ -243,7 +243,6 @@ private CustomAnalyzer initializeComponents(CustomAnalyzer customAnalyzer) { return customAnalyzer; } - // TODO: replace usages of this method in suggest with getAnalyzer public static Analyzer getStandardAnalyzer() { return new StandardAnalyzer(); } diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexState.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexState.java index e6fd31a72..ba834e16f 100644 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexState.java +++ b/src/main/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexState.java @@ -67,7 +67,6 @@ import org.apache.lucene.search.Sort; import org.apache.lucene.search.SortField; import org.apache.lucene.search.SortField.Type; -import org.apache.lucene.search.suggest.Lookup; import org.apache.lucene.store.Directory; import org.apache.lucene.util.PrintStreamInfoStream; import org.slf4j.Logger; @@ -716,16 +715,6 @@ public long getMaxMergePreCopyDurationSec() { return maxMergePreCopyDurationSec; } - @Override - public void addSuggest(String name, JsonObject o) { - throw new UnsupportedOperationException(); - } - - @Override - public Map getSuggesters() { - throw new UnsupportedOperationException(); - } - @Override public boolean getVerboseMetrics() { return verboseMetrics; diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/CompletionInfixSuggester.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/CompletionInfixSuggester.java deleted file mode 100644 index 67dce5742..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/CompletionInfixSuggester.java +++ /dev/null @@ -1,323 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver.suggest; - -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.SuggestInputIterator; -import java.io.IOException; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.codecs.Codec; -import org.apache.lucene.codecs.PostingsFormat; -import org.apache.lucene.codecs.lucene99.Lucene99Codec; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.StoredField; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexWriter; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.IndexableField; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.IndexSearcher; -import org.apache.lucene.search.ScoreDoc; -import org.apache.lucene.search.SearcherManager; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.search.suggest.analyzing.AnalyzingInfixSuggester; -import org.apache.lucene.search.suggest.document.Completion99PostingsFormat; -import org.apache.lucene.search.suggest.document.CompletionQuery; -import org.apache.lucene.search.suggest.document.ContextQuery; -import org.apache.lucene.search.suggest.document.ContextSuggestField; -import org.apache.lucene.search.suggest.document.PrefixCompletionQuery; -import org.apache.lucene.search.suggest.document.SuggestIndexSearcher; -import org.apache.lucene.search.suggest.document.TopSuggestDocs; -import org.apache.lucene.store.Directory; -import org.apache.lucene.util.BytesRef; - -/** - * Analyzes the input text and suggests matched suggest items based on the prefix matches to any - * pre-analyzed suffix-token gram in the indexed text. - * - *

This suggester relies on a customized InputIterator FromFileSuggestItemIterator to build - * suggestion index. Each suggest text is pre-analyzed as a list of suffix-token grams. - * - *

This suggester requires payload defined for each suggest item. The payload persist necessary - * information for the downstream services. - * - *

This suggester supports multiple contexts. The suggested results are returned only when any of - * its contexts matches any context in the lookup query. Context match is not considered if there is - * no context specified in the lookup query. - * - *

The same as AnalyzingInfixSuggester, results are sorted by descending weight values. - * - *

Example usage of this suggester: 1. Use FromFileSuggestItemIterator iterator to read the raw - * file of suggest items 2. call build method with FromFileSuggestItemIterator iterator to build - * indexes 3. call lookup method to look up the matched items based on the input text and optional - * contexts. - */ -public class CompletionInfixSuggester extends AnalyzingInfixSuggester { - - private static final String EXACT_TEXT_FIELD_NAME = "text"; - protected static final String SEARCH_TEXT_FIELD_NAME = "search_text"; - private static final String PAYLOAD_FIELD_NAME = "payload"; - private static final boolean DEFAULT_COMMIT_ON_BUILD = false; - private static final boolean DEFAULT_SKIP_DUPLICATION = true; - - private final Directory dir; - - public CompletionInfixSuggester(Directory dir, Analyzer indexAnalyzer, Analyzer queryAnalyzer) - throws IOException { - super(dir, indexAnalyzer, queryAnalyzer, DEFAULT_MIN_PREFIX_CHARS, DEFAULT_COMMIT_ON_BUILD); - this.dir = dir; - } - - @Override - public List lookup( - CharSequence key, Set contexts, boolean onlyMorePopular, int num) - throws IOException, RuntimeException { - if (searcherMgr == null) { - throw new RuntimeException("No valid searcher manager available!"); - } - - IndexSearcher searcher; - SearcherManager mgr; - List results; - - synchronized (searcherMgrLock) { - mgr = searcherMgr; // acquire & release on same SearcherManager, via local reference - searcher = searcherMgr.acquire(); - } - - try { - SuggestIndexSearcher suggestIndexSearcher = - new SuggestIndexSearcher(searcher.getIndexReader()); - ContextQuery finalQuery = createContextQuery(key, contexts); - TopSuggestDocs topDocs = - suggestIndexSearcher.suggest(finalQuery, num, DEFAULT_SKIP_DUPLICATION); - results = createResults(suggestIndexSearcher, topDocs, contexts); - } finally { - mgr.release(searcher); - } - - return results; - } - - protected List createResults( - SuggestIndexSearcher suggestIndexSearcher, TopSuggestDocs topDocs, Set contexts) - throws IOException { - if (topDocs.scoreDocs == null || topDocs.scoreDocs.length == 0) { - return List.of(); - } - - List results = new ArrayList<>(); - Set visitedDocIds = new HashSet<>(); - for (ScoreDoc scoreDoc : topDocs.scoreDocs) { - if (visitedDocIds.contains(scoreDoc.doc)) { - continue; - } - visitedDocIds.add(scoreDoc.doc); - - Document curDoc = suggestIndexSearcher.doc(scoreDoc.doc); - IndexableField textField = curDoc.getField(EXACT_TEXT_FIELD_NAME); - assert textField != null : EXACT_TEXT_FIELD_NAME + " field can not be null"; - IndexableField payloadField = curDoc.getField(PAYLOAD_FIELD_NAME); - assert payloadField != null : PAYLOAD_FIELD_NAME + " field can not be null"; - - results.add( - new LookupResult( - textField.stringValue(), - (long) scoreDoc.score, - payloadField.binaryValue(), - contexts)); - } - - return results; - } - - private ContextQuery createContextQuery(CharSequence key, Set contexts) { - CompletionQuery completionQuery = createCompletionQuery(key); - ContextQuery contextQuery = new ContextQuery(completionQuery); - - if (contexts != null) { - for (BytesRef context : contexts) { - contextQuery.addContext(context.utf8ToString()); - } - } - - return contextQuery; - } - - protected CompletionQuery createCompletionQuery(CharSequence key) { - return new PrefixCompletionQuery( - queryAnalyzer, new Term(SEARCH_TEXT_FIELD_NAME, new BytesRef(key))); - } - - @Override - public void build(InputIterator iterator) throws IOException { - if (!(iterator instanceof SuggestInputIterator)) { - throw new IllegalArgumentException( - "this suggester only works with iterator that implementing SuggestInputIterator"); - } - - SuggestInputIterator iter = (SuggestInputIterator) iterator; - if (!iter.hasPayloads()) { - throw new IllegalArgumentException("this suggester requires to have payload in index"); - } - if (!iter.hasContexts()) { - throw new IllegalArgumentException("this suggester requires to have context in index"); - } - if (!iter.hasSearchTexts()) { - throw new IllegalArgumentException("this suggester requires to have search texts in index"); - } - - synchronized (searcherMgrLock) { - if (searcherMgr != null) { - searcherMgr.close(); - searcherMgr = null; - } - - if (writer != null) { - writer.close(); - writer = null; - } - - boolean success = false; - try { - writer = - new IndexWriter( - dir, getIndexWriterConfig(indexAnalyzer, IndexWriterConfig.OpenMode.CREATE)); - - BytesRef text; - while ((text = iterator.next()) != null) { - add(text, iter.searchTexts(), iter.contexts(), iter.weight(), iter.payload()); - } - - searcherMgr = new SearcherManager(writer, null); - success = true; - } finally { - if (success) { - writer.close(); - writer = null; - } else { - if (writer != null) { - writer.rollback(); - writer = null; - } - } - } - } - } - - public void update( - BytesRef text, - Set searchTexts, - Set contexts, - long weight, - BytesRef payload) - throws IOException { - ensureOpen(); - writer.updateDocument( - new Term(EXACT_TEXT_FIELD_NAME, text.utf8ToString()), - buildDocument(text, searchTexts, contexts, weight, payload)); - } - - public void add( - BytesRef text, - Set searchText, - Set contexts, - long weight, - BytesRef payload) - throws IOException { - ensureOpen(); - writer.addDocument(buildDocument(text, searchText, contexts, weight, payload)); - } - - protected IndexWriterConfig getIndexWriterConfig( - Analyzer indexAnalyzer, IndexWriterConfig.OpenMode mode) { - IndexWriterConfig iwc = super.getIndexWriterConfig(indexAnalyzer, mode); - Codec filterCodec = - new Lucene99Codec() { - final PostingsFormat fstPostingsFormat = new Completion99PostingsFormat(); - - @Override - public PostingsFormat getPostingsFormatForField(String field) { - if (SEARCH_TEXT_FIELD_NAME.equals(field)) { - return fstPostingsFormat; - } - return super.getPostingsFormatForField(field); - } - }; - iwc.setCodec(filterCodec); - return iwc; - } - - private Document buildDocument( - BytesRef text, - Set searchTexts, - Set contexts, - long weight, - BytesRef payload) { - Document doc = new Document(); - - doc.add(new StoredField(PAYLOAD_FIELD_NAME, payload)); - doc.add(new StoredField(EXACT_TEXT_FIELD_NAME, text.utf8ToString())); - - int weightInt = (int) weight; - CharSequence[] contextSequence = convertSetToCharSeq(contexts); - for (BytesRef searchText : searchTexts) { - doc.add( - new ContextSuggestField( - SEARCH_TEXT_FIELD_NAME, searchText.utf8ToString(), weightInt, contextSequence)); - } - return doc; - } - - private CharSequence[] convertSetToCharSeq(Set bytesRefSet) { - if (bytesRefSet == null || bytesRefSet.size() == 0) { - return new CharSequence[0]; - } - - CharSequence[] charSeq = new CharSequence[bytesRefSet.size()]; - int index = 0; - for (BytesRef text : bytesRefSet) { - charSeq[index++] = text.utf8ToString(); - } - return charSeq; - } - - /** Copy from AnalyzingInfixSuggester Todo: add license acknowledge? */ - protected synchronized void ensureOpen() throws IOException { - if (writer == null) { - if (DirectoryReader.indexExists(dir)) { - // Already built; open it: - writer = - new IndexWriter( - dir, getIndexWriterConfig(indexAnalyzer, IndexWriterConfig.OpenMode.APPEND)); - } else { - writer = - new IndexWriter( - dir, getIndexWriterConfig(indexAnalyzer, IndexWriterConfig.OpenMode.CREATE)); - } - synchronized (searcherMgrLock) { - SearcherManager oldSearcherMgr = searcherMgr; - searcherMgr = new SearcherManager(writer, null); - if (oldSearcherMgr != null) { - oldSearcherMgr.close(); - } - } - } - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/FuzzyInfixSuggester.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/FuzzyInfixSuggester.java deleted file mode 100644 index b77fb01fa..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/FuzzyInfixSuggester.java +++ /dev/null @@ -1,100 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver.suggest; - -import java.io.IOException; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.index.Term; -import org.apache.lucene.search.suggest.BitsProducer; -import org.apache.lucene.search.suggest.document.CompletionQuery; -import org.apache.lucene.search.suggest.document.FuzzyCompletionQuery; -import org.apache.lucene.store.Directory; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.automaton.LevenshteinAutomata; -import org.apache.lucene.util.automaton.Operations; - -/** - * Suggests fuzzy-matched suggest items. - * - *

The similarity is measured by default Damerau-Levenshtein algorithm or classic Levenshtein - * algorithm with false value in transpositions. - * - *

The maximum edit distance is controlled by maxEdit variable. It is recommended to set maxEdit - * as 1 for faster lookup. - */ -public class FuzzyInfixSuggester extends CompletionInfixSuggester { - - private static final BitsProducer DEFAULT_BITS_PRODUCER = null; - private int minFuzzyLength; - private int nonFuzzyPrefix; - private int maxEdits; - private boolean transpositions; - private boolean unicodeAware; - - public FuzzyInfixSuggester( - Directory dir, - Analyzer indexAnalyzer, - Analyzer queryAnalyzer, - int maxEdits, - boolean transpositions, - int nonFuzzyPrefix, - int minFuzzyLength, - boolean unicodeAware) - throws IOException { - super(dir, indexAnalyzer, queryAnalyzer); - if (maxEdits < 0 || maxEdits > LevenshteinAutomata.MAXIMUM_SUPPORTED_DISTANCE) { - throw new IllegalArgumentException( - "maxEdits must be between 0 and " + LevenshteinAutomata.MAXIMUM_SUPPORTED_DISTANCE); - } - if (nonFuzzyPrefix < 0) { - throw new IllegalArgumentException( - "nonFuzzyPrefix must not be >= 0 (got " + nonFuzzyPrefix + ")"); - } - if (minFuzzyLength < 0) { - throw new IllegalArgumentException( - "minFuzzyLength must not be >= 0 (got " + minFuzzyLength + ")"); - } - - this.maxEdits = maxEdits; - this.transpositions = transpositions; - this.nonFuzzyPrefix = nonFuzzyPrefix; - this.minFuzzyLength = minFuzzyLength; - this.unicodeAware = unicodeAware; - } - - public FuzzyInfixSuggester(Directory dir, Analyzer analyzer) throws IOException { - super(dir, analyzer, analyzer); - this.maxEdits = FuzzyCompletionQuery.DEFAULT_MAX_EDITS; - this.transpositions = FuzzyCompletionQuery.DEFAULT_TRANSPOSITIONS; - this.nonFuzzyPrefix = FuzzyCompletionQuery.DEFAULT_NON_FUZZY_PREFIX; - this.minFuzzyLength = FuzzyCompletionQuery.DEFAULT_MIN_FUZZY_LENGTH; - this.unicodeAware = FuzzyCompletionQuery.DEFAULT_UNICODE_AWARE; - } - - @Override - protected CompletionQuery createCompletionQuery(CharSequence key) { - return new FuzzyCompletionQuery( - queryAnalyzer, - new Term(SEARCH_TEXT_FIELD_NAME, new BytesRef(key)), - DEFAULT_BITS_PRODUCER, - maxEdits, - transpositions, - nonFuzzyPrefix, - minFuzzyLength, - unicodeAware, - Operations.DEFAULT_DETERMINIZE_WORK_LIMIT); - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/FromProtobufFileSuggestItemIterator.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/FromProtobufFileSuggestItemIterator.java deleted file mode 100644 index e17018407..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/FromProtobufFileSuggestItemIterator.java +++ /dev/null @@ -1,135 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver.suggest.iterator; - -import com.yelp.nrtsearch.server.grpc.NrtsearchIndex; -import java.io.Closeable; -import java.io.File; -import java.io.FileInputStream; -import java.io.IOException; -import java.util.HashSet; -import java.util.Set; -import org.apache.lucene.util.BytesRef; - -/** - * An {@link org.apache.lucene.search.suggest.InputIterator} that reads the binary file and parse - * the suggest index information based on the `NrtsearchIndex` proto - */ -public class FromProtobufFileSuggestItemIterator implements SuggestInputIterator, Closeable { - - /** How many suggestions were found. */ - public int suggestCount; - - private final FileInputStream sourceStream; - private final boolean hasContexts; - private final boolean hasPayload; - private final boolean hasSearchTexts; - - private final Set searchTexts = new HashSet<>(); - private final Set contexts = new HashSet<>(); - private BytesRef text; - private long weight; - private BytesRef payload; - - public FromProtobufFileSuggestItemIterator( - File sourceFile, boolean hasContexts, boolean hasPayload, boolean hasSearchTexts) - throws IOException { - this.sourceStream = new FileInputStream(sourceFile); - this.hasPayload = hasPayload; - this.hasContexts = hasContexts; - this.hasSearchTexts = hasSearchTexts; - this.suggestCount = 0; - } - - @Override - public void close() throws IOException { - sourceStream.close(); - } - - @Override - public long weight() { - return weight; - } - - @Override - public BytesRef payload() { - if (hasPayload) { - return payload; - } - return null; - } - - @Override - public boolean hasPayloads() { - return hasPayload; - } - - @Override - public Set contexts() { - if (hasContexts) { - return contexts; - } - return null; - } - - @Override - public boolean hasContexts() { - return this.hasContexts; - } - - @Override - public boolean hasSearchTexts() { - return hasSearchTexts; - } - - public Set searchTexts() { - return searchTexts; - } - - @Override - public BytesRef next() throws IOException { - NrtsearchIndex suggestIndexInfo = NrtsearchIndex.parseDelimitedFrom(sourceStream); - if (suggestIndexInfo == null) { - return null; - } - - parseProtobufIndex(suggestIndexInfo); - suggestCount++; - return text; - } - - /** Parse each protobuf object based on NrtsearchIndex proto schema */ - private boolean parseProtobufIndex(NrtsearchIndex suggestIndexInfo) { - text = new BytesRef(String.valueOf(suggestIndexInfo.getUniqueId())); - searchTexts.clear(); - if (suggestIndexInfo.getSearchTextsCount() > 0) { - for (String searchTextString : suggestIndexInfo.getSearchTextsList()) { - searchTexts.add(new BytesRef(searchTextString)); - } - } - weight = suggestIndexInfo.getScore(); - if (hasPayload) { - payload = new BytesRef(suggestIndexInfo.getPayload().toByteArray()); - } - contexts.clear(); - if (hasContexts && suggestIndexInfo.getContextsCount() > 0) { - for (String contextString : suggestIndexInfo.getContextsList()) { - contexts.add(new BytesRef(contextString)); - } - } - return true; - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestDocumentDictionary.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestDocumentDictionary.java deleted file mode 100644 index 5b7f9bb60..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestDocumentDictionary.java +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver.suggest.iterator; - -import java.io.IOException; -import java.util.Collections; -import java.util.HashSet; -import java.util.Set; -import org.apache.lucene.document.Document; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexableField; -import org.apache.lucene.index.MultiBits; -import org.apache.lucene.index.MultiDocValues; -import org.apache.lucene.index.NumericDocValues; -import org.apache.lucene.search.suggest.DocumentDictionary; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.util.Bits; -import org.apache.lucene.util.BytesRef; - -public class SuggestDocumentDictionary extends DocumentDictionary { - - /** Field to read suggest texts from */ - private final String searchTextsField; - - private final String field; - private final String weightField; - - /** Extend the functionality of DocumentDictionary with extra support to field `Search Text`. */ - public SuggestDocumentDictionary( - IndexReader reader, - String field, - String weightField, - String payloadField, - String contextsField, - String searchTextsField) - throws IOException { - super(reader, field, weightField, payloadField, contextsField); - this.searchTextsField = searchTextsField; - this.field = field; - this.weightField = weightField; - } - - @Override - public InputIterator getEntryIterator() throws IOException { - return new SuggestDocumentInputIterator( - payloadField != null, contextsField != null, searchTextsField != null); - } - - /** Implements SuggestInputIterator interface from stored fields. */ - protected class SuggestDocumentInputIterator implements SuggestInputIterator { - - private final boolean hasPayloads; - private final boolean hasContexts; - private final boolean hasSearchTexts; - - private final int docCount; - private final Set relevantFields; - - private final Bits liveDocs; - private int currentDocId = -1; - private long currentWeight = 0; - private BytesRef currentPayload = null; - private Set currentContexts; - private Set currentSearchTexts; - private final NumericDocValues weightValues; - IndexableField[] currentDocFields = new IndexableField[0]; - int nextFieldsPosition = 0; - - /** - * Creates an iterator over term, weight, payload, context, and search text fields from the - * lucene index. - */ - public SuggestDocumentInputIterator( - boolean hasPayloads, boolean hasContexts, boolean hasSearchTexts) throws IOException { - this.hasPayloads = hasPayloads; - this.hasContexts = hasContexts; - this.hasSearchTexts = hasSearchTexts; - - docCount = reader.maxDoc() - 1; - weightValues = - (weightField != null) ? MultiDocValues.getNumericValues(reader, weightField) : null; - liveDocs = (reader.leaves().size() > 0) ? MultiBits.getLiveDocs(reader) : null; - relevantFields = - getRelevantFields(field, weightField, payloadField, contextsField, searchTextsField); - } - - @Override - public long weight() { - return currentWeight; - } - - @Override - public BytesRef next() throws IOException { - BytesRef tempPayload; - Set tempContexts; - Set tempSearchTexts; - - while (true) { - if (nextFieldsPosition < currentDocFields.length) { - // Still values left from the document - IndexableField fieldValue = currentDocFields[nextFieldsPosition++]; - if (fieldValue.binaryValue() != null) { - return fieldValue.binaryValue(); - } else if (fieldValue.stringValue() != null) { - return new BytesRef(fieldValue.stringValue()); - } else { - continue; - } - } - - if (currentDocId == docCount) { - // Iterated over all the documents. - break; - } - - currentDocId++; - if (liveDocs != null && !liveDocs.get(currentDocId)) { - continue; - } - - Document doc = reader.document(currentDocId, relevantFields); - - tempPayload = null; - if (hasPayloads) { - IndexableField payload = doc.getField(payloadField); - if (payload != null) { - if (payload.binaryValue() != null) { - tempPayload = payload.binaryValue(); - } else if (payload.stringValue() != null) { - tempPayload = new BytesRef(payload.stringValue()); - } - } - // in case that the iterator has payloads configured, use empty values - // instead of null for payload - if (tempPayload == null) { - tempPayload = new BytesRef(); - } - } - - tempContexts = getBytesRefSet(doc, hasContexts, contextsField); - tempSearchTexts = getBytesRefSet(doc, hasSearchTexts, searchTextsField); - - currentDocFields = doc.getFields(field); - nextFieldsPosition = 0; - if (currentDocFields.length == 0) { // no values in this document - continue; - } - IndexableField fieldValue = currentDocFields[nextFieldsPosition++]; - BytesRef tempTerm; - if (fieldValue.binaryValue() != null) { - tempTerm = fieldValue.binaryValue(); - } else if (fieldValue.stringValue() != null) { - tempTerm = new BytesRef(fieldValue.stringValue()); - } else { - continue; - } - - currentPayload = tempPayload; - currentContexts = tempContexts; - currentSearchTexts = tempSearchTexts; - currentWeight = getWeight(doc, currentDocId); - - return tempTerm; - } - - return null; - } - - @Override - public BytesRef payload() { - return currentPayload; - } - - @Override - public boolean hasPayloads() { - return hasPayloads; - } - - @Override - public Set contexts() { - if (hasContexts) { - return currentContexts; - } - return null; - } - - @Override - public boolean hasContexts() { - return hasContexts; - } - - @Override - public boolean hasSearchTexts() { - return hasSearchTexts; - } - - @Override - public Set searchTexts() { - if (hasSearchTexts) { - return currentSearchTexts; - } - return null; - } - - /** - * Returns the value of the weightField for the current document. Retrieves the - * value for the weightField if it's stored (using doc) or if it's - * indexed as {@link NumericDocValues} (using docId) for the document. If no value - * is found, then the weight is 0. - * - *

Note that this function is identical to getWeight in DocumentInputIterator - */ - protected long getWeight(Document doc, int docId) throws IOException { - IndexableField weight = doc.getField(weightField); - if (weight != null) { // found weight as stored - return (weight.numericValue() != null) ? weight.numericValue().longValue() : 0; - } else if (weightValues != null) { // found weight as NumericDocValue - if (weightValues.docID() < docId) { - weightValues.advance(docId); - } - if (weightValues.docID() == docId) { - return weightValues.longValue(); - } else { - // missing - return 0; - } - } else { // fall back - return 0; - } - } - - private Set getBytesRefSet(Document doc, boolean isAvailable, String fieldName) { - Set tempSet; - if (isAvailable) { - tempSet = new HashSet<>(); - final IndexableField[] fields = doc.getFields(fieldName); - for (IndexableField field : fields) { - if (field.binaryValue() != null) { - tempSet.add(field.binaryValue()); - } else if (field.stringValue() != null) { - tempSet.add(new BytesRef(field.stringValue())); - } else { - continue; - } - } - } else { - tempSet = Collections.emptySet(); - } - - return tempSet; - } - - private Set getRelevantFields(String... fields) { - Set relevantFields = new HashSet<>(); - for (String relevantField : fields) { - if (relevantField != null) { - relevantFields.add(relevantField); - } - } - return relevantFields; - } - } -} diff --git a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestInputIterator.java b/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestInputIterator.java deleted file mode 100644 index 18c04a5fb..000000000 --- a/src/main/java/com/yelp/nrtsearch/server/luceneserver/suggest/iterator/SuggestInputIterator.java +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.luceneserver.suggest.iterator; - -import java.util.Set; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.util.BytesRef; - -/** - * Interface is the child of InputIterator interface with extra support for search texts. currently - * only CompletionInfixSuggest adopts the iterator implementing this interface. - */ -public interface SuggestInputIterator extends InputIterator { - boolean hasSearchTexts(); - - /** - * A term's search texts are used to perform infix suggest for both exact matching and fuzzy - * match. This field is critical in CompletionInfixSuggest, so that it can not be empty. - */ - Set searchTexts(); -} diff --git a/src/test/java/com/yelp/nrtsearch/server/TestIndexManager.java b/src/test/java/com/yelp/nrtsearch/server/TestIndexManager.java deleted file mode 100644 index 0ae0dec4d..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/TestIndexManager.java +++ /dev/null @@ -1,170 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server; - -import com.google.protobuf.InvalidProtocolBufferException; -import com.google.protobuf.util.JsonFormat; -import com.yelp.nrtsearch.server.grpc.AddDocumentRequest; -import com.yelp.nrtsearch.server.grpc.CommitRequest; -import com.yelp.nrtsearch.server.grpc.CreateIndexRequest; -import com.yelp.nrtsearch.server.grpc.CreateIndexResponse; -import com.yelp.nrtsearch.server.grpc.FieldDefRequest; -import com.yelp.nrtsearch.server.grpc.FieldDefResponse; -import com.yelp.nrtsearch.server.grpc.LiveSettingsRequest; -import com.yelp.nrtsearch.server.grpc.LiveSettingsResponse; -import com.yelp.nrtsearch.server.grpc.LuceneServerClient; -import com.yelp.nrtsearch.server.grpc.Mode; -import com.yelp.nrtsearch.server.grpc.StartIndexRequest; -import com.yelp.nrtsearch.server.grpc.StartIndexResponse; -import com.yelp.nrtsearch.server.utils.OneDocBuilder; -import com.yelp.nrtsearch.server.utils.ParallelDocumentIndexer; -import io.grpc.StatusRuntimeException; -import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.List; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Future; -import java.util.stream.Stream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -public class TestIndexManager { - protected static final Logger logger = LoggerFactory.getLogger(YelpReviewsTest.class.getName()); - - protected static void liveSettings(LuceneServerClient serverClient, String indexName) { - LiveSettingsRequest liveSettingsRequest = - LiveSettingsRequest.newBuilder() - .setIndexName(indexName) - .setIndexRamBufferSizeMB(256.0) - .setMaxRefreshSec(1.0) - .build(); - LiveSettingsResponse liveSettingsResponse = - serverClient.getBlockingStub().liveSettings(liveSettingsRequest); - logger.info(liveSettingsResponse.getResponse()); - } - - protected static String readResourceAsString(String path) throws IOException { - return Files.readString(Paths.get(path)); - } - - protected static void setUpIndex( - LuceneServerClient standaloneServerClient, - String indexName, - String suggestionsFilePath, - OneDocBuilder oneDocBuilder) - throws IOException, ExecutionException, InterruptedException { - // create index if it does not exist - try { - createIndex(standaloneServerClient, indexName); - } catch (StatusRuntimeException e) { - if (!e.getStatus().getCode().name().equals("ALREADY_EXISTS")) throw e; - } - // add live settings - liveSettings(standaloneServerClient, indexName); - - // register fields - registerFields( - standaloneServerClient, - Paths.get("src", "test", "resources", "registerFieldsYelpSuggestTestPayload.json") - .toAbsolutePath() - .toString()); - - // start index - StartIndexRequest startIndexRequest = - StartIndexRequest.newBuilder() - .setIndexName(indexName) - .setMode(Mode.STANDALONE) - .setPrimaryGen(0) - .build(); - startIndex(standaloneServerClient, startIndexRequest); - // index docs - long t1 = System.nanoTime(); - Stream.Builder builder = Stream.builder(); - - final ExecutorService indexService = - YelpReviewsTest.createExecutorService( - (Runtime.getRuntime().availableProcessors()) / 4, "LuceneIndexing"); - - Path suggestionsPath = Paths.get(suggestionsFilePath); - - List> results = - ParallelDocumentIndexer.buildAndIndexDocs( - oneDocBuilder, suggestionsPath, indexService, standaloneServerClient); - - // wait till all indexing done - for (Future each : results) { - try { - Long genId = each.get(); - logger.info("ParallelDocumentIndexer.buildAndIndexDocs returned genId: {}", genId); - } catch (ExecutionException | InterruptedException futureException) { - System.out.println(futureException.getCause()); - } - } - long t2 = System.nanoTime(); - - System.out.println(String.format("IT took %s nanosecs to index documents", (t2 - t1))); - - // commit - standaloneServerClient - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName(indexName).build()); - } - - protected static void registerFields(LuceneServerClient serverClient, String path) - throws IOException { - String registerFieldsJson = readResourceAsString(path); - FieldDefRequest fieldDefRequest = getFieldDefRequest(registerFieldsJson); - FieldDefResponse fieldDefResponse = - serverClient.getBlockingStub().registerFields(fieldDefRequest); - logger.info(fieldDefResponse.getResponse()); - } - - private static FieldDefRequest getFieldDefRequest(String jsonStr) { - logger.debug("Converting fields {} to proto FieldDefRequest", jsonStr); - FieldDefRequest.Builder fieldDefRequestBuilder = FieldDefRequest.newBuilder(); - try { - JsonFormat.parser().merge(jsonStr, fieldDefRequestBuilder); - } catch (InvalidProtocolBufferException e) { - throw new RuntimeException(e); - } - FieldDefRequest fieldDefRequest = fieldDefRequestBuilder.build(); - logger.debug("jsonStr converted to proto FieldDefRequest {}", fieldDefRequest); - return fieldDefRequest; - } - - protected static void createIndex(LuceneServerClient serverClient, String indexName) { - CreateIndexResponse response = - serverClient - .getBlockingStub() - .createIndex(CreateIndexRequest.newBuilder().setIndexName(indexName).build()); - logger.info(response.getResponse()); - } - - protected static void startIndex( - LuceneServerClient serverClient, StartIndexRequest startIndexRequest) { - StartIndexResponse startIndexResponse = - serverClient.getBlockingStub().startIndex(startIndexRequest); - logger.info( - "numDocs: {}, maxDoc: {}, segments: {}, startTimeMS: {}", - startIndexResponse.getNumDocs(), - startIndexResponse.getMaxDoc(), - startIndexResponse.getSegments(), - startIndexResponse.getStartTimeMS()); - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/YelpSuggestTest.java b/src/test/java/com/yelp/nrtsearch/server/YelpSuggestTest.java deleted file mode 100644 index 7e7a910e3..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/YelpSuggestTest.java +++ /dev/null @@ -1,249 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server; - -import com.google.gson.Gson; -import com.yelp.nrtsearch.server.grpc.AddDocumentRequest; -import com.yelp.nrtsearch.server.grpc.BuildSuggestRequest; -import com.yelp.nrtsearch.server.grpc.BuildSuggestResponse; -import com.yelp.nrtsearch.server.grpc.InfixSuggester; -import com.yelp.nrtsearch.server.grpc.LuceneServerClient; -import com.yelp.nrtsearch.server.grpc.OneSuggestLookupResponse; -import com.yelp.nrtsearch.server.grpc.SuggestLookupRequest; -import com.yelp.nrtsearch.server.grpc.SuggestLookupResponse; -import com.yelp.nrtsearch.server.grpc.SuggestNonLocalSource; -import com.yelp.nrtsearch.server.utils.OneDocBuilder; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import org.junit.Test; -import org.locationtech.spatial4j.io.GeohashUtils; - -public class YelpSuggestTest extends TestIndexManager { - private static final String SUGGESTIONS_FILE_PATH = - Paths.get("src", "test", "resources", "yelp_5_business_suggestions.json") - .toAbsolutePath() - .toString(); - - public static final String INDEX_NAME = "yelp_suggest_test_3"; - - private static BuildSuggestResponse buildSuggester(LuceneServerClient standaloneServerClient) { - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest_0"); - buildSuggestRequestBuilder.setIndexName(INDEX_NAME); - buildSuggestRequestBuilder.setInfixSuggester( - InfixSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setSuggestField("localized_completed_text") - .setWeightField("score") - .setContextField("geo_context") - .setPayloadField("payload") - .build()); - - return standaloneServerClient - .getBlockingStub() - .buildSuggest(buildSuggestRequestBuilder.build()); - } - - // Run with args host && port && remote tmp dir in order - public static void main(String[] args) throws Exception { - // The dir where the indices will live in the remote server - Path yelp_suggest_test_base_path = Paths.get(System.getProperty("suggestTmp")); - // The client who will be talking to the remote server - LuceneServerClient standaloneServerClient = - new LuceneServerClient( - System.getProperty("suggestHost"), Integer.parseInt(System.getProperty("suggestPort"))); - - setUpIndex( - standaloneServerClient, - INDEX_NAME, - SUGGESTIONS_FILE_PATH, - new YelpSuggestTest.OneDocBuilderImpl()); - - // build Suggester - buildSuggester(standaloneServerClient); - - // look up suggestions - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setIndexName(INDEX_NAME); - suggestLookupBuilder.setText("a"); - suggestLookupBuilder.setSuggestName("suggest_0"); - suggestLookupBuilder.setHighlight(true); - - // Set SF lat lon lookup - List sanFranGeohashes = getGeoHashes(37.785371, -122.459446, 5, 7); - - for (String geohash : sanFranGeohashes) { - suggestLookupBuilder.addContexts(geohash); - } - - SuggestLookupResponse suggestResponse = - standaloneServerClient.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List suggestResponseResultsList = suggestResponse.getResultsList(); - - System.out.println(suggestResponseResultsList); - - System.exit(0); - } - - private static List getGeoHashes( - double latitude, double longitude, int minPrecision, int maxPrecision) { - List geohashes = new ArrayList<>(); - for (int i = minPrecision; i <= maxPrecision; i++) { - geohashes.add(GeohashUtils.encodeLatLon(latitude, longitude, i)); - } - return geohashes; - } - - private static class OneDocBuilderImpl implements OneDocBuilder { - - @Override - public AddDocumentRequest buildOneDoc(String line, Gson gson) { - AddDocumentRequest.Builder addDocumentRequestBuilder = AddDocumentRequest.newBuilder(); - addDocumentRequestBuilder.setIndexName(INDEX_NAME); - BusinessSuggestionRecord one_biz = gson.fromJson(line, BusinessSuggestionRecord.class); - try { - - addField("score", one_biz.getScore().toString(), addDocumentRequestBuilder); - addField("payload", one_biz.toString(), addDocumentRequestBuilder); - addField( - "geo_context", - getGeoHashes(one_biz.getLocationLat(), one_biz.getLocationLon(), 5, 7), - addDocumentRequestBuilder); - addField( - "localized_completed_text", - one_biz.getLocalizedCompletedText(), - addDocumentRequestBuilder); - } catch (Exception hey) { - System.out.println(hey.getLocalizedMessage()); - } - AddDocumentRequest addDocumentRequest = addDocumentRequestBuilder.build(); - return addDocumentRequest; - } - } - - private static class BusinessSuggestionRecord { - - private Long unique_id; - private Long score; - private Long id; - private String localized_completed_text; - private Map location; - private String country; - private Integer review_count; - private Double review_wilson_score; - private List category_aliases; - private Double checkin_rate_per_day; - private Long standardized_score; - private List> language_alternate_names; - - public Long getUniqueId() { - return unique_id; - } - - public Long getScore() { - return score; - } - - public Long getId() { - return id; - } - - public String getLocalizedCompletedText() { - return localized_completed_text; - } - - public Map getLocation() { - return location; - } - - public Double getLocationLat() { - return getLocation().get("y"); - } - - public Double getLocationLon() { - return getLocation().get("x"); - } - - @Override - public String toString() { - return "BusinessSuggestionRecord{" - + "unique_id=" - + unique_id - + ", score=" - + score - + ", id=" - + id - + ", localized_completed_text='" - + localized_completed_text - + '\'' - + ", location=" - + location - + ", country='" - + country - + '\'' - + ", review_count=" - + review_count - + ", review_wilson_score=" - + review_wilson_score - + ", category_aliases=" - + category_aliases - + ", checkin_rate_per_day=" - + checkin_rate_per_day - + ", standardized_score=" - + standardized_score - + ", language_alternate_names=" - + language_alternate_names - + '}'; - } - - public String getCountry() { - return country; - } - - public Integer getReviewCount() { - return review_count; - } - - public Double getReviewWilsonScore() { - return review_wilson_score; - } - - public List getCategoryAliases() { - return category_aliases; - } - - public Double getCheckinRatePerDay() { - return checkin_rate_per_day; - } - - public Long getStandardizedScore() { - return standardized_score; - } - - public List> getLanguageAlternateNames() { - return language_alternate_names; - } - } - - @Test - public void runYelpSuggest() throws Exception { - YelpSuggestTest.main(null); - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/grpc/SuggestTest.java b/src/test/java/com/yelp/nrtsearch/server/grpc/SuggestTest.java deleted file mode 100644 index 050bebfdc..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/grpc/SuggestTest.java +++ /dev/null @@ -1,939 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.grpc; - -import static com.yelp.nrtsearch.server.grpc.GrpcServer.rmDir; -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; - -import com.google.protobuf.ByteString; -import com.yelp.nrtsearch.server.LuceneServerTestConfigurationFactory; -import com.yelp.nrtsearch.server.config.LuceneServerConfiguration; -import io.grpc.stub.StreamObserver; -import io.grpc.testing.GrpcCleanupRule; -import java.io.BufferedWriter; -import java.io.FileOutputStream; -import java.io.IOException; -import java.io.OutputStreamWriter; -import java.io.Writer; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.concurrent.CountDownLatch; -import java.util.concurrent.TimeUnit; -import org.junit.After; -import org.junit.Before; -import org.junit.Ignore; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; -import org.junit.runner.RunWith; -import org.junit.runners.JUnit4; -import org.locationtech.spatial4j.io.GeohashUtils; - -@RunWith(JUnit4.class) -@Ignore("Do we still want to support this?") -public class SuggestTest { - - enum Suggester { - INFIX, - ANALYZING, - FUZZY, - COMPLETION_INFIX, - FUZZY_INFIX - } - - /** - * This rule manages automatic graceful shutdown for the registered servers and channels at the - * end of test. - */ - @Rule public final GrpcCleanupRule grpcCleanup = new GrpcCleanupRule(); - - /** - * This rule ensure the temporary folder which maintains indexes are cleaned up after each test - */ - @Rule public final TemporaryFolder folder = new TemporaryFolder(); - - private GrpcServer grpcServer; - static Path tempFile; - - @After - public void tearDown() throws IOException { - grpcServer.getGlobalState().close(); - rmDir(Paths.get(grpcServer.getIndexDir()).getParent()); - tempFile = null; - } - - @Before - public void setUp() throws IOException { - LuceneServerConfiguration luceneServerConfiguration = - LuceneServerTestConfigurationFactory.getConfig(Mode.STANDALONE, folder.getRoot()); - grpcServer = - new GrpcServer( - grpcCleanup, - luceneServerConfiguration, - folder, - null, - luceneServerConfiguration.getIndexDir(), - "test_index", - luceneServerConfiguration.getPort()); - Path tempDir = folder.newFolder("TestSuggest").toPath(); - tempFile = tempDir.resolve("suggest.in"); - } - - @Test - public void testInfixSuggest() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - Writer fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - BufferedWriter out = new BufferedWriter(fstream); - out.write("15\u001flove lost\u001ffoobar\n"); - out.close(); - - BuildSuggestResponse response = - sendBuildSuggest("suggest2", false, false, false, false, Suggester.INFIX); - assertEquals(1, response.getCount()); - - for (int i = 0; i < 2; i++) { - assertOneHighlightOnIndexLoveLost("lost", "suggest2", 15, "foobar"); - assertMultipleHighlightsOnIndexLoveLost("lo", "suggest2", 15, "foobar"); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testCompletionInfixSuggest() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - - try (FileOutputStream fos = new FileOutputStream(tempFile.toFile())) { - NrtsearchIndex.newBuilder() - .setUniqueId(1) - .addAllSearchTexts(List.of("home depot", "depot")) - .setScore(1L) - .setPayload(ByteString.copyFrom("payload".getBytes())) - .addAllContexts(List.of("c1", "c2")) - .build() - .writeDelimitedTo(fos); - } - - BuildSuggestResponse response = - sendBuildSuggest("suggest2", true, true, true, false, Suggester.COMPLETION_INFIX); - assertEquals(1, response.getCount()); - - for (int i = 0; i < 2; i++) { - // 1 transposition and this matches the infix of "depot": - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("de"); - suggestLookupBuilder.setSuggestName("suggest2"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertNotNull(results); - assertEquals(1, results.size()); - assertEquals(1, results.get(0).getWeight()); - assertEquals("1", results.get(0).getKey()); - assertEquals("payload", results.get(0).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testFuzzyInfixSuggest() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - - try (FileOutputStream fos = new FileOutputStream(tempFile.toFile())) { - NrtsearchIndex.newBuilder() - .setUniqueId(1) - .addAllSearchTexts(List.of("home depot", "depot")) - .setScore(1L) - .setPayload(ByteString.copyFrom("payload".getBytes())) - .addAllContexts(List.of("c1", "c2")) - .build() - .writeDelimitedTo(fos); - } - - BuildSuggestResponse response = - sendBuildSuggest("suggest2", true, true, true, false, Suggester.FUZZY_INFIX); - assertEquals(1, response.getCount()); - - for (int i = 0; i < 2; i++) { - // 1 transposition and this matches the infix of "depot": - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("dip"); - suggestLookupBuilder.setSuggestName("suggest2"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertNotNull(results); - assertEquals(1, results.size()); - assertEquals(1, results.get(0).getWeight()); - assertEquals("1", results.get(0).getKey()); - assertEquals("payload", results.get(0).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - private BuildSuggestResponse sendBuildSuggest( - String suggestName, - boolean hasContexts, - boolean hasPayload, - boolean hasMultiSearchTexts, - boolean isUpdate, - Suggester suggester) { - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName(suggestName); - buildSuggestRequestBuilder.setIndexName("test_index"); - if (suggester.equals(Suggester.INFIX)) { - buildSuggestRequestBuilder.setInfixSuggester( - InfixSuggester.newBuilder().setAnalyzer("default").build()); - } else if (suggester.equals(Suggester.ANALYZING)) { - buildSuggestRequestBuilder.setAnalyzingSuggester( - AnalyzingSuggester.newBuilder().setAnalyzer("default").build()); - } else if (suggester.equals(Suggester.FUZZY)) { - buildSuggestRequestBuilder.setFuzzySuggester( - FuzzySuggester.newBuilder().setAnalyzer("default").build()); - } else if (suggester.equals(Suggester.COMPLETION_INFIX)) { - buildSuggestRequestBuilder.setCompletionInfixSuggester( - CompletionInfixSuggester.newBuilder().setAnalyzer("default").build()); - } else if (suggester.equals(Suggester.FUZZY_INFIX)) { - buildSuggestRequestBuilder.setFuzzyInfixSuggester( - FuzzyInfixSuggester.newBuilder().setAnalyzer("default").setTranspositions(true).build()); - } - buildSuggestRequestBuilder.setLocalSource( - SuggestLocalSource.newBuilder() - .setLocalFile(tempFile.toAbsolutePath().toString()) - .setHasContexts(hasContexts) - .setHasPayload(hasPayload) - .setHasMultiSearchText(hasMultiSearchTexts) - .build()); - BuildSuggestResponse response; - if (isUpdate) { - response = grpcServer.getBlockingStub().updateSuggest(buildSuggestRequestBuilder.build()); - } else { - response = grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - } - return response; - } - - private void assertMultipleHighlightsOnIndexLoveLost( - String text, String suggestName, long weight, String payload) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText(text); - suggestLookupBuilder.setSuggestName(suggestName); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(weight, results.get(0).getWeight()); - SuggestLookupHighlight suggestLookupHighLight = results.get(0).getSuggestLookupHighlight(); - assertEquals(5, suggestLookupHighLight.getOneHighlightList().size()); - assertEquals("lo", suggestLookupHighLight.getOneHighlight(0).getText()); - assertEquals(true, suggestLookupHighLight.getOneHighlight(0).getIsHit()); - assertEquals("ve", suggestLookupHighLight.getOneHighlight(1).getText()); - assertEquals(false, suggestLookupHighLight.getOneHighlight(1).getIsHit()); - assertEquals(" ", suggestLookupHighLight.getOneHighlight(2).getText()); - assertEquals(false, suggestLookupHighLight.getOneHighlight(2).getIsHit()); - assertEquals("lo", suggestLookupHighLight.getOneHighlight(3).getText()); - assertEquals(true, suggestLookupHighLight.getOneHighlight(3).getIsHit()); - assertEquals("st", suggestLookupHighLight.getOneHighlight(4).getText()); - assertEquals(false, suggestLookupHighLight.getOneHighlight(4).getIsHit()); - assertEquals(payload, results.get(0).getPayload()); - } - - private void assertOneHighlightOnIndexLoveLost( - String text, String suggestName, long weight, String payload) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText(text); - suggestLookupBuilder.setSuggestName(suggestName); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(weight, results.get(0).getWeight()); - SuggestLookupHighlight suggestLookupHighLight = results.get(0).getSuggestLookupHighlight(); - assertEquals(2, suggestLookupHighLight.getOneHighlightList().size()); - assertEquals("love ", suggestLookupHighLight.getOneHighlight(0).getText()); - assertEquals(false, suggestLookupHighLight.getOneHighlight(0).getIsHit()); - assertEquals("lost", suggestLookupHighLight.getOneHighlight(1).getText()); - assertEquals(true, suggestLookupHighLight.getOneHighlight(1).getIsHit()); - assertEquals(payload, results.get(0).getPayload()); - } - - @Test - public void testInfixSuggestNRT() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - Writer fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - BufferedWriter out = new BufferedWriter(fstream); - out.write("15\u001flove lost\u001ffoobar\n"); - out.close(); - - BuildSuggestResponse response = - sendBuildSuggest("suggestnrt", false, false, false, false, Suggester.INFIX); - assertEquals(1, response.getCount()); - - assertOneHighlightOnIndexLoveLost("lost", "suggestnrt", 15, "foobar"); - assertMultipleHighlightsOnIndexLoveLost("lo", "suggestnrt", 15, "foobar"); - - // Now update the suggestions: - fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - out = new BufferedWriter(fstream); - out.write("10\u001flove lost\u001ffoobaz\n"); - out.write("20\u001flove found\u001ffooboo\n"); - out.close(); - - response = sendBuildSuggest("suggestnrt", false, false, false, true, Suggester.INFIX); - assertEquals(2, response.getCount()); - - for (int i = 0; i < 2; i++) { - assertOneHighlightOnIndexLoveLost("lost", "suggestnrt", 10, "foobaz"); - - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("lo"); - suggestLookupBuilder.setSuggestName("suggestnrt"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(20, results.get(0).getWeight()); - assertEquals("fooboo", results.get(0).getPayload()); - - SuggestLookupHighlight suggestLookupHighLight = results.get(0).getSuggestLookupHighlight(); - SuggestLookupHighlight expected = - SuggestLookupHighlight.newBuilder() - .addOneHighlight(OneHighlight.newBuilder().setText("lo").setIsHit(true).build()) - .addOneHighlight(OneHighlight.newBuilder().setText("ve").setIsHit(false).build()) - .addOneHighlight(OneHighlight.newBuilder().setText(" ").setIsHit(false).build()) - .addOneHighlight(OneHighlight.newBuilder().setText("found").setIsHit(false).build()) - .build(); - assertEquals(expected, suggestLookupHighLight); - - assertEquals(10, results.get(1).getWeight()); - assertEquals("foobaz", results.get(1).getPayload()); - suggestLookupHighLight = results.get(1).getSuggestLookupHighlight(); - expected = - SuggestLookupHighlight.newBuilder() - .addOneHighlight(OneHighlight.newBuilder().setText("lo").setIsHit(true).build()) - .addOneHighlight(OneHighlight.newBuilder().setText("ve").setIsHit(false).build()) - .addOneHighlight(OneHighlight.newBuilder().setText(" ").setIsHit(false).build()) - .addOneHighlight(OneHighlight.newBuilder().setText("lo").setIsHit(true).build()) - .addOneHighlight(OneHighlight.newBuilder().setText("st").setIsHit(false).build()) - .build(); - assertEquals(expected, suggestLookupHighLight); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testAnalyzingSuggest() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - Writer fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - BufferedWriter out = new BufferedWriter(fstream); - out.write("5\u001flucene\u001ffoobar\n"); - out.write("10\u001flucifer\u001ffoobar\n"); - out.write("15\u001flove\u001ffoobar\n"); - out.write("5\u001ftheories take time\u001ffoobar\n"); - out.write("5\u001fthe time is now\u001ffoobar\n"); - out.close(); - BuildSuggestResponse response = - sendBuildSuggest("suggest", false, false, false, false, Suggester.ANALYZING); - assertEquals(5, response.getCount()); - - for (int i = 0; i < 2; i++) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("l"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertEquals(3, results.size()); - - assertEquals("love", results.get(0).getKey()); - assertEquals(15, results.get(0).getWeight()); - assertEquals("foobar", results.get(0).getPayload()); - - assertEquals("lucifer", results.get(1).getKey()); - assertEquals(10, results.get(1).getWeight()); - assertEquals("foobar", results.get(1).getPayload()); - - assertEquals("lucene", results.get(2).getKey()); - assertEquals(5, results.get(2).getWeight()); - assertEquals("foobar", results.get(2).getPayload()); - - suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("the"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestResponse = grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - results = suggestResponse.getResultsList(); - - assertEquals(2, results.size()); - - assertEquals("theories take time", results.get(0).getKey()); - assertEquals(5, results.get(0).getWeight()); - assertEquals("foobar", results.get(0).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testFuzzySuggest() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - Writer fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - BufferedWriter out = new BufferedWriter(fstream); - out.write("15\u001flove lost\u001ffoobar\n"); - out.close(); - - BuildSuggestResponse result = - sendBuildSuggest("suggest3", false, false, false, false, Suggester.FUZZY); - assertEquals(1, result.getCount()); - - for (int i = 0; i < 2; i++) { - // 1 transposition and this is prefix of "love": - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("lvo"); - suggestLookupBuilder.setSuggestName("suggest3"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertEquals(15, results.get(0).getWeight()); - assertEquals("love lost", results.get(0).getKey()); - assertEquals("foobar", results.get(0).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - /** Build a suggest, pulling suggestions/weights/payloads from stored fields. */ - @Test - public void testFromStoredFields() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, false, Mode.STANDALONE); - new GrpcServer.IndexAndRoleManager(grpcServer) - .createStartIndexAndRegisterFields(Mode.STANDALONE, 0, false, "registerFieldsSuggest.json"); - AddDocumentResponse addDocumentResponse = testAddDocs.addDocuments("addSuggestDocs.csv"); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest"); - buildSuggestRequestBuilder.setIndexName("test_index"); - buildSuggestRequestBuilder.setAnalyzingSuggester( - AnalyzingSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setIndexGen(Long.valueOf(addDocumentResponse.getGenId())) - .setSuggestField("text") - .setWeightField("weight") - .setPayloadField("payload") - .build()); - BuildSuggestResponse response = - grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - // nocommit count isn't returned for stored fields source: - assertEquals(2, response.getCount()); - - for (int i = 0; i < 2; i++) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("the"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertEquals(2, results.get(0).getWeight()); - assertEquals("the dog barks", results.get(0).getKey()); - assertEquals("payload2", results.get(0).getPayload()); - assertEquals(1, results.get(1).getWeight()); - assertEquals("the cat meows", results.get(1).getKey()); - assertEquals("payload1", results.get(1).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - /** - * Build a suggest, pulling suggestions/payloads from stored fields, and weight from an expression - */ - @Test - public void testFromStoredFieldsWithWeightExpression() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, false, Mode.STANDALONE); - new GrpcServer.IndexAndRoleManager(grpcServer) - .createStartIndexAndRegisterFields( - Mode.STANDALONE, 0, false, "registerFieldsSuggestExpr.json"); - AddDocumentResponse addDocumentResponse = testAddDocs.addDocuments("addSuggestDocsExpr.csv"); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest"); - buildSuggestRequestBuilder.setIndexName("test_index"); - buildSuggestRequestBuilder.setAnalyzingSuggester( - AnalyzingSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setIndexGen(Long.valueOf(addDocumentResponse.getGenId())) - .setSuggestField("text") - .setWeightExpression("-negWeight") - .setPayloadField("payload") - .build()); - BuildSuggestResponse response = - grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - assertEquals(2, response.getCount()); - - for (int i = 0; i < 2; i++) { - // nocommit count isn't returned for stored fields source: - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("the"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - - assertEquals(2, results.get(0).getWeight()); - assertEquals("the dog barks", results.get(0).getKey()); - assertEquals("payload2", results.get(0).getPayload()); - assertEquals(1, results.get(1).getWeight()); - assertEquals("the cat meows", results.get(1).getKey()); - assertEquals("payload1", results.get(1).getPayload()); - - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testInfixSuggesterWithContexts() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, true, Mode.STANDALONE); - - Writer fstream = new OutputStreamWriter(new FileOutputStream(tempFile.toFile()), "UTF-8"); - BufferedWriter out = new BufferedWriter(fstream); - out.write("15\u001flove lost\u001ffoobar\u001flucene\n"); - out.close(); - - BuildSuggestResponse response = - sendBuildSuggest("suggest", true, false, false, false, Suggester.INFIX); - assertEquals(1, response.getCount()); - - for (int i = 0; i < 2; i++) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("lov"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - suggestLookupBuilder.addContexts("lucene"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(1, results.size()); - assertEquals(15, results.get(0).getWeight()); - assertEquals("foobar", results.get(0).getPayload()); - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testInfixSuggesterWithContextsFromField() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, false, Mode.STANDALONE); - new GrpcServer.IndexAndRoleManager(grpcServer) - .createStartIndexAndRegisterFields( - Mode.STANDALONE, 0, false, "registerFieldsSuggestWithContext.json"); - AddDocumentResponse addDocumentResponse = - testAddDocs.addDocuments("addSuggestDocsWithContext.csv"); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest"); - buildSuggestRequestBuilder.setIndexName("test_index"); - buildSuggestRequestBuilder.setInfixSuggester( - InfixSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setIndexGen(Long.valueOf(addDocumentResponse.getGenId())) - .setSuggestField("text") - .setWeightField("weight") - .setPayloadField("payload") - .setContextField("context") - .build()); - BuildSuggestResponse response = - grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - // nocommit count isn't returned for stored fields source: - assertEquals(2, response.getCount()); - - for (int i = 0; i < 2; i++) { - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("the"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - suggestLookupBuilder.addContexts("lucene"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(1, results.size()); - assertEquals(1, results.get(0).getWeight()); - assertEquals("payload1", results.get(0).getPayload()); - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - } - - @Test - public void testInfixSuggesterWithPayloadContextsAndSearchTexts() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, false, Mode.STANDALONE); - new GrpcServer.IndexAndRoleManager(grpcServer) - .createStartIndexAndRegisterFields( - Mode.STANDALONE, 0, false, "registerFieldsSuggestWithContextAndSearchTexts.json"); - AddDocumentResponse addDocumentResponse = - testAddDocs.addDocuments("addSuggestDocsWithContextsAndSearchTexts.csv"); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest"); - buildSuggestRequestBuilder.setIndexName("test_index"); - buildSuggestRequestBuilder.setCompletionInfixSuggester( - CompletionInfixSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setIndexGen(Long.valueOf(addDocumentResponse.getGenId())) - .setSuggestField("text") - .setWeightField("weight") - .setPayloadField("payload") - .setContextField("context") - .setSearchTextField("search_text") - .build()); - BuildSuggestResponse response = - grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - // nocommit count isn't returned for stored fields source: - assertEquals(2, response.getCount()); - - for (int i = 0; i < 2; i++) { - // Only one result is expected to return, given only one suggest item contains c2 context - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("dog"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.addContexts("c2"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(1, results.size()); - assertEquals(2, results.get(0).getWeight()); - assertEquals("payload2", results.get(0).getPayload()); - assertEquals("dog barks", results.get(0).getKey()); - // commit state and indexes - grpcServer - .getBlockingStub() - .commit(CommitRequest.newBuilder().setIndexName("test_index").build()); - // mimic bounce server to make sure suggestions survive restart - grpcServer - .getBlockingStub() - .stopIndex(StopIndexRequest.newBuilder().setIndexName("test_index").build()); - grpcServer - .getBlockingStub() - .startIndex(StartIndexRequest.newBuilder().setIndexName("test_index").build()); - } - - // All results are expected to return, given only one suggest item contains c2 context - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("dog"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.addContexts("c1"); - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(2, results.size()); - - // Only one results with highest weight is expected to return - // In this case, "dog barks" suggestion with weight of 2 is returned. - suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("dog"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setCount(1); - suggestResponse = grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - results = suggestResponse.getResultsList(); - assertEquals(1, results.size()); - assertEquals(2, results.get(0).getWeight()); - assertEquals("dog barks", results.get(0).getKey()); - } - - @Test - public void testSuggesterWithGeoHashContexts() throws Exception { - GrpcServer.TestServer testAddDocs = - new GrpcServer.TestServer(grpcServer, false, Mode.STANDALONE); - new GrpcServer.IndexAndRoleManager(grpcServer) - .createStartIndexAndRegisterFields( - Mode.STANDALONE, 0, false, "registerFieldsSuggestGeohash.json"); - - AddDocumentResponse addDocumentResponse = new GeohashDocumentProducer().indexDocs(grpcServer); - BuildSuggestRequest.Builder buildSuggestRequestBuilder = BuildSuggestRequest.newBuilder(); - buildSuggestRequestBuilder.setSuggestName("suggest"); - buildSuggestRequestBuilder.setIndexName("test_index"); - buildSuggestRequestBuilder.setInfixSuggester( - InfixSuggester.newBuilder().setAnalyzer("default").build()); - buildSuggestRequestBuilder.setNonLocalSource( - SuggestNonLocalSource.newBuilder() - .setIndexGen(Long.valueOf(addDocumentResponse.getGenId())) - .setSuggestField("text") - .setWeightField("weight") - .setPayloadField("payload") - .setContextField("context") - .build()); - BuildSuggestResponse response = - grpcServer.getBlockingStub().buildSuggest(buildSuggestRequestBuilder.build()); - // nocommit count isn't returned for stored fields source: - assertEquals(2, response.getCount()); - - SuggestLookupRequest.Builder suggestLookupBuilder = SuggestLookupRequest.newBuilder(); - suggestLookupBuilder.setText("the"); - suggestLookupBuilder.setSuggestName("suggest"); - suggestLookupBuilder.setIndexName("test_index"); - suggestLookupBuilder.setHighlight(true); - // only need san fran Geohashes - List geohashes = GeohashDocumentProducer.getGeoHashes(37.7749, -122.4194, 5, 7); - for (String geohash : geohashes) { - suggestLookupBuilder.addContexts(geohash); - } - SuggestLookupResponse suggestResponse = - grpcServer.getBlockingStub().suggestLookup(suggestLookupBuilder.build()); - List results = suggestResponse.getResultsList(); - assertEquals(1, results.size()); - assertEquals(1, results.get(0).getWeight()); - assertEquals("payload1", results.get(0).getPayload()); - } - - private static class GeohashDocumentProducer { - AddDocumentResponse addDocumentResponse; - - private static List getGeoHashes( - double latitude, double longitude, int minPrecision, int maxPrecision) { - List geohashes = new ArrayList<>(); - for (int i = minPrecision; i <= maxPrecision; i++) { - geohashes.add(GeohashUtils.encodeLatLon(latitude, longitude, i)); - } - return geohashes; - } - - private AddDocumentResponse indexDocs(GrpcServer grpcServer) throws InterruptedException { - List sanFranGeohashes = getGeoHashes(37.7749, -122.4194, 5, 7); - List fremontGeohashes = getGeoHashes(37.5485, -121.9886, 5, 7); - - ArrayList addDocumentRequests = - new ArrayList( - Arrays.asList( - AddDocumentRequest.newBuilder() - .setIndexName("test_index") - .putFields( - "text", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue("the cat meows") - .build()) - .putFields( - "weight", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue(String.valueOf(1)) - .build()) - .putFields( - "payload", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue("payload1") - .build()) - .putFields( - "context", - AddDocumentRequest.MultiValuedField.newBuilder() - .addAllValue(sanFranGeohashes) - .build()) - .build(), - AddDocumentRequest.newBuilder() - .setIndexName("test_index") - .putFields( - "text", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue("the dog barks") - .build()) - .putFields( - "weight", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue(String.valueOf(2)) - .build()) - .putFields( - "payload", - AddDocumentRequest.MultiValuedField.newBuilder() - .addValue("payload2") - .build()) - .putFields( - "context", - AddDocumentRequest.MultiValuedField.newBuilder() - .addAllValue(fremontGeohashes) - .build()) - .build())); - - CountDownLatch finishLatch = new CountDownLatch(1); - AddDocumentResponse addDocResponse; - // observers responses from Server(should get one onNext and oneCompleted) - StreamObserver responseStreamObserver = - new StreamObserver() { - @Override - public void onNext(AddDocumentResponse value) { - addDocumentResponse = value; - } - - @Override - public void onError(Throwable t) { - finishLatch.countDown(); - } - - @Override - public void onCompleted() { - finishLatch.countDown(); - } - }; - - // requestObserver sends requests to Server (one onNext per AddDocumentRequest and one - // onCompleted) - StreamObserver requestObserver = - grpcServer.getStub().addDocuments(responseStreamObserver); - for (AddDocumentRequest addDocumentRequest : addDocumentRequests) { - requestObserver.onNext(addDocumentRequest); - } - // Mark the end of requests - requestObserver.onCompleted(); - // Receiving happens asynchronously, so block here 5 seconds - if (!finishLatch.await(5, TimeUnit.SECONDS)) { - throw new RuntimeException("addDocuments can not finish within 5 seconds"); - } - - return addDocumentResponse; - } - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexStateTest.java b/src/test/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexStateTest.java index 96e880963..a63eeb1a2 100644 --- a/src/test/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexStateTest.java +++ b/src/test/java/com/yelp/nrtsearch/server/luceneserver/index/ImmutableIndexStateTest.java @@ -1166,16 +1166,6 @@ public void testCommit() throws IOException { verify(mockShard, times(1)).commit(); } - @Test(expected = UnsupportedOperationException.class) - public void testAddSuggest() throws IOException { - getIndexState(getEmptyState()).addSuggest(null, null); - } - - @Test(expected = UnsupportedOperationException.class) - public void testGetSuggesters() throws IOException { - getIndexState(getEmptyState()).getSuggesters(); - } - @Test public void testDeleteIndex() throws IOException { ImmutableIndexState indexState = getIndexState(getEmptyState()); diff --git a/src/test/java/com/yelp/nrtsearch/server/suggest/CompletionInfixSuggesterTest.java b/src/test/java/com/yelp/nrtsearch/server/suggest/CompletionInfixSuggesterTest.java deleted file mode 100644 index b16b031e1..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/suggest/CompletionInfixSuggesterTest.java +++ /dev/null @@ -1,221 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.suggest; - -import com.google.protobuf.ByteString; -import com.yelp.nrtsearch.server.grpc.NrtsearchIndex; -import com.yelp.nrtsearch.server.luceneserver.suggest.CompletionInfixSuggester; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.FromProtobufFileSuggestItemIterator; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.search.suggest.Lookup; -import org.apache.lucene.search.suggest.Lookup.LookupResult; -import org.apache.lucene.store.Directory; -import org.apache.lucene.tests.util.LuceneTestCase; -import org.apache.lucene.util.BytesRef; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -public class CompletionInfixSuggesterTest extends LuceneTestCase { - - @Rule public TemporaryFolder folder = new TemporaryFolder(); - - private CompletionInfixSuggester suggester; - - @Before - public void before() throws Exception { - Directory dir = newDirectory(); - FromProtobufFileSuggestItemIterator iter = createIterator(); - Analyzer analyzer = new StandardAnalyzer(); - suggester = new CompletionInfixSuggester(dir, analyzer, analyzer); - suggester.build(iter); - } - - @After - public void after() throws Exception { - suggester.close(); - } - - @Test - public void testCompletionSuggestionWithoutContext() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of(), 2); - - assertNotNull(actualResults); - assertEquals(2, actualResults.size()); - assertEquals("1", actualResults.get(0).key); - assertEquals(4, actualResults.get(0).value); - assertEquals("2", actualResults.get(1).key); - assertEquals(2, actualResults.get(1).value); - } - - @Test - public void testSuggesterWithOneContext() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of("9q9hxb"), 2); - - assertNotNull(actualResults); - assertEquals(1, actualResults.size()); - assertEquals("2", actualResults.get(0).key); - assertEquals(2, actualResults.get(0).value); - } - - @Test - public void testSuggesterWithOneContextWithNoMatch() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of("abcde"), 2); - - assertNotNull(actualResults); - assertEquals(0, actualResults.size()); - } - - @Test - public void testSuggesterWithOneContextWithMultipleMatches() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of("9q9hf"), 2); - - assertNotNull(actualResults); - assertEquals(2, actualResults.size()); - assertEquals("1", actualResults.get(0).key); - assertEquals(4, actualResults.get(0).value); - assertEquals("0", actualResults.get(1).key); - assertEquals(1, actualResults.get(1).value); - } - - @Test - public void testSuggesterWithMultipleContexts() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of("9q9hx", "9q9hf"), 2); - - assertNotNull(actualResults); - assertEquals(2, actualResults.size()); - assertEquals("1", actualResults.get(0).key); - assertEquals(4, actualResults.get(0).value); - assertEquals("2", actualResults.get(1).key); - assertEquals(2, actualResults.get(1).value); - } - - @Test - public void testSuggesterWithUpdatedDocs() throws IOException { - List actualResults; - actualResults = lookupHelper(suggester, "hom", Set.of(), 20); - assertEquals(3, actualResults.size()); - - suggester.update( - new BytesRef("2"), - Set.of(new BytesRef("home decoration"), new BytesRef("decoration")), - Set.of(new BytesRef("9q9hfe"), new BytesRef("9q9hf")), - 10L, - new BytesRef("new payload")); - suggester.update( - new BytesRef("10"), - Set.of(new BytesRef("new home"), new BytesRef("home")), - Set.of(new BytesRef("9q9hfe"), new BytesRef("9q9hf")), - 20L, - new BytesRef("new payload")); - - actualResults = lookupHelper(suggester, "hom", Set.of(), 20); - assertNotNull(actualResults); - assertEquals(3, actualResults.size()); - - suggester.refresh(); - - actualResults = lookupHelper(suggester, "hom", Set.of(), 20); - assertNotNull(actualResults); - assertEquals(4, actualResults.size()); - assertEquals("10", actualResults.get(0).key); - assertEquals(20, actualResults.get(0).value); - assertEquals("2", actualResults.get(1).key); - assertEquals(10, actualResults.get(1).value); - assertEquals("1", actualResults.get(2).key); - assertEquals(4, actualResults.get(2).value); - assertEquals("0", actualResults.get(3).key); - assertEquals(1, actualResults.get(3).value); - } - - @Test - public void testSuggesterWithDuplicatedPrefixDoc() throws IOException { - List actualResults = lookupHelper(suggester, "sha", Set.of("9q9hf"), 2); - assertNotNull(actualResults); - assertEquals(1, actualResults.size()); - assertEquals(3, actualResults.get(0).value); - assertEquals("4", actualResults.get(0).key); - } - - @Test(expected = RuntimeException.class) - public void testSuggesterLookupWithoutValidIndexBuild() throws IOException { - Directory dir = newDirectory(); - Analyzer analyzer = new StandardAnalyzer(); - CompletionInfixSuggester testSuggester = new CompletionInfixSuggester(dir, analyzer, analyzer); - try { - lookupHelper(testSuggester, "sha", Set.of("9q9hf"), 2); - } finally { - testSuggester.close(); - } - } - - private List lookupHelper( - Lookup suggester, String key, Set contexts, int count) throws IOException { - Set contextSet = new HashSet<>(); - for (String context : contexts) { - contextSet.add(new BytesRef(context)); - } - - return suggester.lookup(key, contextSet, true, count); - } - - private FromProtobufFileSuggestItemIterator createIterator() throws Exception { - File outputFile = - Paths.get(folder.newFolder("nrtsearch_file").toPath().toString(), "fuzzy_suggest_item.file") - .toFile(); - - List> searchTextsList = - List.of( - List.of("home depot", "depot"), - List.of("lowe's home improvement", "home improvement", "improvement"), - List.of("home decoration", "decoration"), - List.of("gary danko restaurant", "danko restaurant", "restaurant"), - List.of("shack shack", "shack")); - List payloads = List.of("payload1", "payload2", "payload3", "payload4", "payload5"); - List> contextsList = - List.of( - List.of("9q9hfe", "9q9hf"), - List.of("9q9hfe", "9q9hf"), - List.of("9q9hxb", "9q9hx"), - List.of("9q9hbw", "9q9hb"), - List.of("9q9hfe", "9q9hf")); - List scores = List.of(1L, 4L, 2L, 3L, 3L); - - try (FileOutputStream protoFile = new FileOutputStream(outputFile)) { - for (int i = 0; i < searchTextsList.size(); i++) { - NrtsearchIndex.newBuilder() - .setUniqueId(i) - .addAllSearchTexts(searchTextsList.get(i)) - .setScore(scores.get(i)) - .setPayload(ByteString.copyFrom(payloads.get(i).getBytes())) - .addAllContexts(contextsList.get(i)) - .build() - .writeDelimitedTo(protoFile); - } - } - return new FromProtobufFileSuggestItemIterator(outputFile, true, true, true); - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/suggest/FromProtobufFileSuggestItemIteratorTest.java b/src/test/java/com/yelp/nrtsearch/server/suggest/FromProtobufFileSuggestItemIteratorTest.java deleted file mode 100644 index f981ea578..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/suggest/FromProtobufFileSuggestItemIteratorTest.java +++ /dev/null @@ -1,89 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.suggest; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertNull; -import static org.junit.Assert.assertTrue; - -import com.google.common.io.Resources; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.FromProtobufFileSuggestItemIterator; -import java.io.File; -import java.util.Set; -import org.apache.lucene.util.BytesRef; -import org.junit.Before; -import org.junit.Test; - -public class FromProtobufFileSuggestItemIteratorTest { - - private File indexFile; - - @Before - public void setUp() throws Exception { - this.indexFile = new File(Resources.getResource("suggest/test_index.file").toURI()); - } - - @Test - public void testIteratorWithContextWithPayload() throws Exception { - FromProtobufFileSuggestItemIterator iterator = - new FromProtobufFileSuggestItemIterator(indexFile, true, true, true); - assertEquals("1", iterator.next().utf8ToString()); - assertEquals(10, iterator.weight()); - assertExpectedSet(Set.of("en_CL"), iterator.contexts()); - assertExpectedSet(Set.of("post offices", "offices"), iterator.searchTexts()); - assertNotNull(iterator.payload()); - - assertEquals("2", iterator.next().utf8ToString()); - assertEquals(20, iterator.weight()); - assertExpectedSet(Set.of("en_US"), iterator.contexts()); - assertExpectedSet(Set.of("hog island", "island"), iterator.searchTexts()); - assertNotNull(iterator.payload()); - - // Reach the end of the source file - assertNull(iterator.next()); - assertEquals(2, iterator.suggestCount); - } - - @Test - public void testIteratorWithoutContextWithoutPayload() throws Exception { - FromProtobufFileSuggestItemIterator iterator = - new FromProtobufFileSuggestItemIterator(indexFile, false, false, true); - assertEquals("1", iterator.next().utf8ToString()); - assertEquals(10, iterator.weight()); - assertExpectedSet(Set.of("post offices", "offices"), iterator.searchTexts()); - assertNull(iterator.contexts()); - assertNull(iterator.payload()); - - assertEquals("2", iterator.next().utf8ToString()); - assertEquals(20, iterator.weight()); - assertExpectedSet(Set.of("hog island", "island"), iterator.searchTexts()); - assertNull(iterator.contexts()); - assertNull(iterator.payload()); - - // Reach the end of the source file - assertNull(iterator.next()); - assertEquals(2, iterator.suggestCount); - } - - private void assertExpectedSet(Set expectedSet, Set actualSet) { - assertNotNull(actualSet); - assertEquals(expectedSet.size(), actualSet.size()); - for (BytesRef bytes : actualSet) { - assertTrue(expectedSet.contains(bytes.utf8ToString())); - } - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/suggest/FuzzyInfixSuggesterTest.java b/src/test/java/com/yelp/nrtsearch/server/suggest/FuzzyInfixSuggesterTest.java deleted file mode 100644 index 6f8dd15d9..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/suggest/FuzzyInfixSuggesterTest.java +++ /dev/null @@ -1,157 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.suggest; - -import com.google.protobuf.ByteString; -import com.yelp.nrtsearch.server.grpc.NrtsearchIndex; -import com.yelp.nrtsearch.server.luceneserver.suggest.CompletionInfixSuggester; -import com.yelp.nrtsearch.server.luceneserver.suggest.FuzzyInfixSuggester; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.FromProtobufFileSuggestItemIterator; -import java.io.File; -import java.io.FileOutputStream; -import java.io.IOException; -import java.nio.file.Paths; -import java.util.HashSet; -import java.util.List; -import java.util.Set; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.analysis.standard.StandardAnalyzer; -import org.apache.lucene.search.suggest.Lookup; -import org.apache.lucene.search.suggest.Lookup.LookupResult; -import org.apache.lucene.store.Directory; -import org.apache.lucene.tests.util.LuceneTestCase; -import org.apache.lucene.util.BytesRef; -import org.junit.After; -import org.junit.Before; -import org.junit.Rule; -import org.junit.Test; -import org.junit.rules.TemporaryFolder; - -public class FuzzyInfixSuggesterTest extends LuceneTestCase { - - @Rule public TemporaryFolder folder = new TemporaryFolder(); - - private FuzzyInfixSuggester suggester; - - @Before - public void before() throws Exception { - Directory dir = newDirectory(); - FromProtobufFileSuggestItemIterator iter = createIterator(); - Analyzer analyzer = new StandardAnalyzer(); - // Setup fuzzy infix suggester with default values - suggester = new FuzzyInfixSuggester(dir, analyzer); - suggester.build(iter); - } - - @After - public void after() throws Exception { - suggester.close(); - } - - @Test - public void testCompletionSuggestionWithLongPrefixWithoutContext() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of(), 9); - // "iom decoration" text is not returned since non_fuzzy_prefix is 1. - assertNotNull(actualResults); - assertEquals(4, actualResults.size()); - assertEquals("4", actualResults.get(0).key); - assertEquals("1", actualResults.get(1).key); - assertEquals("2", actualResults.get(2).key); - assertEquals("0", actualResults.get(3).key); - } - - @Test - public void testCompletionSuggestionWithShortPrefixWithoutContext() throws IOException { - List actualResults = lookupHelper(suggester, "hi", Set.of(), 9); - - // No fuzzy match is returned since the length of prefix is less than non_fuzzy_prefix (3 in - // this case). - assertNotNull(actualResults); - assertEquals(1, actualResults.size()); - assertEquals("4", actualResults.get(0).key); - } - - @Test - public void testCompletionSuggestionWithLongPrefixWithContext() throws IOException { - List actualResults = lookupHelper(suggester, "hom", Set.of("9q9hfe"), 9); - - // "iom decoration" text is not returned since non_fuzzy_prefix is 1. - assertNotNull(actualResults); - assertEquals(2, actualResults.size()); - assertEquals("1", actualResults.get(0).key); - assertEquals("0", actualResults.get(1).key); - } - - @Test(expected = RuntimeException.class) - public void testSuggesterLookupWithoutValidIndexBuild() throws IOException { - Directory dir = newDirectory(); - Analyzer analyzer = new StandardAnalyzer(); - CompletionInfixSuggester testSuggester = new CompletionInfixSuggester(dir, analyzer, analyzer); - try { - lookupHelper(testSuggester, "sha", Set.of("9q9hf"), 2); - } finally { - testSuggester.close(); - } - } - - private List lookupHelper( - Lookup suggester, String key, Set contexts, int count) throws IOException { - Set contextSet = new HashSet<>(); - for (String context : contexts) { - contextSet.add(new BytesRef(context)); - } - - return suggester.lookup(key, contextSet, true, count); - } - - private FromProtobufFileSuggestItemIterator createIterator() throws Exception { - File outputFile = - Paths.get(folder.newFolder("nrtsearch_file").toPath().toString(), "fuzzy_suggest_item.file") - .toFile(); - - List> searchTextsList = - List.of( - List.of("hot depot", "depot"), - List.of("lowe's hot spring", "hot spring", "spring"), - List.of("home decoration", "decoration"), - List.of("iome decoration", "decoration"), - List.of("hime decoration", "decoration")); - List payloads = List.of("payload1", "payload2", "payload3", "payload4", "payload5"); - List> contextsList = - List.of( - List.of("9q9hfe", "9q9hf"), - List.of("9q9hfe", "9q9hf"), - List.of("9q9hxb", "9q9hx"), - List.of("9q9hxb", "9q9hx"), - List.of("9q9hxb", "9q9hx")); - List scores = List.of(1L, 4L, 2L, 10L, 12L); - - try (FileOutputStream protoFile = new FileOutputStream(outputFile)) { - for (int i = 0; i < searchTextsList.size(); i++) { - NrtsearchIndex.newBuilder() - .setUniqueId(i) - .addAllSearchTexts(searchTextsList.get(i)) - .setScore(scores.get(i)) - .setPayload(ByteString.copyFrom(payloads.get(i).getBytes())) - .addAllContexts(contextsList.get(i)) - .build() - .writeDelimitedTo(protoFile); - } - } - - return new FromProtobufFileSuggestItemIterator(outputFile, true, true, true); - } -} diff --git a/src/test/java/com/yelp/nrtsearch/server/suggest/SuggestDocumentDictionaryTest.java b/src/test/java/com/yelp/nrtsearch/server/suggest/SuggestDocumentDictionaryTest.java deleted file mode 100644 index be9d484b9..000000000 --- a/src/test/java/com/yelp/nrtsearch/server/suggest/SuggestDocumentDictionaryTest.java +++ /dev/null @@ -1,144 +0,0 @@ -/* - * Copyright 2020 Yelp Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package com.yelp.nrtsearch.server.suggest; - -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.SuggestDocumentDictionary; -import com.yelp.nrtsearch.server.luceneserver.suggest.iterator.SuggestInputIterator; -import java.io.IOException; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; -import org.apache.lucene.analysis.Analyzer; -import org.apache.lucene.document.Document; -import org.apache.lucene.document.Field; -import org.apache.lucene.document.NumericDocValuesField; -import org.apache.lucene.document.StoredField; -import org.apache.lucene.document.TextField; -import org.apache.lucene.index.DirectoryReader; -import org.apache.lucene.index.IndexReader; -import org.apache.lucene.index.IndexWriterConfig; -import org.apache.lucene.index.IndexableField; -import org.apache.lucene.search.spell.Dictionary; -import org.apache.lucene.search.suggest.InputIterator; -import org.apache.lucene.store.Directory; -import org.apache.lucene.tests.analysis.MockAnalyzer; -import org.apache.lucene.tests.index.RandomIndexWriter; -import org.apache.lucene.tests.util.LuceneTestCase; -import org.apache.lucene.util.BytesRef; -import org.apache.lucene.util.IOUtils; -import org.junit.Test; - -public class SuggestDocumentDictionaryTest extends LuceneTestCase { - - private static final String FIELD_NAME = "suggestText"; - private static final String WEIGHT_FIELD_NAME = "weight"; - private static final String PAYLOAD_FIELD_NAME = "payload"; - private static final String CONTEXT_FIELD_NAME = "context"; - private static final String SEARCH_TEXT_FILED_NAME = "searchText"; - - @Test - public void testDictionaryWithWeightPayloadContextSearchText() throws IOException { - Directory dir = newDirectory(); - Analyzer analyzer = new MockAnalyzer(random()); - IndexWriterConfig iwc = newIndexWriterConfig(analyzer); - iwc.setMergePolicy(newLogMergePolicy()); - RandomIndexWriter writer = new RandomIndexWriter(random(), dir, iwc); - - Document doc1 = new Document(); - doc1.add(new TextField(FIELD_NAME, "food court", Field.Store.YES)); - doc1.add(new NumericDocValuesField(WEIGHT_FIELD_NAME, 1)); - doc1.add(new StoredField(PAYLOAD_FIELD_NAME, new BytesRef("payload1"))); - doc1.add(new StoredField(CONTEXT_FIELD_NAME, new BytesRef("context1"))); - doc1.add(new TextField(SEARCH_TEXT_FILED_NAME, "food court", Field.Store.YES)); - doc1.add(new TextField(SEARCH_TEXT_FILED_NAME, "court", Field.Store.YES)); - - Document doc2 = new Document(); - doc2.add(new TextField(FIELD_NAME, "food truck", Field.Store.YES)); - doc2.add(new NumericDocValuesField(WEIGHT_FIELD_NAME, 1)); - doc2.add(new StoredField(PAYLOAD_FIELD_NAME, new BytesRef("payload2"))); - doc2.add(new StoredField(CONTEXT_FIELD_NAME, new BytesRef("context2"))); - doc2.add(new StoredField(CONTEXT_FIELD_NAME, new BytesRef("context3"))); - doc2.add(new TextField(SEARCH_TEXT_FILED_NAME, "food truck", Field.Store.YES)); - doc2.add(new TextField(SEARCH_TEXT_FILED_NAME, "truck", Field.Store.YES)); - - Map docMap = new HashMap<>(Map.of("food court", doc1, "food truck", doc2)); - - for (Document doc : docMap.values()) { - writer.addDocument(doc); - } - writer.commit(); - writer.close(); - IndexReader ir = DirectoryReader.open(dir); - Dictionary dictionary = - new SuggestDocumentDictionary( - ir, - FIELD_NAME, - WEIGHT_FIELD_NAME, - PAYLOAD_FIELD_NAME, - CONTEXT_FIELD_NAME, - SEARCH_TEXT_FILED_NAME); - - InputIterator inputIterator = dictionary.getEntryIterator(); - - assertTrue(inputIterator instanceof SuggestInputIterator); - SuggestInputIterator iter = (SuggestInputIterator) inputIterator; - BytesRef f; - - while ((f = iter.next()) != null) { - Document doc = docMap.remove(f.utf8ToString()); - - // Compare FIELD field - assertEquals(f, new BytesRef(doc.get(FIELD_NAME))); - - // Compare WEIGHT field - IndexableField weightField = doc.getField(WEIGHT_FIELD_NAME); - assertEquals(iter.weight(), weightField.numericValue().longValue()); - - // Compare PAYLOAD field - IndexableField payloadField = doc.getField(PAYLOAD_FIELD_NAME); - assertEquals(iter.payload(), payloadField.binaryValue()); - - // Compare CONTEXT field - IndexableField[] contextFields = doc.getFields(CONTEXT_FIELD_NAME); - assertEquals(iter.contexts().size(), contextFields.length); - Set expectedContexts = - Arrays.stream(contextFields) - .map(IndexableField::binaryValue) - .map(BytesRef::utf8ToString) - .collect(Collectors.toSet()); - for (BytesRef context : iter.contexts()) { - assertTrue(expectedContexts.contains(context.utf8ToString())); - } - - // Compare SEARCH_TEXT field - IndexableField[] searchTextFields = doc.getFields(SEARCH_TEXT_FILED_NAME); - assertEquals(iter.searchTexts().size(), searchTextFields.length); - Set expectedSearchTexts = - Arrays.stream(searchTextFields) - .map(IndexableField::stringValue) - .collect(Collectors.toSet()); - for (BytesRef searchText : iter.searchTexts()) { - assertTrue(expectedSearchTexts.contains(searchText.utf8ToString())); - } - } - - // All documents have been examined. - assertTrue(docMap.isEmpty()); - IOUtils.close(ir, analyzer, dir); - } -}