// Code generated by protoc-gen-go. DO NOT EDIT.
// source: prototype/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 Config struct {
	Partners             *PartnerList            `protobuf:"bytes,1,opt,name=partners,proto3" json:"partners,omitempty"`
	Components           *ComponentList          `protobuf:"bytes,2,opt,name=components,proto3" json:"components,omitempty"`
	Programs             *ProgramList            `protobuf:"bytes,3,opt,name=programs,proto3" json:"programs,omitempty"`
	Designs              *DesignList             `protobuf:"bytes,4,opt,name=designs,proto3" json:"designs,omitempty"`
	DeviceBrands         *DeviceBrandList        `protobuf:"bytes,8,opt,name=device_brands,json=deviceBrands,proto3" json:"device_brands,omitempty"`
	DeviceProjects       *DeviceProjectList      `protobuf:"bytes,5,opt,name=device_projects,json=deviceProjects,proto3" json:"device_projects,omitempty"`
	BuildTargets         *BuildTargetList        `protobuf:"bytes,6,opt,name=build_targets,json=buildTargets,proto3" json:"build_targets,omitempty"`
	VariantBuildConfigs  *VariantBuildConfigList `protobuf:"bytes,7,opt,name=variant_build_configs,json=variantBuildConfigs,proto3" json:"variant_build_configs,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                `json:"-"`
	XXX_unrecognized     []byte                  `json:"-"`
	XXX_sizecache        int32                   `json:"-"`
}

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

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

var xxx_messageInfo_Config proto.InternalMessageInfo

func (m *Config) GetPartners() *PartnerList {
	if m != nil {
		return m.Partners
	}
	return nil
}

func (m *Config) GetComponents() *ComponentList {
	if m != nil {
		return m.Components
	}
	return nil
}

func (m *Config) GetPrograms() *ProgramList {
	if m != nil {
		return m.Programs
	}
	return nil
}

func (m *Config) GetDesigns() *DesignList {
	if m != nil {
		return m.Designs
	}
	return nil
}

func (m *Config) GetDeviceBrands() *DeviceBrandList {
	if m != nil {
		return m.DeviceBrands
	}
	return nil
}

func (m *Config) GetDeviceProjects() *DeviceProjectList {
	if m != nil {
		return m.DeviceProjects
	}
	return nil
}

func (m *Config) GetBuildTargets() *BuildTargetList {
	if m != nil {
		return m.BuildTargets
	}
	return nil
}

func (m *Config) GetVariantBuildConfigs() *VariantBuildConfigList {
	if m != nil {
		return m.VariantBuildConfigs
	}
	return nil
}

func init() {
	proto.RegisterType((*Config)(nil), "prototype.Config")
}

func init() { proto.RegisterFile("prototype/config.proto", fileDescriptor_2fb895343ee1aa54) }

var fileDescriptor_2fb895343ee1aa54 = []byte{
	// 375 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0x4b, 0xfb, 0x30,
	0x18, 0xc6, 0xd9, 0x77, 0x5f, 0xb7, 0x19, 0x7f, 0x41, 0x65, 0x33, 0x0e, 0x11, 0xf5, 0xe4, 0xc5,
	0x06, 0x36, 0x04, 0x3d, 0x09, 0x9b, 0xde, 0x3c, 0x0c, 0x51, 0x0f, 0x5e, 0x4a, 0xda, 0x66, 0x5d,
	0x64, 0x4d, 0x4a, 0x92, 0x15, 0xf6, 0xb7, 0x7b, 0x91, 0xbe, 0xe9, 0x8f, 0x8c, 0x7a, 0x2b, 0xcf,
	0xe7, 0x79, 0x9e, 0xf7, 0x4d, 0x1a, 0x34, 0xca, 0x94, 0x34, 0xd2, 0x6c, 0x33, 0x46, 0x22, 0x29,
	0x96, 0x3c, 0xf1, 0x41, 0xf0, 0xf6, 0x6b, 0x7d, 0x7c, 0xee, 0x5a, 0xd2, 0x4c, 0x0a, 0x26, 0x8c,
	0x75, 0x8d, 0xcf, 0x1a, 0x94, 0x51, 0x65, 0x04, 0x53, 0x25, 0x70, 0x6a, 0x63, 0xa6, 0x79, 0x22,
	0xfe, 0x08, 0x28, 0x99, 0x28, 0x9a, 0x96, 0xe0, 0xd2, 0x0d, 0xe4, 0x3c, 0x62, 0x41, 0xa6, 0xe4,
	0x37, 0x8b, 0xaa, 0x49, 0x8f, 0x0d, 0xd7, 0x2a, 0x22, 0x66, 0xc5, 0x55, 0x1c, 0x14, 0x33, 0xb7,
	0x24, 0x5a, 0x29, 0x99, 0xf2, 0x4d, 0x2a, 0xf5, 0x9d, 0xcc, 0x99, 0x5a, 0xd3, 0xed, 0xce, 0x51,
	0x6e, 0x7e, 0xba, 0xa8, 0x37, 0x07, 0xc1, 0x9b, 0xa0, 0x41, 0xb9, 0xa7, 0xc6, 0x9d, 0xab, 0xce,
	0xed, 0xc1, 0x64, 0xe4, 0xd7, 0xc5, 0xfe, 0xc2, 0xa2, 0x57, 0xae, 0xcd, 0x5b, 0xed, 0xf3, 0x1e,
	0x10, 0xaa, 0x8f, 0xad, 0xf1, 0x3f, 0x48, 0x61, 0x27, 0x35, 0xaf, 0x20, 0xe4, 0x1c, 0x2f, 0x4c,
	0xb3, 0x87, 0xd4, 0xb8, 0xdb, 0x9e, 0x66, 0x51, 0x39, 0xad, 0xf4, 0x79, 0x04, 0xf5, 0xed, 0x85,
	0x69, 0xfc, 0x1f, 0x22, 0x43, 0x27, 0xf2, 0x0c, 0x04, 0x12, 0x95, 0xcb, 0x7b, 0x42, 0x47, 0xe5,
	0x85, 0x85, 0x8a, 0x8a, 0x58, 0xe3, 0x01, 0xc4, 0xc6, 0x3b, 0xb1, 0x82, 0xcf, 0x0a, 0x0c, 0xd9,
	0xc3, 0xb8, 0x11, 0xb4, 0xf7, 0x82, 0x4e, 0x76, 0x6f, 0x5c, 0xe3, 0x3d, 0xa8, 0xb8, 0x68, 0x55,
	0x2c, 0xac, 0x01, 0x4a, 0x8e, 0x63, 0x57, 0x82, 0x3d, 0xc2, 0x0d, 0x5f, 0xc7, 0x81, 0xa1, 0x2a,
	0x61, 0x46, 0xe3, 0x5e, 0x6b, 0x8f, 0x59, 0xc1, 0xdf, 0x01, 0xdb, 0x3d, 0xc2, 0x46, 0xd0, 0xde,
	0x07, 0x1a, 0xe6, 0x54, 0x71, 0x2a, 0x4c, 0x60, 0x8b, 0xec, 0x4f, 0xd4, 0xb8, 0x0f, 0x45, 0xd7,
	0x4e, 0xd1, 0xa7, 0xf5, 0x41, 0x9f, 0xfd, 0xb3, 0xd0, 0x77, 0x9a, 0xb7, 0x74, 0x3d, 0xbb, 0xff,
	0x9a, 0x26, 0xd2, 0xaf, 0xde, 0x88, 0x2f, 0x55, 0xe2, 0x3c, 0x18, 0xc2, 0xc5, 0x52, 0x51, 0x02,
	0xcd, 0x24, 0x91, 0xa4, 0x1e, 0x11, 0xf6, 0xe0, 0x73, 0xfa, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x5f,
	0xcc, 0x15, 0xb8, 0x20, 0x03, 0x00, 0x00,
}
