// Code generated by protoc-gen-go. DO NOT EDIT.
// source: test/custom_results/graphics/software_overrides_config.proto

package graphics

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

// Next Tag: 2
type SoftwareOverridesConfig struct {
	// Packages that were explicitly overridden from the normal system softare.
	Packages             []*Package `protobuf:"bytes,1,rep,name=packages,proto3" json:"packages,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

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

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

var xxx_messageInfo_SoftwareOverridesConfig proto.InternalMessageInfo

func (m *SoftwareOverridesConfig) GetPackages() []*Package {
	if m != nil {
		return m.Packages
	}
	return nil
}

func init() {
	proto.RegisterType((*SoftwareOverridesConfig)(nil), "test.custom_results.graphics.SoftwareOverridesConfig")
}

func init() {
	proto.RegisterFile("test/custom_results/graphics/software_overrides_config.proto", fileDescriptor_e71e3c9a6580d8a0)
}

var fileDescriptor_e71e3c9a6580d8a0 = []byte{
	// 192 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x8e, 0x3f, 0x8b, 0xc2, 0x40,
	0x10, 0x47, 0x39, 0x0e, 0x8e, 0x23, 0x76, 0x69, 0x14, 0xb1, 0x10, 0x41, 0x10, 0x8b, 0x19, 0xd0,
	0xd6, 0x46, 0x05, 0xb1, 0x53, 0xb4, 0x13, 0x21, 0xac, 0xeb, 0x66, 0xb3, 0x68, 0x32, 0x61, 0x66,
	0xa3, 0x5f, 0x5f, 0xcc, 0x1f, 0xc1, 0x26, 0xe5, 0xc0, 0x7b, 0xf3, 0x7e, 0xc1, 0xc2, 0x1b, 0xf1,
	0xa8, 0x0b, 0xf1, 0x94, 0x46, 0x6c, 0xa4, 0xb8, 0x7b, 0x41, 0xcb, 0x2a, 0x4f, 0x9c, 0x16, 0x14,
	0x8a, 0xfd, 0x53, 0xb1, 0x89, 0xe8, 0x61, 0x98, 0xdd, 0xd5, 0x48, 0xa4, 0x29, 0x8b, 0x9d, 0x85,
	0x9c, 0xc9, 0x53, 0x38, 0x78, 0xdb, 0xf0, 0x6d, 0x43, 0x63, 0xf7, 0xa7, 0xad, 0xbf, 0x73, 0xa5,
	0x6f, 0xca, 0x9a, 0xea, 0xd3, 0xe8, 0x1c, 0x74, 0x8f, 0x75, 0x6c, 0xd7, 0xb4, 0xd6, 0x65, 0x2a,
	0x5c, 0x06, 0xff, 0x35, 0x2b, 0xbd, 0x9f, 0xe1, 0xef, 0xa4, 0x33, 0x1b, 0x43, 0x5b, 0x17, 0xf6,
	0x15, 0x7d, 0xf8, 0x68, 0xab, 0xed, 0x69, 0x63, 0x09, 0x74, 0xc2, 0x94, 0xba, 0x22, 0x05, 0x62,
	0x8b, 0xcd, 0x41, 0x82, 0x2e, 0x8b, 0x59, 0x61, 0xb9, 0x03, 0x2d, 0x61, 0xdb, 0xea, 0xcb, 0x5f,
	0x89, 0xcd, 0x5f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x87, 0x60, 0xda, 0xd6, 0x38, 0x01, 0x00, 0x00,
}
