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

// Possible plannable network values.
type ReachPlanNetworkEnum_ReachPlanNetwork int32

const (
	// Not specified.
	ReachPlanNetworkEnum_UNSPECIFIED ReachPlanNetworkEnum_ReachPlanNetwork = 0
	// Used as a return value only. Represents value unknown in this version.
	ReachPlanNetworkEnum_UNKNOWN ReachPlanNetworkEnum_ReachPlanNetwork = 1
	// YouTube network.
	ReachPlanNetworkEnum_YOUTUBE ReachPlanNetworkEnum_ReachPlanNetwork = 2
	// Google Video Partners (GVP) network.
	ReachPlanNetworkEnum_GOOGLE_VIDEO_PARTNERS ReachPlanNetworkEnum_ReachPlanNetwork = 3
	// A combination of the YouTube network and the Google Video Partners
	// network.
	ReachPlanNetworkEnum_YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS ReachPlanNetworkEnum_ReachPlanNetwork = 4
)

var ReachPlanNetworkEnum_ReachPlanNetwork_name = map[int32]string{
	0: "UNSPECIFIED",
	1: "UNKNOWN",
	2: "YOUTUBE",
	3: "GOOGLE_VIDEO_PARTNERS",
	4: "YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS",
}

var ReachPlanNetworkEnum_ReachPlanNetwork_value = map[string]int32{
	"UNSPECIFIED":                       0,
	"UNKNOWN":                           1,
	"YOUTUBE":                           2,
	"GOOGLE_VIDEO_PARTNERS":             3,
	"YOUTUBE_AND_GOOGLE_VIDEO_PARTNERS": 4,
}

func (x ReachPlanNetworkEnum_ReachPlanNetwork) String() string {
	return proto.EnumName(ReachPlanNetworkEnum_ReachPlanNetwork_name, int32(x))
}

func (ReachPlanNetworkEnum_ReachPlanNetwork) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_604f342e4658a385, []int{0, 0}
}

// Container for enum describing plannable networks.
type ReachPlanNetworkEnum struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_ReachPlanNetworkEnum proto.InternalMessageInfo

func init() {
	proto.RegisterEnum("google.ads.googleads.v3.enums.ReachPlanNetworkEnum_ReachPlanNetwork", ReachPlanNetworkEnum_ReachPlanNetwork_name, ReachPlanNetworkEnum_ReachPlanNetwork_value)
	proto.RegisterType((*ReachPlanNetworkEnum)(nil), "google.ads.googleads.v3.enums.ReachPlanNetworkEnum")
}

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

var fileDescriptor_604f342e4658a385 = []byte{
	// 334 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x50, 0x41, 0x4b, 0xc3, 0x30,
	0x18, 0xb5, 0x9d, 0x28, 0x64, 0x07, 0x4b, 0x71, 0x07, 0xc5, 0x1d, 0x36, 0xf0, 0x9a, 0x1e, 0x0a,
	0x1e, 0xe2, 0x29, 0x75, 0xb1, 0x0c, 0x25, 0x2d, 0xdb, 0x5a, 0x51, 0x0a, 0x25, 0xae, 0xa5, 0x0e,
	0xbb, 0xa4, 0x34, 0xdd, 0x3c, 0xfa, 0x33, 0xbc, 0x7b, 0xf4, 0xa7, 0xf8, 0x53, 0xf6, 0x2b, 0xa4,
	0xcd, 0xd6, 0xc3, 0x50, 0x2f, 0xe1, 0xe5, 0xfb, 0xde, 0x7b, 0x7c, 0xef, 0x81, 0xab, 0x4c, 0x88,
	0x2c, 0x4f, 0x2d, 0x96, 0x48, 0x4b, 0xc1, 0x1a, 0xad, 0x6d, 0x2b, 0xe5, 0xab, 0xa5, 0xb4, 0xca,
	0x94, 0xcd, 0x5f, 0xe2, 0x22, 0x67, 0x3c, 0xe6, 0x69, 0xf5, 0x26, 0xca, 0x57, 0x58, 0x94, 0xa2,
	0x12, 0x66, 0x5f, 0x91, 0x21, 0x4b, 0x24, 0x6c, 0x75, 0x70, 0x6d, 0xc3, 0x46, 0x77, 0x7e, 0xb1,
	0xb3, 0x2d, 0x16, 0x16, 0xe3, 0x5c, 0x54, 0xac, 0x5a, 0x08, 0x2e, 0x95, 0x78, 0xf8, 0xa1, 0x81,
	0xd3, 0x49, 0xed, 0xec, 0xe7, 0x8c, 0x53, 0xe5, 0x4b, 0xf8, 0x6a, 0x39, 0x7c, 0x07, 0xc6, 0xfe,
	0xdc, 0x3c, 0x01, 0xdd, 0x80, 0x4e, 0x7d, 0x72, 0x33, 0xbe, 0x1d, 0x93, 0x91, 0x71, 0x60, 0x76,
	0xc1, 0x71, 0x40, 0xef, 0xa8, 0xf7, 0x40, 0x0d, 0xad, 0xfe, 0x3c, 0x7a, 0xc1, 0x2c, 0x70, 0x88,
	0xa1, 0x9b, 0x67, 0xa0, 0xe7, 0x7a, 0x9e, 0x7b, 0x4f, 0xe2, 0x70, 0x3c, 0x22, 0x5e, 0xec, 0xe3,
	0xc9, 0x8c, 0x92, 0xc9, 0xd4, 0xe8, 0x98, 0x97, 0x60, 0xb0, 0xe5, 0xc5, 0x98, 0x8e, 0xe2, 0xdf,
	0x69, 0x87, 0xce, 0x46, 0x03, 0x83, 0xb9, 0x58, 0xc2, 0x7f, 0xd3, 0x39, 0xbd, 0xfd, 0x23, 0xfd,
	0x3a, 0x96, 0xaf, 0x3d, 0x39, 0x5b, 0x5d, 0x26, 0x72, 0xc6, 0x33, 0x28, 0xca, 0xcc, 0xca, 0x52,
	0xde, 0x84, 0xde, 0xb5, 0x5b, 0x2c, 0xe4, 0x1f, 0x65, 0x5f, 0x37, 0xef, 0xa7, 0xde, 0x71, 0x31,
	0xfe, 0xd2, 0xfb, 0xae, 0xb2, 0xc2, 0x89, 0x84, 0x0a, 0xd6, 0x28, 0xb4, 0x61, 0x5d, 0x94, 0xfc,
	0xde, 0xed, 0x23, 0x9c, 0xc8, 0xa8, 0xdd, 0x47, 0xa1, 0x1d, 0x35, 0xfb, 0x8d, 0x3e, 0x50, 0x43,
	0x84, 0x70, 0x22, 0x11, 0x6a, 0x19, 0x08, 0x85, 0x36, 0x42, 0x0d, 0xe7, 0xf9, 0xa8, 0x39, 0xcc,
	0xfe, 0x09, 0x00, 0x00, 0xff, 0xff, 0xb4, 0xa6, 0xa9, 0x02, 0x04, 0x02, 0x00, 0x00,
}
