// Code generated by protoc-gen-go. DO NOT EDIT.
// source: device/brand_id.proto

package device

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

// Globally unique identifier.
type BrandId struct {
	// Required. Source: 'mosys platform brand', aka RLZ-code.
	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 *BrandId) Reset()         { *m = BrandId{} }
func (m *BrandId) String() string { return proto.CompactTextString(m) }
func (*BrandId) ProtoMessage()    {}
func (*BrandId) Descriptor() ([]byte, []int) {
	return fileDescriptor_0942210c41a0dcdf, []int{0}
}

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

var xxx_messageInfo_BrandId proto.InternalMessageInfo

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

func init() {
	proto.RegisterType((*BrandId)(nil), "device.BrandId")
}

func init() { proto.RegisterFile("device/brand_id.proto", fileDescriptor_0942210c41a0dcdf) }

var fileDescriptor_0942210c41a0dcdf = []byte{
	// 121 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x4d, 0x49, 0x2d, 0xcb,
	0x4c, 0x4e, 0xd5, 0x4f, 0x2a, 0x4a, 0xcc, 0x4b, 0x89, 0xcf, 0x4c, 0xd1, 0x2b, 0x28, 0xca, 0x2f,
	0xc9, 0x17, 0x62, 0x83, 0x08, 0x2b, 0xc9, 0x73, 0xb1, 0x3b, 0x81, 0x64, 0x3c, 0x53, 0x84, 0x44,
	0xb8, 0x58, 0xcb, 0x12, 0x73, 0x4a, 0x53, 0x25, 0x18, 0x15, 0x18, 0x35, 0x38, 0x83, 0x20, 0x1c,
	0x27, 0xa3, 0x28, 0x83, 0xf4, 0x7c, 0xbd, 0xe4, 0x8c, 0xa2, 0xfc, 0xdc, 0xcc, 0xd2, 0x5c, 0xbd,
	0xfc, 0xa2, 0x74, 0x7d, 0x18, 0x27, 0xbf, 0x58, 0x3f, 0x33, 0x2f, 0xad, 0x28, 0x51, 0x1f, 0x6c,
	0xa4, 0x7e, 0x7a, 0xbe, 0x3e, 0xc4, 0xd0, 0x24, 0x36, 0xb0, 0x80, 0x31, 0x20, 0x00, 0x00, 0xff,
	0xff, 0xf1, 0xb4, 0xb3, 0x87, 0x7c, 0x00, 0x00, 0x00,
}
