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

// A location view summarizes the performance of campaigns by
// Location criteria.
type LocationView struct {
	// The resource name of the location view.
	// Location view resource names have the form:
	//
	// `customers/{customer_id}/locationViews/{campaign_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 *LocationView) Reset()         { *m = LocationView{} }
func (m *LocationView) String() string { return proto.CompactTextString(m) }
func (*LocationView) ProtoMessage()    {}
func (*LocationView) Descriptor() ([]byte, []int) {
	return fileDescriptor_3aa3d275dc2bd5c6, []int{0}
}

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

var xxx_messageInfo_LocationView proto.InternalMessageInfo

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

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

func init() {
	proto.RegisterFile("google/ads/googleads/v1/resources/location_view.proto", fileDescriptor_3aa3d275dc2bd5c6)
}

var fileDescriptor_3aa3d275dc2bd5c6 = []byte{
	// 264 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x32, 0x4d, 0xcf, 0xcf, 0x4f,
	0xcf, 0x49, 0xd5, 0x4f, 0x4c, 0x29, 0xd6, 0x87, 0x30, 0x41, 0xac, 0x32, 0x43, 0xfd, 0xa2, 0xd4,
	0xe2, 0xfc, 0xd2, 0xa2, 0xe4, 0xd4, 0x62, 0xfd, 0x9c, 0xfc, 0xe4, 0xc4, 0x92, 0xcc, 0xfc, 0xbc,
	0xf8, 0xb2, 0xcc, 0xd4, 0x72, 0xbd, 0x82, 0xa2, 0xfc, 0x92, 0x7c, 0x21, 0x45, 0x88, 0x5a, 0xbd,
	0xc4, 0x94, 0x62, 0x3d, 0xb8, 0x36, 0xbd, 0x32, 0x43, 0x3d, 0xb8, 0x36, 0x29, 0x19, 0x98, 0xc9,
	0x05, 0x99, 0xfa, 0x89, 0x79, 0x79, 0xf9, 0x25, 0x60, 0x43, 0x8a, 0x21, 0x06, 0x28, 0x19, 0x73,
	0xf1, 0xf8, 0x40, 0xcd, 0x0d, 0xcb, 0x4c, 0x2d, 0x17, 0x52, 0xe6, 0xe2, 0x85, 0x69, 0x8d, 0xcf,
	0x4b, 0xcc, 0x4d, 0x95, 0x60, 0x54, 0x60, 0xd4, 0xe0, 0x0c, 0xe2, 0x81, 0x09, 0xfa, 0x25, 0xe6,
	0xa6, 0x3a, 0xfd, 0x63, 0xe4, 0x52, 0x4d, 0xce, 0xcf, 0xd5, 0x23, 0x68, 0xb9, 0x93, 0x20, 0xb2,
	0xe1, 0x01, 0x20, 0x1b, 0x03, 0x18, 0xa3, 0xbc, 0xa0, 0xfa, 0xd2, 0xf3, 0x73, 0x12, 0xf3, 0xd2,
	0xf5, 0xf2, 0x8b, 0xd2, 0xf5, 0xd3, 0x53, 0xf3, 0xc0, 0xee, 0x81, 0xf9, 0xbd, 0x20, 0xb3, 0x18,
	0x4f, 0x50, 0x58, 0xc3, 0x59, 0x8b, 0x98, 0x98, 0xdd, 0x1d, 0x1d, 0x57, 0x31, 0x29, 0xba, 0x43,
	0x8c, 0x74, 0x4c, 0x29, 0xd6, 0x83, 0x30, 0x41, 0xac, 0x30, 0x43, 0xbd, 0x20, 0x98, 0xca, 0x53,
	0x30, 0x35, 0x31, 0x8e, 0x29, 0xc5, 0x31, 0x70, 0x35, 0x31, 0x61, 0x86, 0x31, 0x70, 0x35, 0xaf,
	0x98, 0x54, 0x21, 0x12, 0x56, 0x56, 0x8e, 0x29, 0xc5, 0x56, 0x56, 0x70, 0x55, 0x56, 0x56, 0x61,
	0x86, 0x56, 0x56, 0x70, 0x75, 0x49, 0x6c, 0x60, 0xc7, 0x1a, 0x03, 0x02, 0x00, 0x00, 0xff, 0xff,
	0x98, 0x19, 0x68, 0x8b, 0xb6, 0x01, 0x00, 0x00,
}
