// Code generated by protoc-gen-go. DO NOT EDIT.
// source: google/api/service.proto

package serviceconfig

import (
	fmt "fmt"
	math "math"

	proto "github.com/golang/protobuf/proto"
	_ "github.com/golang/protobuf/ptypes/any"
	wrappers "github.com/golang/protobuf/ptypes/wrappers"
	annotations "google.golang.org/genproto/googleapis/api/annotations"
	_ "google.golang.org/genproto/googleapis/api/label"
	metric "google.golang.org/genproto/googleapis/api/metric"
	monitoredres "google.golang.org/genproto/googleapis/api/monitoredres"
	api "google.golang.org/genproto/protobuf/api"
	ptype "google.golang.org/genproto/protobuf/ptype"
)

// 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

// `Service` is the root object of Google service configuration schema. It
// describes basic information about a service, such as the name and the
// title, and delegates other aspects to sub-sections. Each sub-section is
// either a proto message or a repeated proto message that configures a
// specific aspect, such as auth. See each proto message definition for details.
//
// Example:
//
//     type: google.api.Service
//     config_version: 3
//     name: calendar.googleapis.com
//     title: Google Calendar API
//     apis:
//     - name: google.calendar.v3.Calendar
//     authentication:
//       providers:
//       - id: google_calendar_auth
//         jwks_uri: https://www.googleapis.com/oauth2/v1/certs
//         issuer: https://securetoken.google.com
//       rules:
//       - selector: "*"
//         requirements:
//           provider_id: google_calendar_auth
type Service struct {
	// The semantic version of the service configuration. The config version
	// affects the interpretation of the service configuration. For example,
	// certain features are enabled by default for certain config versions.
	// The latest config version is `3`.
	ConfigVersion *wrappers.UInt32Value `protobuf:"bytes,20,opt,name=config_version,json=configVersion,proto3" json:"config_version,omitempty"`
	// The service name, which is a DNS-like logical identifier for the
	// service, such as `calendar.googleapis.com`. The service name
	// typically goes through DNS verification to make sure the owner
	// of the service also owns the DNS name.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// A unique ID for a specific instance of this message, typically assigned
	// by the client for tracking purpose. If empty, the server may choose to
	// generate one instead. Must be no longer than 60 characters.
	Id string `protobuf:"bytes,33,opt,name=id,proto3" json:"id,omitempty"`
	// The product title for this service.
	Title string `protobuf:"bytes,2,opt,name=title,proto3" json:"title,omitempty"`
	// The Google project that owns this service.
	ProducerProjectId string `protobuf:"bytes,22,opt,name=producer_project_id,json=producerProjectId,proto3" json:"producer_project_id,omitempty"`
	// A list of API interfaces exported by this service. Only the `name` field
	// of the [google.protobuf.Api][google.protobuf.Api] needs to be provided by the configuration
	// author, as the remaining fields will be derived from the IDL during the
	// normalization process. It is an error to specify an API interface here
	// which cannot be resolved against the associated IDL files.
	Apis []*api.Api `protobuf:"bytes,3,rep,name=apis,proto3" json:"apis,omitempty"`
	// A list of all proto message types included in this API service.
	// Types referenced directly or indirectly by the `apis` are
	// automatically included.  Messages which are not referenced but
	// shall be included, such as types used by the `google.protobuf.Any` type,
	// should be listed here by name. Example:
	//
	//     types:
	//     - name: google.protobuf.Int32
	Types []*ptype.Type `protobuf:"bytes,4,rep,name=types,proto3" json:"types,omitempty"`
	// A list of all enum types included in this API service.  Enums
	// referenced directly or indirectly by the `apis` are automatically
	// included.  Enums which are not referenced but shall be included
	// should be listed here by name. Example:
	//
	//     enums:
	//     - name: google.someapi.v1.SomeEnum
	Enums []*ptype.Enum `protobuf:"bytes,5,rep,name=enums,proto3" json:"enums,omitempty"`
	// Additional API documentation.
	Documentation *Documentation `protobuf:"bytes,6,opt,name=documentation,proto3" json:"documentation,omitempty"`
	// API backend configuration.
	Backend *Backend `protobuf:"bytes,8,opt,name=backend,proto3" json:"backend,omitempty"`
	// HTTP configuration.
	Http *annotations.Http `protobuf:"bytes,9,opt,name=http,proto3" json:"http,omitempty"`
	// Quota configuration.
	Quota *Quota `protobuf:"bytes,10,opt,name=quota,proto3" json:"quota,omitempty"`
	// Auth configuration.
	Authentication *Authentication `protobuf:"bytes,11,opt,name=authentication,proto3" json:"authentication,omitempty"`
	// Context configuration.
	Context *Context `protobuf:"bytes,12,opt,name=context,proto3" json:"context,omitempty"`
	// Configuration controlling usage of this service.
	Usage *Usage `protobuf:"bytes,15,opt,name=usage,proto3" json:"usage,omitempty"`
	// Configuration for network endpoints.  If this is empty, then an endpoint
	// with the same name as the service is automatically generated to service all
	// defined APIs.
	Endpoints []*Endpoint `protobuf:"bytes,18,rep,name=endpoints,proto3" json:"endpoints,omitempty"`
	// Configuration for the service control plane.
	Control *Control `protobuf:"bytes,21,opt,name=control,proto3" json:"control,omitempty"`
	// Defines the logs used by this service.
	Logs []*LogDescriptor `protobuf:"bytes,23,rep,name=logs,proto3" json:"logs,omitempty"`
	// Defines the metrics used by this service.
	Metrics []*metric.MetricDescriptor `protobuf:"bytes,24,rep,name=metrics,proto3" json:"metrics,omitempty"`
	// Defines the monitored resources used by this service. This is required
	// by the [Service.monitoring][google.api.Service.monitoring] and [Service.logging][google.api.Service.logging] configurations.
	MonitoredResources []*monitoredres.MonitoredResourceDescriptor `protobuf:"bytes,25,rep,name=monitored_resources,json=monitoredResources,proto3" json:"monitored_resources,omitempty"`
	// Billing configuration.
	Billing *Billing `protobuf:"bytes,26,opt,name=billing,proto3" json:"billing,omitempty"`
	// Logging configuration.
	Logging *Logging `protobuf:"bytes,27,opt,name=logging,proto3" json:"logging,omitempty"`
	// Monitoring configuration.
	Monitoring *Monitoring `protobuf:"bytes,28,opt,name=monitoring,proto3" json:"monitoring,omitempty"`
	// System parameter configuration.
	SystemParameters *SystemParameters `protobuf:"bytes,29,opt,name=system_parameters,json=systemParameters,proto3" json:"system_parameters,omitempty"`
	// Output only. The source information for this configuration if available.
	SourceInfo           *SourceInfo `protobuf:"bytes,37,opt,name=source_info,json=sourceInfo,proto3" json:"source_info,omitempty"`
	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
	XXX_unrecognized     []byte      `json:"-"`
	XXX_sizecache        int32       `json:"-"`
}

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

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

var xxx_messageInfo_Service proto.InternalMessageInfo

func (m *Service) GetConfigVersion() *wrappers.UInt32Value {
	if m != nil {
		return m.ConfigVersion
	}
	return nil
}

func (m *Service) GetName() string {
	if m != nil {
		return m.Name
	}
	return ""
}

func (m *Service) GetId() string {
	if m != nil {
		return m.Id
	}
	return ""
}

func (m *Service) GetTitle() string {
	if m != nil {
		return m.Title
	}
	return ""
}

func (m *Service) GetProducerProjectId() string {
	if m != nil {
		return m.ProducerProjectId
	}
	return ""
}

func (m *Service) GetApis() []*api.Api {
	if m != nil {
		return m.Apis
	}
	return nil
}

func (m *Service) GetTypes() []*ptype.Type {
	if m != nil {
		return m.Types
	}
	return nil
}

func (m *Service) GetEnums() []*ptype.Enum {
	if m != nil {
		return m.Enums
	}
	return nil
}

func (m *Service) GetDocumentation() *Documentation {
	if m != nil {
		return m.Documentation
	}
	return nil
}

func (m *Service) GetBackend() *Backend {
	if m != nil {
		return m.Backend
	}
	return nil
}

func (m *Service) GetHttp() *annotations.Http {
	if m != nil {
		return m.Http
	}
	return nil
}

func (m *Service) GetQuota() *Quota {
	if m != nil {
		return m.Quota
	}
	return nil
}

func (m *Service) GetAuthentication() *Authentication {
	if m != nil {
		return m.Authentication
	}
	return nil
}

func (m *Service) GetContext() *Context {
	if m != nil {
		return m.Context
	}
	return nil
}

func (m *Service) GetUsage() *Usage {
	if m != nil {
		return m.Usage
	}
	return nil
}

func (m *Service) GetEndpoints() []*Endpoint {
	if m != nil {
		return m.Endpoints
	}
	return nil
}

func (m *Service) GetControl() *Control {
	if m != nil {
		return m.Control
	}
	return nil
}

func (m *Service) GetLogs() []*LogDescriptor {
	if m != nil {
		return m.Logs
	}
	return nil
}

func (m *Service) GetMetrics() []*metric.MetricDescriptor {
	if m != nil {
		return m.Metrics
	}
	return nil
}

func (m *Service) GetMonitoredResources() []*monitoredres.MonitoredResourceDescriptor {
	if m != nil {
		return m.MonitoredResources
	}
	return nil
}

func (m *Service) GetBilling() *Billing {
	if m != nil {
		return m.Billing
	}
	return nil
}

func (m *Service) GetLogging() *Logging {
	if m != nil {
		return m.Logging
	}
	return nil
}

func (m *Service) GetMonitoring() *Monitoring {
	if m != nil {
		return m.Monitoring
	}
	return nil
}

func (m *Service) GetSystemParameters() *SystemParameters {
	if m != nil {
		return m.SystemParameters
	}
	return nil
}

func (m *Service) GetSourceInfo() *SourceInfo {
	if m != nil {
		return m.SourceInfo
	}
	return nil
}

func init() {
	proto.RegisterType((*Service)(nil), "google.api.Service")
}

func init() {
	proto.RegisterFile("google/api/service.proto", fileDescriptor_d556deeebe545813)
}

var fileDescriptor_d556deeebe545813 = []byte{
	// 792 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x74, 0x95, 0xdd, 0x6e, 0xdb, 0x36,
	0x18, 0x86, 0x61, 0xd7, 0x6e, 0x66, 0xba, 0xcd, 0x1a, 0xc6, 0x49, 0x19, 0xd7, 0x1b, 0xd2, 0xfd,
	0xa0, 0x06, 0x86, 0xca, 0x80, 0x0b, 0x74, 0x07, 0x3b, 0x18, 0xe2, 0x36, 0xd8, 0x0c, 0x64, 0x80,
	0xc7, 0x2c, 0xc1, 0xb0, 0x13, 0x83, 0x96, 0x68, 0x85, 0x9b, 0x44, 0x72, 0x24, 0x95, 0xcd, 0xb7,
	0xb3, 0x7b, 0xda, 0xfd, 0x14, 0x22, 0xa5, 0x98, 0xfa, 0xc9, 0x99, 0xc5, 0xe7, 0xf9, 0xa8, 0x8f,
	0x22, 0xf9, 0x1a, 0xa0, 0x58, 0x88, 0x38, 0xa1, 0x33, 0x22, 0xd9, 0x4c, 0x53, 0x75, 0xcf, 0x42,
	0x1a, 0x48, 0x25, 0x8c, 0x80, 0xc0, 0x91, 0x80, 0x48, 0x36, 0x3e, 0xf1, 0x2c, 0x92, 0x99, 0x3b,
	0xa7, 0x8c, 0xfd, 0xe2, 0x0d, 0x09, 0xff, 0xa2, 0x3c, 0x6a, 0x23, 0x2c, 0x49, 0x18, 0x8f, 0x5b,
	0x48, 0x28, 0xb8, 0xa1, 0xff, 0x9a, 0x47, 0x88, 0x12, 0x49, 0x41, 0xbe, 0xf4, 0x48, 0x24, 0xc2,
	0x2c, 0xa5, 0xdc, 0x10, 0xc3, 0x04, 0x2f, 0xf8, 0x99, 0xc7, 0x29, 0x8f, 0xa4, 0x60, 0xbc, 0x9c,
	0xd4, 0xef, 0xfc, 0xce, 0x18, 0x59, 0x0c, 0x9f, 0x7a, 0xc3, 0x09, 0xd9, 0xd0, 0xf2, 0x4d, 0x23,
	0x7f, 0x5c, 0xb4, 0xf5, 0x9c, 0x88, 0x38, 0xde, 0xaf, 0xe6, 0xa5, 0x47, 0x52, 0x6a, 0x14, 0x0b,
	0x0b, 0xf0, 0xb5, 0x0f, 0x04, 0x67, 0x46, 0x28, 0x1a, 0xad, 0x15, 0xd5, 0x22, 0x53, 0xe5, 0x27,
	0x1e, 0xbf, 0x6a, 0x4a, 0xfb, 0xa9, 0xfd, 0x16, 0xff, 0xce, 0x84, 0x21, 0x2d, 0x8b, 0xad, 0xcd,
	0x37, 0xf1, 0x37, 0xd3, 0x82, 0x35, 0xe3, 0x5b, 0x51, 0xd0, 0xd7, 0x3e, 0xdd, 0x69, 0x43, 0xd3,
	0xb5, 0x24, 0x8a, 0xa4, 0xd4, 0x50, 0xd5, 0xf2, 0xce, 0x4c, 0x93, 0x98, 0xd6, 0xde, 0x69, 0x9f,
	0x36, 0xd9, 0x76, 0x46, 0xf8, 0xee, 0x51, 0x24, 0x59, 0x81, 0xc6, 0x75, 0x64, 0x76, 0x92, 0xd6,
	0xb6, 0xf4, 0x81, 0xfd, 0xa3, 0x88, 0x94, 0x54, 0x69, 0xc7, 0xbf, 0xfa, 0x7f, 0x00, 0x0e, 0xae,
	0xdd, 0x79, 0x84, 0x1f, 0xc0, 0x61, 0x28, 0xf8, 0x96, 0xc5, 0xeb, 0x7b, 0xaa, 0x34, 0x13, 0x1c,
	0x8d, 0xce, 0x3b, 0xd3, 0xe1, 0x7c, 0x12, 0x14, 0x47, 0xb4, 0x9c, 0x24, 0xb8, 0x59, 0x72, 0xf3,
	0x6e, 0x7e, 0x4b, 0x92, 0x8c, 0xe2, 0xe7, 0xae, 0xe6, 0xd6, 0x95, 0x40, 0x08, 0x7a, 0x9c, 0xa4,
	0x14, 0x75, 0xce, 0x3b, 0xd3, 0x01, 0xb6, 0xbf, 0xe1, 0x21, 0xe8, 0xb2, 0x08, 0xbd, 0xb6, 0x23,
	0x5d, 0x16, 0xc1, 0x11, 0xe8, 0x1b, 0x66, 0x12, 0x8a, 0xba, 0x76, 0xc8, 0x3d, 0xc0, 0x00, 0x1c,
	0x4b, 0x25, 0xa2, 0x2c, 0xa4, 0x6a, 0x2d, 0x95, 0xf8, 0x93, 0x86, 0x66, 0xcd, 0x22, 0x74, 0x6a,
	0x9d, 0xa3, 0x12, 0xad, 0x1c, 0x59, 0x46, 0x70, 0x0a, 0x7a, 0x44, 0x32, 0x8d, 0x9e, 0x9c, 0x3f,
	0x99, 0x0e, 0xe7, 0xa3, 0x46, 0x93, 0x17, 0x92, 0x61, 0x6b, 0xc0, 0xef, 0x40, 0x3f, 0xff, 0x24,
	0x1a, 0xf5, 0xac, 0x7a, 0xd2, 0x50, 0x7f, 0xdb, 0x49, 0x8a, 0x9d, 0x93, 0xcb, 0x94, 0x67, 0xa9,
	0x46, 0xfd, 0x47, 0xe4, 0x4b, 0x9e, 0xa5, 0xd8, 0x39, 0xf0, 0x47, 0xf0, 0xbc, 0x72, 0x51, 0xd0,
	0x53, 0xfb, 0xc5, 0xce, 0x82, 0xfd, 0xa5, 0x0e, 0x3e, 0xfa, 0x02, 0xae, 0xfa, 0xf0, 0x2d, 0x38,
	0x28, 0x6e, 0x34, 0xfa, 0xcc, 0x96, 0x1e, 0xfb, 0xa5, 0x0b, 0x87, 0x70, 0xe9, 0xc0, 0x6f, 0x40,
	0x2f, 0xbf, 0x5d, 0x68, 0x60, 0xdd, 0x17, 0xbe, 0xfb, 0xb3, 0x31, 0x12, 0x5b, 0x0a, 0xdf, 0x80,
	0xbe, 0x3d, 0xc9, 0x08, 0x58, 0xed, 0xc8, 0xd7, 0x7e, 0xcd, 0x01, 0x76, 0x1c, 0x2e, 0xc0, 0x61,
	0x1e, 0x33, 0x94, 0x1b, 0x16, 0xba, 0xfe, 0x87, 0xb6, 0x62, 0xec, 0x57, 0x5c, 0x54, 0x0c, 0x5c,
	0xab, 0xc8, 0x57, 0x50, 0xe4, 0x0b, 0x7a, 0xd6, 0x5c, 0xc1, 0x07, 0x87, 0x70, 0xe9, 0xe4, 0xbd,
	0xd9, 0x13, 0x8f, 0x3e, 0x6f, 0xf6, 0x76, 0x93, 0x03, 0xec, 0x38, 0x9c, 0x83, 0x41, 0x99, 0x31,
	0x1a, 0xc1, 0xea, 0x1e, 0xe7, 0xf2, 0x65, 0x01, 0xf1, 0x5e, 0x2b, 0x7b, 0x51, 0x22, 0x41, 0x27,
	0xed, 0xbd, 0x28, 0x91, 0xe0, 0xd2, 0x81, 0x6f, 0x41, 0x2f, 0x11, 0xb1, 0x46, 0x2f, 0xed, 0xec,
	0x95, 0x4d, 0xbb, 0x12, 0xf1, 0x47, 0xaa, 0x43, 0xc5, 0xa4, 0x11, 0x0a, 0x5b, 0x0d, 0xbe, 0x07,
	0x07, 0x2e, 0x7b, 0x34, 0x42, 0xb6, 0x62, 0xe2, 0x57, 0xfc, 0x62, 0x91, 0x57, 0x54, 0xca, 0xf0,
	0x77, 0x70, 0xdc, 0x8c, 0x26, 0x8d, 0xce, 0xec, 0x1c, 0x6f, 0x2a, 0x73, 0x94, 0x1a, 0x2e, 0x2c,
	0x6f, 0x3a, 0x98, 0xd6, 0xa1, 0x5d, 0x6f, 0x91, 0xfa, 0x68, 0xdc, 0x72, 0x7a, 0x1c, 0xc2, 0xa5,
	0x93, 0xeb, 0x45, 0xac, 0xa2, 0x57, 0x4d, 0xfd, 0xca, 0x21, 0x5c, 0x3a, 0xf0, 0x3d, 0x00, 0xfb,
	0xb4, 0x44, 0x13, 0x5b, 0x71, 0xda, 0xd2, 0x6e, 0x5e, 0xe4, 0x99, 0x70, 0x09, 0x8e, 0xea, 0xb9,
	0xa7, 0xd1, 0x17, 0xd5, 0x28, 0xc9, 0xcb, 0xaf, 0xad, 0xb4, 0x7a, 0x70, 0xf0, 0x0b, 0x5d, 0x1b,
	0x81, 0xdf, 0x83, 0xa1, 0x17, 0xb0, 0xe8, 0xdb, 0x66, 0x0f, 0xd7, 0x16, 0x2f, 0xf9, 0x56, 0x60,
	0xa0, 0x1f, 0x7e, 0x2f, 0x78, 0x9e, 0x65, 0xa9, 0x27, 0x2e, 0x9e, 0x15, 0x31, 0xb7, 0xca, 0xef,
	0xf1, 0xaa, 0xf3, 0xc7, 0x65, 0xc1, 0x62, 0x91, 0x10, 0x1e, 0x07, 0x42, 0xc5, 0xb3, 0x98, 0x72,
	0x7b, 0xcb, 0x67, 0x0e, 0xe5, 0xd9, 0xe1, 0xff, 0x61, 0xbb, 0xa0, 0xfb, 0xa1, 0xf2, 0xf4, 0x5f,
	0xb7, 0xf7, 0xd3, 0xc5, 0x6a, 0xb9, 0x79, 0x6a, 0x0b, 0xdf, 0x7d, 0x0a, 0x00, 0x00, 0xff, 0xff,
	0x78, 0x8a, 0xb2, 0x67, 0xe8, 0x07, 0x00, 0x00,
}
