// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/customer_match_upload_key_type.proto

package enums

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "google.golang.org/genproto/googleapis/api/annotations"
)

// 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

// Enum describing possible customer match upload key types.
type CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType int32

const (
	// Not specified.
	CustomerMatchUploadKeyTypeEnum_UNSPECIFIED CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 0
	// Used for return value only. Represents value unknown in this version.
	CustomerMatchUploadKeyTypeEnum_UNKNOWN CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 1
	// Members are matched from customer info such as email address, phone
	// number or physical address.
	CustomerMatchUploadKeyTypeEnum_CONTACT_INFO CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 2
	// Members are matched from a user id generated and assigned by the
	// advertiser.
	CustomerMatchUploadKeyTypeEnum_CRM_ID CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 3
	// Members are matched from mobile advertising ids.
	CustomerMatchUploadKeyTypeEnum_MOBILE_ADVERTISING_ID CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType = 4
)

var CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "CONTACT_INFO",
	3: "CRM_ID",
	4: "MOBILE_ADVERTISING_ID",
}

var CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_value = map[string]int32{
	"UNSPECIFIED":           0,
	"UNKNOWN":               1,
	"CONTACT_INFO":          2,
	"CRM_ID":                3,
	"MOBILE_ADVERTISING_ID": 4,
}

func (x CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType) String() string {
	return proto.EnumName(CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name, int32(x))
}

func (CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_5ec82e81541fd3d7, []int{0, 0}
}

// Indicates what type of data are the user list's members matched from.
type CustomerMatchUploadKeyTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_CustomerMatchUploadKeyTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType", CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_name, CustomerMatchUploadKeyTypeEnum_CustomerMatchUploadKeyType_value)
	proto.RegisterType((*CustomerMatchUploadKeyTypeEnum)(nil), "google.ads.googleads.v3.enums.CustomerMatchUploadKeyTypeEnum")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/enums/customer_match_upload_key_type.proto", fileDescriptor_5ec82e81541fd3d7)
}

var fileDescriptor_5ec82e81541fd3d7 = []byte{
	// 354 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0xc1, 0x6a, 0xab, 0x40,
	0x14, 0x7d, 0x9a, 0x47, 0x1e, 0x4c, 0x1e, 0x3c, 0x11, 0xde, 0xa2, 0xa1, 0x69, 0x49, 0x3e, 0x60,
	0x5c, 0xb8, 0x9b, 0xae, 0xd4, 0x98, 0x20, 0x69, 0xc6, 0x90, 0x18, 0x0b, 0x45, 0x18, 0xa6, 0x71,
	0xb0, 0xa1, 0x71, 0x46, 0x32, 0x1a, 0xf0, 0x43, 0xfa, 0x03, 0x5d, 0xf6, 0x53, 0xfa, 0x29, 0x5d,
	0xf7, 0x03, 0x8a, 0x63, 0x92, 0x5d, 0xba, 0x91, 0x83, 0xe7, 0xde, 0x73, 0xee, 0x39, 0x03, 0xdc,
	0x4c, 0x88, 0x6c, 0xc7, 0x2c, 0x9a, 0x4a, 0xab, 0x85, 0x0d, 0x3a, 0xd8, 0x16, 0xe3, 0x55, 0x2e,
	0xad, 0x4d, 0x25, 0x4b, 0x91, 0xb3, 0x3d, 0xc9, 0x69, 0xb9, 0x79, 0x26, 0x55, 0xb1, 0x13, 0x34,
	0x25, 0x2f, 0xac, 0x26, 0x65, 0x5d, 0x30, 0x58, 0xec, 0x45, 0x29, 0xcc, 0x41, 0xbb, 0x08, 0x69,
	0x2a, 0xe1, 0x59, 0x03, 0x1e, 0x6c, 0xa8, 0x34, 0xfa, 0xd7, 0x27, 0x8b, 0x62, 0x6b, 0x51, 0xce,
	0x45, 0x49, 0xcb, 0xad, 0xe0, 0xb2, 0x5d, 0x1e, 0xbd, 0x6a, 0xe0, 0xc6, 0x3b, 0xba, 0xcc, 0x1b,
	0x93, 0xb5, 0xf2, 0x98, 0xb1, 0x3a, 0xaa, 0x0b, 0xe6, 0xf3, 0x2a, 0x1f, 0x49, 0xd0, 0xbf, 0x3c,
	0x61, 0xfe, 0x03, 0xbd, 0x35, 0x5e, 0x2d, 0x7c, 0x2f, 0x98, 0x04, 0xfe, 0xd8, 0xf8, 0x65, 0xf6,
	0xc0, 0x9f, 0x35, 0x9e, 0xe1, 0xf0, 0x01, 0x1b, 0x9a, 0x69, 0x80, 0xbf, 0x5e, 0x88, 0x23, 0xc7,
	0x8b, 0x48, 0x80, 0x27, 0xa1, 0xa1, 0x9b, 0x00, 0x74, 0xbd, 0xe5, 0x9c, 0x04, 0x63, 0xa3, 0x63,
	0x5e, 0x81, 0xff, 0xf3, 0xd0, 0x0d, 0xee, 0x7d, 0xe2, 0x8c, 0x63, 0x7f, 0x19, 0x05, 0xab, 0x00,
	0x4f, 0x1b, 0xea, 0xb7, 0xfb, 0xa5, 0x81, 0xe1, 0x46, 0xe4, 0xf0, 0xc7, 0x6c, 0xee, 0xed, 0xe5,
	0xc3, 0x16, 0x4d, 0xbc, 0x85, 0xf6, 0x78, 0x6c, 0x18, 0x66, 0x62, 0x47, 0x79, 0x06, 0xc5, 0x3e,
	0xb3, 0x32, 0xc6, 0x55, 0xf8, 0x53, 0xe3, 0xc5, 0x56, 0x5e, 0x78, 0x80, 0x3b, 0xf5, 0x7d, 0xd3,
	0x3b, 0x53, 0xc7, 0x79, 0xd7, 0x07, 0xd3, 0x56, 0xca, 0x49, 0x25, 0x6c, 0x61, 0x83, 0x62, 0x1b,
	0x36, 0x35, 0xc9, 0x8f, 0x13, 0x9f, 0x38, 0xa9, 0x4c, 0xce, 0x7c, 0x12, 0xdb, 0x89, 0xe2, 0x3f,
	0xf5, 0x61, 0xfb, 0x13, 0x21, 0x27, 0x95, 0x08, 0x9d, 0x27, 0x10, 0x8a, 0x6d, 0x84, 0xd4, 0xcc,
	0x53, 0x57, 0x1d, 0x66, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x4e, 0x96, 0x90, 0xd2, 0x18, 0x02,
	0x00, 0x00,
}
