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

package graphics

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	timestamp "github.com/golang/protobuf/ptypes/timestamp"
	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: 5
type Machine struct {
	// Global unique machine identifier.
	Name       *MachineId           `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	CreateTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
	// Identity of owner.
	Owner string `protobuf:"bytes,3,opt,name=owner,proto3" json:"owner,omitempty"`
	// Hardware identification.
	Hwid                 string   `protobuf:"bytes,4,opt,name=hwid,proto3" json:"hwid,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Machine proto.InternalMessageInfo

func (m *Machine) GetName() *MachineId {
	if m != nil {
		return m.Name
	}
	return nil
}

func (m *Machine) GetCreateTime() *timestamp.Timestamp {
	if m != nil {
		return m.CreateTime
	}
	return nil
}

func (m *Machine) GetOwner() string {
	if m != nil {
		return m.Owner
	}
	return ""
}

func (m *Machine) GetHwid() string {
	if m != nil {
		return m.Hwid
	}
	return ""
}

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

func init() {
	proto.RegisterFile("test/custom_results/graphics/machine.proto", fileDescriptor_53eecb40097bb418)
}

var fileDescriptor_53eecb40097bb418 = []byte{
	// 250 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0x31, 0x4b, 0x34, 0x31,
	0x10, 0x86, 0xd9, 0xef, 0x5b, 0x15, 0x73, 0x5d, 0xb0, 0x58, 0x16, 0xc1, 0xc3, 0xc6, 0x43, 0x70,
	0x06, 0xb4, 0xbc, 0xce, 0x42, 0xb4, 0xb0, 0x59, 0xac, 0x6c, 0x96, 0x5c, 0x76, 0x2e, 0x1b, 0xb8,
	0xec, 0x2c, 0x49, 0x96, 0xfb, 0x55, 0xfe, 0x47, 0xd9, 0xc4, 0x2d, 0x6c, 0x0e, 0xbb, 0xcc, 0xcb,
	0xf3, 0x66, 0x1e, 0x46, 0xdc, 0x47, 0x0a, 0x11, 0xf5, 0x14, 0x22, 0xbb, 0xd6, 0x53, 0x98, 0x0e,
	0x31, 0xa0, 0xf1, 0x6a, 0xec, 0xad, 0x0e, 0xe8, 0x94, 0xee, 0xed, 0x40, 0x30, 0x7a, 0x8e, 0x2c,
	0xaf, 0x67, 0x16, 0x7e, 0xb3, 0xb0, 0xb0, 0xf5, 0x8d, 0x61, 0x36, 0x07, 0xc2, 0xc4, 0xee, 0xa6,
	0x3d, 0x46, 0xeb, 0x28, 0x44, 0xe5, 0xc6, 0x5c, 0xaf, 0x1f, 0xfe, 0xb2, 0xaa, 0xb5, 0x5d, 0xc6,
	0x6f, 0xbf, 0x0a, 0x71, 0xf1, 0x9e, 0x43, 0xb9, 0x15, 0xe5, 0xa0, 0x1c, 0x55, 0xc5, 0xba, 0xd8,
	0xac, 0x1e, 0xef, 0xe0, 0x94, 0x08, 0xfc, 0x94, 0xde, 0xba, 0x26, 0x95, 0xe4, 0x56, 0xac, 0xb4,
	0x27, 0x15, 0xa9, 0x9d, 0x8d, 0xaa, 0x7f, 0xe9, 0x8f, 0x1a, 0xb2, 0x2e, 0x2c, 0xba, 0xf0, 0xb1,
	0xe8, 0x36, 0x22, 0xe3, 0x73, 0x20, 0xaf, 0xc4, 0x19, 0x1f, 0x07, 0xf2, 0xd5, 0xff, 0x75, 0xb1,
	0xb9, 0x6c, 0xf2, 0x20, 0xa5, 0x28, 0xfb, 0xa3, 0xed, 0xaa, 0x32, 0x85, 0xe9, 0xfd, 0xfc, 0xfa,
	0xf9, 0x62, 0x18, 0x74, 0xef, 0xd9, 0xd9, 0xc9, 0x01, 0x7b, 0x83, 0xcb, 0xc0, 0x01, 0xed, 0xb0,
	0xf7, 0x2a, 0xdf, 0x06, 0x0d, 0xe3, 0xa9, 0x53, 0xec, 0xce, 0x13, 0xf6, 0xf4, 0x1d, 0x00, 0x00,
	0xff, 0xff, 0x80, 0x53, 0x54, 0x89, 0x9c, 0x01, 0x00, 0x00,
}
