// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/src/third_party/chromiumos-overlay/config.proto

package prototype

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf

// This is a compile-time assertion to ensure that this generated file
// is compatible with the proto package it is being compiled against.
// A compilation error at this line likely means your copy of the
// proto package needs to be updated.
const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package

type BuildTargetId struct {
	Value                string   `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *BuildTargetId) Reset()         { *m = BuildTargetId{} }
func (m *BuildTargetId) String() string { return proto.CompactTextString(m) }
func (*BuildTargetId) ProtoMessage()    {}
func (*BuildTargetId) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{0}
}

func (m *BuildTargetId) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildTargetId.Unmarshal(m, b)
}
func (m *BuildTargetId) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildTargetId.Marshal(b, m, deterministic)
}
func (m *BuildTargetId) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildTargetId.Merge(m, src)
}
func (m *BuildTargetId) XXX_Size() int {
	return xxx_messageInfo_BuildTargetId.Size(m)
}
func (m *BuildTargetId) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildTargetId.DiscardUnknown(m)
}

var xxx_messageInfo_BuildTargetId proto.InternalMessageInfo

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

type FirmwarePayload struct {
	BuildTarget          string   `protobuf:"bytes,1,opt,name=build_target,json=buildTarget,proto3" json:"build_target,omitempty"`
	PinnedVersion        string   `protobuf:"bytes,2,opt,name=pinned_version,json=pinnedVersion,proto3" json:"pinned_version,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *FirmwarePayload) Reset()         { *m = FirmwarePayload{} }
func (m *FirmwarePayload) String() string { return proto.CompactTextString(m) }
func (*FirmwarePayload) ProtoMessage()    {}
func (*FirmwarePayload) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{1}
}

func (m *FirmwarePayload) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FirmwarePayload.Unmarshal(m, b)
}
func (m *FirmwarePayload) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FirmwarePayload.Marshal(b, m, deterministic)
}
func (m *FirmwarePayload) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FirmwarePayload.Merge(m, src)
}
func (m *FirmwarePayload) XXX_Size() int {
	return xxx_messageInfo_FirmwarePayload.Size(m)
}
func (m *FirmwarePayload) XXX_DiscardUnknown() {
	xxx_messageInfo_FirmwarePayload.DiscardUnknown(m)
}

var xxx_messageInfo_FirmwarePayload proto.InternalMessageInfo

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

func (m *FirmwarePayload) GetPinnedVersion() string {
	if m != nil {
		return m.PinnedVersion
	}
	return ""
}

type FirmwareConfig struct {
	ApRo                 *FirmwarePayload `protobuf:"bytes,1,opt,name=ap_ro,json=apRo,proto3" json:"ap_ro,omitempty"`
	ApRw                 *FirmwarePayload `protobuf:"bytes,2,opt,name=ap_rw,json=apRw,proto3" json:"ap_rw,omitempty"`
	Ec                   *FirmwarePayload `protobuf:"bytes,3,opt,name=ec,proto3" json:"ec,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *FirmwareConfig) Reset()         { *m = FirmwareConfig{} }
func (m *FirmwareConfig) String() string { return proto.CompactTextString(m) }
func (*FirmwareConfig) ProtoMessage()    {}
func (*FirmwareConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{2}
}

func (m *FirmwareConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_FirmwareConfig.Unmarshal(m, b)
}
func (m *FirmwareConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_FirmwareConfig.Marshal(b, m, deterministic)
}
func (m *FirmwareConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_FirmwareConfig.Merge(m, src)
}
func (m *FirmwareConfig) XXX_Size() int {
	return xxx_messageInfo_FirmwareConfig.Size(m)
}
func (m *FirmwareConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_FirmwareConfig.DiscardUnknown(m)
}

var xxx_messageInfo_FirmwareConfig proto.InternalMessageInfo

func (m *FirmwareConfig) GetApRo() *FirmwarePayload {
	if m != nil {
		return m.ApRo
	}
	return nil
}

func (m *FirmwareConfig) GetApRw() *FirmwarePayload {
	if m != nil {
		return m.ApRw
	}
	return nil
}

func (m *FirmwareConfig) GetEc() *FirmwarePayload {
	if m != nil {
		return m.Ec
	}
	return nil
}

type VariantBuildConfig struct {
	Id                   *DesignVariantId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	BuildTargetId        *BuildTargetId   `protobuf:"bytes,2,opt,name=build_target_id,json=buildTargetId,proto3" json:"build_target_id,omitempty"`
	OverlayConfig        *OverlayConfig   `protobuf:"bytes,3,opt,name=overlay_config,json=overlayConfig,proto3" json:"overlay_config,omitempty"`
	FirmwareConfig       *FirmwareConfig  `protobuf:"bytes,4,opt,name=firmware_config,json=firmwareConfig,proto3" json:"firmware_config,omitempty"`
	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
	XXX_unrecognized     []byte           `json:"-"`
	XXX_sizecache        int32            `json:"-"`
}

func (m *VariantBuildConfig) Reset()         { *m = VariantBuildConfig{} }
func (m *VariantBuildConfig) String() string { return proto.CompactTextString(m) }
func (*VariantBuildConfig) ProtoMessage()    {}
func (*VariantBuildConfig) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{3}
}

func (m *VariantBuildConfig) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VariantBuildConfig.Unmarshal(m, b)
}
func (m *VariantBuildConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VariantBuildConfig.Marshal(b, m, deterministic)
}
func (m *VariantBuildConfig) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VariantBuildConfig.Merge(m, src)
}
func (m *VariantBuildConfig) XXX_Size() int {
	return xxx_messageInfo_VariantBuildConfig.Size(m)
}
func (m *VariantBuildConfig) XXX_DiscardUnknown() {
	xxx_messageInfo_VariantBuildConfig.DiscardUnknown(m)
}

var xxx_messageInfo_VariantBuildConfig proto.InternalMessageInfo

func (m *VariantBuildConfig) GetId() *DesignVariantId {
	if m != nil {
		return m.Id
	}
	return nil
}

func (m *VariantBuildConfig) GetBuildTargetId() *BuildTargetId {
	if m != nil {
		return m.BuildTargetId
	}
	return nil
}

func (m *VariantBuildConfig) GetOverlayConfig() *OverlayConfig {
	if m != nil {
		return m.OverlayConfig
	}
	return nil
}

func (m *VariantBuildConfig) GetFirmwareConfig() *FirmwareConfig {
	if m != nil {
		return m.FirmwareConfig
	}
	return nil
}

type VariantBuildConfigList struct {
	Value                []*VariantBuildConfig `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
	XXX_unrecognized     []byte                `json:"-"`
	XXX_sizecache        int32                 `json:"-"`
}

func (m *VariantBuildConfigList) Reset()         { *m = VariantBuildConfigList{} }
func (m *VariantBuildConfigList) String() string { return proto.CompactTextString(m) }
func (*VariantBuildConfigList) ProtoMessage()    {}
func (*VariantBuildConfigList) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{4}
}

func (m *VariantBuildConfigList) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_VariantBuildConfigList.Unmarshal(m, b)
}
func (m *VariantBuildConfigList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_VariantBuildConfigList.Marshal(b, m, deterministic)
}
func (m *VariantBuildConfigList) XXX_Merge(src proto.Message) {
	xxx_messageInfo_VariantBuildConfigList.Merge(m, src)
}
func (m *VariantBuildConfigList) XXX_Size() int {
	return xxx_messageInfo_VariantBuildConfigList.Size(m)
}
func (m *VariantBuildConfigList) XXX_DiscardUnknown() {
	xxx_messageInfo_VariantBuildConfigList.DiscardUnknown(m)
}

var xxx_messageInfo_VariantBuildConfigList proto.InternalMessageInfo

func (m *VariantBuildConfigList) GetValue() []*VariantBuildConfig {
	if m != nil {
		return m.Value
	}
	return nil
}

type BuildTarget struct {
	Id                   *BuildTargetId `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *BuildTarget) Reset()         { *m = BuildTarget{} }
func (m *BuildTarget) String() string { return proto.CompactTextString(m) }
func (*BuildTarget) ProtoMessage()    {}
func (*BuildTarget) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{5}
}

func (m *BuildTarget) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildTarget.Unmarshal(m, b)
}
func (m *BuildTarget) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildTarget.Marshal(b, m, deterministic)
}
func (m *BuildTarget) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildTarget.Merge(m, src)
}
func (m *BuildTarget) XXX_Size() int {
	return xxx_messageInfo_BuildTarget.Size(m)
}
func (m *BuildTarget) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildTarget.DiscardUnknown(m)
}

var xxx_messageInfo_BuildTarget proto.InternalMessageInfo

func (m *BuildTarget) GetId() *BuildTargetId {
	if m != nil {
		return m.Id
	}
	return nil
}

type BuildTargetList struct {
	Value                []*BuildTarget `protobuf:"bytes,1,rep,name=value,proto3" json:"value,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *BuildTargetList) Reset()         { *m = BuildTargetList{} }
func (m *BuildTargetList) String() string { return proto.CompactTextString(m) }
func (*BuildTargetList) ProtoMessage()    {}
func (*BuildTargetList) Descriptor() ([]byte, []int) {
	return fileDescriptor_24d331d0463127ef, []int{6}
}

func (m *BuildTargetList) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_BuildTargetList.Unmarshal(m, b)
}
func (m *BuildTargetList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_BuildTargetList.Marshal(b, m, deterministic)
}
func (m *BuildTargetList) XXX_Merge(src proto.Message) {
	xxx_messageInfo_BuildTargetList.Merge(m, src)
}
func (m *BuildTargetList) XXX_Size() int {
	return xxx_messageInfo_BuildTargetList.Size(m)
}
func (m *BuildTargetList) XXX_DiscardUnknown() {
	xxx_messageInfo_BuildTargetList.DiscardUnknown(m)
}

var xxx_messageInfo_BuildTargetList proto.InternalMessageInfo

func (m *BuildTargetList) GetValue() []*BuildTarget {
	if m != nil {
		return m.Value
	}
	return nil
}

func init() {
	proto.RegisterType((*BuildTargetId)(nil), "prototype.BuildTargetId")
	proto.RegisterType((*FirmwarePayload)(nil), "prototype.FirmwarePayload")
	proto.RegisterType((*FirmwareConfig)(nil), "prototype.FirmwareConfig")
	proto.RegisterType((*VariantBuildConfig)(nil), "prototype.VariantBuildConfig")
	proto.RegisterType((*VariantBuildConfigList)(nil), "prototype.VariantBuildConfigList")
	proto.RegisterType((*BuildTarget)(nil), "prototype.BuildTarget")
	proto.RegisterType((*BuildTargetList)(nil), "prototype.BuildTargetList")
}

func init() {
	proto.RegisterFile("prototype/src/third_party/chromiumos-overlay/config.proto", fileDescriptor_24d331d0463127ef)
}

var fileDescriptor_24d331d0463127ef = []byte{
	// 436 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x84, 0x93, 0x51, 0x8b, 0xd4, 0x30,
	0x10, 0xc7, 0xd9, 0xde, 0x9d, 0x70, 0x53, 0xdb, 0x42, 0x90, 0xa5, 0x2e, 0x08, 0x5a, 0x39, 0x58,
	0x0e, 0x6d, 0xe0, 0x16, 0x11, 0x9f, 0x4e, 0x56, 0x11, 0x0e, 0x14, 0xa5, 0xc8, 0x3d, 0xe8, 0x43,
	0x49, 0x9b, 0xb4, 0x17, 0xe8, 0x36, 0x25, 0xcd, 0xee, 0xd2, 0x4f, 0xe0, 0xb7, 0xf0, 0xb3, 0x8a,
	0x69, 0xba, 0x9b, 0xba, 0x2b, 0xfb, 0x96, 0x19, 0xe6, 0xff, 0xcb, 0x7f, 0x66, 0x12, 0x78, 0xd7,
	0x48, 0xa1, 0x84, 0xea, 0x1a, 0x86, 0x5b, 0x99, 0x63, 0xf5, 0xc0, 0x25, 0x4d, 0x1b, 0x22, 0x55,
	0x87, 0xf3, 0x07, 0x29, 0x56, 0x7c, 0xbd, 0x12, 0xed, 0x6b, 0xb1, 0x61, 0xb2, 0x22, 0x1d, 0xce,
	0x45, 0x5d, 0xf0, 0x32, 0xd6, 0x1a, 0x74, 0xb9, 0x93, 0xce, 0xa6, 0x7b, 0x0a, 0x65, 0x2d, 0x2f,
	0xeb, 0xbe, 0x64, 0xf6, 0x72, 0x4c, 0x37, 0x98, 0x76, 0xc4, 0x89, 0xae, 0xc0, 0x5b, 0xae, 0x79,
	0x45, 0xbf, 0x13, 0x59, 0x32, 0x75, 0x47, 0xd1, 0x13, 0xb8, 0xd8, 0x90, 0x6a, 0xcd, 0xc2, 0xc9,
	0xf3, 0xc9, 0xfc, 0x32, 0xe9, 0x83, 0xe8, 0x27, 0x04, 0x9f, 0xb8, 0x5c, 0x6d, 0x89, 0x64, 0xdf,
	0x48, 0x57, 0x09, 0x42, 0xd1, 0x0b, 0x78, 0x9c, 0xfd, 0x55, 0xa6, 0x4a, 0x4b, 0x4d, 0xbd, 0x9b,
	0xed, 0x69, 0xe8, 0x0a, 0xfc, 0x86, 0xd7, 0x35, 0xa3, 0xe9, 0x86, 0xc9, 0x96, 0x8b, 0x3a, 0x74,
	0x74, 0x91, 0xd7, 0x67, 0xef, 0xfb, 0x64, 0xf4, 0x7b, 0x02, 0xfe, 0x40, 0xff, 0xa0, 0xcd, 0x21,
	0x0c, 0x17, 0xa4, 0x49, 0xa5, 0xd0, 0x54, 0xf7, 0x66, 0x16, 0xef, 0x7a, 0x89, 0xff, 0xf1, 0x91,
	0x9c, 0x93, 0x26, 0x11, 0x83, 0x60, 0xab, 0x6f, 0x38, 0x2d, 0xd8, 0xa2, 0x6b, 0x70, 0x58, 0x1e,
	0x9e, 0x9d, 0xac, 0x76, 0x58, 0x1e, 0xfd, 0x72, 0x00, 0xdd, 0x13, 0xc9, 0x49, 0xad, 0xf4, 0xb0,
	0x8c, 0xc9, 0x6b, 0x70, 0x38, 0x3d, 0xe2, 0xf0, 0xa3, 0xde, 0x82, 0x11, 0xdc, 0xd1, 0xc4, 0xe1,
	0x14, 0xbd, 0x87, 0xc0, 0x9e, 0x56, 0xca, 0xa9, 0x71, 0x1a, 0x5a, 0xc2, 0xd1, 0x26, 0x12, 0x2f,
	0x1b, 0x2d, 0xe6, 0x16, 0x7c, 0xb3, 0xc2, 0xb4, 0xdf, 0xa0, 0x31, 0x6f, 0x03, 0xbe, 0xf6, 0x05,
	0xbd, 0xbf, 0xc4, 0x13, 0x76, 0x88, 0x96, 0x10, 0x14, 0xa6, 0xb9, 0x81, 0x70, 0xae, 0x09, 0x4f,
	0x8f, 0xb4, 0x6f, 0x10, 0x7e, 0x31, 0x8a, 0xa3, 0x2f, 0x30, 0x3d, 0x1c, 0xc4, 0x67, 0xde, 0x2a,
	0xb4, 0xd8, 0xbf, 0x9b, 0xb3, 0xb9, 0x7b, 0xf3, 0xcc, 0x62, 0x1e, 0x2a, 0x86, 0x67, 0xf5, 0x16,
	0x5c, 0xab, 0x67, 0x34, 0xb7, 0x06, 0xfa, 0xff, 0xb9, 0x38, 0x9c, 0x46, 0xb7, 0x10, 0x58, 0x49,
	0x6d, 0xe0, 0xd5, 0xd8, 0xc0, 0xf4, 0xb8, 0xde, 0xdc, 0xbc, 0x7c, 0xf3, 0x63, 0x51, 0x8a, 0x78,
	0xf8, 0x65, 0xb1, 0x90, 0xa5, 0xf5, 0xe5, 0x30, 0xaf, 0x0b, 0x49, 0xb0, 0x06, 0xe0, 0x52, 0xe0,
	0x1d, 0x29, 0x7b, 0xa4, 0x8f, 0x8b, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x50, 0x30, 0x2c, 0x87,
	0xba, 0x03, 0x00, 0x00,
}
