// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/user_list_crm_data_source_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 user list crm data source type.
type UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType int32

const (
	// Not specified.
	UserListCrmDataSourceTypeEnum_UNSPECIFIED UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 0
	// Used for return value only. Represents value unknown in this version.
	UserListCrmDataSourceTypeEnum_UNKNOWN UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 1
	// The uploaded data is first-party data.
	UserListCrmDataSourceTypeEnum_FIRST_PARTY UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 2
	// The uploaded data is from a third-party credit bureau.
	UserListCrmDataSourceTypeEnum_THIRD_PARTY_CREDIT_BUREAU UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 3
	// The uploaded data is from a third-party voter file.
	UserListCrmDataSourceTypeEnum_THIRD_PARTY_VOTER_FILE UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType = 4
)

var UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "FIRST_PARTY",
	3: "THIRD_PARTY_CREDIT_BUREAU",
	4: "THIRD_PARTY_VOTER_FILE",
}

var UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_value = map[string]int32{
	"UNSPECIFIED":               0,
	"UNKNOWN":                   1,
	"FIRST_PARTY":               2,
	"THIRD_PARTY_CREDIT_BUREAU": 3,
	"THIRD_PARTY_VOTER_FILE":    4,
}

func (x UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType) String() string {
	return proto.EnumName(UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name, int32(x))
}

func (UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_de5941dcc9ec4be9, []int{0, 0}
}

// Indicates source of Crm upload data.
type UserListCrmDataSourceTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_UserListCrmDataSourceTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType", UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_name, UserListCrmDataSourceTypeEnum_UserListCrmDataSourceType_value)
	proto.RegisterType((*UserListCrmDataSourceTypeEnum)(nil), "google.ads.googleads.v3.enums.UserListCrmDataSourceTypeEnum")
}

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

var fileDescriptor_de5941dcc9ec4be9 = []byte{
	// 360 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x51, 0x41, 0x6a, 0x83, 0x40,
	0x14, 0xad, 0xa6, 0xb4, 0x30, 0x59, 0x54, 0x5c, 0x14, 0x12, 0x6a, 0x21, 0x39, 0xc0, 0xb8, 0x70,
	0x37, 0x5d, 0x69, 0x34, 0xa9, 0x34, 0x18, 0x31, 0x6a, 0x69, 0x11, 0x86, 0x69, 0x1c, 0x44, 0x88,
	0x8e, 0x38, 0x63, 0x20, 0x07, 0xe8, 0x45, 0xba, 0x29, 0xf4, 0x28, 0x3d, 0x4a, 0xb7, 0xbd, 0x40,
	0x51, 0x9b, 0xd0, 0x4d, 0xba, 0x19, 0x1e, 0xf3, 0xde, 0x7f, 0xff, 0xff, 0xf7, 0x81, 0x95, 0x31,
	0x96, 0x6d, 0xa9, 0x4e, 0x52, 0xae, 0xf7, 0xb0, 0x45, 0x3b, 0x43, 0xa7, 0x65, 0x53, 0x70, 0xbd,
	0xe1, 0xb4, 0xc6, 0xdb, 0x9c, 0x0b, 0xbc, 0xa9, 0x0b, 0x9c, 0x12, 0x41, 0x30, 0x67, 0x4d, 0xbd,
	0xa1, 0x58, 0xec, 0x2b, 0x0a, 0xab, 0x9a, 0x09, 0xa6, 0x6a, 0x7d, 0x21, 0x24, 0x29, 0x87, 0x47,
	0x0f, 0xb8, 0x33, 0x60, 0xe7, 0x31, 0xbe, 0x39, 0xb4, 0xa8, 0x72, 0x9d, 0x94, 0x25, 0x13, 0x44,
	0xe4, 0xac, 0xe4, 0x7d, 0xf1, 0xf4, 0x5d, 0x02, 0x5a, 0xc4, 0x69, 0xbd, 0xcc, 0xb9, 0x98, 0xd5,
	0x85, 0x4d, 0x04, 0x59, 0x77, 0x1d, 0xc2, 0x7d, 0x45, 0x9d, 0xb2, 0x29, 0xa6, 0xaf, 0x12, 0x18,
	0x9d, 0x54, 0xa8, 0x57, 0x60, 0x18, 0x79, 0x6b, 0xdf, 0x99, 0xb9, 0x73, 0xd7, 0xb1, 0x95, 0x33,
	0x75, 0x08, 0x2e, 0x23, 0xef, 0xc1, 0x5b, 0x3d, 0x7a, 0x8a, 0xd4, 0xb2, 0x73, 0x37, 0x58, 0x87,
	0xd8, 0x37, 0x83, 0xf0, 0x49, 0x91, 0x55, 0x0d, 0x8c, 0xc2, 0x7b, 0x37, 0xb0, 0xfb, 0x0f, 0x3c,
	0x0b, 0x1c, 0xdb, 0x0d, 0xb1, 0x15, 0x05, 0x8e, 0x19, 0x29, 0x03, 0x75, 0x0c, 0xae, 0xff, 0xd2,
	0xf1, 0x2a, 0x74, 0x02, 0x3c, 0x77, 0x97, 0x8e, 0x72, 0x6e, 0x7d, 0x4b, 0x60, 0xb2, 0x61, 0x05,
	0xfc, 0x77, 0x5b, 0xeb, 0xf6, 0xe4, 0xa8, 0x7e, 0xbb, 0xaf, 0x2f, 0x3d, 0xff, 0x46, 0x0e, 0x33,
	0xb6, 0x25, 0x65, 0x06, 0x59, 0x9d, 0xe9, 0x19, 0x2d, 0xbb, 0x34, 0x0e, 0x27, 0xa8, 0x72, 0x7e,
	0xe2, 0x22, 0x77, 0xdd, 0xfb, 0x26, 0x0f, 0x16, 0xa6, 0xf9, 0x21, 0x6b, 0x8b, 0xde, 0xca, 0x4c,
	0x39, 0xec, 0x61, 0x8b, 0x62, 0x03, 0xb6, 0xc1, 0xf1, 0xcf, 0x03, 0x9f, 0x98, 0x29, 0x4f, 0x8e,
	0x7c, 0x12, 0x1b, 0x49, 0xc7, 0x7f, 0xc9, 0x93, 0xfe, 0x13, 0x21, 0x33, 0xe5, 0x08, 0x1d, 0x15,
	0x08, 0xc5, 0x06, 0x42, 0x9d, 0xe6, 0xe5, 0xa2, 0x1b, 0xcc, 0xf8, 0x09, 0x00, 0x00, 0xff, 0xff,
	0xd1, 0x50, 0xda, 0x2a, 0x29, 0x02, 0x00, 0x00,
}
