// Copyright 2017 Google 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.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.22.0
// 	protoc        v3.12.2
// source: google/cloud/language/v1beta1/language_service.proto

package language

import (
	context "context"
	reflect "reflect"
	sync "sync"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
	grpc "google.golang.org/grpc"
	codes "google.golang.org/grpc/codes"
	status "google.golang.org/grpc/status"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)

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)
)

// This is a compile-time assertion that a sufficiently up-to-date version
// of the legacy proto package is being used.
const _ = proto.ProtoPackageIsVersion4

// Represents the text encoding that the caller uses to process the output.
// Providing an `EncodingType` is recommended because the API provides the
// beginning offsets for various outputs, such as tokens and mentions, and
// languages that natively use different text encodings may access offsets
// differently.
type EncodingType int32

const (
	// If `EncodingType` is not specified, encoding-dependent information (such as
	// `begin_offset`) will be set at `-1`.
	EncodingType_NONE EncodingType = 0
	// Encoding-dependent information (such as `begin_offset`) is calculated based
	// on the UTF-8 encoding of the input. C++ and Go are examples of languages
	// that use this encoding natively.
	EncodingType_UTF8 EncodingType = 1
	// Encoding-dependent information (such as `begin_offset`) is calculated based
	// on the UTF-16 encoding of the input. Java and Javascript are examples of
	// languages that use this encoding natively.
	EncodingType_UTF16 EncodingType = 2
	// Encoding-dependent information (such as `begin_offset`) is calculated based
	// on the UTF-32 encoding of the input. Python is an example of a language
	// that uses this encoding natively.
	EncodingType_UTF32 EncodingType = 3
)

// Enum value maps for EncodingType.
var (
	EncodingType_name = map[int32]string{
		0: "NONE",
		1: "UTF8",
		2: "UTF16",
		3: "UTF32",
	}
	EncodingType_value = map[string]int32{
		"NONE":  0,
		"UTF8":  1,
		"UTF16": 2,
		"UTF32": 3,
	}
)

func (x EncodingType) Enum() *EncodingType {
	p := new(EncodingType)
	*p = x
	return p
}

func (x EncodingType) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (EncodingType) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[0].Descriptor()
}

func (EncodingType) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[0]
}

func (x EncodingType) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use EncodingType.Descriptor instead.
func (EncodingType) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{0}
}

// The document types enum.
type Document_Type int32

const (
	// The content type is not specified.
	Document_TYPE_UNSPECIFIED Document_Type = 0
	// Plain text
	Document_PLAIN_TEXT Document_Type = 1
	// HTML
	Document_HTML Document_Type = 2
)

// Enum value maps for Document_Type.
var (
	Document_Type_name = map[int32]string{
		0: "TYPE_UNSPECIFIED",
		1: "PLAIN_TEXT",
		2: "HTML",
	}
	Document_Type_value = map[string]int32{
		"TYPE_UNSPECIFIED": 0,
		"PLAIN_TEXT":       1,
		"HTML":             2,
	}
)

func (x Document_Type) Enum() *Document_Type {
	p := new(Document_Type)
	*p = x
	return p
}

func (x Document_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Document_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[1].Descriptor()
}

func (Document_Type) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[1]
}

func (x Document_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Document_Type.Descriptor instead.
func (Document_Type) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{0, 0}
}

// The type of the entity.
type Entity_Type int32

const (
	// Unknown
	Entity_UNKNOWN Entity_Type = 0
	// Person
	Entity_PERSON Entity_Type = 1
	// Location
	Entity_LOCATION Entity_Type = 2
	// Organization
	Entity_ORGANIZATION Entity_Type = 3
	// Event
	Entity_EVENT Entity_Type = 4
	// Work of art
	Entity_WORK_OF_ART Entity_Type = 5
	// Consumer goods
	Entity_CONSUMER_GOOD Entity_Type = 6
	// Other types
	Entity_OTHER Entity_Type = 7
)

// Enum value maps for Entity_Type.
var (
	Entity_Type_name = map[int32]string{
		0: "UNKNOWN",
		1: "PERSON",
		2: "LOCATION",
		3: "ORGANIZATION",
		4: "EVENT",
		5: "WORK_OF_ART",
		6: "CONSUMER_GOOD",
		7: "OTHER",
	}
	Entity_Type_value = map[string]int32{
		"UNKNOWN":       0,
		"PERSON":        1,
		"LOCATION":      2,
		"ORGANIZATION":  3,
		"EVENT":         4,
		"WORK_OF_ART":   5,
		"CONSUMER_GOOD": 6,
		"OTHER":         7,
	}
)

func (x Entity_Type) Enum() *Entity_Type {
	p := new(Entity_Type)
	*p = x
	return p
}

func (x Entity_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (Entity_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[2].Descriptor()
}

func (Entity_Type) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[2]
}

func (x Entity_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use Entity_Type.Descriptor instead.
func (Entity_Type) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{2, 0}
}

// The part of speech tags enum.
type PartOfSpeech_Tag int32

const (
	// Unknown
	PartOfSpeech_UNKNOWN PartOfSpeech_Tag = 0
	// Adjective
	PartOfSpeech_ADJ PartOfSpeech_Tag = 1
	// Adposition (preposition and postposition)
	PartOfSpeech_ADP PartOfSpeech_Tag = 2
	// Adverb
	PartOfSpeech_ADV PartOfSpeech_Tag = 3
	// Conjunction
	PartOfSpeech_CONJ PartOfSpeech_Tag = 4
	// Determiner
	PartOfSpeech_DET PartOfSpeech_Tag = 5
	// Noun (common and proper)
	PartOfSpeech_NOUN PartOfSpeech_Tag = 6
	// Cardinal number
	PartOfSpeech_NUM PartOfSpeech_Tag = 7
	// Pronoun
	PartOfSpeech_PRON PartOfSpeech_Tag = 8
	// Particle or other function word
	PartOfSpeech_PRT PartOfSpeech_Tag = 9
	// Punctuation
	PartOfSpeech_PUNCT PartOfSpeech_Tag = 10
	// Verb (all tenses and modes)
	PartOfSpeech_VERB PartOfSpeech_Tag = 11
	// Other: foreign words, typos, abbreviations
	PartOfSpeech_X PartOfSpeech_Tag = 12
	// Affix
	PartOfSpeech_AFFIX PartOfSpeech_Tag = 13
)

// Enum value maps for PartOfSpeech_Tag.
var (
	PartOfSpeech_Tag_name = map[int32]string{
		0:  "UNKNOWN",
		1:  "ADJ",
		2:  "ADP",
		3:  "ADV",
		4:  "CONJ",
		5:  "DET",
		6:  "NOUN",
		7:  "NUM",
		8:  "PRON",
		9:  "PRT",
		10: "PUNCT",
		11: "VERB",
		12: "X",
		13: "AFFIX",
	}
	PartOfSpeech_Tag_value = map[string]int32{
		"UNKNOWN": 0,
		"ADJ":     1,
		"ADP":     2,
		"ADV":     3,
		"CONJ":    4,
		"DET":     5,
		"NOUN":    6,
		"NUM":     7,
		"PRON":    8,
		"PRT":     9,
		"PUNCT":   10,
		"VERB":    11,
		"X":       12,
		"AFFIX":   13,
	}
)

func (x PartOfSpeech_Tag) Enum() *PartOfSpeech_Tag {
	p := new(PartOfSpeech_Tag)
	*p = x
	return p
}

func (x PartOfSpeech_Tag) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Tag) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[3].Descriptor()
}

func (PartOfSpeech_Tag) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[3]
}

func (x PartOfSpeech_Tag) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Tag.Descriptor instead.
func (PartOfSpeech_Tag) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 0}
}

// The characteristic of a verb that expresses time flow during an event.
type PartOfSpeech_Aspect int32

const (
	// Aspect is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_ASPECT_UNKNOWN PartOfSpeech_Aspect = 0
	// Perfective
	PartOfSpeech_PERFECTIVE PartOfSpeech_Aspect = 1
	// Imperfective
	PartOfSpeech_IMPERFECTIVE PartOfSpeech_Aspect = 2
	// Progressive
	PartOfSpeech_PROGRESSIVE PartOfSpeech_Aspect = 3
)

// Enum value maps for PartOfSpeech_Aspect.
var (
	PartOfSpeech_Aspect_name = map[int32]string{
		0: "ASPECT_UNKNOWN",
		1: "PERFECTIVE",
		2: "IMPERFECTIVE",
		3: "PROGRESSIVE",
	}
	PartOfSpeech_Aspect_value = map[string]int32{
		"ASPECT_UNKNOWN": 0,
		"PERFECTIVE":     1,
		"IMPERFECTIVE":   2,
		"PROGRESSIVE":    3,
	}
)

func (x PartOfSpeech_Aspect) Enum() *PartOfSpeech_Aspect {
	p := new(PartOfSpeech_Aspect)
	*p = x
	return p
}

func (x PartOfSpeech_Aspect) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Aspect) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[4].Descriptor()
}

func (PartOfSpeech_Aspect) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[4]
}

func (x PartOfSpeech_Aspect) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Aspect.Descriptor instead.
func (PartOfSpeech_Aspect) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 1}
}

// The grammatical function performed by a noun or pronoun in a phrase,
// clause, or sentence. In some languages, other parts of speech, such as
// adjective and determiner, take case inflection in agreement with the noun.
type PartOfSpeech_Case int32

const (
	// Case is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_CASE_UNKNOWN PartOfSpeech_Case = 0
	// Accusative
	PartOfSpeech_ACCUSATIVE PartOfSpeech_Case = 1
	// Adverbial
	PartOfSpeech_ADVERBIAL PartOfSpeech_Case = 2
	// Complementive
	PartOfSpeech_COMPLEMENTIVE PartOfSpeech_Case = 3
	// Dative
	PartOfSpeech_DATIVE PartOfSpeech_Case = 4
	// Genitive
	PartOfSpeech_GENITIVE PartOfSpeech_Case = 5
	// Instrumental
	PartOfSpeech_INSTRUMENTAL PartOfSpeech_Case = 6
	// Locative
	PartOfSpeech_LOCATIVE PartOfSpeech_Case = 7
	// Nominative
	PartOfSpeech_NOMINATIVE PartOfSpeech_Case = 8
	// Oblique
	PartOfSpeech_OBLIQUE PartOfSpeech_Case = 9
	// Partitive
	PartOfSpeech_PARTITIVE PartOfSpeech_Case = 10
	// Prepositional
	PartOfSpeech_PREPOSITIONAL PartOfSpeech_Case = 11
	// Reflexive
	PartOfSpeech_REFLEXIVE_CASE PartOfSpeech_Case = 12
	// Relative
	PartOfSpeech_RELATIVE_CASE PartOfSpeech_Case = 13
	// Vocative
	PartOfSpeech_VOCATIVE PartOfSpeech_Case = 14
)

// Enum value maps for PartOfSpeech_Case.
var (
	PartOfSpeech_Case_name = map[int32]string{
		0:  "CASE_UNKNOWN",
		1:  "ACCUSATIVE",
		2:  "ADVERBIAL",
		3:  "COMPLEMENTIVE",
		4:  "DATIVE",
		5:  "GENITIVE",
		6:  "INSTRUMENTAL",
		7:  "LOCATIVE",
		8:  "NOMINATIVE",
		9:  "OBLIQUE",
		10: "PARTITIVE",
		11: "PREPOSITIONAL",
		12: "REFLEXIVE_CASE",
		13: "RELATIVE_CASE",
		14: "VOCATIVE",
	}
	PartOfSpeech_Case_value = map[string]int32{
		"CASE_UNKNOWN":   0,
		"ACCUSATIVE":     1,
		"ADVERBIAL":      2,
		"COMPLEMENTIVE":  3,
		"DATIVE":         4,
		"GENITIVE":       5,
		"INSTRUMENTAL":   6,
		"LOCATIVE":       7,
		"NOMINATIVE":     8,
		"OBLIQUE":        9,
		"PARTITIVE":      10,
		"PREPOSITIONAL":  11,
		"REFLEXIVE_CASE": 12,
		"RELATIVE_CASE":  13,
		"VOCATIVE":       14,
	}
)

func (x PartOfSpeech_Case) Enum() *PartOfSpeech_Case {
	p := new(PartOfSpeech_Case)
	*p = x
	return p
}

func (x PartOfSpeech_Case) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Case) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[5].Descriptor()
}

func (PartOfSpeech_Case) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[5]
}

func (x PartOfSpeech_Case) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Case.Descriptor instead.
func (PartOfSpeech_Case) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 2}
}

// Depending on the language, Form can be categorizing different forms of
// verbs, adjectives, adverbs, etc. For example, categorizing inflected
// endings of verbs and adjectives or distinguishing between short and long
// forms of adjectives and participles
type PartOfSpeech_Form int32

const (
	// Form is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_FORM_UNKNOWN PartOfSpeech_Form = 0
	// Adnomial
	PartOfSpeech_ADNOMIAL PartOfSpeech_Form = 1
	// Auxiliary
	PartOfSpeech_AUXILIARY PartOfSpeech_Form = 2
	// Complementizer
	PartOfSpeech_COMPLEMENTIZER PartOfSpeech_Form = 3
	// Final ending
	PartOfSpeech_FINAL_ENDING PartOfSpeech_Form = 4
	// Gerund
	PartOfSpeech_GERUND PartOfSpeech_Form = 5
	// Realis
	PartOfSpeech_REALIS PartOfSpeech_Form = 6
	// Irrealis
	PartOfSpeech_IRREALIS PartOfSpeech_Form = 7
	// Short form
	PartOfSpeech_SHORT PartOfSpeech_Form = 8
	// Long form
	PartOfSpeech_LONG PartOfSpeech_Form = 9
	// Order form
	PartOfSpeech_ORDER PartOfSpeech_Form = 10
	// Specific form
	PartOfSpeech_SPECIFIC PartOfSpeech_Form = 11
)

// Enum value maps for PartOfSpeech_Form.
var (
	PartOfSpeech_Form_name = map[int32]string{
		0:  "FORM_UNKNOWN",
		1:  "ADNOMIAL",
		2:  "AUXILIARY",
		3:  "COMPLEMENTIZER",
		4:  "FINAL_ENDING",
		5:  "GERUND",
		6:  "REALIS",
		7:  "IRREALIS",
		8:  "SHORT",
		9:  "LONG",
		10: "ORDER",
		11: "SPECIFIC",
	}
	PartOfSpeech_Form_value = map[string]int32{
		"FORM_UNKNOWN":   0,
		"ADNOMIAL":       1,
		"AUXILIARY":      2,
		"COMPLEMENTIZER": 3,
		"FINAL_ENDING":   4,
		"GERUND":         5,
		"REALIS":         6,
		"IRREALIS":       7,
		"SHORT":          8,
		"LONG":           9,
		"ORDER":          10,
		"SPECIFIC":       11,
	}
)

func (x PartOfSpeech_Form) Enum() *PartOfSpeech_Form {
	p := new(PartOfSpeech_Form)
	*p = x
	return p
}

func (x PartOfSpeech_Form) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Form) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[6].Descriptor()
}

func (PartOfSpeech_Form) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[6]
}

func (x PartOfSpeech_Form) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Form.Descriptor instead.
func (PartOfSpeech_Form) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 3}
}

// Gender classes of nouns reflected in the behaviour of associated words.
type PartOfSpeech_Gender int32

const (
	// Gender is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_GENDER_UNKNOWN PartOfSpeech_Gender = 0
	// Feminine
	PartOfSpeech_FEMININE PartOfSpeech_Gender = 1
	// Masculine
	PartOfSpeech_MASCULINE PartOfSpeech_Gender = 2
	// Neuter
	PartOfSpeech_NEUTER PartOfSpeech_Gender = 3
)

// Enum value maps for PartOfSpeech_Gender.
var (
	PartOfSpeech_Gender_name = map[int32]string{
		0: "GENDER_UNKNOWN",
		1: "FEMININE",
		2: "MASCULINE",
		3: "NEUTER",
	}
	PartOfSpeech_Gender_value = map[string]int32{
		"GENDER_UNKNOWN": 0,
		"FEMININE":       1,
		"MASCULINE":      2,
		"NEUTER":         3,
	}
)

func (x PartOfSpeech_Gender) Enum() *PartOfSpeech_Gender {
	p := new(PartOfSpeech_Gender)
	*p = x
	return p
}

func (x PartOfSpeech_Gender) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Gender) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[7].Descriptor()
}

func (PartOfSpeech_Gender) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[7]
}

func (x PartOfSpeech_Gender) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Gender.Descriptor instead.
func (PartOfSpeech_Gender) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 4}
}

// The grammatical feature of verbs, used for showing modality and attitude.
type PartOfSpeech_Mood int32

const (
	// Mood is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_MOOD_UNKNOWN PartOfSpeech_Mood = 0
	// Conditional
	PartOfSpeech_CONDITIONAL_MOOD PartOfSpeech_Mood = 1
	// Imperative
	PartOfSpeech_IMPERATIVE PartOfSpeech_Mood = 2
	// Indicative
	PartOfSpeech_INDICATIVE PartOfSpeech_Mood = 3
	// Interrogative
	PartOfSpeech_INTERROGATIVE PartOfSpeech_Mood = 4
	// Jussive
	PartOfSpeech_JUSSIVE PartOfSpeech_Mood = 5
	// Subjunctive
	PartOfSpeech_SUBJUNCTIVE PartOfSpeech_Mood = 6
)

// Enum value maps for PartOfSpeech_Mood.
var (
	PartOfSpeech_Mood_name = map[int32]string{
		0: "MOOD_UNKNOWN",
		1: "CONDITIONAL_MOOD",
		2: "IMPERATIVE",
		3: "INDICATIVE",
		4: "INTERROGATIVE",
		5: "JUSSIVE",
		6: "SUBJUNCTIVE",
	}
	PartOfSpeech_Mood_value = map[string]int32{
		"MOOD_UNKNOWN":     0,
		"CONDITIONAL_MOOD": 1,
		"IMPERATIVE":       2,
		"INDICATIVE":       3,
		"INTERROGATIVE":    4,
		"JUSSIVE":          5,
		"SUBJUNCTIVE":      6,
	}
)

func (x PartOfSpeech_Mood) Enum() *PartOfSpeech_Mood {
	p := new(PartOfSpeech_Mood)
	*p = x
	return p
}

func (x PartOfSpeech_Mood) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Mood) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[8].Descriptor()
}

func (PartOfSpeech_Mood) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[8]
}

func (x PartOfSpeech_Mood) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Mood.Descriptor instead.
func (PartOfSpeech_Mood) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 5}
}

// Count distinctions.
type PartOfSpeech_Number int32

const (
	// Number is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_NUMBER_UNKNOWN PartOfSpeech_Number = 0
	// Singular
	PartOfSpeech_SINGULAR PartOfSpeech_Number = 1
	// Plural
	PartOfSpeech_PLURAL PartOfSpeech_Number = 2
	// Dual
	PartOfSpeech_DUAL PartOfSpeech_Number = 3
)

// Enum value maps for PartOfSpeech_Number.
var (
	PartOfSpeech_Number_name = map[int32]string{
		0: "NUMBER_UNKNOWN",
		1: "SINGULAR",
		2: "PLURAL",
		3: "DUAL",
	}
	PartOfSpeech_Number_value = map[string]int32{
		"NUMBER_UNKNOWN": 0,
		"SINGULAR":       1,
		"PLURAL":         2,
		"DUAL":           3,
	}
)

func (x PartOfSpeech_Number) Enum() *PartOfSpeech_Number {
	p := new(PartOfSpeech_Number)
	*p = x
	return p
}

func (x PartOfSpeech_Number) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Number) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[9].Descriptor()
}

func (PartOfSpeech_Number) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[9]
}

func (x PartOfSpeech_Number) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Number.Descriptor instead.
func (PartOfSpeech_Number) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 6}
}

// The distinction between the speaker, second person, third person, etc.
type PartOfSpeech_Person int32

const (
	// Person is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_PERSON_UNKNOWN PartOfSpeech_Person = 0
	// First
	PartOfSpeech_FIRST PartOfSpeech_Person = 1
	// Second
	PartOfSpeech_SECOND PartOfSpeech_Person = 2
	// Third
	PartOfSpeech_THIRD PartOfSpeech_Person = 3
	// Reflexive
	PartOfSpeech_REFLEXIVE_PERSON PartOfSpeech_Person = 4
)

// Enum value maps for PartOfSpeech_Person.
var (
	PartOfSpeech_Person_name = map[int32]string{
		0: "PERSON_UNKNOWN",
		1: "FIRST",
		2: "SECOND",
		3: "THIRD",
		4: "REFLEXIVE_PERSON",
	}
	PartOfSpeech_Person_value = map[string]int32{
		"PERSON_UNKNOWN":   0,
		"FIRST":            1,
		"SECOND":           2,
		"THIRD":            3,
		"REFLEXIVE_PERSON": 4,
	}
)

func (x PartOfSpeech_Person) Enum() *PartOfSpeech_Person {
	p := new(PartOfSpeech_Person)
	*p = x
	return p
}

func (x PartOfSpeech_Person) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Person) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[10].Descriptor()
}

func (PartOfSpeech_Person) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[10]
}

func (x PartOfSpeech_Person) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Person.Descriptor instead.
func (PartOfSpeech_Person) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 7}
}

// This category shows if the token is part of a proper name.
type PartOfSpeech_Proper int32

const (
	// Proper is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_PROPER_UNKNOWN PartOfSpeech_Proper = 0
	// Proper
	PartOfSpeech_PROPER PartOfSpeech_Proper = 1
	// Not proper
	PartOfSpeech_NOT_PROPER PartOfSpeech_Proper = 2
)

// Enum value maps for PartOfSpeech_Proper.
var (
	PartOfSpeech_Proper_name = map[int32]string{
		0: "PROPER_UNKNOWN",
		1: "PROPER",
		2: "NOT_PROPER",
	}
	PartOfSpeech_Proper_value = map[string]int32{
		"PROPER_UNKNOWN": 0,
		"PROPER":         1,
		"NOT_PROPER":     2,
	}
)

func (x PartOfSpeech_Proper) Enum() *PartOfSpeech_Proper {
	p := new(PartOfSpeech_Proper)
	*p = x
	return p
}

func (x PartOfSpeech_Proper) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Proper) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[11].Descriptor()
}

func (PartOfSpeech_Proper) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[11]
}

func (x PartOfSpeech_Proper) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Proper.Descriptor instead.
func (PartOfSpeech_Proper) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 8}
}

// Reciprocal features of a pronoun.
type PartOfSpeech_Reciprocity int32

const (
	// Reciprocity is not applicable in the analyzed language or is not
	// predicted.
	PartOfSpeech_RECIPROCITY_UNKNOWN PartOfSpeech_Reciprocity = 0
	// Reciprocal
	PartOfSpeech_RECIPROCAL PartOfSpeech_Reciprocity = 1
	// Non-reciprocal
	PartOfSpeech_NON_RECIPROCAL PartOfSpeech_Reciprocity = 2
)

// Enum value maps for PartOfSpeech_Reciprocity.
var (
	PartOfSpeech_Reciprocity_name = map[int32]string{
		0: "RECIPROCITY_UNKNOWN",
		1: "RECIPROCAL",
		2: "NON_RECIPROCAL",
	}
	PartOfSpeech_Reciprocity_value = map[string]int32{
		"RECIPROCITY_UNKNOWN": 0,
		"RECIPROCAL":          1,
		"NON_RECIPROCAL":      2,
	}
)

func (x PartOfSpeech_Reciprocity) Enum() *PartOfSpeech_Reciprocity {
	p := new(PartOfSpeech_Reciprocity)
	*p = x
	return p
}

func (x PartOfSpeech_Reciprocity) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Reciprocity) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[12].Descriptor()
}

func (PartOfSpeech_Reciprocity) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[12]
}

func (x PartOfSpeech_Reciprocity) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Reciprocity.Descriptor instead.
func (PartOfSpeech_Reciprocity) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 9}
}

// Time reference.
type PartOfSpeech_Tense int32

const (
	// Tense is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_TENSE_UNKNOWN PartOfSpeech_Tense = 0
	// Conditional
	PartOfSpeech_CONDITIONAL_TENSE PartOfSpeech_Tense = 1
	// Future
	PartOfSpeech_FUTURE PartOfSpeech_Tense = 2
	// Past
	PartOfSpeech_PAST PartOfSpeech_Tense = 3
	// Present
	PartOfSpeech_PRESENT PartOfSpeech_Tense = 4
	// Imperfect
	PartOfSpeech_IMPERFECT PartOfSpeech_Tense = 5
	// Pluperfect
	PartOfSpeech_PLUPERFECT PartOfSpeech_Tense = 6
)

// Enum value maps for PartOfSpeech_Tense.
var (
	PartOfSpeech_Tense_name = map[int32]string{
		0: "TENSE_UNKNOWN",
		1: "CONDITIONAL_TENSE",
		2: "FUTURE",
		3: "PAST",
		4: "PRESENT",
		5: "IMPERFECT",
		6: "PLUPERFECT",
	}
	PartOfSpeech_Tense_value = map[string]int32{
		"TENSE_UNKNOWN":     0,
		"CONDITIONAL_TENSE": 1,
		"FUTURE":            2,
		"PAST":              3,
		"PRESENT":           4,
		"IMPERFECT":         5,
		"PLUPERFECT":        6,
	}
)

func (x PartOfSpeech_Tense) Enum() *PartOfSpeech_Tense {
	p := new(PartOfSpeech_Tense)
	*p = x
	return p
}

func (x PartOfSpeech_Tense) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Tense) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[13].Descriptor()
}

func (PartOfSpeech_Tense) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[13]
}

func (x PartOfSpeech_Tense) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Tense.Descriptor instead.
func (PartOfSpeech_Tense) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 10}
}

// The relationship between the action that a verb expresses and the
// participants identified by its arguments.
type PartOfSpeech_Voice int32

const (
	// Voice is not applicable in the analyzed language or is not predicted.
	PartOfSpeech_VOICE_UNKNOWN PartOfSpeech_Voice = 0
	// Active
	PartOfSpeech_ACTIVE PartOfSpeech_Voice = 1
	// Causative
	PartOfSpeech_CAUSATIVE PartOfSpeech_Voice = 2
	// Passive
	PartOfSpeech_PASSIVE PartOfSpeech_Voice = 3
)

// Enum value maps for PartOfSpeech_Voice.
var (
	PartOfSpeech_Voice_name = map[int32]string{
		0: "VOICE_UNKNOWN",
		1: "ACTIVE",
		2: "CAUSATIVE",
		3: "PASSIVE",
	}
	PartOfSpeech_Voice_value = map[string]int32{
		"VOICE_UNKNOWN": 0,
		"ACTIVE":        1,
		"CAUSATIVE":     2,
		"PASSIVE":       3,
	}
)

func (x PartOfSpeech_Voice) Enum() *PartOfSpeech_Voice {
	p := new(PartOfSpeech_Voice)
	*p = x
	return p
}

func (x PartOfSpeech_Voice) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (PartOfSpeech_Voice) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[14].Descriptor()
}

func (PartOfSpeech_Voice) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[14]
}

func (x PartOfSpeech_Voice) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use PartOfSpeech_Voice.Descriptor instead.
func (PartOfSpeech_Voice) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5, 11}
}

// The parse label enum for the token.
type DependencyEdge_Label int32

const (
	// Unknown
	DependencyEdge_UNKNOWN DependencyEdge_Label = 0
	// Abbreviation modifier
	DependencyEdge_ABBREV DependencyEdge_Label = 1
	// Adjectival complement
	DependencyEdge_ACOMP DependencyEdge_Label = 2
	// Adverbial clause modifier
	DependencyEdge_ADVCL DependencyEdge_Label = 3
	// Adverbial modifier
	DependencyEdge_ADVMOD DependencyEdge_Label = 4
	// Adjectival modifier of an NP
	DependencyEdge_AMOD DependencyEdge_Label = 5
	// Appositional modifier of an NP
	DependencyEdge_APPOS DependencyEdge_Label = 6
	// Attribute dependent of a copular verb
	DependencyEdge_ATTR DependencyEdge_Label = 7
	// Auxiliary (non-main) verb
	DependencyEdge_AUX DependencyEdge_Label = 8
	// Passive auxiliary
	DependencyEdge_AUXPASS DependencyEdge_Label = 9
	// Coordinating conjunction
	DependencyEdge_CC DependencyEdge_Label = 10
	// Clausal complement of a verb or adjective
	DependencyEdge_CCOMP DependencyEdge_Label = 11
	// Conjunct
	DependencyEdge_CONJ DependencyEdge_Label = 12
	// Clausal subject
	DependencyEdge_CSUBJ DependencyEdge_Label = 13
	// Clausal passive subject
	DependencyEdge_CSUBJPASS DependencyEdge_Label = 14
	// Dependency (unable to determine)
	DependencyEdge_DEP DependencyEdge_Label = 15
	// Determiner
	DependencyEdge_DET DependencyEdge_Label = 16
	// Discourse
	DependencyEdge_DISCOURSE DependencyEdge_Label = 17
	// Direct object
	DependencyEdge_DOBJ DependencyEdge_Label = 18
	// Expletive
	DependencyEdge_EXPL DependencyEdge_Label = 19
	// Goes with (part of a word in a text not well edited)
	DependencyEdge_GOESWITH DependencyEdge_Label = 20
	// Indirect object
	DependencyEdge_IOBJ DependencyEdge_Label = 21
	// Marker (word introducing a subordinate clause)
	DependencyEdge_MARK DependencyEdge_Label = 22
	// Multi-word expression
	DependencyEdge_MWE DependencyEdge_Label = 23
	// Multi-word verbal expression
	DependencyEdge_MWV DependencyEdge_Label = 24
	// Negation modifier
	DependencyEdge_NEG DependencyEdge_Label = 25
	// Noun compound modifier
	DependencyEdge_NN DependencyEdge_Label = 26
	// Noun phrase used as an adverbial modifier
	DependencyEdge_NPADVMOD DependencyEdge_Label = 27
	// Nominal subject
	DependencyEdge_NSUBJ DependencyEdge_Label = 28
	// Passive nominal subject
	DependencyEdge_NSUBJPASS DependencyEdge_Label = 29
	// Numeric modifier of a noun
	DependencyEdge_NUM DependencyEdge_Label = 30
	// Element of compound number
	DependencyEdge_NUMBER DependencyEdge_Label = 31
	// Punctuation mark
	DependencyEdge_P DependencyEdge_Label = 32
	// Parataxis relation
	DependencyEdge_PARATAXIS DependencyEdge_Label = 33
	// Participial modifier
	DependencyEdge_PARTMOD DependencyEdge_Label = 34
	// The complement of a preposition is a clause
	DependencyEdge_PCOMP DependencyEdge_Label = 35
	// Object of a preposition
	DependencyEdge_POBJ DependencyEdge_Label = 36
	// Possession modifier
	DependencyEdge_POSS DependencyEdge_Label = 37
	// Postverbal negative particle
	DependencyEdge_POSTNEG DependencyEdge_Label = 38
	// Predicate complement
	DependencyEdge_PRECOMP DependencyEdge_Label = 39
	// Preconjunt
	DependencyEdge_PRECONJ DependencyEdge_Label = 40
	// Predeterminer
	DependencyEdge_PREDET DependencyEdge_Label = 41
	// Prefix
	DependencyEdge_PREF DependencyEdge_Label = 42
	// Prepositional modifier
	DependencyEdge_PREP DependencyEdge_Label = 43
	// The relationship between a verb and verbal morpheme
	DependencyEdge_PRONL DependencyEdge_Label = 44
	// Particle
	DependencyEdge_PRT DependencyEdge_Label = 45
	// Associative or possessive marker
	DependencyEdge_PS DependencyEdge_Label = 46
	// Quantifier phrase modifier
	DependencyEdge_QUANTMOD DependencyEdge_Label = 47
	// Relative clause modifier
	DependencyEdge_RCMOD DependencyEdge_Label = 48
	// Complementizer in relative clause
	DependencyEdge_RCMODREL DependencyEdge_Label = 49
	// Ellipsis without a preceding predicate
	DependencyEdge_RDROP DependencyEdge_Label = 50
	// Referent
	DependencyEdge_REF DependencyEdge_Label = 51
	// Remnant
	DependencyEdge_REMNANT DependencyEdge_Label = 52
	// Reparandum
	DependencyEdge_REPARANDUM DependencyEdge_Label = 53
	// Root
	DependencyEdge_ROOT DependencyEdge_Label = 54
	// Suffix specifying a unit of number
	DependencyEdge_SNUM DependencyEdge_Label = 55
	// Suffix
	DependencyEdge_SUFF DependencyEdge_Label = 56
	// Temporal modifier
	DependencyEdge_TMOD DependencyEdge_Label = 57
	// Topic marker
	DependencyEdge_TOPIC DependencyEdge_Label = 58
	// Clause headed by an infinite form of the verb that modifies a noun
	DependencyEdge_VMOD DependencyEdge_Label = 59
	// Vocative
	DependencyEdge_VOCATIVE DependencyEdge_Label = 60
	// Open clausal complement
	DependencyEdge_XCOMP DependencyEdge_Label = 61
	// Name suffix
	DependencyEdge_SUFFIX DependencyEdge_Label = 62
	// Name title
	DependencyEdge_TITLE DependencyEdge_Label = 63
	// Adverbial phrase modifier
	DependencyEdge_ADVPHMOD DependencyEdge_Label = 64
	// Causative auxiliary
	DependencyEdge_AUXCAUS DependencyEdge_Label = 65
	// Helper auxiliary
	DependencyEdge_AUXVV DependencyEdge_Label = 66
	// Rentaishi (Prenominal modifier)
	DependencyEdge_DTMOD DependencyEdge_Label = 67
	// Foreign words
	DependencyEdge_FOREIGN DependencyEdge_Label = 68
	// Keyword
	DependencyEdge_KW DependencyEdge_Label = 69
	// List for chains of comparable items
	DependencyEdge_LIST DependencyEdge_Label = 70
	// Nominalized clause
	DependencyEdge_NOMC DependencyEdge_Label = 71
	// Nominalized clausal subject
	DependencyEdge_NOMCSUBJ DependencyEdge_Label = 72
	// Nominalized clausal passive
	DependencyEdge_NOMCSUBJPASS DependencyEdge_Label = 73
	// Compound of numeric modifier
	DependencyEdge_NUMC DependencyEdge_Label = 74
	// Copula
	DependencyEdge_COP DependencyEdge_Label = 75
	// Dislocated relation (for fronted/topicalized elements)
	DependencyEdge_DISLOCATED DependencyEdge_Label = 76
)

// Enum value maps for DependencyEdge_Label.
var (
	DependencyEdge_Label_name = map[int32]string{
		0:  "UNKNOWN",
		1:  "ABBREV",
		2:  "ACOMP",
		3:  "ADVCL",
		4:  "ADVMOD",
		5:  "AMOD",
		6:  "APPOS",
		7:  "ATTR",
		8:  "AUX",
		9:  "AUXPASS",
		10: "CC",
		11: "CCOMP",
		12: "CONJ",
		13: "CSUBJ",
		14: "CSUBJPASS",
		15: "DEP",
		16: "DET",
		17: "DISCOURSE",
		18: "DOBJ",
		19: "EXPL",
		20: "GOESWITH",
		21: "IOBJ",
		22: "MARK",
		23: "MWE",
		24: "MWV",
		25: "NEG",
		26: "NN",
		27: "NPADVMOD",
		28: "NSUBJ",
		29: "NSUBJPASS",
		30: "NUM",
		31: "NUMBER",
		32: "P",
		33: "PARATAXIS",
		34: "PARTMOD",
		35: "PCOMP",
		36: "POBJ",
		37: "POSS",
		38: "POSTNEG",
		39: "PRECOMP",
		40: "PRECONJ",
		41: "PREDET",
		42: "PREF",
		43: "PREP",
		44: "PRONL",
		45: "PRT",
		46: "PS",
		47: "QUANTMOD",
		48: "RCMOD",
		49: "RCMODREL",
		50: "RDROP",
		51: "REF",
		52: "REMNANT",
		53: "REPARANDUM",
		54: "ROOT",
		55: "SNUM",
		56: "SUFF",
		57: "TMOD",
		58: "TOPIC",
		59: "VMOD",
		60: "VOCATIVE",
		61: "XCOMP",
		62: "SUFFIX",
		63: "TITLE",
		64: "ADVPHMOD",
		65: "AUXCAUS",
		66: "AUXVV",
		67: "DTMOD",
		68: "FOREIGN",
		69: "KW",
		70: "LIST",
		71: "NOMC",
		72: "NOMCSUBJ",
		73: "NOMCSUBJPASS",
		74: "NUMC",
		75: "COP",
		76: "DISLOCATED",
	}
	DependencyEdge_Label_value = map[string]int32{
		"UNKNOWN":      0,
		"ABBREV":       1,
		"ACOMP":        2,
		"ADVCL":        3,
		"ADVMOD":       4,
		"AMOD":         5,
		"APPOS":        6,
		"ATTR":         7,
		"AUX":          8,
		"AUXPASS":      9,
		"CC":           10,
		"CCOMP":        11,
		"CONJ":         12,
		"CSUBJ":        13,
		"CSUBJPASS":    14,
		"DEP":          15,
		"DET":          16,
		"DISCOURSE":    17,
		"DOBJ":         18,
		"EXPL":         19,
		"GOESWITH":     20,
		"IOBJ":         21,
		"MARK":         22,
		"MWE":          23,
		"MWV":          24,
		"NEG":          25,
		"NN":           26,
		"NPADVMOD":     27,
		"NSUBJ":        28,
		"NSUBJPASS":    29,
		"NUM":          30,
		"NUMBER":       31,
		"P":            32,
		"PARATAXIS":    33,
		"PARTMOD":      34,
		"PCOMP":        35,
		"POBJ":         36,
		"POSS":         37,
		"POSTNEG":      38,
		"PRECOMP":      39,
		"PRECONJ":      40,
		"PREDET":       41,
		"PREF":         42,
		"PREP":         43,
		"PRONL":        44,
		"PRT":          45,
		"PS":           46,
		"QUANTMOD":     47,
		"RCMOD":        48,
		"RCMODREL":     49,
		"RDROP":        50,
		"REF":          51,
		"REMNANT":      52,
		"REPARANDUM":   53,
		"ROOT":         54,
		"SNUM":         55,
		"SUFF":         56,
		"TMOD":         57,
		"TOPIC":        58,
		"VMOD":         59,
		"VOCATIVE":     60,
		"XCOMP":        61,
		"SUFFIX":       62,
		"TITLE":        63,
		"ADVPHMOD":     64,
		"AUXCAUS":      65,
		"AUXVV":        66,
		"DTMOD":        67,
		"FOREIGN":      68,
		"KW":           69,
		"LIST":         70,
		"NOMC":         71,
		"NOMCSUBJ":     72,
		"NOMCSUBJPASS": 73,
		"NUMC":         74,
		"COP":          75,
		"DISLOCATED":   76,
	}
)

func (x DependencyEdge_Label) Enum() *DependencyEdge_Label {
	p := new(DependencyEdge_Label)
	*p = x
	return p
}

func (x DependencyEdge_Label) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (DependencyEdge_Label) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[15].Descriptor()
}

func (DependencyEdge_Label) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[15]
}

func (x DependencyEdge_Label) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use DependencyEdge_Label.Descriptor instead.
func (DependencyEdge_Label) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{6, 0}
}

// The supported types of mentions.
type EntityMention_Type int32

const (
	// Unknown
	EntityMention_TYPE_UNKNOWN EntityMention_Type = 0
	// Proper name
	EntityMention_PROPER EntityMention_Type = 1
	// Common noun (or noun compound)
	EntityMention_COMMON EntityMention_Type = 2
)

// Enum value maps for EntityMention_Type.
var (
	EntityMention_Type_name = map[int32]string{
		0: "TYPE_UNKNOWN",
		1: "PROPER",
		2: "COMMON",
	}
	EntityMention_Type_value = map[string]int32{
		"TYPE_UNKNOWN": 0,
		"PROPER":       1,
		"COMMON":       2,
	}
)

func (x EntityMention_Type) Enum() *EntityMention_Type {
	p := new(EntityMention_Type)
	*p = x
	return p
}

func (x EntityMention_Type) String() string {
	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}

func (EntityMention_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_google_cloud_language_v1beta1_language_service_proto_enumTypes[16].Descriptor()
}

func (EntityMention_Type) Type() protoreflect.EnumType {
	return &file_google_cloud_language_v1beta1_language_service_proto_enumTypes[16]
}

func (x EntityMention_Type) Number() protoreflect.EnumNumber {
	return protoreflect.EnumNumber(x)
}

// Deprecated: Use EntityMention_Type.Descriptor instead.
func (EntityMention_Type) EnumDescriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{7, 0}
}

// ################################################################ #
//
// Represents the input to API methods.
type Document struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Required. If the type is not set or is `TYPE_UNSPECIFIED`,
	// returns an `INVALID_ARGUMENT` error.
	Type Document_Type `protobuf:"varint,1,opt,name=type,proto3,enum=google.cloud.language.v1beta1.Document_Type" json:"type,omitempty"`
	// The source of the document: a string containing the content or a
	// Google Cloud Storage URI.
	//
	// Types that are assignable to Source:
	//	*Document_Content
	//	*Document_GcsContentUri
	Source isDocument_Source `protobuf_oneof:"source"`
	// The language of the document (if not specified, the language is
	// automatically detected). Both ISO and BCP-47 language codes are
	// accepted.<br>
	// [Language
	// Support](https://cloud.google.com/natural-language/docs/languages) lists
	// currently supported languages for each API method. If the language (either
	// specified by the caller or automatically detected) is not supported by the
	// called API method, an `INVALID_ARGUMENT` error is returned.
	Language string `protobuf:"bytes,4,opt,name=language,proto3" json:"language,omitempty"`
}

func (x *Document) Reset() {
	*x = Document{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Document) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Document) ProtoMessage() {}

func (x *Document) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 Document.ProtoReflect.Descriptor instead.
func (*Document) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{0}
}

func (x *Document) GetType() Document_Type {
	if x != nil {
		return x.Type
	}
	return Document_TYPE_UNSPECIFIED
}

func (m *Document) GetSource() isDocument_Source {
	if m != nil {
		return m.Source
	}
	return nil
}

func (x *Document) GetContent() string {
	if x, ok := x.GetSource().(*Document_Content); ok {
		return x.Content
	}
	return ""
}

func (x *Document) GetGcsContentUri() string {
	if x, ok := x.GetSource().(*Document_GcsContentUri); ok {
		return x.GcsContentUri
	}
	return ""
}

func (x *Document) GetLanguage() string {
	if x != nil {
		return x.Language
	}
	return ""
}

type isDocument_Source interface {
	isDocument_Source()
}

type Document_Content struct {
	// The content of the input in string format.
	Content string `protobuf:"bytes,2,opt,name=content,proto3,oneof"`
}

type Document_GcsContentUri struct {
	// The Google Cloud Storage URI where the file content is located.
	// This URI must be of the form: gs://bucket_name/object_name. For more
	// details, see https://cloud.google.com/storage/docs/reference-uris.
	// NOTE: Cloud Storage object versioning is not supported.
	GcsContentUri string `protobuf:"bytes,3,opt,name=gcs_content_uri,json=gcsContentUri,proto3,oneof"`
}

func (*Document_Content) isDocument_Source() {}

func (*Document_GcsContentUri) isDocument_Source() {}

// Represents a sentence in the input document.
type Sentence struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The sentence text.
	Text *TextSpan `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// For calls to [AnalyzeSentiment][] or if
	// [AnnotateTextRequest.Features.extract_document_sentiment][google.cloud.language.v1beta1.AnnotateTextRequest.Features.extract_document_sentiment]
	// is set to true, this field will contain the sentiment for the sentence.
	Sentiment *Sentiment `protobuf:"bytes,2,opt,name=sentiment,proto3" json:"sentiment,omitempty"`
}

func (x *Sentence) Reset() {
	*x = Sentence{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[1]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Sentence) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Sentence) ProtoMessage() {}

func (x *Sentence) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 Sentence.ProtoReflect.Descriptor instead.
func (*Sentence) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{1}
}

func (x *Sentence) GetText() *TextSpan {
	if x != nil {
		return x.Text
	}
	return nil
}

func (x *Sentence) GetSentiment() *Sentiment {
	if x != nil {
		return x.Sentiment
	}
	return nil
}

// Represents a phrase in the text that is a known entity, such as
// a person, an organization, or location. The API associates information, such
// as salience and mentions, with entities.
type Entity struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The representative name for the entity.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The entity type.
	Type Entity_Type `protobuf:"varint,2,opt,name=type,proto3,enum=google.cloud.language.v1beta1.Entity_Type" json:"type,omitempty"`
	// Metadata associated with the entity.
	//
	// Currently, Wikipedia URLs and Knowledge Graph MIDs are provided, if
	// available. The associated keys are "wikipedia_url" and "mid", respectively.
	Metadata map[string]string `protobuf:"bytes,3,rep,name=metadata,proto3" json:"metadata,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
	// The salience score associated with the entity in the [0, 1.0] range.
	//
	// The salience score for an entity provides information about the
	// importance or centrality of that entity to the entire document text.
	// Scores closer to 0 are less salient, while scores closer to 1.0 are highly
	// salient.
	Salience float32 `protobuf:"fixed32,4,opt,name=salience,proto3" json:"salience,omitempty"`
	// The mentions of this entity in the input document. The API currently
	// supports proper noun mentions.
	Mentions []*EntityMention `protobuf:"bytes,5,rep,name=mentions,proto3" json:"mentions,omitempty"`
}

func (x *Entity) Reset() {
	*x = Entity{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[2]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Entity) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Entity) ProtoMessage() {}

func (x *Entity) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 Entity.ProtoReflect.Descriptor instead.
func (*Entity) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{2}
}

func (x *Entity) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *Entity) GetType() Entity_Type {
	if x != nil {
		return x.Type
	}
	return Entity_UNKNOWN
}

func (x *Entity) GetMetadata() map[string]string {
	if x != nil {
		return x.Metadata
	}
	return nil
}

func (x *Entity) GetSalience() float32 {
	if x != nil {
		return x.Salience
	}
	return 0
}

func (x *Entity) GetMentions() []*EntityMention {
	if x != nil {
		return x.Mentions
	}
	return nil
}

// Represents the smallest syntactic building block of the text.
type Token struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The token text.
	Text *TextSpan `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// Parts of speech tag for this token.
	PartOfSpeech *PartOfSpeech `protobuf:"bytes,2,opt,name=part_of_speech,json=partOfSpeech,proto3" json:"part_of_speech,omitempty"`
	// Dependency tree parse for this token.
	DependencyEdge *DependencyEdge `protobuf:"bytes,3,opt,name=dependency_edge,json=dependencyEdge,proto3" json:"dependency_edge,omitempty"`
	// [Lemma](https://en.wikipedia.org/wiki/Lemma_%28morphology%29) of the token.
	Lemma string `protobuf:"bytes,4,opt,name=lemma,proto3" json:"lemma,omitempty"`
}

func (x *Token) Reset() {
	*x = Token{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[3]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Token) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Token) ProtoMessage() {}

func (x *Token) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 Token.ProtoReflect.Descriptor instead.
func (*Token) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{3}
}

func (x *Token) GetText() *TextSpan {
	if x != nil {
		return x.Text
	}
	return nil
}

func (x *Token) GetPartOfSpeech() *PartOfSpeech {
	if x != nil {
		return x.PartOfSpeech
	}
	return nil
}

func (x *Token) GetDependencyEdge() *DependencyEdge {
	if x != nil {
		return x.DependencyEdge
	}
	return nil
}

func (x *Token) GetLemma() string {
	if x != nil {
		return x.Lemma
	}
	return ""
}

// Represents the feeling associated with the entire text or entities in
// the text.
type Sentiment struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// DEPRECATED FIELD - This field is being deprecated in
	// favor of score. Please refer to our documentation at
	// https://cloud.google.com/natural-language/docs for more information.
	Polarity float32 `protobuf:"fixed32,1,opt,name=polarity,proto3" json:"polarity,omitempty"`
	// A non-negative number in the [0, +inf) range, which represents
	// the absolute magnitude of sentiment regardless of score (positive or
	// negative).
	Magnitude float32 `protobuf:"fixed32,2,opt,name=magnitude,proto3" json:"magnitude,omitempty"`
	// Sentiment score between -1.0 (negative sentiment) and 1.0
	// (positive sentiment).
	Score float32 `protobuf:"fixed32,3,opt,name=score,proto3" json:"score,omitempty"`
}

func (x *Sentiment) Reset() {
	*x = Sentiment{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[4]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *Sentiment) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*Sentiment) ProtoMessage() {}

func (x *Sentiment) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 Sentiment.ProtoReflect.Descriptor instead.
func (*Sentiment) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{4}
}

func (x *Sentiment) GetPolarity() float32 {
	if x != nil {
		return x.Polarity
	}
	return 0
}

func (x *Sentiment) GetMagnitude() float32 {
	if x != nil {
		return x.Magnitude
	}
	return 0
}

func (x *Sentiment) GetScore() float32 {
	if x != nil {
		return x.Score
	}
	return 0
}

// Represents part of speech information for a token.
type PartOfSpeech struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The part of speech tag.
	Tag PartOfSpeech_Tag `protobuf:"varint,1,opt,name=tag,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Tag" json:"tag,omitempty"`
	// The grammatical aspect.
	Aspect PartOfSpeech_Aspect `protobuf:"varint,2,opt,name=aspect,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Aspect" json:"aspect,omitempty"`
	// The grammatical case.
	Case PartOfSpeech_Case `protobuf:"varint,3,opt,name=case,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Case" json:"case,omitempty"`
	// The grammatical form.
	Form PartOfSpeech_Form `protobuf:"varint,4,opt,name=form,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Form" json:"form,omitempty"`
	// The grammatical gender.
	Gender PartOfSpeech_Gender `protobuf:"varint,5,opt,name=gender,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Gender" json:"gender,omitempty"`
	// The grammatical mood.
	Mood PartOfSpeech_Mood `protobuf:"varint,6,opt,name=mood,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Mood" json:"mood,omitempty"`
	// The grammatical number.
	Number PartOfSpeech_Number `protobuf:"varint,7,opt,name=number,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Number" json:"number,omitempty"`
	// The grammatical person.
	Person PartOfSpeech_Person `protobuf:"varint,8,opt,name=person,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Person" json:"person,omitempty"`
	// The grammatical properness.
	Proper PartOfSpeech_Proper `protobuf:"varint,9,opt,name=proper,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Proper" json:"proper,omitempty"`
	// The grammatical reciprocity.
	Reciprocity PartOfSpeech_Reciprocity `protobuf:"varint,10,opt,name=reciprocity,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Reciprocity" json:"reciprocity,omitempty"`
	// The grammatical tense.
	Tense PartOfSpeech_Tense `protobuf:"varint,11,opt,name=tense,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Tense" json:"tense,omitempty"`
	// The grammatical voice.
	Voice PartOfSpeech_Voice `protobuf:"varint,12,opt,name=voice,proto3,enum=google.cloud.language.v1beta1.PartOfSpeech_Voice" json:"voice,omitempty"`
}

func (x *PartOfSpeech) Reset() {
	*x = PartOfSpeech{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[5]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *PartOfSpeech) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*PartOfSpeech) ProtoMessage() {}

func (x *PartOfSpeech) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 PartOfSpeech.ProtoReflect.Descriptor instead.
func (*PartOfSpeech) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{5}
}

func (x *PartOfSpeech) GetTag() PartOfSpeech_Tag {
	if x != nil {
		return x.Tag
	}
	return PartOfSpeech_UNKNOWN
}

func (x *PartOfSpeech) GetAspect() PartOfSpeech_Aspect {
	if x != nil {
		return x.Aspect
	}
	return PartOfSpeech_ASPECT_UNKNOWN
}

func (x *PartOfSpeech) GetCase() PartOfSpeech_Case {
	if x != nil {
		return x.Case
	}
	return PartOfSpeech_CASE_UNKNOWN
}

func (x *PartOfSpeech) GetForm() PartOfSpeech_Form {
	if x != nil {
		return x.Form
	}
	return PartOfSpeech_FORM_UNKNOWN
}

func (x *PartOfSpeech) GetGender() PartOfSpeech_Gender {
	if x != nil {
		return x.Gender
	}
	return PartOfSpeech_GENDER_UNKNOWN
}

func (x *PartOfSpeech) GetMood() PartOfSpeech_Mood {
	if x != nil {
		return x.Mood
	}
	return PartOfSpeech_MOOD_UNKNOWN
}

func (x *PartOfSpeech) GetNumber() PartOfSpeech_Number {
	if x != nil {
		return x.Number
	}
	return PartOfSpeech_NUMBER_UNKNOWN
}

func (x *PartOfSpeech) GetPerson() PartOfSpeech_Person {
	if x != nil {
		return x.Person
	}
	return PartOfSpeech_PERSON_UNKNOWN
}

func (x *PartOfSpeech) GetProper() PartOfSpeech_Proper {
	if x != nil {
		return x.Proper
	}
	return PartOfSpeech_PROPER_UNKNOWN
}

func (x *PartOfSpeech) GetReciprocity() PartOfSpeech_Reciprocity {
	if x != nil {
		return x.Reciprocity
	}
	return PartOfSpeech_RECIPROCITY_UNKNOWN
}

func (x *PartOfSpeech) GetTense() PartOfSpeech_Tense {
	if x != nil {
		return x.Tense
	}
	return PartOfSpeech_TENSE_UNKNOWN
}

func (x *PartOfSpeech) GetVoice() PartOfSpeech_Voice {
	if x != nil {
		return x.Voice
	}
	return PartOfSpeech_VOICE_UNKNOWN
}

// Represents dependency parse tree information for a token.
type DependencyEdge struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Represents the head of this token in the dependency tree.
	// This is the index of the token which has an arc going to this token.
	// The index is the position of the token in the array of tokens returned
	// by the API method. If this token is a root token, then the
	// `head_token_index` is its own index.
	HeadTokenIndex int32 `protobuf:"varint,1,opt,name=head_token_index,json=headTokenIndex,proto3" json:"head_token_index,omitempty"`
	// The parse label for the token.
	Label DependencyEdge_Label `protobuf:"varint,2,opt,name=label,proto3,enum=google.cloud.language.v1beta1.DependencyEdge_Label" json:"label,omitempty"`
}

func (x *DependencyEdge) Reset() {
	*x = DependencyEdge{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[6]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *DependencyEdge) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*DependencyEdge) ProtoMessage() {}

func (x *DependencyEdge) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 DependencyEdge.ProtoReflect.Descriptor instead.
func (*DependencyEdge) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{6}
}

func (x *DependencyEdge) GetHeadTokenIndex() int32 {
	if x != nil {
		return x.HeadTokenIndex
	}
	return 0
}

func (x *DependencyEdge) GetLabel() DependencyEdge_Label {
	if x != nil {
		return x.Label
	}
	return DependencyEdge_UNKNOWN
}

// Represents a mention for an entity in the text. Currently, proper noun
// mentions are supported.
type EntityMention struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The mention text.
	Text *TextSpan `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	// The type of the entity mention.
	Type EntityMention_Type `protobuf:"varint,2,opt,name=type,proto3,enum=google.cloud.language.v1beta1.EntityMention_Type" json:"type,omitempty"`
}

func (x *EntityMention) Reset() {
	*x = EntityMention{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[7]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *EntityMention) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*EntityMention) ProtoMessage() {}

func (x *EntityMention) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 EntityMention.ProtoReflect.Descriptor instead.
func (*EntityMention) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{7}
}

func (x *EntityMention) GetText() *TextSpan {
	if x != nil {
		return x.Text
	}
	return nil
}

func (x *EntityMention) GetType() EntityMention_Type {
	if x != nil {
		return x.Type
	}
	return EntityMention_TYPE_UNKNOWN
}

// Represents an output piece of text.
type TextSpan struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The content of the output text.
	Content string `protobuf:"bytes,1,opt,name=content,proto3" json:"content,omitempty"`
	// The API calculates the beginning offset of the content in the original
	// document according to the
	// [EncodingType][google.cloud.language.v1beta1.EncodingType] specified in the
	// API request.
	BeginOffset int32 `protobuf:"varint,2,opt,name=begin_offset,json=beginOffset,proto3" json:"begin_offset,omitempty"`
}

func (x *TextSpan) Reset() {
	*x = TextSpan{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[8]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *TextSpan) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*TextSpan) ProtoMessage() {}

func (x *TextSpan) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 TextSpan.ProtoReflect.Descriptor instead.
func (*TextSpan) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{8}
}

func (x *TextSpan) GetContent() string {
	if x != nil {
		return x.Content
	}
	return ""
}

func (x *TextSpan) GetBeginOffset() int32 {
	if x != nil {
		return x.BeginOffset
	}
	return 0
}

// The sentiment analysis request message.
type AnalyzeSentimentRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Input document.
	Document *Document `protobuf:"bytes,1,opt,name=document,proto3" json:"document,omitempty"`
	// The encoding type used by the API to calculate sentence offsets for the
	// sentence sentiment.
	EncodingType EncodingType `protobuf:"varint,2,opt,name=encoding_type,json=encodingType,proto3,enum=google.cloud.language.v1beta1.EncodingType" json:"encoding_type,omitempty"`
}

func (x *AnalyzeSentimentRequest) Reset() {
	*x = AnalyzeSentimentRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[9]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeSentimentRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeSentimentRequest) ProtoMessage() {}

func (x *AnalyzeSentimentRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeSentimentRequest.ProtoReflect.Descriptor instead.
func (*AnalyzeSentimentRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{9}
}

func (x *AnalyzeSentimentRequest) GetDocument() *Document {
	if x != nil {
		return x.Document
	}
	return nil
}

func (x *AnalyzeSentimentRequest) GetEncodingType() EncodingType {
	if x != nil {
		return x.EncodingType
	}
	return EncodingType_NONE
}

// The sentiment analysis response message.
type AnalyzeSentimentResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The overall sentiment of the input document.
	DocumentSentiment *Sentiment `protobuf:"bytes,1,opt,name=document_sentiment,json=documentSentiment,proto3" json:"document_sentiment,omitempty"`
	// The language of the text, which will be the same as the language specified
	// in the request or, if not specified, the automatically-detected language.
	// See [Document.language][google.cloud.language.v1beta1.Document.language]
	// field for more details.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
	// The sentiment for all the sentences in the document.
	Sentences []*Sentence `protobuf:"bytes,3,rep,name=sentences,proto3" json:"sentences,omitempty"`
}

func (x *AnalyzeSentimentResponse) Reset() {
	*x = AnalyzeSentimentResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[10]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeSentimentResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeSentimentResponse) ProtoMessage() {}

func (x *AnalyzeSentimentResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeSentimentResponse.ProtoReflect.Descriptor instead.
func (*AnalyzeSentimentResponse) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{10}
}

func (x *AnalyzeSentimentResponse) GetDocumentSentiment() *Sentiment {
	if x != nil {
		return x.DocumentSentiment
	}
	return nil
}

func (x *AnalyzeSentimentResponse) GetLanguage() string {
	if x != nil {
		return x.Language
	}
	return ""
}

func (x *AnalyzeSentimentResponse) GetSentences() []*Sentence {
	if x != nil {
		return x.Sentences
	}
	return nil
}

// The entity analysis request message.
type AnalyzeEntitiesRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Input document.
	Document *Document `protobuf:"bytes,1,opt,name=document,proto3" json:"document,omitempty"`
	// The encoding type used by the API to calculate offsets.
	EncodingType EncodingType `protobuf:"varint,2,opt,name=encoding_type,json=encodingType,proto3,enum=google.cloud.language.v1beta1.EncodingType" json:"encoding_type,omitempty"`
}

func (x *AnalyzeEntitiesRequest) Reset() {
	*x = AnalyzeEntitiesRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[11]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeEntitiesRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeEntitiesRequest) ProtoMessage() {}

func (x *AnalyzeEntitiesRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeEntitiesRequest.ProtoReflect.Descriptor instead.
func (*AnalyzeEntitiesRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{11}
}

func (x *AnalyzeEntitiesRequest) GetDocument() *Document {
	if x != nil {
		return x.Document
	}
	return nil
}

func (x *AnalyzeEntitiesRequest) GetEncodingType() EncodingType {
	if x != nil {
		return x.EncodingType
	}
	return EncodingType_NONE
}

// The entity analysis response message.
type AnalyzeEntitiesResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The recognized entities in the input document.
	Entities []*Entity `protobuf:"bytes,1,rep,name=entities,proto3" json:"entities,omitempty"`
	// The language of the text, which will be the same as the language specified
	// in the request or, if not specified, the automatically-detected language.
	// See [Document.language][google.cloud.language.v1beta1.Document.language]
	// field for more details.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
}

func (x *AnalyzeEntitiesResponse) Reset() {
	*x = AnalyzeEntitiesResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[12]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeEntitiesResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeEntitiesResponse) ProtoMessage() {}

func (x *AnalyzeEntitiesResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeEntitiesResponse.ProtoReflect.Descriptor instead.
func (*AnalyzeEntitiesResponse) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{12}
}

func (x *AnalyzeEntitiesResponse) GetEntities() []*Entity {
	if x != nil {
		return x.Entities
	}
	return nil
}

func (x *AnalyzeEntitiesResponse) GetLanguage() string {
	if x != nil {
		return x.Language
	}
	return ""
}

// The syntax analysis request message.
type AnalyzeSyntaxRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Input document.
	Document *Document `protobuf:"bytes,1,opt,name=document,proto3" json:"document,omitempty"`
	// The encoding type used by the API to calculate offsets.
	EncodingType EncodingType `protobuf:"varint,2,opt,name=encoding_type,json=encodingType,proto3,enum=google.cloud.language.v1beta1.EncodingType" json:"encoding_type,omitempty"`
}

func (x *AnalyzeSyntaxRequest) Reset() {
	*x = AnalyzeSyntaxRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[13]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeSyntaxRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeSyntaxRequest) ProtoMessage() {}

func (x *AnalyzeSyntaxRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeSyntaxRequest.ProtoReflect.Descriptor instead.
func (*AnalyzeSyntaxRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{13}
}

func (x *AnalyzeSyntaxRequest) GetDocument() *Document {
	if x != nil {
		return x.Document
	}
	return nil
}

func (x *AnalyzeSyntaxRequest) GetEncodingType() EncodingType {
	if x != nil {
		return x.EncodingType
	}
	return EncodingType_NONE
}

// The syntax analysis response message.
type AnalyzeSyntaxResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Sentences in the input document.
	Sentences []*Sentence `protobuf:"bytes,1,rep,name=sentences,proto3" json:"sentences,omitempty"`
	// Tokens, along with their syntactic information, in the input document.
	Tokens []*Token `protobuf:"bytes,2,rep,name=tokens,proto3" json:"tokens,omitempty"`
	// The language of the text, which will be the same as the language specified
	// in the request or, if not specified, the automatically-detected language.
	// See [Document.language][google.cloud.language.v1beta1.Document.language]
	// field for more details.
	Language string `protobuf:"bytes,3,opt,name=language,proto3" json:"language,omitempty"`
}

func (x *AnalyzeSyntaxResponse) Reset() {
	*x = AnalyzeSyntaxResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[14]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnalyzeSyntaxResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnalyzeSyntaxResponse) ProtoMessage() {}

func (x *AnalyzeSyntaxResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_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 AnalyzeSyntaxResponse.ProtoReflect.Descriptor instead.
func (*AnalyzeSyntaxResponse) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{14}
}

func (x *AnalyzeSyntaxResponse) GetSentences() []*Sentence {
	if x != nil {
		return x.Sentences
	}
	return nil
}

func (x *AnalyzeSyntaxResponse) GetTokens() []*Token {
	if x != nil {
		return x.Tokens
	}
	return nil
}

func (x *AnalyzeSyntaxResponse) GetLanguage() string {
	if x != nil {
		return x.Language
	}
	return ""
}

// The request message for the text annotation API, which can perform multiple
// analysis types (sentiment, entities, and syntax) in one call.
type AnnotateTextRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Input document.
	Document *Document `protobuf:"bytes,1,opt,name=document,proto3" json:"document,omitempty"`
	// The enabled features.
	Features *AnnotateTextRequest_Features `protobuf:"bytes,2,opt,name=features,proto3" json:"features,omitempty"`
	// The encoding type used by the API to calculate offsets.
	EncodingType EncodingType `protobuf:"varint,3,opt,name=encoding_type,json=encodingType,proto3,enum=google.cloud.language.v1beta1.EncodingType" json:"encoding_type,omitempty"`
}

func (x *AnnotateTextRequest) Reset() {
	*x = AnnotateTextRequest{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[15]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnnotateTextRequest) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnnotateTextRequest) ProtoMessage() {}

func (x *AnnotateTextRequest) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[15]
	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 AnnotateTextRequest.ProtoReflect.Descriptor instead.
func (*AnnotateTextRequest) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{15}
}

func (x *AnnotateTextRequest) GetDocument() *Document {
	if x != nil {
		return x.Document
	}
	return nil
}

func (x *AnnotateTextRequest) GetFeatures() *AnnotateTextRequest_Features {
	if x != nil {
		return x.Features
	}
	return nil
}

func (x *AnnotateTextRequest) GetEncodingType() EncodingType {
	if x != nil {
		return x.EncodingType
	}
	return EncodingType_NONE
}

// The text annotations response message.
type AnnotateTextResponse struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Sentences in the input document. Populated if the user enables
	// [AnnotateTextRequest.Features.extract_syntax][google.cloud.language.v1beta1.AnnotateTextRequest.Features.extract_syntax].
	Sentences []*Sentence `protobuf:"bytes,1,rep,name=sentences,proto3" json:"sentences,omitempty"`
	// Tokens, along with their syntactic information, in the input document.
	// Populated if the user enables
	// [AnnotateTextRequest.Features.extract_syntax][google.cloud.language.v1beta1.AnnotateTextRequest.Features.extract_syntax].
	Tokens []*Token `protobuf:"bytes,2,rep,name=tokens,proto3" json:"tokens,omitempty"`
	// Entities, along with their semantic information, in the input document.
	// Populated if the user enables
	// [AnnotateTextRequest.Features.extract_entities][google.cloud.language.v1beta1.AnnotateTextRequest.Features.extract_entities].
	Entities []*Entity `protobuf:"bytes,3,rep,name=entities,proto3" json:"entities,omitempty"`
	// The overall sentiment for the document. Populated if the user enables
	// [AnnotateTextRequest.Features.extract_document_sentiment][google.cloud.language.v1beta1.AnnotateTextRequest.Features.extract_document_sentiment].
	DocumentSentiment *Sentiment `protobuf:"bytes,4,opt,name=document_sentiment,json=documentSentiment,proto3" json:"document_sentiment,omitempty"`
	// The language of the text, which will be the same as the language specified
	// in the request or, if not specified, the automatically-detected language.
	// See [Document.language][google.cloud.language.v1beta1.Document.language]
	// field for more details.
	Language string `protobuf:"bytes,5,opt,name=language,proto3" json:"language,omitempty"`
}

func (x *AnnotateTextResponse) Reset() {
	*x = AnnotateTextResponse{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[16]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnnotateTextResponse) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnnotateTextResponse) ProtoMessage() {}

func (x *AnnotateTextResponse) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[16]
	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 AnnotateTextResponse.ProtoReflect.Descriptor instead.
func (*AnnotateTextResponse) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{16}
}

func (x *AnnotateTextResponse) GetSentences() []*Sentence {
	if x != nil {
		return x.Sentences
	}
	return nil
}

func (x *AnnotateTextResponse) GetTokens() []*Token {
	if x != nil {
		return x.Tokens
	}
	return nil
}

func (x *AnnotateTextResponse) GetEntities() []*Entity {
	if x != nil {
		return x.Entities
	}
	return nil
}

func (x *AnnotateTextResponse) GetDocumentSentiment() *Sentiment {
	if x != nil {
		return x.DocumentSentiment
	}
	return nil
}

func (x *AnnotateTextResponse) GetLanguage() string {
	if x != nil {
		return x.Language
	}
	return ""
}

// All available features for sentiment, syntax, and semantic analysis.
// Setting each one to true will enable that specific analysis for the input.
type AnnotateTextRequest_Features struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Extract syntax information.
	ExtractSyntax bool `protobuf:"varint,1,opt,name=extract_syntax,json=extractSyntax,proto3" json:"extract_syntax,omitempty"`
	// Extract entities.
	ExtractEntities bool `protobuf:"varint,2,opt,name=extract_entities,json=extractEntities,proto3" json:"extract_entities,omitempty"`
	// Extract document-level sentiment.
	ExtractDocumentSentiment bool `protobuf:"varint,3,opt,name=extract_document_sentiment,json=extractDocumentSentiment,proto3" json:"extract_document_sentiment,omitempty"`
}

func (x *AnnotateTextRequest_Features) Reset() {
	*x = AnnotateTextRequest_Features{}
	if protoimpl.UnsafeEnabled {
		mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[18]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *AnnotateTextRequest_Features) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*AnnotateTextRequest_Features) ProtoMessage() {}

func (x *AnnotateTextRequest_Features) ProtoReflect() protoreflect.Message {
	mi := &file_google_cloud_language_v1beta1_language_service_proto_msgTypes[18]
	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 AnnotateTextRequest_Features.ProtoReflect.Descriptor instead.
func (*AnnotateTextRequest_Features) Descriptor() ([]byte, []int) {
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP(), []int{15, 0}
}

func (x *AnnotateTextRequest_Features) GetExtractSyntax() bool {
	if x != nil {
		return x.ExtractSyntax
	}
	return false
}

func (x *AnnotateTextRequest_Features) GetExtractEntities() bool {
	if x != nil {
		return x.ExtractEntities
	}
	return false
}

func (x *AnnotateTextRequest_Features) GetExtractDocumentSentiment() bool {
	if x != nil {
		return x.ExtractDocumentSentiment
	}
	return false
}

var File_google_cloud_language_v1beta1_language_service_proto protoreflect.FileDescriptor

var file_google_cloud_language_v1beta1_language_service_proto_rawDesc = []byte{
	0x0a, 0x34, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f,
	0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
	0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x1d, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 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, 0x22, 0xf0, 0x01, 0x0a, 0x08, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
	0x12, 0x40, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61,
	0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44,
	0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79,
	0x70, 0x65, 0x12, 0x1a, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x28,
	0x0a, 0x0f, 0x67, 0x63, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x5f, 0x75, 0x72,
	0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0d, 0x67, 0x63, 0x73, 0x43, 0x6f,
	0x6e, 0x74, 0x65, 0x6e, 0x74, 0x55, 0x72, 0x69, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x22, 0x36, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x14, 0x0a, 0x10,
	0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x4c, 0x41, 0x49, 0x4e, 0x5f, 0x54, 0x45, 0x58, 0x54,
	0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x54, 0x4d, 0x4c, 0x10, 0x02, 0x42, 0x08, 0x0a, 0x06,
	0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x8f, 0x01, 0x0a, 0x08, 0x53, 0x65, 0x6e, 0x74, 0x65,
	0x6e, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x2e, 0x54, 0x65, 0x78, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74,
	0x12, 0x46, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x73,
	0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xcb, 0x03, 0x0a, 0x06, 0x45, 0x6e, 0x74,
	0x69, 0x74, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x2e, 0x54, 0x79, 0x70,
	0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x4f, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64,
	0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79,
	0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08,
	0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x61, 0x6c, 0x69,
	0x65, 0x6e, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x73, 0x61, 0x6c, 0x69,
	0x65, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x08, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73,
	0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
	0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6e,
	0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x6d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x3b,
	0x0a, 0x0d, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 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, 0x79, 0x0a, 0x04, 0x54,
	0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
	0x12, 0x0a, 0x0a, 0x06, 0x50, 0x45, 0x52, 0x53, 0x4f, 0x4e, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08,
	0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x52,
	0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x09, 0x0a, 0x05,
	0x45, 0x56, 0x45, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x0f, 0x0a, 0x0b, 0x57, 0x4f, 0x52, 0x4b, 0x5f,
	0x4f, 0x46, 0x5f, 0x41, 0x52, 0x54, 0x10, 0x05, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4e, 0x53,
	0x55, 0x4d, 0x45, 0x52, 0x5f, 0x47, 0x4f, 0x4f, 0x44, 0x10, 0x06, 0x12, 0x09, 0x0a, 0x05, 0x4f,
	0x54, 0x48, 0x45, 0x52, 0x10, 0x07, 0x22, 0x85, 0x02, 0x0a, 0x05, 0x54, 0x6f, 0x6b, 0x65, 0x6e,
	0x12, 0x3b, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61,
	0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54,
	0x65, 0x78, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x51, 0x0a,
	0x0e, 0x70, 0x61, 0x72, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x73, 0x70, 0x65, 0x65, 0x63, 0x68, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65,
	0x63, 0x68, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68,
	0x12, 0x56, 0x0a, 0x0f, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x65,
	0x64, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64,
	0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x52, 0x0e, 0x64, 0x65, 0x70, 0x65, 0x6e, 0x64,
	0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x6d, 0x6d,
	0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x6d, 0x6d, 0x61, 0x22, 0x5b,
	0x0a, 0x09, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70,
	0x6f, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x08, 0x70,
	0x6f, 0x6c, 0x61, 0x72, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x6d, 0x61, 0x67, 0x6e, 0x69,
	0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x09, 0x6d, 0x61, 0x67, 0x6e,
	0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0xb9, 0x11, 0x0a, 0x0c,
	0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x12, 0x41, 0x0a, 0x03,
	0x74, 0x61, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66,
	0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x54, 0x61, 0x67, 0x52, 0x03, 0x74, 0x61, 0x67, 0x12,
	0x4a, 0x0a, 0x06, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e,
	0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x41, 0x73, 0x70,
	0x65, 0x63, 0x74, 0x52, 0x06, 0x61, 0x73, 0x70, 0x65, 0x63, 0x74, 0x12, 0x44, 0x0a, 0x04, 0x63,
	0x61, 0x73, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66,
	0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x43, 0x61, 0x73, 0x65, 0x52, 0x04, 0x63, 0x61, 0x73,
	0x65, 0x12, 0x44, 0x0a, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e,
	0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x46, 0x6f, 0x72,
	0x6d, 0x52, 0x04, 0x66, 0x6f, 0x72, 0x6d, 0x12, 0x4a, 0x0a, 0x06, 0x67, 0x65, 0x6e, 0x64, 0x65,
	0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70,
	0x65, 0x65, 0x63, 0x68, 0x2e, 0x47, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x52, 0x06, 0x67, 0x65, 0x6e,
	0x64, 0x65, 0x72, 0x12, 0x44, 0x0a, 0x04, 0x6d, 0x6f, 0x6f, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x4d,
	0x6f, 0x6f, 0x64, 0x52, 0x04, 0x6d, 0x6f, 0x6f, 0x64, 0x12, 0x4a, 0x0a, 0x06, 0x6e, 0x75, 0x6d,
	0x62, 0x65, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66,
	0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6e,
	0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x4a, 0x0a, 0x06, 0x70, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x18,
	0x08, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65,
	0x63, 0x68, 0x2e, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x70, 0x65, 0x72, 0x73, 0x6f,
	0x6e, 0x12, 0x4a, 0x0a, 0x06, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28,
	0x0e, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x50,
	0x72, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x06, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x59, 0x0a,
	0x0b, 0x72, 0x65, 0x63, 0x69, 0x70, 0x72, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x18, 0x0a, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e,
	0x52, 0x65, 0x63, 0x69, 0x70, 0x72, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x52, 0x0b, 0x72, 0x65, 0x63,
	0x69, 0x70, 0x72, 0x6f, 0x63, 0x69, 0x74, 0x79, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x65, 0x6e, 0x73,
	0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70,
	0x65, 0x65, 0x63, 0x68, 0x2e, 0x54, 0x65, 0x6e, 0x73, 0x65, 0x52, 0x05, 0x74, 0x65, 0x6e, 0x73,
	0x65, 0x12, 0x47, 0x0a, 0x05, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0e,
	0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
	0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31,
	0x2e, 0x50, 0x61, 0x72, 0x74, 0x4f, 0x66, 0x53, 0x70, 0x65, 0x65, 0x63, 0x68, 0x2e, 0x56, 0x6f,
	0x69, 0x63, 0x65, 0x52, 0x05, 0x76, 0x6f, 0x69, 0x63, 0x65, 0x22, 0x8d, 0x01, 0x0a, 0x03, 0x54,
	0x61, 0x67, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
	0x07, 0x0a, 0x03, 0x41, 0x44, 0x4a, 0x10, 0x01, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x50, 0x10,
	0x02, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x44, 0x56, 0x10, 0x03, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4f,
	0x4e, 0x4a, 0x10, 0x04, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x45, 0x54, 0x10, 0x05, 0x12, 0x08, 0x0a,
	0x04, 0x4e, 0x4f, 0x55, 0x4e, 0x10, 0x06, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x55, 0x4d, 0x10, 0x07,
	0x12, 0x08, 0x0a, 0x04, 0x50, 0x52, 0x4f, 0x4e, 0x10, 0x08, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x52,
	0x54, 0x10, 0x09, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x55, 0x4e, 0x43, 0x54, 0x10, 0x0a, 0x12, 0x08,
	0x0a, 0x04, 0x56, 0x45, 0x52, 0x42, 0x10, 0x0b, 0x12, 0x05, 0x0a, 0x01, 0x58, 0x10, 0x0c, 0x12,
	0x09, 0x0a, 0x05, 0x41, 0x46, 0x46, 0x49, 0x58, 0x10, 0x0d, 0x22, 0x4f, 0x0a, 0x06, 0x41, 0x73,
	0x70, 0x65, 0x63, 0x74, 0x12, 0x12, 0x0a, 0x0e, 0x41, 0x53, 0x50, 0x45, 0x43, 0x54, 0x5f, 0x55,
	0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x45, 0x52, 0x46,
	0x45, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4d, 0x50, 0x45,
	0x52, 0x46, 0x45, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x50, 0x52,
	0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x03, 0x22, 0xf8, 0x01, 0x0a, 0x04,
	0x43, 0x61, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x41, 0x53, 0x45, 0x5f, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x41, 0x43, 0x43, 0x55, 0x53, 0x41,
	0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x41, 0x44, 0x56, 0x45, 0x52, 0x42,
	0x49, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x11, 0x0a, 0x0d, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x4d,
	0x45, 0x4e, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x41, 0x54, 0x49,
	0x56, 0x45, 0x10, 0x04, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x45, 0x4e, 0x49, 0x54, 0x49, 0x56, 0x45,
	0x10, 0x05, 0x12, 0x10, 0x0a, 0x0c, 0x49, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x4d, 0x45, 0x4e, 0x54,
	0x41, 0x4c, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x56, 0x45,
	0x10, 0x07, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x4d, 0x49, 0x4e, 0x41, 0x54, 0x49, 0x56, 0x45,
	0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07, 0x4f, 0x42, 0x4c, 0x49, 0x51, 0x55, 0x45, 0x10, 0x09, 0x12,
	0x0d, 0x0a, 0x09, 0x50, 0x41, 0x52, 0x54, 0x49, 0x54, 0x49, 0x56, 0x45, 0x10, 0x0a, 0x12, 0x11,
	0x0a, 0x0d, 0x50, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x10,
	0x0b, 0x12, 0x12, 0x0a, 0x0e, 0x52, 0x45, 0x46, 0x4c, 0x45, 0x58, 0x49, 0x56, 0x45, 0x5f, 0x43,
	0x41, 0x53, 0x45, 0x10, 0x0c, 0x12, 0x11, 0x0a, 0x0d, 0x52, 0x45, 0x4c, 0x41, 0x54, 0x49, 0x56,
	0x45, 0x5f, 0x43, 0x41, 0x53, 0x45, 0x10, 0x0d, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x4f, 0x43, 0x41,
	0x54, 0x49, 0x56, 0x45, 0x10, 0x0e, 0x22, 0xaf, 0x01, 0x0a, 0x04, 0x46, 0x6f, 0x72, 0x6d, 0x12,
	0x10, 0x0a, 0x0c, 0x46, 0x4f, 0x52, 0x4d, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10,
	0x00, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x4e, 0x4f, 0x4d, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x12,
	0x0d, 0x0a, 0x09, 0x41, 0x55, 0x58, 0x49, 0x4c, 0x49, 0x41, 0x52, 0x59, 0x10, 0x02, 0x12, 0x12,
	0x0a, 0x0e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x49, 0x5a, 0x45, 0x52,
	0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x49, 0x4e, 0x41, 0x4c, 0x5f, 0x45, 0x4e, 0x44, 0x49,
	0x4e, 0x47, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x45, 0x52, 0x55, 0x4e, 0x44, 0x10, 0x05,
	0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x53, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08,
	0x49, 0x52, 0x52, 0x45, 0x41, 0x4c, 0x49, 0x53, 0x10, 0x07, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x48,
	0x4f, 0x52, 0x54, 0x10, 0x08, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x4f, 0x4e, 0x47, 0x10, 0x09, 0x12,
	0x09, 0x0a, 0x05, 0x4f, 0x52, 0x44, 0x45, 0x52, 0x10, 0x0a, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x50,
	0x45, 0x43, 0x49, 0x46, 0x49, 0x43, 0x10, 0x0b, 0x22, 0x45, 0x0a, 0x06, 0x47, 0x65, 0x6e, 0x64,
	0x65, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x47, 0x45, 0x4e, 0x44, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x46, 0x45, 0x4d, 0x49, 0x4e, 0x49,
	0x4e, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4d, 0x41, 0x53, 0x43, 0x55, 0x4c, 0x49, 0x4e,
	0x45, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x4e, 0x45, 0x55, 0x54, 0x45, 0x52, 0x10, 0x03, 0x22,
	0x7f, 0x0a, 0x04, 0x4d, 0x6f, 0x6f, 0x64, 0x12, 0x10, 0x0a, 0x0c, 0x4d, 0x4f, 0x4f, 0x44, 0x5f,
	0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x43, 0x4f, 0x4e,
	0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x4d, 0x4f, 0x4f, 0x44, 0x10, 0x01, 0x12,
	0x0e, 0x0a, 0x0a, 0x49, 0x4d, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12,
	0x0e, 0x0a, 0x0a, 0x49, 0x4e, 0x44, 0x49, 0x43, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x03, 0x12,
	0x11, 0x0a, 0x0d, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x52, 0x4f, 0x47, 0x41, 0x54, 0x49, 0x56, 0x45,
	0x10, 0x04, 0x12, 0x0b, 0x0a, 0x07, 0x4a, 0x55, 0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x05, 0x12,
	0x0f, 0x0a, 0x0b, 0x53, 0x55, 0x42, 0x4a, 0x55, 0x4e, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x06,
	0x22, 0x40, 0x0a, 0x06, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x55,
	0x4d, 0x42, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0c,
	0x0a, 0x08, 0x53, 0x49, 0x4e, 0x47, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06,
	0x50, 0x4c, 0x55, 0x52, 0x41, 0x4c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x55, 0x41, 0x4c,
	0x10, 0x03, 0x22, 0x54, 0x0a, 0x06, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x0e,
	0x50, 0x45, 0x52, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00,
	0x12, 0x09, 0x0a, 0x05, 0x46, 0x49, 0x52, 0x53, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x53,
	0x45, 0x43, 0x4f, 0x4e, 0x44, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x48, 0x49, 0x52, 0x44,
	0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x45, 0x46, 0x4c, 0x45, 0x58, 0x49, 0x56, 0x45, 0x5f,
	0x50, 0x45, 0x52, 0x53, 0x4f, 0x4e, 0x10, 0x04, 0x22, 0x38, 0x0a, 0x06, 0x50, 0x72, 0x6f, 0x70,
	0x65, 0x72, 0x12, 0x12, 0x0a, 0x0e, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x5f, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52,
	0x10, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52,
	0x10, 0x02, 0x22, 0x4a, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x69, 0x70, 0x72, 0x6f, 0x63, 0x69, 0x74,
	0x79, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, 0x49, 0x54, 0x59,
	0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45,
	0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x4e, 0x4f,
	0x4e, 0x5f, 0x52, 0x45, 0x43, 0x49, 0x50, 0x52, 0x4f, 0x43, 0x41, 0x4c, 0x10, 0x02, 0x22, 0x73,
	0x0a, 0x05, 0x54, 0x65, 0x6e, 0x73, 0x65, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x45, 0x4e, 0x53, 0x45,
	0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x43, 0x4f,
	0x4e, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, 0x4c, 0x5f, 0x54, 0x45, 0x4e, 0x53, 0x45, 0x10,
	0x01, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x55, 0x54, 0x55, 0x52, 0x45, 0x10, 0x02, 0x12, 0x08, 0x0a,
	0x04, 0x50, 0x41, 0x53, 0x54, 0x10, 0x03, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x53, 0x45,
	0x4e, 0x54, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4d, 0x50, 0x45, 0x52, 0x46, 0x45, 0x43,
	0x54, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x50, 0x4c, 0x55, 0x50, 0x45, 0x52, 0x46, 0x45, 0x43,
	0x54, 0x10, 0x06, 0x22, 0x42, 0x0a, 0x05, 0x56, 0x6f, 0x69, 0x63, 0x65, 0x12, 0x11, 0x0a, 0x0d,
	0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12,
	0x0a, 0x0a, 0x06, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x43,
	0x41, 0x55, 0x53, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x41,
	0x53, 0x53, 0x49, 0x56, 0x45, 0x10, 0x03, 0x22, 0xf4, 0x07, 0x0a, 0x0e, 0x44, 0x65, 0x70, 0x65,
	0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x65,
	0x61, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x65, 0x61, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x49,
	0x6e, 0x64, 0x65, 0x78, 0x12, 0x49, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x31, 0x2e, 0x44, 0x65, 0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x63, 0x79, 0x45, 0x64,
	0x67, 0x65, 0x2e, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22,
	0xec, 0x06, 0x0a, 0x05, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b,
	0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x42, 0x42, 0x52, 0x45, 0x56,
	0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x43, 0x4f, 0x4d, 0x50, 0x10, 0x02, 0x12, 0x09, 0x0a,
	0x05, 0x41, 0x44, 0x56, 0x43, 0x4c, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x41, 0x44, 0x56, 0x4d,
	0x4f, 0x44, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x4d, 0x4f, 0x44, 0x10, 0x05, 0x12, 0x09,
	0x0a, 0x05, 0x41, 0x50, 0x50, 0x4f, 0x53, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x54, 0x54,
	0x52, 0x10, 0x07, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x55, 0x58, 0x10, 0x08, 0x12, 0x0b, 0x0a, 0x07,
	0x41, 0x55, 0x58, 0x50, 0x41, 0x53, 0x53, 0x10, 0x09, 0x12, 0x06, 0x0a, 0x02, 0x43, 0x43, 0x10,
	0x0a, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x43, 0x4f, 0x4d, 0x50, 0x10, 0x0b, 0x12, 0x08, 0x0a, 0x04,
	0x43, 0x4f, 0x4e, 0x4a, 0x10, 0x0c, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x53, 0x55, 0x42, 0x4a, 0x10,
	0x0d, 0x12, 0x0d, 0x0a, 0x09, 0x43, 0x53, 0x55, 0x42, 0x4a, 0x50, 0x41, 0x53, 0x53, 0x10, 0x0e,
	0x12, 0x07, 0x0a, 0x03, 0x44, 0x45, 0x50, 0x10, 0x0f, 0x12, 0x07, 0x0a, 0x03, 0x44, 0x45, 0x54,
	0x10, 0x10, 0x12, 0x0d, 0x0a, 0x09, 0x44, 0x49, 0x53, 0x43, 0x4f, 0x55, 0x52, 0x53, 0x45, 0x10,
	0x11, 0x12, 0x08, 0x0a, 0x04, 0x44, 0x4f, 0x42, 0x4a, 0x10, 0x12, 0x12, 0x08, 0x0a, 0x04, 0x45,
	0x58, 0x50, 0x4c, 0x10, 0x13, 0x12, 0x0c, 0x0a, 0x08, 0x47, 0x4f, 0x45, 0x53, 0x57, 0x49, 0x54,
	0x48, 0x10, 0x14, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4f, 0x42, 0x4a, 0x10, 0x15, 0x12, 0x08, 0x0a,
	0x04, 0x4d, 0x41, 0x52, 0x4b, 0x10, 0x16, 0x12, 0x07, 0x0a, 0x03, 0x4d, 0x57, 0x45, 0x10, 0x17,
	0x12, 0x07, 0x0a, 0x03, 0x4d, 0x57, 0x56, 0x10, 0x18, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x45, 0x47,
	0x10, 0x19, 0x12, 0x06, 0x0a, 0x02, 0x4e, 0x4e, 0x10, 0x1a, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x50,
	0x41, 0x44, 0x56, 0x4d, 0x4f, 0x44, 0x10, 0x1b, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x53, 0x55, 0x42,
	0x4a, 0x10, 0x1c, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x53, 0x55, 0x42, 0x4a, 0x50, 0x41, 0x53, 0x53,
	0x10, 0x1d, 0x12, 0x07, 0x0a, 0x03, 0x4e, 0x55, 0x4d, 0x10, 0x1e, 0x12, 0x0a, 0x0a, 0x06, 0x4e,
	0x55, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x1f, 0x12, 0x05, 0x0a, 0x01, 0x50, 0x10, 0x20, 0x12, 0x0d,
	0x0a, 0x09, 0x50, 0x41, 0x52, 0x41, 0x54, 0x41, 0x58, 0x49, 0x53, 0x10, 0x21, 0x12, 0x0b, 0x0a,
	0x07, 0x50, 0x41, 0x52, 0x54, 0x4d, 0x4f, 0x44, 0x10, 0x22, 0x12, 0x09, 0x0a, 0x05, 0x50, 0x43,
	0x4f, 0x4d, 0x50, 0x10, 0x23, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x4f, 0x42, 0x4a, 0x10, 0x24, 0x12,
	0x08, 0x0a, 0x04, 0x50, 0x4f, 0x53, 0x53, 0x10, 0x25, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x4f, 0x53,
	0x54, 0x4e, 0x45, 0x47, 0x10, 0x26, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4d,
	0x50, 0x10, 0x27, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x52, 0x45, 0x43, 0x4f, 0x4e, 0x4a, 0x10, 0x28,
	0x12, 0x0a, 0x0a, 0x06, 0x50, 0x52, 0x45, 0x44, 0x45, 0x54, 0x10, 0x29, 0x12, 0x08, 0x0a, 0x04,
	0x50, 0x52, 0x45, 0x46, 0x10, 0x2a, 0x12, 0x08, 0x0a, 0x04, 0x50, 0x52, 0x45, 0x50, 0x10, 0x2b,
	0x12, 0x09, 0x0a, 0x05, 0x50, 0x52, 0x4f, 0x4e, 0x4c, 0x10, 0x2c, 0x12, 0x07, 0x0a, 0x03, 0x50,
	0x52, 0x54, 0x10, 0x2d, 0x12, 0x06, 0x0a, 0x02, 0x50, 0x53, 0x10, 0x2e, 0x12, 0x0c, 0x0a, 0x08,
	0x51, 0x55, 0x41, 0x4e, 0x54, 0x4d, 0x4f, 0x44, 0x10, 0x2f, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x43,
	0x4d, 0x4f, 0x44, 0x10, 0x30, 0x12, 0x0c, 0x0a, 0x08, 0x52, 0x43, 0x4d, 0x4f, 0x44, 0x52, 0x45,
	0x4c, 0x10, 0x31, 0x12, 0x09, 0x0a, 0x05, 0x52, 0x44, 0x52, 0x4f, 0x50, 0x10, 0x32, 0x12, 0x07,
	0x0a, 0x03, 0x52, 0x45, 0x46, 0x10, 0x33, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x4d, 0x4e, 0x41,
	0x4e, 0x54, 0x10, 0x34, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x45, 0x50, 0x41, 0x52, 0x41, 0x4e, 0x44,
	0x55, 0x4d, 0x10, 0x35, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x4f, 0x4f, 0x54, 0x10, 0x36, 0x12, 0x08,
	0x0a, 0x04, 0x53, 0x4e, 0x55, 0x4d, 0x10, 0x37, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x55, 0x46, 0x46,
	0x10, 0x38, 0x12, 0x08, 0x0a, 0x04, 0x54, 0x4d, 0x4f, 0x44, 0x10, 0x39, 0x12, 0x09, 0x0a, 0x05,
	0x54, 0x4f, 0x50, 0x49, 0x43, 0x10, 0x3a, 0x12, 0x08, 0x0a, 0x04, 0x56, 0x4d, 0x4f, 0x44, 0x10,
	0x3b, 0x12, 0x0c, 0x0a, 0x08, 0x56, 0x4f, 0x43, 0x41, 0x54, 0x49, 0x56, 0x45, 0x10, 0x3c, 0x12,
	0x09, 0x0a, 0x05, 0x58, 0x43, 0x4f, 0x4d, 0x50, 0x10, 0x3d, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x55,
	0x46, 0x46, 0x49, 0x58, 0x10, 0x3e, 0x12, 0x09, 0x0a, 0x05, 0x54, 0x49, 0x54, 0x4c, 0x45, 0x10,
	0x3f, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x44, 0x56, 0x50, 0x48, 0x4d, 0x4f, 0x44, 0x10, 0x40, 0x12,
	0x0b, 0x0a, 0x07, 0x41, 0x55, 0x58, 0x43, 0x41, 0x55, 0x53, 0x10, 0x41, 0x12, 0x09, 0x0a, 0x05,
	0x41, 0x55, 0x58, 0x56, 0x56, 0x10, 0x42, 0x12, 0x09, 0x0a, 0x05, 0x44, 0x54, 0x4d, 0x4f, 0x44,
	0x10, 0x43, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x4f, 0x52, 0x45, 0x49, 0x47, 0x4e, 0x10, 0x44, 0x12,
	0x06, 0x0a, 0x02, 0x4b, 0x57, 0x10, 0x45, 0x12, 0x08, 0x0a, 0x04, 0x4c, 0x49, 0x53, 0x54, 0x10,
	0x46, 0x12, 0x08, 0x0a, 0x04, 0x4e, 0x4f, 0x4d, 0x43, 0x10, 0x47, 0x12, 0x0c, 0x0a, 0x08, 0x4e,
	0x4f, 0x4d, 0x43, 0x53, 0x55, 0x42, 0x4a, 0x10, 0x48, 0x12, 0x10, 0x0a, 0x0c, 0x4e, 0x4f, 0x4d,
	0x43, 0x53, 0x55, 0x42, 0x4a, 0x50, 0x41, 0x53, 0x53, 0x10, 0x49, 0x12, 0x08, 0x0a, 0x04, 0x4e,
	0x55, 0x4d, 0x43, 0x10, 0x4a, 0x12, 0x07, 0x0a, 0x03, 0x43, 0x4f, 0x50, 0x10, 0x4b, 0x12, 0x0e,
	0x0a, 0x0a, 0x44, 0x49, 0x53, 0x4c, 0x4f, 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x4c, 0x22, 0xc5,
	0x01, 0x0a, 0x0d, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e,
	0x12, 0x3b, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61,
	0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54,
	0x65, 0x78, 0x74, 0x53, 0x70, 0x61, 0x6e, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, 0x45, 0x0a,
	0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75,
	0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69,
	0x74, 0x79, 0x4d, 0x65, 0x6e, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04,
	0x74, 0x79, 0x70, 0x65, 0x22, 0x30, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x10, 0x0a, 0x0c,
	0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0a,
	0x0a, 0x06, 0x50, 0x52, 0x4f, 0x50, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x43, 0x4f,
	0x4d, 0x4d, 0x4f, 0x4e, 0x10, 0x02, 0x22, 0x47, 0x0a, 0x08, 0x54, 0x65, 0x78, 0x74, 0x53, 0x70,
	0x61, 0x6e, 0x12, 0x18, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c,
	0x62, 0x65, 0x67, 0x69, 0x6e, 0x5f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x05, 0x52, 0x0b, 0x62, 0x65, 0x67, 0x69, 0x6e, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x22,
	0xb0, 0x01, 0x0a, 0x17, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x69,
	0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64,
	0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e,
	0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e,
	0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x6f,
	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74,
	0x12, 0x50, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67,
	0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79,
	0x70, 0x65, 0x22, 0xd6, 0x01, 0x0a, 0x18, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x65,
	0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12,
	0x57, 0x0a, 0x12, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74,
	0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75,
	0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74,
	0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53,
	0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x12, 0x45, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65,
	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65,
	0x52, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0xaf, 0x01, 0x0a, 0x16,
	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52,
	0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
	0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e,
	0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x65,
	0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01,
	0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x31, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52,
	0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0x78, 0x0a,
	0x17, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
	0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69,
	0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
	0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74,
	0x79, 0x52, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x22, 0xad, 0x01, 0x0a, 0x14, 0x41, 0x6e, 0x61, 0x6c,
	0x79, 0x7a, 0x65, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
	0x12, 0x43, 0x0a, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x31, 0x2e, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63,
	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x50, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e,
	0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x63,
	0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x65, 0x6e, 0x63, 0x6f, 0x64,
	0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x22, 0xb8, 0x01, 0x0a, 0x15, 0x41, 0x6e, 0x61, 0x6c,
	0x79, 0x7a, 0x65, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x12, 0x45, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01,
	0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
	0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62,
	0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x73,
	0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65,
	0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06,
	0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
	0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
	0x67, 0x65, 0x22, 0xa2, 0x03, 0x0a, 0x13, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54,
	0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x43, 0x0a, 0x08, 0x64, 0x6f,
	0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x44, 0x6f, 0x63,
	0x75, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x08, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x12,
	0x57, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
	0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61,
	0x31, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x08,
	0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x50, 0x0a, 0x0d, 0x65, 0x6e, 0x63, 0x6f,
	0x64, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32,
	0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e,
	0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0c, 0x65, 0x6e,
	0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x1a, 0x9a, 0x01, 0x0a, 0x08, 0x46,
	0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x65, 0x78, 0x74, 0x72, 0x61,
	0x63, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x0d, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x29,
	0x0a, 0x10, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69,
	0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x65, 0x78, 0x74, 0x72, 0x61, 0x63,
	0x74, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x65, 0x78, 0x74,
	0x72, 0x61, 0x63, 0x74, 0x5f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65,
	0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x65,
	0x78, 0x74, 0x72, 0x61, 0x63, 0x74, 0x44, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65,
	0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xd3, 0x02, 0x0a, 0x14, 0x41, 0x6e, 0x6e, 0x6f,
	0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x12, 0x45, 0x0a, 0x09, 0x73, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20,
	0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
	0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x09, 0x73, 0x65,
	0x6e, 0x74, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x3c, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e,
	0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74,
	0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65,
	0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
	0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e,
	0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x08,
	0x65, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x57, 0x0a, 0x12, 0x64, 0x6f, 0x63, 0x75,
	0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x04,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
	0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62,
	0x65, 0x74, 0x61, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x11,
	0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e,
	0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2a, 0x38, 0x0a,
	0x0c, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a,
	0x04, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x55, 0x54, 0x46, 0x38, 0x10,
	0x01, 0x12, 0x09, 0x0a, 0x05, 0x55, 0x54, 0x46, 0x31, 0x36, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05,
	0x55, 0x54, 0x46, 0x33, 0x32, 0x10, 0x03, 0x32, 0xc9, 0x05, 0x0a, 0x0f, 0x4c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xb3, 0x01, 0x0a, 0x10,
	0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74,
	0x12, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
	0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31,
	0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e,
	0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
	0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65,
	0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65,
	0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
	0x65, 0x22, 0x2e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x28, 0x22, 0x23, 0x2f, 0x76, 0x31, 0x62, 0x65,
	0x74, 0x61, 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x61, 0x6e,
	0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x65, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x01,
	0x2a, 0x12, 0xaf, 0x01, 0x0a, 0x0f, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74,
	0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74,
	0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x67,
	0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67,
	0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61,
	0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70,
	0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x27, 0x22, 0x22, 0x2f, 0x76,
	0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73,
	0x3a, 0x61, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x69, 0x65, 0x73,
	0x3a, 0x01, 0x2a, 0x12, 0xa7, 0x01, 0x0a, 0x0d, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53,
	0x79, 0x6e, 0x74, 0x61, 0x78, 0x12, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
	0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31,
	0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79, 0x7a, 0x65, 0x53, 0x79, 0x6e,
	0x74, 0x61, 0x78, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x67, 0x6f, 0x6f,
	0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61,
	0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41, 0x6e, 0x61, 0x6c, 0x79,
	0x7a, 0x65, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65,
	0x22, 0x2b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x25, 0x22, 0x20, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x3a, 0x61, 0x6e, 0x61,
	0x6c, 0x79, 0x7a, 0x65, 0x53, 0x79, 0x6e, 0x74, 0x61, 0x78, 0x3a, 0x01, 0x2a, 0x12, 0xa3, 0x01,
	0x0a, 0x0c, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x12, 0x32,
	0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61,
	0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x41,
	0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
	0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
	0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74,
	0x61, 0x31, 0x2e, 0x41, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74, 0x52,
	0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x2a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x22,
	0x1f, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65,
	0x6e, 0x74, 0x73, 0x3a, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x65, 0x54, 0x65, 0x78, 0x74,
	0x3a, 0x01, 0x2a, 0x42, 0x82, 0x01, 0x0a, 0x21, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
	0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67,
	0x65, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x42, 0x14, 0x4c, 0x61, 0x6e, 0x67, 0x75,
	0x61, 0x67, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50,
	0x01, 0x5a, 0x45, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67,
	0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f,
	0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6c,
	0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x3b,
	0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_google_cloud_language_v1beta1_language_service_proto_rawDescOnce sync.Once
	file_google_cloud_language_v1beta1_language_service_proto_rawDescData = file_google_cloud_language_v1beta1_language_service_proto_rawDesc
)

func file_google_cloud_language_v1beta1_language_service_proto_rawDescGZIP() []byte {
	file_google_cloud_language_v1beta1_language_service_proto_rawDescOnce.Do(func() {
		file_google_cloud_language_v1beta1_language_service_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_cloud_language_v1beta1_language_service_proto_rawDescData)
	})
	return file_google_cloud_language_v1beta1_language_service_proto_rawDescData
}

var file_google_cloud_language_v1beta1_language_service_proto_enumTypes = make([]protoimpl.EnumInfo, 17)
var file_google_cloud_language_v1beta1_language_service_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
var file_google_cloud_language_v1beta1_language_service_proto_goTypes = []interface{}{
	(EncodingType)(0),                    // 0: google.cloud.language.v1beta1.EncodingType
	(Document_Type)(0),                   // 1: google.cloud.language.v1beta1.Document.Type
	(Entity_Type)(0),                     // 2: google.cloud.language.v1beta1.Entity.Type
	(PartOfSpeech_Tag)(0),                // 3: google.cloud.language.v1beta1.PartOfSpeech.Tag
	(PartOfSpeech_Aspect)(0),             // 4: google.cloud.language.v1beta1.PartOfSpeech.Aspect
	(PartOfSpeech_Case)(0),               // 5: google.cloud.language.v1beta1.PartOfSpeech.Case
	(PartOfSpeech_Form)(0),               // 6: google.cloud.language.v1beta1.PartOfSpeech.Form
	(PartOfSpeech_Gender)(0),             // 7: google.cloud.language.v1beta1.PartOfSpeech.Gender
	(PartOfSpeech_Mood)(0),               // 8: google.cloud.language.v1beta1.PartOfSpeech.Mood
	(PartOfSpeech_Number)(0),             // 9: google.cloud.language.v1beta1.PartOfSpeech.Number
	(PartOfSpeech_Person)(0),             // 10: google.cloud.language.v1beta1.PartOfSpeech.Person
	(PartOfSpeech_Proper)(0),             // 11: google.cloud.language.v1beta1.PartOfSpeech.Proper
	(PartOfSpeech_Reciprocity)(0),        // 12: google.cloud.language.v1beta1.PartOfSpeech.Reciprocity
	(PartOfSpeech_Tense)(0),              // 13: google.cloud.language.v1beta1.PartOfSpeech.Tense
	(PartOfSpeech_Voice)(0),              // 14: google.cloud.language.v1beta1.PartOfSpeech.Voice
	(DependencyEdge_Label)(0),            // 15: google.cloud.language.v1beta1.DependencyEdge.Label
	(EntityMention_Type)(0),              // 16: google.cloud.language.v1beta1.EntityMention.Type
	(*Document)(nil),                     // 17: google.cloud.language.v1beta1.Document
	(*Sentence)(nil),                     // 18: google.cloud.language.v1beta1.Sentence
	(*Entity)(nil),                       // 19: google.cloud.language.v1beta1.Entity
	(*Token)(nil),                        // 20: google.cloud.language.v1beta1.Token
	(*Sentiment)(nil),                    // 21: google.cloud.language.v1beta1.Sentiment
	(*PartOfSpeech)(nil),                 // 22: google.cloud.language.v1beta1.PartOfSpeech
	(*DependencyEdge)(nil),               // 23: google.cloud.language.v1beta1.DependencyEdge
	(*EntityMention)(nil),                // 24: google.cloud.language.v1beta1.EntityMention
	(*TextSpan)(nil),                     // 25: google.cloud.language.v1beta1.TextSpan
	(*AnalyzeSentimentRequest)(nil),      // 26: google.cloud.language.v1beta1.AnalyzeSentimentRequest
	(*AnalyzeSentimentResponse)(nil),     // 27: google.cloud.language.v1beta1.AnalyzeSentimentResponse
	(*AnalyzeEntitiesRequest)(nil),       // 28: google.cloud.language.v1beta1.AnalyzeEntitiesRequest
	(*AnalyzeEntitiesResponse)(nil),      // 29: google.cloud.language.v1beta1.AnalyzeEntitiesResponse
	(*AnalyzeSyntaxRequest)(nil),         // 30: google.cloud.language.v1beta1.AnalyzeSyntaxRequest
	(*AnalyzeSyntaxResponse)(nil),        // 31: google.cloud.language.v1beta1.AnalyzeSyntaxResponse
	(*AnnotateTextRequest)(nil),          // 32: google.cloud.language.v1beta1.AnnotateTextRequest
	(*AnnotateTextResponse)(nil),         // 33: google.cloud.language.v1beta1.AnnotateTextResponse
	nil,                                  // 34: google.cloud.language.v1beta1.Entity.MetadataEntry
	(*AnnotateTextRequest_Features)(nil), // 35: google.cloud.language.v1beta1.AnnotateTextRequest.Features
}
var file_google_cloud_language_v1beta1_language_service_proto_depIdxs = []int32{
	1,  // 0: google.cloud.language.v1beta1.Document.type:type_name -> google.cloud.language.v1beta1.Document.Type
	25, // 1: google.cloud.language.v1beta1.Sentence.text:type_name -> google.cloud.language.v1beta1.TextSpan
	21, // 2: google.cloud.language.v1beta1.Sentence.sentiment:type_name -> google.cloud.language.v1beta1.Sentiment
	2,  // 3: google.cloud.language.v1beta1.Entity.type:type_name -> google.cloud.language.v1beta1.Entity.Type
	34, // 4: google.cloud.language.v1beta1.Entity.metadata:type_name -> google.cloud.language.v1beta1.Entity.MetadataEntry
	24, // 5: google.cloud.language.v1beta1.Entity.mentions:type_name -> google.cloud.language.v1beta1.EntityMention
	25, // 6: google.cloud.language.v1beta1.Token.text:type_name -> google.cloud.language.v1beta1.TextSpan
	22, // 7: google.cloud.language.v1beta1.Token.part_of_speech:type_name -> google.cloud.language.v1beta1.PartOfSpeech
	23, // 8: google.cloud.language.v1beta1.Token.dependency_edge:type_name -> google.cloud.language.v1beta1.DependencyEdge
	3,  // 9: google.cloud.language.v1beta1.PartOfSpeech.tag:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Tag
	4,  // 10: google.cloud.language.v1beta1.PartOfSpeech.aspect:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Aspect
	5,  // 11: google.cloud.language.v1beta1.PartOfSpeech.case:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Case
	6,  // 12: google.cloud.language.v1beta1.PartOfSpeech.form:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Form
	7,  // 13: google.cloud.language.v1beta1.PartOfSpeech.gender:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Gender
	8,  // 14: google.cloud.language.v1beta1.PartOfSpeech.mood:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Mood
	9,  // 15: google.cloud.language.v1beta1.PartOfSpeech.number:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Number
	10, // 16: google.cloud.language.v1beta1.PartOfSpeech.person:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Person
	11, // 17: google.cloud.language.v1beta1.PartOfSpeech.proper:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Proper
	12, // 18: google.cloud.language.v1beta1.PartOfSpeech.reciprocity:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Reciprocity
	13, // 19: google.cloud.language.v1beta1.PartOfSpeech.tense:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Tense
	14, // 20: google.cloud.language.v1beta1.PartOfSpeech.voice:type_name -> google.cloud.language.v1beta1.PartOfSpeech.Voice
	15, // 21: google.cloud.language.v1beta1.DependencyEdge.label:type_name -> google.cloud.language.v1beta1.DependencyEdge.Label
	25, // 22: google.cloud.language.v1beta1.EntityMention.text:type_name -> google.cloud.language.v1beta1.TextSpan
	16, // 23: google.cloud.language.v1beta1.EntityMention.type:type_name -> google.cloud.language.v1beta1.EntityMention.Type
	17, // 24: google.cloud.language.v1beta1.AnalyzeSentimentRequest.document:type_name -> google.cloud.language.v1beta1.Document
	0,  // 25: google.cloud.language.v1beta1.AnalyzeSentimentRequest.encoding_type:type_name -> google.cloud.language.v1beta1.EncodingType
	21, // 26: google.cloud.language.v1beta1.AnalyzeSentimentResponse.document_sentiment:type_name -> google.cloud.language.v1beta1.Sentiment
	18, // 27: google.cloud.language.v1beta1.AnalyzeSentimentResponse.sentences:type_name -> google.cloud.language.v1beta1.Sentence
	17, // 28: google.cloud.language.v1beta1.AnalyzeEntitiesRequest.document:type_name -> google.cloud.language.v1beta1.Document
	0,  // 29: google.cloud.language.v1beta1.AnalyzeEntitiesRequest.encoding_type:type_name -> google.cloud.language.v1beta1.EncodingType
	19, // 30: google.cloud.language.v1beta1.AnalyzeEntitiesResponse.entities:type_name -> google.cloud.language.v1beta1.Entity
	17, // 31: google.cloud.language.v1beta1.AnalyzeSyntaxRequest.document:type_name -> google.cloud.language.v1beta1.Document
	0,  // 32: google.cloud.language.v1beta1.AnalyzeSyntaxRequest.encoding_type:type_name -> google.cloud.language.v1beta1.EncodingType
	18, // 33: google.cloud.language.v1beta1.AnalyzeSyntaxResponse.sentences:type_name -> google.cloud.language.v1beta1.Sentence
	20, // 34: google.cloud.language.v1beta1.AnalyzeSyntaxResponse.tokens:type_name -> google.cloud.language.v1beta1.Token
	17, // 35: google.cloud.language.v1beta1.AnnotateTextRequest.document:type_name -> google.cloud.language.v1beta1.Document
	35, // 36: google.cloud.language.v1beta1.AnnotateTextRequest.features:type_name -> google.cloud.language.v1beta1.AnnotateTextRequest.Features
	0,  // 37: google.cloud.language.v1beta1.AnnotateTextRequest.encoding_type:type_name -> google.cloud.language.v1beta1.EncodingType
	18, // 38: google.cloud.language.v1beta1.AnnotateTextResponse.sentences:type_name -> google.cloud.language.v1beta1.Sentence
	20, // 39: google.cloud.language.v1beta1.AnnotateTextResponse.tokens:type_name -> google.cloud.language.v1beta1.Token
	19, // 40: google.cloud.language.v1beta1.AnnotateTextResponse.entities:type_name -> google.cloud.language.v1beta1.Entity
	21, // 41: google.cloud.language.v1beta1.AnnotateTextResponse.document_sentiment:type_name -> google.cloud.language.v1beta1.Sentiment
	26, // 42: google.cloud.language.v1beta1.LanguageService.AnalyzeSentiment:input_type -> google.cloud.language.v1beta1.AnalyzeSentimentRequest
	28, // 43: google.cloud.language.v1beta1.LanguageService.AnalyzeEntities:input_type -> google.cloud.language.v1beta1.AnalyzeEntitiesRequest
	30, // 44: google.cloud.language.v1beta1.LanguageService.AnalyzeSyntax:input_type -> google.cloud.language.v1beta1.AnalyzeSyntaxRequest
	32, // 45: google.cloud.language.v1beta1.LanguageService.AnnotateText:input_type -> google.cloud.language.v1beta1.AnnotateTextRequest
	27, // 46: google.cloud.language.v1beta1.LanguageService.AnalyzeSentiment:output_type -> google.cloud.language.v1beta1.AnalyzeSentimentResponse
	29, // 47: google.cloud.language.v1beta1.LanguageService.AnalyzeEntities:output_type -> google.cloud.language.v1beta1.AnalyzeEntitiesResponse
	31, // 48: google.cloud.language.v1beta1.LanguageService.AnalyzeSyntax:output_type -> google.cloud.language.v1beta1.AnalyzeSyntaxResponse
	33, // 49: google.cloud.language.v1beta1.LanguageService.AnnotateText:output_type -> google.cloud.language.v1beta1.AnnotateTextResponse
	46, // [46:50] is the sub-list for method output_type
	42, // [42:46] is the sub-list for method input_type
	42, // [42:42] is the sub-list for extension type_name
	42, // [42:42] is the sub-list for extension extendee
	0,  // [0:42] is the sub-list for field type_name
}

func init() { file_google_cloud_language_v1beta1_language_service_proto_init() }
func file_google_cloud_language_v1beta1_language_service_proto_init() {
	if File_google_cloud_language_v1beta1_language_service_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Document); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Sentence); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Entity); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Token); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Sentiment); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*PartOfSpeech); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DependencyEdge); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*EntityMention); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*TextSpan); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeSentimentRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeSentimentResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeEntitiesRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeEntitiesResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeSyntaxRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnalyzeSyntaxResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnnotateTextRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnnotateTextResponse); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_google_cloud_language_v1beta1_language_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*AnnotateTextRequest_Features); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_google_cloud_language_v1beta1_language_service_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*Document_Content)(nil),
		(*Document_GcsContentUri)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_google_cloud_language_v1beta1_language_service_proto_rawDesc,
			NumEnums:      17,
			NumMessages:   19,
			NumExtensions: 0,
			NumServices:   1,
		},
		GoTypes:           file_google_cloud_language_v1beta1_language_service_proto_goTypes,
		DependencyIndexes: file_google_cloud_language_v1beta1_language_service_proto_depIdxs,
		EnumInfos:         file_google_cloud_language_v1beta1_language_service_proto_enumTypes,
		MessageInfos:      file_google_cloud_language_v1beta1_language_service_proto_msgTypes,
	}.Build()
	File_google_cloud_language_v1beta1_language_service_proto = out.File
	file_google_cloud_language_v1beta1_language_service_proto_rawDesc = nil
	file_google_cloud_language_v1beta1_language_service_proto_goTypes = nil
	file_google_cloud_language_v1beta1_language_service_proto_depIdxs = nil
}

// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface

// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6

// LanguageServiceClient is the client API for LanguageService service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type LanguageServiceClient interface {
	// Analyzes the sentiment of the provided text.
	AnalyzeSentiment(ctx context.Context, in *AnalyzeSentimentRequest, opts ...grpc.CallOption) (*AnalyzeSentimentResponse, error)
	// Finds named entities (currently proper names and common nouns) in the text
	// along with entity types, salience, mentions for each entity, and
	// other properties.
	AnalyzeEntities(ctx context.Context, in *AnalyzeEntitiesRequest, opts ...grpc.CallOption) (*AnalyzeEntitiesResponse, error)
	// Analyzes the syntax of the text and provides sentence boundaries and
	// tokenization along with part of speech tags, dependency trees, and other
	// properties.
	AnalyzeSyntax(ctx context.Context, in *AnalyzeSyntaxRequest, opts ...grpc.CallOption) (*AnalyzeSyntaxResponse, error)
	// A convenience method that provides all the features that analyzeSentiment,
	// analyzeEntities, and analyzeSyntax provide in one call.
	AnnotateText(ctx context.Context, in *AnnotateTextRequest, opts ...grpc.CallOption) (*AnnotateTextResponse, error)
}

type languageServiceClient struct {
	cc grpc.ClientConnInterface
}

func NewLanguageServiceClient(cc grpc.ClientConnInterface) LanguageServiceClient {
	return &languageServiceClient{cc}
}

func (c *languageServiceClient) AnalyzeSentiment(ctx context.Context, in *AnalyzeSentimentRequest, opts ...grpc.CallOption) (*AnalyzeSentimentResponse, error) {
	out := new(AnalyzeSentimentResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.language.v1beta1.LanguageService/AnalyzeSentiment", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *languageServiceClient) AnalyzeEntities(ctx context.Context, in *AnalyzeEntitiesRequest, opts ...grpc.CallOption) (*AnalyzeEntitiesResponse, error) {
	out := new(AnalyzeEntitiesResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.language.v1beta1.LanguageService/AnalyzeEntities", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *languageServiceClient) AnalyzeSyntax(ctx context.Context, in *AnalyzeSyntaxRequest, opts ...grpc.CallOption) (*AnalyzeSyntaxResponse, error) {
	out := new(AnalyzeSyntaxResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.language.v1beta1.LanguageService/AnalyzeSyntax", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

func (c *languageServiceClient) AnnotateText(ctx context.Context, in *AnnotateTextRequest, opts ...grpc.CallOption) (*AnnotateTextResponse, error) {
	out := new(AnnotateTextResponse)
	err := c.cc.Invoke(ctx, "/google.cloud.language.v1beta1.LanguageService/AnnotateText", in, out, opts...)
	if err != nil {
		return nil, err
	}
	return out, nil
}

// LanguageServiceServer is the server API for LanguageService service.
type LanguageServiceServer interface {
	// Analyzes the sentiment of the provided text.
	AnalyzeSentiment(context.Context, *AnalyzeSentimentRequest) (*AnalyzeSentimentResponse, error)
	// Finds named entities (currently proper names and common nouns) in the text
	// along with entity types, salience, mentions for each entity, and
	// other properties.
	AnalyzeEntities(context.Context, *AnalyzeEntitiesRequest) (*AnalyzeEntitiesResponse, error)
	// Analyzes the syntax of the text and provides sentence boundaries and
	// tokenization along with part of speech tags, dependency trees, and other
	// properties.
	AnalyzeSyntax(context.Context, *AnalyzeSyntaxRequest) (*AnalyzeSyntaxResponse, error)
	// A convenience method that provides all the features that analyzeSentiment,
	// analyzeEntities, and analyzeSyntax provide in one call.
	AnnotateText(context.Context, *AnnotateTextRequest) (*AnnotateTextResponse, error)
}

// UnimplementedLanguageServiceServer can be embedded to have forward compatible implementations.
type UnimplementedLanguageServiceServer struct {
}

func (*UnimplementedLanguageServiceServer) AnalyzeSentiment(context.Context, *AnalyzeSentimentRequest) (*AnalyzeSentimentResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AnalyzeSentiment not implemented")
}
func (*UnimplementedLanguageServiceServer) AnalyzeEntities(context.Context, *AnalyzeEntitiesRequest) (*AnalyzeEntitiesResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AnalyzeEntities not implemented")
}
func (*UnimplementedLanguageServiceServer) AnalyzeSyntax(context.Context, *AnalyzeSyntaxRequest) (*AnalyzeSyntaxResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AnalyzeSyntax not implemented")
}
func (*UnimplementedLanguageServiceServer) AnnotateText(context.Context, *AnnotateTextRequest) (*AnnotateTextResponse, error) {
	return nil, status.Errorf(codes.Unimplemented, "method AnnotateText not implemented")
}

func RegisterLanguageServiceServer(s *grpc.Server, srv LanguageServiceServer) {
	s.RegisterService(&_LanguageService_serviceDesc, srv)
}

func _LanguageService_AnalyzeSentiment_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnalyzeSentimentRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LanguageServiceServer).AnalyzeSentiment(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.language.v1beta1.LanguageService/AnalyzeSentiment",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LanguageServiceServer).AnalyzeSentiment(ctx, req.(*AnalyzeSentimentRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _LanguageService_AnalyzeEntities_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnalyzeEntitiesRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LanguageServiceServer).AnalyzeEntities(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.language.v1beta1.LanguageService/AnalyzeEntities",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LanguageServiceServer).AnalyzeEntities(ctx, req.(*AnalyzeEntitiesRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _LanguageService_AnalyzeSyntax_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnalyzeSyntaxRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LanguageServiceServer).AnalyzeSyntax(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.language.v1beta1.LanguageService/AnalyzeSyntax",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LanguageServiceServer).AnalyzeSyntax(ctx, req.(*AnalyzeSyntaxRequest))
	}
	return interceptor(ctx, in, info, handler)
}

func _LanguageService_AnnotateText_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
	in := new(AnnotateTextRequest)
	if err := dec(in); err != nil {
		return nil, err
	}
	if interceptor == nil {
		return srv.(LanguageServiceServer).AnnotateText(ctx, in)
	}
	info := &grpc.UnaryServerInfo{
		Server:     srv,
		FullMethod: "/google.cloud.language.v1beta1.LanguageService/AnnotateText",
	}
	handler := func(ctx context.Context, req interface{}) (interface{}, error) {
		return srv.(LanguageServiceServer).AnnotateText(ctx, req.(*AnnotateTextRequest))
	}
	return interceptor(ctx, in, info, handler)
}

var _LanguageService_serviceDesc = grpc.ServiceDesc{
	ServiceName: "google.cloud.language.v1beta1.LanguageService",
	HandlerType: (*LanguageServiceServer)(nil),
	Methods: []grpc.MethodDesc{
		{
			MethodName: "AnalyzeSentiment",
			Handler:    _LanguageService_AnalyzeSentiment_Handler,
		},
		{
			MethodName: "AnalyzeEntities",
			Handler:    _LanguageService_AnalyzeEntities_Handler,
		},
		{
			MethodName: "AnalyzeSyntax",
			Handler:    _LanguageService_AnalyzeSyntax_Handler,
		},
		{
			MethodName: "AnnotateText",
			Handler:    _LanguageService_AnnotateText_Handler,
		},
	},
	Streams:  []grpc.StreamDesc{},
	Metadata: "google/cloud/language/v1beta1/language_service.proto",
}
