// Copyright 2021 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.27.1
// 	protoc        v3.17.1
// source: chromiumos/test/lab/api/dut.proto

package api

import (
	api "go.chromium.org/chromiumos/config/go/api"
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

type Cable_Type int32

const (
	Cable_TYPE_UNSPECIFIED Cable_Type = 0
	Cable_AUDIOJACK        Cable_Type = 1
	Cable_USBAUDIO         Cable_Type = 2
	Cable_USBPRINTING      Cable_Type = 3
	Cable_HDMIAUDIO        Cable_Type = 4
)

// Enum value maps for Cable_Type.
var (
	Cable_Type_name = map[int32]string{
		0: "TYPE_UNSPECIFIED",
		1: "AUDIOJACK",
		2: "USBAUDIO",
		3: "USBPRINTING",
		4: "HDMIAUDIO",
	}
	Cable_Type_value = map[string]int32{
		"TYPE_UNSPECIFIED": 0,
		"AUDIOJACK":        1,
		"USBAUDIO":         2,
		"USBPRINTING":      3,
		"HDMIAUDIO":        4,
	}
)

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

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

func (Cable_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[0].Descriptor()
}

func (Cable_Type) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[0]
}

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

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

// Facing of DUT's camera to be tested whose FOV should cover chart tablet's
// screen.
type Camerabox_Facing int32

const (
	Camerabox_FACING_UNSPECIFIED Camerabox_Facing = 0
	// DUT's back camera faces the chart tablet.
	Camerabox_BACK Camerabox_Facing = 1
	// DUT's front camera faces to chart tablet.
	Camerabox_FRONT Camerabox_Facing = 2
)

// Enum value maps for Camerabox_Facing.
var (
	Camerabox_Facing_name = map[int32]string{
		0: "FACING_UNSPECIFIED",
		1: "BACK",
		2: "FRONT",
	}
	Camerabox_Facing_value = map[string]int32{
		"FACING_UNSPECIFIED": 0,
		"BACK":               1,
		"FRONT":              2,
	}
)

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

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

func (Camerabox_Facing) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[1].Descriptor()
}

func (Camerabox_Facing) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[1]
}

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

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

type Cellular_Operator int32

const (
	Cellular_OPERATOR_UNSPECIFIED Cellular_Operator = 0
	Cellular_ATT                  Cellular_Operator = 1
	Cellular_VERIZON              Cellular_Operator = 2
	Cellular_TMOBILE              Cellular_Operator = 3
)

// Enum value maps for Cellular_Operator.
var (
	Cellular_Operator_name = map[int32]string{
		0: "OPERATOR_UNSPECIFIED",
		1: "ATT",
		2: "VERIZON",
		3: "TMOBILE",
	}
	Cellular_Operator_value = map[string]int32{
		"OPERATOR_UNSPECIFIED": 0,
		"ATT":                  1,
		"VERIZON":              2,
		"TMOBILE":              3,
	}
)

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

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

func (Cellular_Operator) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[2].Descriptor()
}

func (Cellular_Operator) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[2]
}

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

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

type Chameleon_Peripheral int32

const (
	Chameleon_PREIPHERAL_UNSPECIFIED Chameleon_Peripheral = 0
	Chameleon_BT_HID                 Chameleon_Peripheral = 1
	Chameleon_DP                     Chameleon_Peripheral = 2
	Chameleon_DP_HDMI                Chameleon_Peripheral = 3
	Chameleon_VGA                    Chameleon_Peripheral = 4
	Chameleon_HDMI                   Chameleon_Peripheral = 5
	Chameleon_BT_BLE_HID             Chameleon_Peripheral = 6
	Chameleon_BT_A2DP_SINK           Chameleon_Peripheral = 7
	Chameleon_BT_PEER                Chameleon_Peripheral = 8
)

// Enum value maps for Chameleon_Peripheral.
var (
	Chameleon_Peripheral_name = map[int32]string{
		0: "PREIPHERAL_UNSPECIFIED",
		1: "BT_HID",
		2: "DP",
		3: "DP_HDMI",
		4: "VGA",
		5: "HDMI",
		6: "BT_BLE_HID",
		7: "BT_A2DP_SINK",
		8: "BT_PEER",
	}
	Chameleon_Peripheral_value = map[string]int32{
		"PREIPHERAL_UNSPECIFIED": 0,
		"BT_HID":                 1,
		"DP":                     2,
		"DP_HDMI":                3,
		"VGA":                    4,
		"HDMI":                   5,
		"BT_BLE_HID":             6,
		"BT_A2DP_SINK":           7,
		"BT_PEER":                8,
	}
)

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

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

func (Chameleon_Peripheral) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[3].Descriptor()
}

func (Chameleon_Peripheral) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[3]
}

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

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

type ExternalCamera_Type int32

const (
	ExternalCamera_TYPE_UNSPECIFIED ExternalCamera_Type = 0
	// camera Huddly GO
	ExternalCamera_HUDDLY ExternalCamera_Type = 1
	// camera Logitech PTZ Pro 2
	ExternalCamera_PTZPRO2 ExternalCamera_Type = 2
)

// Enum value maps for ExternalCamera_Type.
var (
	ExternalCamera_Type_name = map[int32]string{
		0: "TYPE_UNSPECIFIED",
		1: "HUDDLY",
		2: "PTZPRO2",
	}
	ExternalCamera_Type_value = map[string]int32{
		"TYPE_UNSPECIFIED": 0,
		"HUDDLY":           1,
		"PTZPRO2":          2,
	}
)

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

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

func (ExternalCamera_Type) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[4].Descriptor()
}

func (ExternalCamera_Type) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[4]
}

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

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

type Wifi_Environment int32

const (
	Wifi_ENVIRONMENT_UNSPECIFIED Wifi_Environment = 0
	// Device is setup without any special wifi environment.
	Wifi_STANDARD Wifi_Environment = 1
	// Device is inside a hermetic wifi cell.
	Wifi_WIFI_CELL Wifi_Environment = 2
	// Device is setup in a chaos environment. It's a special settings for
	// running wifi interop tests.
	Wifi_CHAOS Wifi_Environment = 3
	// In an environment where the AP is 802.11ax compliant.
	// Context: crbug.com/1044786
	Wifi_ROUTER_802_11AX Wifi_Environment = 4
)

// Enum value maps for Wifi_Environment.
var (
	Wifi_Environment_name = map[int32]string{
		0: "ENVIRONMENT_UNSPECIFIED",
		1: "STANDARD",
		2: "WIFI_CELL",
		3: "CHAOS",
		4: "ROUTER_802_11AX",
	}
	Wifi_Environment_value = map[string]int32{
		"ENVIRONMENT_UNSPECIFIED": 0,
		"STANDARD":                1,
		"WIFI_CELL":               2,
		"CHAOS":                   3,
		"ROUTER_802_11AX":         4,
	}
)

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

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

func (Wifi_Environment) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[5].Descriptor()
}

func (Wifi_Environment) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[5]
}

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

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

// DUT's WiFi antenna's connection.
type WifiAntenna_Connection int32

const (
	WifiAntenna_CONNECTION_UNSPECIFIED WifiAntenna_Connection = 0
	// WIFI antenna is connected conductively.
	WifiAntenna_CONDUCTIVE WifiAntenna_Connection = 1
	// WIFI antenna is connected over-the-air.
	WifiAntenna_OTA WifiAntenna_Connection = 2
)

// Enum value maps for WifiAntenna_Connection.
var (
	WifiAntenna_Connection_name = map[int32]string{
		0: "CONNECTION_UNSPECIFIED",
		1: "CONDUCTIVE",
		2: "OTA",
	}
	WifiAntenna_Connection_value = map[string]int32{
		"CONNECTION_UNSPECIFIED": 0,
		"CONDUCTIVE":             1,
		"OTA":                    2,
	}
)

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

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

func (WifiAntenna_Connection) Descriptor() protoreflect.EnumDescriptor {
	return file_chromiumos_test_lab_api_dut_proto_enumTypes[6].Descriptor()
}

func (WifiAntenna_Connection) Type() protoreflect.EnumType {
	return &file_chromiumos_test_lab_api_dut_proto_enumTypes[6]
}

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

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

// Specification of Device Under Test.
type Dut struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Id *Dut_Id `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	// Types that are assignable to DutType:
	//	*Dut_Chromeos
	//	*Dut_Android_
	DutType isDut_DutType `protobuf_oneof:"dut_type"`
	// Cache server for downloading artifacts related to this DUT.
	CacheServer *CacheServer `protobuf:"bytes,4,opt,name=cache_server,json=cacheServer,proto3" json:"cache_server,omitempty"`
}

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

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

func (*Dut) ProtoMessage() {}

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

func (x *Dut) GetId() *Dut_Id {
	if x != nil {
		return x.Id
	}
	return nil
}

func (m *Dut) GetDutType() isDut_DutType {
	if m != nil {
		return m.DutType
	}
	return nil
}

func (x *Dut) GetChromeos() *Dut_ChromeOS {
	if x, ok := x.GetDutType().(*Dut_Chromeos); ok {
		return x.Chromeos
	}
	return nil
}

func (x *Dut) GetAndroid() *Dut_Android {
	if x, ok := x.GetDutType().(*Dut_Android_); ok {
		return x.Android
	}
	return nil
}

func (x *Dut) GetCacheServer() *CacheServer {
	if x != nil {
		return x.CacheServer
	}
	return nil
}

type isDut_DutType interface {
	isDut_DutType()
}

type Dut_Chromeos struct {
	Chromeos *Dut_ChromeOS `protobuf:"bytes,2,opt,name=chromeos,proto3,oneof"`
}

type Dut_Android_ struct {
	Android *Dut_Android `protobuf:"bytes,3,opt,name=android,proto3,oneof"`
}

func (*Dut_Chromeos) isDut_DutType() {}

func (*Dut_Android_) isDut_DutType() {}

// Defines the build target/board and model of the Dut
type DutModel struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	BuildTarget string `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	ModelName   string `protobuf:"bytes,2,opt,name=model_name,json=modelName,proto3" json:"model_name,omitempty"`
}

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

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

func (*DutModel) ProtoMessage() {}

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

func (x *DutModel) GetBuildTarget() string {
	if x != nil {
		return x.BuildTarget
	}
	return ""
}

func (x *DutModel) GetModelName() string {
	if x != nil {
		return x.ModelName
	}
	return ""
}

// Defines the topology of connected devices under test
type DutTopology struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Id *DutTopology_Id `protobuf:"bytes,3,opt,name=id,proto3" json:"id,omitempty"`
	// Collection of devices that are used in a given test.
	// Generally, this will contain a single Dut for an functional test that
	// doesn't depend on other devices, but can include a collection of devices
	// used in multi-dut testing (e.g. ChromeOS to ChromeOS, ChromeOS to Android,
	// etc...)
	Duts []*Dut `protobuf:"bytes,4,rep,name=duts,proto3" json:"duts,omitempty"`
}

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

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

func (*DutTopology) ProtoMessage() {}

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

func (x *DutTopology) GetId() *DutTopology_Id {
	if x != nil {
		return x.Id
	}
	return nil
}

func (x *DutTopology) GetDuts() []*Dut {
	if x != nil {
		return x.Duts
	}
	return nil
}

// Peripherals related to audio input and output from the Device.
type Audio struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Device is housed in an audio box to record / replay audio
	// for audio testing.
	AudioBox bool `protobuf:"varint,1,opt,name=audio_box,json=audioBox,proto3" json:"audio_box,omitempty"`
	// Device is connected to Atrus speakermic.
	Atrus bool `protobuf:"varint,2,opt,name=atrus,proto3" json:"atrus,omitempty"`
}

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

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

func (*Audio) ProtoMessage() {}

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

func (x *Audio) GetAudioBox() bool {
	if x != nil {
		return x.AudioBox
	}
	return false
}

func (x *Audio) GetAtrus() bool {
	if x != nil {
		return x.Atrus
	}
	return false
}

// A cable connecting the device to audio, printer and other peripherals.
type Cable struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Type Cable_Type `protobuf:"varint,1,opt,name=type,proto3,enum=chromiumos.test.lab.api.Cable_Type" json:"type,omitempty"`
}

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

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

func (*Cable) ProtoMessage() {}

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

func (x *Cable) GetType() Cable_Type {
	if x != nil {
		return x.Type
	}
	return Cable_TYPE_UNSPECIFIED
}

// A cache server for downloading artifacts.
//
// The server should support the following HTTP requests:
//
// GET /download/GS_BUCKET/GS_PATH
// Download a file from Google Storage.
//
// GET /extract/GS_BUCKET/GS_PATH?file=TAR_PATH
// Download a file within a (possibly compressed) TAR archive stored
// in Google Storage.
//
// GET /decompress/GS_BUCKET/GS_PATH
// Download the decompressed data of a compressed file from Google Storage.
type CacheServer struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// HTTP address for the cache server.
	Address *IpEndpoint `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"`
}

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

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

func (*CacheServer) ProtoMessage() {}

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

func (x *CacheServer) GetAddress() *IpEndpoint {
	if x != nil {
		return x.Address
	}
	return nil
}

// A steady and controllable camera box environment for the device, used by
// camera test automation. http://go/cros-camera-box
type Camerabox struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Facing Camerabox_Facing `protobuf:"varint,1,opt,name=facing,proto3,enum=chromiumos.test.lab.api.Camerabox_Facing" json:"facing,omitempty"`
}

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

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

func (*Camerabox) ProtoMessage() {}

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

func (x *Camerabox) GetFacing() Camerabox_Facing {
	if x != nil {
		return x.Facing
	}
	return Camerabox_FACING_UNSPECIFIED
}

type Cellular struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Cellular operators supported by the SIM installed in the device.
	Operators []Cellular_Operator `protobuf:"varint,1,rep,packed,name=operators,proto3,enum=chromiumos.test.lab.api.Cellular_Operator" json:"operators,omitempty"`
}

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

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

func (*Cellular) ProtoMessage() {}

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

func (x *Cellular) GetOperators() []Cellular_Operator {
	if x != nil {
		return x.Operators
	}
	return nil
}

// See https://sites.google.com/a/google.com/cros-chameleon/home
type Chameleon struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Peripherals []Chameleon_Peripheral `protobuf:"varint,1,rep,packed,name=peripherals,proto3,enum=chromiumos.test.lab.api.Chameleon_Peripheral" json:"peripherals,omitempty"`
	// Indicate if there's an audio_board in the chameleon.
	AudioBoard bool `protobuf:"varint,2,opt,name=audio_board,json=audioBoard,proto3" json:"audio_board,omitempty"`
}

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

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

func (*Chameleon) ProtoMessage() {}

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

func (x *Chameleon) GetPeripherals() []Chameleon_Peripheral {
	if x != nil {
		return x.Peripherals
	}
	return nil
}

func (x *Chameleon) GetAudioBoard() bool {
	if x != nil {
		return x.AudioBoard
	}
	return false
}

// External camera connected to the device.
type ExternalCamera struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Type ExternalCamera_Type `protobuf:"varint,1,opt,name=type,proto3,enum=chromiumos.test.lab.api.ExternalCamera_Type" json:"type,omitempty"`
}

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

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

func (*ExternalCamera) ProtoMessage() {}

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

func (x *ExternalCamera) GetType() ExternalCamera_Type {
	if x != nil {
		return x.Type
	}
	return ExternalCamera_TYPE_UNSPECIFIED
}

// Remote power management capability for the device.
type RPM struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Present bool `protobuf:"varint,1,opt,name=present,proto3" json:"present,omitempty"`
}

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

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

func (*RPM) ProtoMessage() {}

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

func (x *RPM) GetPresent() bool {
	if x != nil {
		return x.Present
	}
	return false
}

// Servo control of the device.
type Servo struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Present bool `protobuf:"varint,1,opt,name=present,proto3" json:"present,omitempty"`
	// Address to the host running the servod daemon.
	// Port number servod is listening on.
	ServodAddress *IpEndpoint `protobuf:"bytes,2,opt,name=servod_address,json=servodAddress,proto3" json:"servod_address,omitempty"`
	// Serial number of the servo.
	Serial string `protobuf:"bytes,3,opt,name=serial,proto3" json:"serial,omitempty"`
}

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

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

func (*Servo) ProtoMessage() {}

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

func (x *Servo) GetPresent() bool {
	if x != nil {
		return x.Present
	}
	return false
}

func (x *Servo) GetServodAddress() *IpEndpoint {
	if x != nil {
		return x.ServodAddress
	}
	return nil
}

func (x *Servo) GetSerial() string {
	if x != nil {
		return x.Serial
	}
	return ""
}

type Touch struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Has touch monitor mimo.
	Mimo bool `protobuf:"varint,1,opt,name=mimo,proto3" json:"mimo,omitempty"`
}

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

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

func (*Touch) ProtoMessage() {}

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

func (x *Touch) GetMimo() bool {
	if x != nil {
		return x.Mimo
	}
	return false
}

// Wifi environment of the device.
type Wifi struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Environment Wifi_Environment `protobuf:"varint,1,opt,name=environment,proto3,enum=chromiumos.test.lab.api.Wifi_Environment" json:"environment,omitempty"`
	Antenna     *WifiAntenna     `protobuf:"bytes,2,opt,name=antenna,proto3" json:"antenna,omitempty"`
}

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

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

func (*Wifi) ProtoMessage() {}

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

func (x *Wifi) GetEnvironment() Wifi_Environment {
	if x != nil {
		return x.Environment
	}
	return Wifi_ENVIRONMENT_UNSPECIFIED
}

func (x *Wifi) GetAntenna() *WifiAntenna {
	if x != nil {
		return x.Antenna
	}
	return nil
}

type WifiAntenna struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Connection WifiAntenna_Connection `protobuf:"varint,1,opt,name=connection,proto3,enum=chromiumos.test.lab.api.WifiAntenna_Connection" json:"connection,omitempty"`
}

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

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

func (*WifiAntenna) ProtoMessage() {}

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

func (x *WifiAntenna) GetConnection() WifiAntenna_Connection {
	if x != nil {
		return x.Connection
	}
	return WifiAntenna_CONNECTION_UNSPECIFIED
}

// Unique identifier for the lab device. It can be the DUT serial number
// (e.g. "C144091") derived from the DUT itself or some other unique value
// regarding different contexts.
type Dut_Id struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*Dut_Id) ProtoMessage() {}

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

func (x *Dut_Id) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

// Chrome OS specific DUT details
// NEXT TAG: 16
type Dut_ChromeOS struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// Unique identifiers around the device's hardware, manufacturing, and brand
	// configuration.
	DeviceConfigId *api.DeviceConfigId `protobuf:"bytes,3,opt,name=device_config_id,json=deviceConfigId,proto3" json:"device_config_id,omitempty"`
	// Endpoint for ssh service running on the device
	Ssh *IpEndpoint `protobuf:"bytes,2,opt,name=ssh,proto3" json:"ssh,omitempty"`
	// ChromeOS DUT name that is usually associated with the hostname.
	// Example: "chromeos6-row16-rack11-host1"
	Name            string            `protobuf:"bytes,15,opt,name=name,proto3" json:"name,omitempty"`
	DutModel        *DutModel         `protobuf:"bytes,14,opt,name=dut_model,json=dutModel,proto3" json:"dut_model,omitempty"`
	Servo           *Servo            `protobuf:"bytes,4,opt,name=servo,proto3" json:"servo,omitempty"`
	Chameleon       *Chameleon        `protobuf:"bytes,5,opt,name=chameleon,proto3" json:"chameleon,omitempty"`
	Rpm             *RPM              `protobuf:"bytes,6,opt,name=rpm,proto3" json:"rpm,omitempty"`
	ExternalCameras []*ExternalCamera `protobuf:"bytes,7,rep,name=external_cameras,json=externalCameras,proto3" json:"external_cameras,omitempty"`
	Audio           *Audio            `protobuf:"bytes,8,opt,name=audio,proto3" json:"audio,omitempty"`
	Wifi            *Wifi             `protobuf:"bytes,9,opt,name=wifi,proto3" json:"wifi,omitempty"`
	Touch           *Touch            `protobuf:"bytes,10,opt,name=touch,proto3" json:"touch,omitempty"`
	Camerabox       *Camerabox        `protobuf:"bytes,11,opt,name=camerabox,proto3" json:"camerabox,omitempty"`
	Cables          []*Cable          `protobuf:"bytes,12,rep,name=cables,proto3" json:"cables,omitempty"`
	Cellular        *Cellular         `protobuf:"bytes,13,opt,name=cellular,proto3" json:"cellular,omitempty"`
}

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

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

func (*Dut_ChromeOS) ProtoMessage() {}

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

func (x *Dut_ChromeOS) GetDeviceConfigId() *api.DeviceConfigId {
	if x != nil {
		return x.DeviceConfigId
	}
	return nil
}

func (x *Dut_ChromeOS) GetSsh() *IpEndpoint {
	if x != nil {
		return x.Ssh
	}
	return nil
}

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

func (x *Dut_ChromeOS) GetDutModel() *DutModel {
	if x != nil {
		return x.DutModel
	}
	return nil
}

func (x *Dut_ChromeOS) GetServo() *Servo {
	if x != nil {
		return x.Servo
	}
	return nil
}

func (x *Dut_ChromeOS) GetChameleon() *Chameleon {
	if x != nil {
		return x.Chameleon
	}
	return nil
}

func (x *Dut_ChromeOS) GetRpm() *RPM {
	if x != nil {
		return x.Rpm
	}
	return nil
}

func (x *Dut_ChromeOS) GetExternalCameras() []*ExternalCamera {
	if x != nil {
		return x.ExternalCameras
	}
	return nil
}

func (x *Dut_ChromeOS) GetAudio() *Audio {
	if x != nil {
		return x.Audio
	}
	return nil
}

func (x *Dut_ChromeOS) GetWifi() *Wifi {
	if x != nil {
		return x.Wifi
	}
	return nil
}

func (x *Dut_ChromeOS) GetTouch() *Touch {
	if x != nil {
		return x.Touch
	}
	return nil
}

func (x *Dut_ChromeOS) GetCamerabox() *Camerabox {
	if x != nil {
		return x.Camerabox
	}
	return nil
}

func (x *Dut_ChromeOS) GetCables() []*Cable {
	if x != nil {
		return x.Cables
	}
	return nil
}

func (x *Dut_ChromeOS) GetCellular() *Cellular {
	if x != nil {
		return x.Cellular
	}
	return nil
}

// Android specific DUT details
type Dut_Android struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// A hostname of the device that the Android DUT is attached to.
	AssociatedHostname *IpEndpoint `protobuf:"bytes,1,opt,name=associated_hostname,json=associatedHostname,proto3" json:"associated_hostname,omitempty"`
	// Android DUT name.
	Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"`
	// A string created by adb to uniquely identify the device.
	SerialNumber string    `protobuf:"bytes,3,opt,name=serial_number,json=serialNumber,proto3" json:"serial_number,omitempty"`
	DutModel     *DutModel `protobuf:"bytes,4,opt,name=dut_model,json=dutModel,proto3" json:"dut_model,omitempty"`
}

func (x *Dut_Android) Reset() {
	*x = Dut_Android{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_test_lab_api_dut_proto_msgTypes[17]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

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

func (*Dut_Android) ProtoMessage() {}

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

func (x *Dut_Android) GetAssociatedHostname() *IpEndpoint {
	if x != nil {
		return x.AssociatedHostname
	}
	return nil
}

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

func (x *Dut_Android) GetSerialNumber() string {
	if x != nil {
		return x.SerialNumber
	}
	return ""
}

func (x *Dut_Android) GetDutModel() *DutModel {
	if x != nil {
		return x.DutModel
	}
	return nil
}

// Unique identifier for a given dut topology (schedulable lab unit)
type DutTopology_Id struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
}

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

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

func (*DutTopology_Id) ProtoMessage() {}

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

func (x *DutTopology_Id) GetValue() string {
	if x != nil {
		return x.Value
	}
	return ""
}

var File_chromiumos_test_lab_api_dut_proto protoreflect.FileDescriptor

var file_chromiumos_test_lab_api_dut_proto_rawDesc = []byte{
	0x0a, 0x21, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73,
	0x74, 0x2f, 0x6c, 0x61, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x64, 0x75, 0x74, 0x2e, 0x70, 0x72,
	0x6f, 0x74, 0x6f, 0x12, 0x17, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x1a, 0x2c, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f,
	0x61, 0x70, 0x69, 0x2f, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69,
	0x67, 0x5f, 0x69, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x29, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6c, 0x61, 0x62, 0x2f,
	0x61, 0x70, 0x69, 0x2f, 0x69, 0x70, 0x5f, 0x65, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x2e,
	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcc, 0x0a, 0x0a, 0x03, 0x44, 0x75, 0x74, 0x12, 0x2f, 0x0a,
	0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x2e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x43,
	0x0a, 0x08, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x65, 0x6f, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b,
	0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x2e, 0x43,
	0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x48, 0x00, 0x52, 0x08, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x65, 0x6f, 0x73, 0x12, 0x40, 0x0a, 0x07, 0x61, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x18, 0x03,
	0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44,
	0x75, 0x74, 0x2e, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x48, 0x00, 0x52, 0x07, 0x61, 0x6e,
	0x64, 0x72, 0x6f, 0x69, 0x64, 0x12, 0x47, 0x0a, 0x0c, 0x63, 0x61, 0x63, 0x68, 0x65, 0x5f, 0x73,
	0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61,
	0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65,
	0x72, 0x52, 0x0b, 0x63, 0x61, 0x63, 0x68, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x1a, 0x1a,
	0x0a, 0x02, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x1a, 0xc0, 0x06, 0x0a, 0x08, 0x43,
	0x68, 0x72, 0x6f, 0x6d, 0x65, 0x4f, 0x53, 0x12, 0x4f, 0x0a, 0x10, 0x64, 0x65, 0x76, 0x69, 0x63,
	0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x25, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x63,
	0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x65, 0x76, 0x69, 0x63, 0x65,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x52, 0x0e, 0x64, 0x65, 0x76, 0x69, 0x63, 0x65,
	0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x49, 0x64, 0x12, 0x35, 0x0a, 0x03, 0x73, 0x73, 0x68, 0x18,
	0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x49, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x03, 0x73, 0x73, 0x68, 0x12,
	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x09, 0x64, 0x75, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c,
	0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x44, 0x75, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x08, 0x64, 0x75, 0x74, 0x4d, 0x6f,
	0x64, 0x65, 0x6c, 0x12, 0x34, 0x0a, 0x05, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x18, 0x04, 0x20, 0x01,
	0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e,
	0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72,
	0x76, 0x6f, 0x52, 0x05, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x12, 0x40, 0x0a, 0x09, 0x63, 0x68, 0x61,
	0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c,
	0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e,
	0x52, 0x09, 0x63, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x03, 0x72,
	0x70, 0x6d, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x52, 0x50, 0x4d, 0x52, 0x03, 0x72, 0x70, 0x6d, 0x12, 0x52, 0x0a, 0x10, 0x65,
	0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x18,
	0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x52, 0x0f,
	0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x73, 0x12,
	0x34, 0x0a, 0x05, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x52, 0x05,
	0x61, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x31, 0x0a, 0x04, 0x77, 0x69, 0x66, 0x69, 0x18, 0x09, 0x20,
	0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x69,
	0x66, 0x69, 0x52, 0x04, 0x77, 0x69, 0x66, 0x69, 0x12, 0x34, 0x0a, 0x05, 0x74, 0x6f, 0x75, 0x63,
	0x68, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70,
	0x69, 0x2e, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x52, 0x05, 0x74, 0x6f, 0x75, 0x63, 0x68, 0x12, 0x40,
	0x0a, 0x09, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x18, 0x0b, 0x20, 0x01, 0x28,
	0x0b, 0x32, 0x22, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74,
	0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6d, 0x65,
	0x72, 0x61, 0x62, 0x6f, 0x78, 0x52, 0x09, 0x63, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78,
	0x12, 0x36, 0x0a, 0x06, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b,
	0x32, 0x1e, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65,
	0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x62, 0x6c, 0x65,
	0x52, 0x06, 0x63, 0x61, 0x62, 0x6c, 0x65, 0x73, 0x12, 0x3d, 0x0a, 0x08, 0x63, 0x65, 0x6c, 0x6c,
	0x75, 0x6c, 0x61, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68, 0x72,
	0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62,
	0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x52, 0x08, 0x63,
	0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x1a, 0xd8, 0x01,
	0x0a, 0x07, 0x41, 0x6e, 0x64, 0x72, 0x6f, 0x69, 0x64, 0x12, 0x54, 0x0a, 0x13, 0x61, 0x73, 0x73,
	0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75,
	0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69,
	0x2e, 0x49, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x12, 0x61, 0x73, 0x73,
	0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x48, 0x6f, 0x73, 0x74, 0x6e, 0x61, 0x6d, 0x65, 0x12,
	0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e,
	0x61, 0x6d, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x5f, 0x6e, 0x75,
	0x6d, 0x62, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x69,
	0x61, 0x6c, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x3e, 0x0a, 0x09, 0x64, 0x75, 0x74, 0x5f,
	0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61,
	0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x08,
	0x64, 0x75, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x0a, 0x0a, 0x08, 0x64, 0x75, 0x74, 0x5f,
	0x74, 0x79, 0x70, 0x65, 0x22, 0x4c, 0x0a, 0x08, 0x44, 0x75, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c,
	0x12, 0x21, 0x0a, 0x0c, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74,
	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x75, 0x69, 0x6c, 0x64, 0x54, 0x61, 0x72,
	0x67, 0x65, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x6e, 0x61, 0x6d,
	0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x4e, 0x61,
	0x6d, 0x65, 0x22, 0xa0, 0x01, 0x0a, 0x0b, 0x44, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x6f, 0x6c, 0x6f,
	0x67, 0x79, 0x12, 0x37, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27,
	0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74,
	0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x54, 0x6f, 0x70, 0x6f,
	0x6c, 0x6f, 0x67, 0x79, 0x2e, 0x49, 0x64, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x04, 0x64,
	0x75, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x44, 0x75, 0x74, 0x52, 0x04, 0x64, 0x75, 0x74, 0x73, 0x1a, 0x1a, 0x0a,
	0x02, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01,
	0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a,
	0x04, 0x08, 0x02, 0x10, 0x03, 0x22, 0x3a, 0x0a, 0x05, 0x41, 0x75, 0x64, 0x69, 0x6f, 0x12, 0x1b,
	0x0a, 0x09, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x62, 0x6f, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28,
	0x08, 0x52, 0x08, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x42, 0x6f, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x61,
	0x74, 0x72, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x61, 0x74, 0x72, 0x75,
	0x73, 0x22, 0x9b, 0x01, 0x0a, 0x05, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x37, 0x0a, 0x04, 0x74,
	0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e,
	0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x62, 0x6c, 0x65, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04,
	0x74, 0x79, 0x70, 0x65, 0x22, 0x59, 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, 0x0d, 0x0a, 0x09, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x4a, 0x41, 0x43, 0x4b, 0x10,
	0x01, 0x12, 0x0c, 0x0a, 0x08, 0x55, 0x53, 0x42, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x10, 0x02, 0x12,
	0x0f, 0x0a, 0x0b, 0x55, 0x53, 0x42, 0x50, 0x52, 0x49, 0x4e, 0x54, 0x49, 0x4e, 0x47, 0x10, 0x03,
	0x12, 0x0d, 0x0a, 0x09, 0x48, 0x44, 0x4d, 0x49, 0x41, 0x55, 0x44, 0x49, 0x4f, 0x10, 0x04, 0x22,
	0x4c, 0x0a, 0x0b, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x3d,
	0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
	0x23, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73,
	0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x70, 0x45, 0x6e, 0x64, 0x70,
	0x6f, 0x69, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x85, 0x01,
	0x0a, 0x09, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x12, 0x41, 0x0a, 0x06, 0x66,
	0x61, 0x63, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x68,
	0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61,
	0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x62, 0x6f, 0x78, 0x2e,
	0x46, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x52, 0x06, 0x66, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x22, 0x35,
	0x0a, 0x06, 0x46, 0x61, 0x63, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x12, 0x46, 0x41, 0x43, 0x49,
	0x4e, 0x47, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x08, 0x0a, 0x04, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x01, 0x12, 0x09, 0x0a, 0x05, 0x46, 0x52,
	0x4f, 0x4e, 0x54, 0x10, 0x02, 0x22, 0x9d, 0x01, 0x0a, 0x08, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c,
	0x61, 0x72, 0x12, 0x48, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x18,
	0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2a, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d,
	0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e,
	0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f,
	0x72, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x22, 0x47, 0x0a, 0x08,
	0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x18, 0x0a, 0x14, 0x4f, 0x50, 0x45, 0x52,
	0x41, 0x54, 0x4f, 0x52, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44,
	0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x41, 0x54, 0x54, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x56,
	0x45, 0x52, 0x49, 0x5a, 0x4f, 0x4e, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x54, 0x4d, 0x4f, 0x42,
	0x49, 0x4c, 0x45, 0x10, 0x03, 0x22, 0x8b, 0x02, 0x0a, 0x09, 0x43, 0x68, 0x61, 0x6d, 0x65, 0x6c,
	0x65, 0x6f, 0x6e, 0x12, 0x4f, 0x0a, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65, 0x72, 0x61,
	0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x2d, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x43, 0x68, 0x61, 0x6d, 0x65, 0x6c, 0x65, 0x6f, 0x6e, 0x2e, 0x50, 0x65, 0x72,
	0x69, 0x70, 0x68, 0x65, 0x72, 0x61, 0x6c, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x69, 0x70, 0x68, 0x65,
	0x72, 0x61, 0x6c, 0x73, 0x12, 0x1f, 0x0a, 0x0b, 0x61, 0x75, 0x64, 0x69, 0x6f, 0x5f, 0x62, 0x6f,
	0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x61, 0x75, 0x64, 0x69, 0x6f,
	0x42, 0x6f, 0x61, 0x72, 0x64, 0x22, 0x8b, 0x01, 0x0a, 0x0a, 0x50, 0x65, 0x72, 0x69, 0x70, 0x68,
	0x65, 0x72, 0x61, 0x6c, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x45, 0x49, 0x50, 0x48, 0x45, 0x52,
	0x41, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00,
	0x12, 0x0a, 0x0a, 0x06, 0x42, 0x54, 0x5f, 0x48, 0x49, 0x44, 0x10, 0x01, 0x12, 0x06, 0x0a, 0x02,
	0x44, 0x50, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x50, 0x5f, 0x48, 0x44, 0x4d, 0x49, 0x10,
	0x03, 0x12, 0x07, 0x0a, 0x03, 0x56, 0x47, 0x41, 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x48, 0x44,
	0x4d, 0x49, 0x10, 0x05, 0x12, 0x0e, 0x0a, 0x0a, 0x42, 0x54, 0x5f, 0x42, 0x4c, 0x45, 0x5f, 0x48,
	0x49, 0x44, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x42, 0x54, 0x5f, 0x41, 0x32, 0x44, 0x50, 0x5f,
	0x53, 0x49, 0x4e, 0x4b, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x42, 0x54, 0x5f, 0x50, 0x45, 0x45,
	0x52, 0x10, 0x08, 0x22, 0x89, 0x01, 0x0a, 0x0e, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c,
	0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x12, 0x40, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x0e, 0x32, 0x2c, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f,
	0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x45,
	0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x61, 0x6d, 0x65, 0x72, 0x61, 0x2e, 0x54, 0x79,
	0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x22, 0x35, 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, 0x0a, 0x0a, 0x06, 0x48, 0x55, 0x44, 0x44, 0x4c, 0x59,
	0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x50, 0x54, 0x5a, 0x50, 0x52, 0x4f, 0x32, 0x10, 0x02, 0x22,
	0x1f, 0x0a, 0x03, 0x52, 0x50, 0x4d, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e,
	0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65, 0x73, 0x65, 0x6e, 0x74,
	0x22, 0x85, 0x01, 0x0a, 0x05, 0x53, 0x65, 0x72, 0x76, 0x6f, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72,
	0x65, 0x73, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x65,
	0x73, 0x65, 0x6e, 0x74, 0x12, 0x4a, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x64, 0x5f, 0x61,
	0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c,
	0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x49, 0x70, 0x45, 0x6e, 0x64, 0x70, 0x6f, 0x69, 0x6e,
	0x74, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x6f, 0x64, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73,
	0x12, 0x16, 0x0a, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09,
	0x52, 0x06, 0x73, 0x65, 0x72, 0x69, 0x61, 0x6c, 0x22, 0x1b, 0x0a, 0x05, 0x54, 0x6f, 0x75, 0x63,
	0x68, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x69, 0x6d, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52,
	0x04, 0x6d, 0x69, 0x6d, 0x6f, 0x22, 0xfc, 0x01, 0x0a, 0x04, 0x57, 0x69, 0x66, 0x69, 0x12, 0x4b,
	0x0a, 0x0b, 0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20,
	0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73,
	0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x69,
	0x66, 0x69, 0x2e, 0x45, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x0b,
	0x65, 0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x3e, 0x0a, 0x07, 0x61,
	0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c,
	0x61, 0x62, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x41, 0x6e, 0x74, 0x65, 0x6e,
	0x6e, 0x61, 0x52, 0x07, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x22, 0x67, 0x0a, 0x0b, 0x45,
	0x6e, 0x76, 0x69, 0x72, 0x6f, 0x6e, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x17, 0x45, 0x4e,
	0x56, 0x49, 0x52, 0x4f, 0x4e, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
	0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x4e, 0x44,
	0x41, 0x52, 0x44, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x57, 0x49, 0x46, 0x49, 0x5f, 0x43, 0x45,
	0x4c, 0x4c, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x48, 0x41, 0x4f, 0x53, 0x10, 0x03, 0x12,
	0x13, 0x0a, 0x0f, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x52, 0x5f, 0x38, 0x30, 0x32, 0x5f, 0x31, 0x31,
	0x41, 0x58, 0x10, 0x04, 0x22, 0xa1, 0x01, 0x0a, 0x0b, 0x57, 0x69, 0x66, 0x69, 0x41, 0x6e, 0x74,
	0x65, 0x6e, 0x6e, 0x61, 0x12, 0x4f, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69,
	0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d,
	0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x2e, 0x6c, 0x61, 0x62, 0x2e, 0x61,
	0x70, 0x69, 0x2e, 0x57, 0x69, 0x66, 0x69, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x2e, 0x43,
	0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x6e, 0x65,
	0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x41, 0x0a, 0x0a, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74,
	0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x16, 0x43, 0x4f, 0x4e, 0x4e, 0x45, 0x43, 0x54, 0x49, 0x4f,
	0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12,
	0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x44, 0x55, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x01, 0x12,
	0x07, 0x0a, 0x03, 0x4f, 0x54, 0x41, 0x10, 0x02, 0x42, 0x33, 0x5a, 0x31, 0x67, 0x6f, 0x2e, 0x63,
	0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x2f, 0x67, 0x6f,
	0x2f, 0x74, 0x65, 0x73, 0x74, 0x2f, 0x6c, 0x61, 0x62, 0x2f, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70,
	0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_test_lab_api_dut_proto_rawDescOnce sync.Once
	file_chromiumos_test_lab_api_dut_proto_rawDescData = file_chromiumos_test_lab_api_dut_proto_rawDesc
)

func file_chromiumos_test_lab_api_dut_proto_rawDescGZIP() []byte {
	file_chromiumos_test_lab_api_dut_proto_rawDescOnce.Do(func() {
		file_chromiumos_test_lab_api_dut_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_test_lab_api_dut_proto_rawDescData)
	})
	return file_chromiumos_test_lab_api_dut_proto_rawDescData
}

var file_chromiumos_test_lab_api_dut_proto_enumTypes = make([]protoimpl.EnumInfo, 7)
var file_chromiumos_test_lab_api_dut_proto_msgTypes = make([]protoimpl.MessageInfo, 19)
var file_chromiumos_test_lab_api_dut_proto_goTypes = []interface{}{
	(Cable_Type)(0),             // 0: chromiumos.test.lab.api.Cable.Type
	(Camerabox_Facing)(0),       // 1: chromiumos.test.lab.api.Camerabox.Facing
	(Cellular_Operator)(0),      // 2: chromiumos.test.lab.api.Cellular.Operator
	(Chameleon_Peripheral)(0),   // 3: chromiumos.test.lab.api.Chameleon.Peripheral
	(ExternalCamera_Type)(0),    // 4: chromiumos.test.lab.api.ExternalCamera.Type
	(Wifi_Environment)(0),       // 5: chromiumos.test.lab.api.Wifi.Environment
	(WifiAntenna_Connection)(0), // 6: chromiumos.test.lab.api.WifiAntenna.Connection
	(*Dut)(nil),                 // 7: chromiumos.test.lab.api.Dut
	(*DutModel)(nil),            // 8: chromiumos.test.lab.api.DutModel
	(*DutTopology)(nil),         // 9: chromiumos.test.lab.api.DutTopology
	(*Audio)(nil),               // 10: chromiumos.test.lab.api.Audio
	(*Cable)(nil),               // 11: chromiumos.test.lab.api.Cable
	(*CacheServer)(nil),         // 12: chromiumos.test.lab.api.CacheServer
	(*Camerabox)(nil),           // 13: chromiumos.test.lab.api.Camerabox
	(*Cellular)(nil),            // 14: chromiumos.test.lab.api.Cellular
	(*Chameleon)(nil),           // 15: chromiumos.test.lab.api.Chameleon
	(*ExternalCamera)(nil),      // 16: chromiumos.test.lab.api.ExternalCamera
	(*RPM)(nil),                 // 17: chromiumos.test.lab.api.RPM
	(*Servo)(nil),               // 18: chromiumos.test.lab.api.Servo
	(*Touch)(nil),               // 19: chromiumos.test.lab.api.Touch
	(*Wifi)(nil),                // 20: chromiumos.test.lab.api.Wifi
	(*WifiAntenna)(nil),         // 21: chromiumos.test.lab.api.WifiAntenna
	(*Dut_Id)(nil),              // 22: chromiumos.test.lab.api.Dut.Id
	(*Dut_ChromeOS)(nil),        // 23: chromiumos.test.lab.api.Dut.ChromeOS
	(*Dut_Android)(nil),         // 24: chromiumos.test.lab.api.Dut.Android
	(*DutTopology_Id)(nil),      // 25: chromiumos.test.lab.api.DutTopology.Id
	(*IpEndpoint)(nil),          // 26: chromiumos.test.lab.api.IpEndpoint
	(*api.DeviceConfigId)(nil),  // 27: chromiumos.config.api.DeviceConfigId
}
var file_chromiumos_test_lab_api_dut_proto_depIdxs = []int32{
	22, // 0: chromiumos.test.lab.api.Dut.id:type_name -> chromiumos.test.lab.api.Dut.Id
	23, // 1: chromiumos.test.lab.api.Dut.chromeos:type_name -> chromiumos.test.lab.api.Dut.ChromeOS
	24, // 2: chromiumos.test.lab.api.Dut.android:type_name -> chromiumos.test.lab.api.Dut.Android
	12, // 3: chromiumos.test.lab.api.Dut.cache_server:type_name -> chromiumos.test.lab.api.CacheServer
	25, // 4: chromiumos.test.lab.api.DutTopology.id:type_name -> chromiumos.test.lab.api.DutTopology.Id
	7,  // 5: chromiumos.test.lab.api.DutTopology.duts:type_name -> chromiumos.test.lab.api.Dut
	0,  // 6: chromiumos.test.lab.api.Cable.type:type_name -> chromiumos.test.lab.api.Cable.Type
	26, // 7: chromiumos.test.lab.api.CacheServer.address:type_name -> chromiumos.test.lab.api.IpEndpoint
	1,  // 8: chromiumos.test.lab.api.Camerabox.facing:type_name -> chromiumos.test.lab.api.Camerabox.Facing
	2,  // 9: chromiumos.test.lab.api.Cellular.operators:type_name -> chromiumos.test.lab.api.Cellular.Operator
	3,  // 10: chromiumos.test.lab.api.Chameleon.peripherals:type_name -> chromiumos.test.lab.api.Chameleon.Peripheral
	4,  // 11: chromiumos.test.lab.api.ExternalCamera.type:type_name -> chromiumos.test.lab.api.ExternalCamera.Type
	26, // 12: chromiumos.test.lab.api.Servo.servod_address:type_name -> chromiumos.test.lab.api.IpEndpoint
	5,  // 13: chromiumos.test.lab.api.Wifi.environment:type_name -> chromiumos.test.lab.api.Wifi.Environment
	21, // 14: chromiumos.test.lab.api.Wifi.antenna:type_name -> chromiumos.test.lab.api.WifiAntenna
	6,  // 15: chromiumos.test.lab.api.WifiAntenna.connection:type_name -> chromiumos.test.lab.api.WifiAntenna.Connection
	27, // 16: chromiumos.test.lab.api.Dut.ChromeOS.device_config_id:type_name -> chromiumos.config.api.DeviceConfigId
	26, // 17: chromiumos.test.lab.api.Dut.ChromeOS.ssh:type_name -> chromiumos.test.lab.api.IpEndpoint
	8,  // 18: chromiumos.test.lab.api.Dut.ChromeOS.dut_model:type_name -> chromiumos.test.lab.api.DutModel
	18, // 19: chromiumos.test.lab.api.Dut.ChromeOS.servo:type_name -> chromiumos.test.lab.api.Servo
	15, // 20: chromiumos.test.lab.api.Dut.ChromeOS.chameleon:type_name -> chromiumos.test.lab.api.Chameleon
	17, // 21: chromiumos.test.lab.api.Dut.ChromeOS.rpm:type_name -> chromiumos.test.lab.api.RPM
	16, // 22: chromiumos.test.lab.api.Dut.ChromeOS.external_cameras:type_name -> chromiumos.test.lab.api.ExternalCamera
	10, // 23: chromiumos.test.lab.api.Dut.ChromeOS.audio:type_name -> chromiumos.test.lab.api.Audio
	20, // 24: chromiumos.test.lab.api.Dut.ChromeOS.wifi:type_name -> chromiumos.test.lab.api.Wifi
	19, // 25: chromiumos.test.lab.api.Dut.ChromeOS.touch:type_name -> chromiumos.test.lab.api.Touch
	13, // 26: chromiumos.test.lab.api.Dut.ChromeOS.camerabox:type_name -> chromiumos.test.lab.api.Camerabox
	11, // 27: chromiumos.test.lab.api.Dut.ChromeOS.cables:type_name -> chromiumos.test.lab.api.Cable
	14, // 28: chromiumos.test.lab.api.Dut.ChromeOS.cellular:type_name -> chromiumos.test.lab.api.Cellular
	26, // 29: chromiumos.test.lab.api.Dut.Android.associated_hostname:type_name -> chromiumos.test.lab.api.IpEndpoint
	8,  // 30: chromiumos.test.lab.api.Dut.Android.dut_model:type_name -> chromiumos.test.lab.api.DutModel
	31, // [31:31] is the sub-list for method output_type
	31, // [31:31] is the sub-list for method input_type
	31, // [31:31] is the sub-list for extension type_name
	31, // [31:31] is the sub-list for extension extendee
	0,  // [0:31] is the sub-list for field type_name
}

func init() { file_chromiumos_test_lab_api_dut_proto_init() }
func file_chromiumos_test_lab_api_dut_proto_init() {
	if File_chromiumos_test_lab_api_dut_proto != nil {
		return
	}
	file_chromiumos_test_lab_api_ip_endpoint_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_test_lab_api_dut_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Dut); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DutModel); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DutTopology); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Audio); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Cable); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*CacheServer); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Camerabox); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Cellular); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Chameleon); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*ExternalCamera); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*RPM); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Servo); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Touch); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Wifi); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*WifiAntenna); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Dut_Id); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Dut_ChromeOS); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*Dut_Android); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
		file_chromiumos_test_lab_api_dut_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*DutTopology_Id); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	file_chromiumos_test_lab_api_dut_proto_msgTypes[0].OneofWrappers = []interface{}{
		(*Dut_Chromeos)(nil),
		(*Dut_Android_)(nil),
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_test_lab_api_dut_proto_rawDesc,
			NumEnums:      7,
			NumMessages:   19,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_test_lab_api_dut_proto_goTypes,
		DependencyIndexes: file_chromiumos_test_lab_api_dut_proto_depIdxs,
		EnumInfos:         file_chromiumos_test_lab_api_dut_proto_enumTypes,
		MessageInfos:      file_chromiumos_test_lab_api_dut_proto_msgTypes,
	}.Build()
	File_chromiumos_test_lab_api_dut_proto = out.File
	file_chromiumos_test_lab_api_dut_proto_rawDesc = nil
	file_chromiumos_test_lab_api_dut_proto_goTypes = nil
	file_chromiumos_test_lab_api_dut_proto_depIdxs = nil
}
