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

package resources

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

// An age range view.
type AgeRangeView struct {
	// Output only. The resource name of the age range view.
	// Age range view resource names have the form:
	//
	// `customers/{customer_id}/ageRangeViews/{ad_group_id}~{criterion_id}`
	ResourceName         string   `protobuf:"bytes,1,opt,name=resource_name,json=resourceName,proto3" json:"resource_name,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_AgeRangeView proto.InternalMessageInfo

func (m *AgeRangeView) GetResourceName() string {
	if m != nil {
		return m.ResourceName
	}
	return ""
}

func init() {
	proto.RegisterType((*AgeRangeView)(nil), "google.ads.googleads.v3.resources.AgeRangeView")
}

func init() {
	proto.RegisterFile("google/ads/googleads/v3/resources/age_range_view.proto", fileDescriptor_b1b9693e56ac43d6)
}

var fileDescriptor_b1b9693e56ac43d6 = []byte{
	// 346 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x91, 0xb1, 0x6a, 0xeb, 0x30,
	0x18, 0x85, 0x71, 0x02, 0x17, 0xae, 0xc9, 0x1d, 0x6e, 0xa6, 0x36, 0x14, 0xda, 0x14, 0x42, 0xbb,
	0x54, 0x1a, 0x0c, 0x1d, 0xd4, 0x49, 0x59, 0x02, 0x1d, 0x4a, 0xf0, 0xe0, 0xa1, 0x18, 0x8c, 0x62,
	0xff, 0x55, 0x05, 0xb1, 0x14, 0x24, 0xc7, 0x19, 0x42, 0x5e, 0xa6, 0x63, 0x5f, 0xa3, 0x5b, 0x9f,
	0xa2, 0x73, 0x1e, 0xa1, 0x43, 0x29, 0x8e, 0x22, 0xc5, 0x5d, 0xda, 0x6e, 0x07, 0xfe, 0xef, 0x1c,
	0x1d, 0x8e, 0xc2, 0x6b, 0xae, 0x14, 0x9f, 0x03, 0x66, 0x85, 0xc1, 0x56, 0x36, 0xaa, 0x8e, 0xb0,
	0x06, 0xa3, 0x96, 0x3a, 0x07, 0x83, 0x19, 0x87, 0x4c, 0x33, 0xc9, 0x21, 0xab, 0x05, 0xac, 0xd0,
	0x42, 0xab, 0x4a, 0xf5, 0x87, 0x16, 0x46, 0xac, 0x30, 0xc8, 0xfb, 0x50, 0x1d, 0x21, 0xef, 0x1b,
	0x9c, 0xba, 0xe8, 0x85, 0xc0, 0x0f, 0x02, 0xe6, 0x45, 0x36, 0x83, 0x47, 0x56, 0x0b, 0xa5, 0x6d,
	0xc6, 0xe0, 0xb8, 0x05, 0x38, 0xdb, 0xfe, 0x74, 0xd2, 0x3a, 0x31, 0x29, 0x55, 0xc5, 0x2a, 0xa1,
	0xa4, 0xb1, 0xd7, 0xf3, 0x97, 0x20, 0xec, 0x51, 0x0e, 0x71, 0x53, 0x2a, 0x11, 0xb0, 0xea, 0xc7,
	0xe1, 0x3f, 0x17, 0x90, 0x49, 0x56, 0xc2, 0x51, 0x70, 0x16, 0x5c, 0xfe, 0x1d, 0x5f, 0xbd, 0xd1,
	0xee, 0x3b, 0xbd, 0x08, 0x47, 0x87, 0x86, 0x7b, 0xb5, 0x10, 0x06, 0xe5, 0xaa, 0xc4, 0xed, 0x94,
	0xb8, 0xe7, 0x32, 0xee, 0x58, 0x09, 0x24, 0xdb, 0xd2, 0xf4, 0x97, 0xce, 0x7e, 0x94, 0x2f, 0x4d,
	0xa5, 0x4a, 0xd0, 0x06, 0xaf, 0x9d, 0xdc, 0x34, 0xc3, 0x79, 0xc4, 0xe0, 0xf5, 0xd7, 0x1d, 0x37,
	0xe3, 0x8f, 0x20, 0x1c, 0xe5, 0xaa, 0x44, 0x3f, 0x2e, 0x39, 0xfe, 0xdf, 0x7e, 0x6c, 0xda, 0x4c,
	0x30, 0x0d, 0xee, 0x6f, 0xf7, 0x3e, 0xae, 0xe6, 0x4c, 0x72, 0xa4, 0x34, 0xc7, 0x1c, 0xe4, 0x6e,
	0x20, 0x7c, 0xe8, 0xfa, 0xcd, 0xc7, 0xde, 0x78, 0xf5, 0xd4, 0xe9, 0x4e, 0x28, 0x7d, 0xee, 0x0c,
	0x27, 0x36, 0x92, 0x16, 0x06, 0x59, 0xd9, 0xa8, 0x24, 0x42, 0xb1, 0x23, 0x5f, 0x1d, 0x93, 0xd2,
	0xc2, 0xa4, 0x9e, 0x49, 0x93, 0x28, 0xf5, 0xcc, 0xb6, 0x33, 0xb2, 0x07, 0x42, 0x68, 0x61, 0x08,
	0xf1, 0x14, 0x21, 0x49, 0x44, 0x88, 0xe7, 0x66, 0x7f, 0x76, 0x65, 0xa3, 0xcf, 0x00, 0x00, 0x00,
	0xff, 0xff, 0xde, 0xe0, 0xae, 0xe5, 0x84, 0x02, 0x00, 0x00,
}
