// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/ads/googleads/v3/enums/preferred_content_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

// Enumerates preferred content criterion type.
type PreferredContentTypeEnum_PreferredContentType int32

const (
	// Not specified.
	PreferredContentTypeEnum_UNSPECIFIED PreferredContentTypeEnum_PreferredContentType = 0
	// The value is unknown in this version.
	PreferredContentTypeEnum_UNKNOWN PreferredContentTypeEnum_PreferredContentType = 1
	// Represents top content on YouTube.
	PreferredContentTypeEnum_YOUTUBE_TOP_CONTENT PreferredContentTypeEnum_PreferredContentType = 400
)

var PreferredContentTypeEnum_PreferredContentType_name = map[int32]string{
	0:   "UNSPECIFIED",
	1:   "UNKNOWN",
	400: "YOUTUBE_TOP_CONTENT",
}

var PreferredContentTypeEnum_PreferredContentType_value = map[string]int32{
	"UNSPECIFIED":         0,
	"UNKNOWN":             1,
	"YOUTUBE_TOP_CONTENT": 400,
}

func (x PreferredContentTypeEnum_PreferredContentType) String() string {
	return proto.EnumName(PreferredContentTypeEnum_PreferredContentType_name, int32(x))
}

func (PreferredContentTypeEnum_PreferredContentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_9fb83cbeec849d46, []int{0, 0}
}

// Container for enumeration of preferred content criterion type.
type PreferredContentTypeEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_PreferredContentTypeEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.PreferredContentTypeEnum_PreferredContentType", PreferredContentTypeEnum_PreferredContentType_name, PreferredContentTypeEnum_PreferredContentType_value)
	proto.RegisterType((*PreferredContentTypeEnum)(nil), "google.ads.googleads.v3.enums.PreferredContentTypeEnum")
}

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

var fileDescriptor_9fb83cbeec849d46 = []byte{
	// 314 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x90, 0xc1, 0x4a, 0xc3, 0x30,
	0x1c, 0xc6, 0xdd, 0x06, 0x0a, 0xd9, 0xc1, 0x51, 0x3d, 0x4c, 0x71, 0x87, 0xed, 0x01, 0xd2, 0x43,
	0x6e, 0xf1, 0xd4, 0xce, 0x3a, 0x86, 0x90, 0x16, 0x6c, 0x27, 0x4a, 0xa1, 0xd4, 0x25, 0x86, 0xc9,
	0x96, 0x84, 0x26, 0x1b, 0xec, 0x2d, 0x7c, 0x06, 0x8f, 0x3e, 0x8a, 0x8f, 0xe2, 0xc1, 0x67, 0x90,
	0x26, 0xb6, 0xa7, 0xe9, 0xa5, 0x7c, 0xf4, 0xfb, 0xff, 0xbe, 0x7c, 0xff, 0x3f, 0xc0, 0x5c, 0x4a,
	0xbe, 0x66, 0x7e, 0x49, 0xb5, 0xef, 0x64, 0xad, 0x76, 0xc8, 0x67, 0x62, 0xbb, 0xd1, 0xbe, 0xaa,
	0xd8, 0x0b, 0xab, 0x2a, 0x46, 0x8b, 0xa5, 0x14, 0x86, 0x09, 0x53, 0x98, 0xbd, 0x62, 0x50, 0x55,
	0xd2, 0x48, 0x6f, 0xe4, 0x00, 0x58, 0x52, 0x0d, 0x5b, 0x16, 0xee, 0x10, 0xb4, 0xec, 0xe5, 0x55,
	0x13, 0xad, 0x56, 0x7e, 0x29, 0x84, 0x34, 0xa5, 0x59, 0x49, 0xa1, 0x1d, 0x3c, 0x79, 0x05, 0xc3,
	0xa4, 0x09, 0x9f, 0xba, 0xec, 0x74, 0xaf, 0x58, 0x24, 0xb6, 0x9b, 0x09, 0x01, 0xe7, 0x87, 0x3c,
	0xef, 0x14, 0xf4, 0x33, 0x72, 0x9f, 0x44, 0xd3, 0xf9, 0xed, 0x3c, 0xba, 0x19, 0x1c, 0x79, 0x7d,
	0x70, 0x92, 0x91, 0x3b, 0x12, 0x3f, 0x90, 0x41, 0xc7, 0x1b, 0x82, 0xb3, 0xc7, 0x38, 0x4b, 0xb3,
	0x30, 0x2a, 0xd2, 0x38, 0x29, 0xa6, 0x31, 0x49, 0x23, 0x92, 0x0e, 0xde, 0x7a, 0xe1, 0x77, 0x07,
	0x8c, 0x97, 0x72, 0x03, 0xff, 0xed, 0x1b, 0x5e, 0x1c, 0x7a, 0x33, 0xa9, 0xcb, 0x26, 0x9d, 0xa7,
	0xf0, 0x97, 0xe5, 0x72, 0x5d, 0x0a, 0x0e, 0x65, 0xc5, 0x7d, 0xce, 0x84, 0x5d, 0xa5, 0xb9, 0x9b,
	0x5a, 0xe9, 0x3f, 0xce, 0x78, 0x6d, 0xbf, 0xef, 0xdd, 0xde, 0x2c, 0x08, 0x3e, 0xba, 0xa3, 0x99,
	0x8b, 0x0a, 0xa8, 0x86, 0x4e, 0xd6, 0x6a, 0x81, 0x60, 0xbd, 0xbb, 0xfe, 0x6c, 0xfc, 0x3c, 0xa0,
	0x3a, 0x6f, 0xfd, 0x7c, 0x81, 0x72, 0xeb, 0x7f, 0x75, 0xc7, 0xee, 0x27, 0xc6, 0x01, 0xd5, 0x18,
	0xb7, 0x13, 0x18, 0x2f, 0x10, 0xc6, 0x76, 0xe6, 0xf9, 0xd8, 0x16, 0x43, 0x3f, 0x01, 0x00, 0x00,
	0xff, 0xff, 0x20, 0x35, 0x49, 0x46, 0xde, 0x01, 0x00, 0x00,
}
