// Copyright 2019 The Chromium OS Authors. All rights reserved.
// 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.25.0-devel
// 	protoc        v3.6.1
// source: test_platform/phosphorus/upload_to_tko.proto

package phosphorus

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

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

// UploadToTkoRequest defines the input of `phosphorus upload-to-tko`.
type UploadToTkoRequest struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	Config *Config `protobuf:"bytes,1,opt,name=config,proto3" json:"config,omitempty"`
}

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

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

func (*UploadToTkoRequest) ProtoMessage() {}

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

func (x *UploadToTkoRequest) GetConfig() *Config {
	if x != nil {
		return x.Config
	}
	return nil
}

var File_test_platform_phosphorus_upload_to_tko_proto protoreflect.FileDescriptor

var file_test_platform_phosphorus_upload_to_tko_proto_rawDesc = []byte{
	0x0a, 0x2c, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f,
	0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x2f, 0x75, 0x70, 0x6c, 0x6f, 0x61,
	0x64, 0x5f, 0x74, 0x6f, 0x5f, 0x74, 0x6b, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x18,
	0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68,
	0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73, 0x1a, 0x25, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70,
	0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72,
	0x75, 0x73, 0x2f, 0x63, 0x6f, 0x6d, 0x6d, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22,
	0x4e, 0x0a, 0x12, 0x55, 0x70, 0x6c, 0x6f, 0x61, 0x64, 0x54, 0x6f, 0x54, 0x6b, 0x6f, 0x52, 0x65,
	0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x38, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
	0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x6c, 0x61,
	0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2e, 0x70, 0x68, 0x6f, 0x73, 0x70, 0x68, 0x6f, 0x72, 0x75, 0x73,
	0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42,
	0x44, 0x5a, 0x42, 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, 0x69, 0x6e,
	0x66, 0x72, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x73,
	0x74, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x2f, 0x70, 0x68, 0x6f, 0x73, 0x70,
	0x68, 0x6f, 0x72, 0x75, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_test_platform_phosphorus_upload_to_tko_proto_rawDescOnce sync.Once
	file_test_platform_phosphorus_upload_to_tko_proto_rawDescData = file_test_platform_phosphorus_upload_to_tko_proto_rawDesc
)

func file_test_platform_phosphorus_upload_to_tko_proto_rawDescGZIP() []byte {
	file_test_platform_phosphorus_upload_to_tko_proto_rawDescOnce.Do(func() {
		file_test_platform_phosphorus_upload_to_tko_proto_rawDescData = protoimpl.X.CompressGZIP(file_test_platform_phosphorus_upload_to_tko_proto_rawDescData)
	})
	return file_test_platform_phosphorus_upload_to_tko_proto_rawDescData
}

var file_test_platform_phosphorus_upload_to_tko_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_test_platform_phosphorus_upload_to_tko_proto_goTypes = []interface{}{
	(*UploadToTkoRequest)(nil), // 0: test_platform.phosphorus.UploadToTkoRequest
	(*Config)(nil),             // 1: test_platform.phosphorus.Config
}
var file_test_platform_phosphorus_upload_to_tko_proto_depIdxs = []int32{
	1, // 0: test_platform.phosphorus.UploadToTkoRequest.config:type_name -> test_platform.phosphorus.Config
	1, // [1:1] is the sub-list for method output_type
	1, // [1:1] is the sub-list for method input_type
	1, // [1:1] is the sub-list for extension type_name
	1, // [1:1] is the sub-list for extension extendee
	0, // [0:1] is the sub-list for field type_name
}

func init() { file_test_platform_phosphorus_upload_to_tko_proto_init() }
func file_test_platform_phosphorus_upload_to_tko_proto_init() {
	if File_test_platform_phosphorus_upload_to_tko_proto != nil {
		return
	}
	file_test_platform_phosphorus_common_proto_init()
	if !protoimpl.UnsafeEnabled {
		file_test_platform_phosphorus_upload_to_tko_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*UploadToTkoRequest); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_test_platform_phosphorus_upload_to_tko_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_test_platform_phosphorus_upload_to_tko_proto_goTypes,
		DependencyIndexes: file_test_platform_phosphorus_upload_to_tko_proto_depIdxs,
		MessageInfos:      file_test_platform_phosphorus_upload_to_tko_proto_msgTypes,
	}.Build()
	File_test_platform_phosphorus_upload_to_tko_proto = out.File
	file_test_platform_phosphorus_upload_to_tko_proto_rawDesc = nil
	file_test_platform_phosphorus_upload_to_tko_proto_goTypes = nil
	file_test_platform_phosphorus_upload_to_tko_proto_depIdxs = nil
}
