// Code generated by protoc-gen-go. DO NOT EDIT.
// source: feeds.proto

package maps_booking_feeds

import (
	fmt "fmt"
	proto "github.com/golang/protobuf/proto"
	math "math"
)

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

// Defines how a total price is determined from an availability.
type PriceType int32

const (
	// The price is for a fixed amount. This is the default value if the field is
	// not set.
	PriceType_FIXED_RATE_DEFAULT PriceType = 0
	// The price specified is per person, and the total price is calculated
	// according to the party size specified in Resources as
	// price_micros * party_size. A PER_PERSON price must be accompanied by a
	// party size in the availability resources. If it is not, a party size of one
	// is used.
	PriceType_PER_PERSON PriceType = 1
)

var PriceType_name = map[int32]string{
	0: "FIXED_RATE_DEFAULT",
	1: "PER_PERSON",
}

var PriceType_value = map[string]int32{
	"FIXED_RATE_DEFAULT": 0,
	"PER_PERSON":         1,
}

func (x PriceType) String() string {
	return proto.EnumName(PriceType_name, int32(x))
}

func (PriceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0}
}

// Defines whether a credit card is required in order to book an appointment.
type RequireCreditCard int32

const (
	// The credit card requirement is not explicitly specified and the
	// behaviour is identical to the one specified for CONDITIONAL.
	RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED RequireCreditCard = 0
	// Google will require a credit card for the booking if any of the following
	// conditions are met:
	// * the availability has a price and the prepayment_type is REQUIRED
	// * the no_show_fee is set
	// * the deposit field is set.
	RequireCreditCard_REQUIRE_CREDIT_CARD_CONDITIONAL RequireCreditCard = 1
	// A credit card is always required in order to book this availability
	// regardless of other field values.
	RequireCreditCard_REQUIRE_CREDIT_CARD_ALWAYS RequireCreditCard = 2
)

var RequireCreditCard_name = map[int32]string{
	0: "REQUIRE_CREDIT_CARD_UNSPECIFIED",
	1: "REQUIRE_CREDIT_CARD_CONDITIONAL",
	2: "REQUIRE_CREDIT_CARD_ALWAYS",
}

var RequireCreditCard_value = map[string]int32{
	"REQUIRE_CREDIT_CARD_UNSPECIFIED": 0,
	"REQUIRE_CREDIT_CARD_CONDITIONAL": 1,
	"REQUIRE_CREDIT_CARD_ALWAYS":      2,
}

func (x RequireCreditCard) String() string {
	return proto.EnumName(RequireCreditCard_name, int32(x))
}

func (RequireCreditCard) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

// The platform that the action is performed on. Web application is the general
// fallback. It is recommended to have at least one ActionLink with
// ACTION_PLATFORM_WEB_APPLICATION. Links with Android and iOS as platform are
// only used on the respective system.
type ActionPlatform int32

const (
	// The platform is unspecified.
	ActionPlatform_ACTION_PLATFORM_UNSPECIFIED ActionPlatform = 0
	// The action platform is web in general.
	ActionPlatform_ACTION_PLATFORM_WEB_APPLICATION ActionPlatform = 1
	// The action platform is web on mobile devices.
	ActionPlatform_ACTION_PLATFORM_MOBILE_WEB ActionPlatform = 2
	// The action platform is Android OS.
	ActionPlatform_ACTION_PLATFORM_ANDROID ActionPlatform = 3
	// The action platform is iOS.
	ActionPlatform_ACTION_PLATFORM_IOS ActionPlatform = 4
)

var ActionPlatform_name = map[int32]string{
	0: "ACTION_PLATFORM_UNSPECIFIED",
	1: "ACTION_PLATFORM_WEB_APPLICATION",
	2: "ACTION_PLATFORM_MOBILE_WEB",
	3: "ACTION_PLATFORM_ANDROID",
	4: "ACTION_PLATFORM_IOS",
}

var ActionPlatform_value = map[string]int32{
	"ACTION_PLATFORM_UNSPECIFIED":     0,
	"ACTION_PLATFORM_WEB_APPLICATION": 1,
	"ACTION_PLATFORM_MOBILE_WEB":      2,
	"ACTION_PLATFORM_ANDROID":         3,
	"ACTION_PLATFORM_IOS":             4,
}

func (x ActionPlatform) String() string {
	return proto.EnumName(ActionPlatform_name, int32(x))
}

func (ActionPlatform) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

type FeedMetadata_ProcessingInstruction int32

const (
	// By default we will assume that this feed is an incremental feed.
	FeedMetadata_PROCESS_UNKNOWN FeedMetadata_ProcessingInstruction = 0
	// This Feed message is one shard of a complete feed. Anything previously
	// supplied by this partner will be deleted; the contents of this feed
	// represent the entire state of the world.
	FeedMetadata_PROCESS_AS_COMPLETE FeedMetadata_ProcessingInstruction = 1
	// This Feed message is one shard of an incremental feed. Existing entities
	// will be left untouched except as modified in this feed.
	FeedMetadata_PROCESS_AS_INCREMENTAL FeedMetadata_ProcessingInstruction = 2
)

var FeedMetadata_ProcessingInstruction_name = map[int32]string{
	0: "PROCESS_UNKNOWN",
	1: "PROCESS_AS_COMPLETE",
	2: "PROCESS_AS_INCREMENTAL",
}

var FeedMetadata_ProcessingInstruction_value = map[string]int32{
	"PROCESS_UNKNOWN":        0,
	"PROCESS_AS_COMPLETE":    1,
	"PROCESS_AS_INCREMENTAL": 2,
}

func (x FeedMetadata_ProcessingInstruction) String() string {
	return proto.EnumName(FeedMetadata_ProcessingInstruction_name, int32(x))
}

func (FeedMetadata_ProcessingInstruction) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{0, 0}
}

// The confirmation modes used when booking availabilities.
type Availability_ConfirmationMode int32

const (
	// The confirmation mode was not specified.
	// Synchronous confirmation will be assumed.
	Availability_CONFIRMATION_MODE_UNSPECIFIED Availability_ConfirmationMode = 0
	// Bookings for this availability will be confirmed synchronously.
	Availability_CONFIRMATION_MODE_SYNCHRONOUS Availability_ConfirmationMode = 1
	// Bookings for this availability will be confirmed asynchronously.
	Availability_CONFIRMATION_MODE_ASYNCHRONOUS Availability_ConfirmationMode = 2
)

var Availability_ConfirmationMode_name = map[int32]string{
	0: "CONFIRMATION_MODE_UNSPECIFIED",
	1: "CONFIRMATION_MODE_SYNCHRONOUS",
	2: "CONFIRMATION_MODE_ASYNCHRONOUS",
}

var Availability_ConfirmationMode_value = map[string]int32{
	"CONFIRMATION_MODE_UNSPECIFIED":  0,
	"CONFIRMATION_MODE_SYNCHRONOUS":  1,
	"CONFIRMATION_MODE_ASYNCHRONOUS": 2,
}

func (x Availability_ConfirmationMode) String() string {
	return proto.EnumName(Availability_ConfirmationMode_name, int32(x))
}

func (Availability_ConfirmationMode) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 0}
}

// Enum to indicate the prepayment type.
type Service_PrepaymentType int32

const (
	// By default we will assume that the prepayment is NOT_SUPPORTED.
	Service_PREPAYMENT_TYPE_UNSPECIFIED Service_PrepaymentType = 0
	// The user has to pay this service at the booking time.
	Service_REQUIRED Service_PrepaymentType = 1
	// The user can choose to pre-pay this service at the booking time or later,
	// but it is not required in order to book.
	Service_OPTIONAL Service_PrepaymentType = 2
	// The prepayment is not supported for this service.
	Service_NOT_SUPPORTED Service_PrepaymentType = 3
)

var Service_PrepaymentType_name = map[int32]string{
	0: "PREPAYMENT_TYPE_UNSPECIFIED",
	1: "REQUIRED",
	2: "OPTIONAL",
	3: "NOT_SUPPORTED",
}

var Service_PrepaymentType_value = map[string]int32{
	"PREPAYMENT_TYPE_UNSPECIFIED": 0,
	"REQUIRED":                    1,
	"OPTIONAL":                    2,
	"NOT_SUPPORTED":               3,
}

func (x Service_PrepaymentType) String() string {
	return proto.EnumName(Service_PrepaymentType_name, int32(x))
}

func (Service_PrepaymentType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 0}
}

type Service_ServiceType int32

const (
	Service_SERVICE_TYPE_UNSPECIFIED        Service_ServiceType = 0
	Service_SERVICE_TYPE_DINING_RESERVATION Service_ServiceType = 1
	Service_SERVICE_TYPE_FOOD_ORDERING      Service_ServiceType = 2
	Service_SERVICE_TYPE_EVENT_TICKET       Service_ServiceType = 3
	Service_SERVICE_TYPE_TRIP_TOUR          Service_ServiceType = 4
)

var Service_ServiceType_name = map[int32]string{
	0: "SERVICE_TYPE_UNSPECIFIED",
	1: "SERVICE_TYPE_DINING_RESERVATION",
	2: "SERVICE_TYPE_FOOD_ORDERING",
	3: "SERVICE_TYPE_EVENT_TICKET",
	4: "SERVICE_TYPE_TRIP_TOUR",
}

var Service_ServiceType_value = map[string]int32{
	"SERVICE_TYPE_UNSPECIFIED":        0,
	"SERVICE_TYPE_DINING_RESERVATION": 1,
	"SERVICE_TYPE_FOOD_ORDERING":      2,
	"SERVICE_TYPE_EVENT_TICKET":       3,
	"SERVICE_TYPE_TRIP_TOUR":          4,
}

func (x Service_ServiceType) String() string {
	return proto.EnumName(Service_ServiceType_name, int32(x))
}

func (Service_ServiceType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{7, 1}
}

// The admission policy of this service.
type SchedulingRules_AdmissionPolicy int32

const (
	// Unused.
	SchedulingRules_ADMISSION_POLICY_UNSPECIFIED SchedulingRules_AdmissionPolicy = 0
	// Customers are required to be present at the start time of the
	// availability slot, and the service is expected to finish at the
	// end time of the slot.
	// Examples of TIME_STRICT use cases:
	//   * A tour that starts at 9am that requires all attendees to arrive
	//     at the start time, and returns at around 12pm.
	//   * A haircut reservation at 3pm on Saturday that will take approximately
	//   30 minutes.
	//   * A fitness class from 6pm to 8pm.
	SchedulingRules_TIME_STRICT SchedulingRules_AdmissionPolicy = 1
	// Customers can arrive at any time between the start and end time of the
	// availability slot to use this booking.
	//
	// Examples of TIME_FLEXIBLE use cases:
	//   * A museum ticket that can be used during any time on the purchase
	//     date.
	//   * An afternoon admission to an amusement park that can be used from
	//     12pm to 9pm.
	SchedulingRules_TIME_FLEXIBLE SchedulingRules_AdmissionPolicy = 2
	// Customers need to arrive at the merchant at the start time of the
	// availability slot but can leave any time they want.
	//
	// For example, in the museum admission scenario, a timed entry ticket
	// for 10am requires the user to be at the museum at 10am. The start time of
	// availability slots for this service represents the designated entry
	// time. The end time, however, is used solely as a key to identify the
	// availability slot for booking.
	SchedulingRules_TIMED_ENTRY_WITH_FLEXIBLE_DURATION SchedulingRules_AdmissionPolicy = 3
)

var SchedulingRules_AdmissionPolicy_name = map[int32]string{
	0: "ADMISSION_POLICY_UNSPECIFIED",
	1: "TIME_STRICT",
	2: "TIME_FLEXIBLE",
	3: "TIMED_ENTRY_WITH_FLEXIBLE_DURATION",
}

var SchedulingRules_AdmissionPolicy_value = map[string]int32{
	"ADMISSION_POLICY_UNSPECIFIED":       0,
	"TIME_STRICT":                        1,
	"TIME_FLEXIBLE":                      2,
	"TIMED_ENTRY_WITH_FLEXIBLE_DURATION": 3,
}

func (x SchedulingRules_AdmissionPolicy) String() string {
	return proto.EnumName(SchedulingRules_AdmissionPolicy_name, int32(x))
}

func (SchedulingRules_AdmissionPolicy) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{9, 0}
}

// Enum to indicate the type of field.
type ServiceIntakeFormField_FieldType int32

const (
	// Fields of unspecified or unknown type will be ignored.
	ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED ServiceIntakeFormField_FieldType = 0
	// A one-line input field for text.
	ServiceIntakeFormField_SHORT_ANSWER ServiceIntakeFormField_FieldType = 1
	// A multi-line input field for text.
	ServiceIntakeFormField_PARAGRAPH ServiceIntakeFormField_FieldType = 2
	// A set of radio buttons that requires one choice from many options.
	ServiceIntakeFormField_MULTIPLE_CHOICE ServiceIntakeFormField_FieldType = 3
	// One or more enumerated items with checkboxes.
	ServiceIntakeFormField_CHECKBOXES ServiceIntakeFormField_FieldType = 4
	// A selection from a dropdown.
	ServiceIntakeFormField_DROPDOWN ServiceIntakeFormField_FieldType = 5
	// A yes/no button.
	ServiceIntakeFormField_BOOLEAN ServiceIntakeFormField_FieldType = 6
)

var ServiceIntakeFormField_FieldType_name = map[int32]string{
	0: "FIELD_TYPE_UNSPECIFIED",
	1: "SHORT_ANSWER",
	2: "PARAGRAPH",
	3: "MULTIPLE_CHOICE",
	4: "CHECKBOXES",
	5: "DROPDOWN",
	6: "BOOLEAN",
}

var ServiceIntakeFormField_FieldType_value = map[string]int32{
	"FIELD_TYPE_UNSPECIFIED": 0,
	"SHORT_ANSWER":           1,
	"PARAGRAPH":              2,
	"MULTIPLE_CHOICE":        3,
	"CHECKBOXES":             4,
	"DROPDOWN":               5,
	"BOOLEAN":                6,
}

func (x ServiceIntakeFormField_FieldType) String() string {
	return proto.EnumName(ServiceIntakeFormField_FieldType_name, int32(x))
}

func (ServiceIntakeFormField_FieldType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{11, 0}
}

// Enum to indicate the type of this media source. Only photos are supported.
// Please reach out to the Reserve with Google team if other media beyond
// photos need to be supported.
type RelatedMedia_MediaType int32

const (
	// Unused.
	RelatedMedia_TYPE_UNSPECIFIED RelatedMedia_MediaType = 0
	// Indicates the media provided by the url is a photo.
	RelatedMedia_PHOTO RelatedMedia_MediaType = 1
)

var RelatedMedia_MediaType_name = map[int32]string{
	0: "TYPE_UNSPECIFIED",
	1: "PHOTO",
}

var RelatedMedia_MediaType_value = map[string]int32{
	"TYPE_UNSPECIFIED": 0,
	"PHOTO":            1,
}

func (x RelatedMedia_MediaType) String() string {
	return proto.EnumName(RelatedMedia_MediaType_name, int32(x))
}

func (RelatedMedia_MediaType) EnumDescriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{17, 0}
}

type FeedMetadata struct {
	// Instructs us how to process the feed: either as a shard of a complete feed,
	// or as a shard of an incremental update.
	ProcessingInstruction FeedMetadata_ProcessingInstruction `protobuf:"varint,1,opt,name=processing_instruction,json=processingInstruction,proto3,enum=maps.booking.feeds.FeedMetadata_ProcessingInstruction" json:"processing_instruction,omitempty"`
	// The current shard and total number of shards for this feed.
	//
	// Shard number is assumed to be zero-based.
	//
	// There does not need to be any relationship to the file name.
	//
	// Shards do not need to be transferred in order, and they may not be
	// processed in order.
	ShardNumber int32 `protobuf:"varint,2,opt,name=shard_number,json=shardNumber,proto3" json:"shard_number,omitempty"`
	TotalShards int32 `protobuf:"varint,3,opt,name=total_shards,json=totalShards,proto3" json:"total_shards,omitempty"`
	// An identifier that must be consistent across all shards in a feed.
	// This value must be globally unique across each feed type.
	//
	// This value ensures that complete feeds spanning multiple shards are
	// processed together correctly.
	//
	// Clients only need to set this value when the processing_instruction is set
	// to PROCESS_AS_COMPLETE and the feed spans multiple shards (defined by
	// total_shards).
	//
	// Feeds that span multiple shards must set this nonce to the same value.
	Nonce uint64 `protobuf:"varint,5,opt,name=nonce,proto3" json:"nonce,omitempty"`
	// The timestamp at which this feed shard was generated.
	//
	// In Unix time format (seconds since the epoch).
	GenerationTimestamp  int64    `protobuf:"varint,4,opt,name=generation_timestamp,json=generationTimestamp,proto3" json:"generation_timestamp,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_FeedMetadata proto.InternalMessageInfo

func (m *FeedMetadata) GetProcessingInstruction() FeedMetadata_ProcessingInstruction {
	if m != nil {
		return m.ProcessingInstruction
	}
	return FeedMetadata_PROCESS_UNKNOWN
}

func (m *FeedMetadata) GetShardNumber() int32 {
	if m != nil {
		return m.ShardNumber
	}
	return 0
}

func (m *FeedMetadata) GetTotalShards() int32 {
	if m != nil {
		return m.TotalShards
	}
	return 0
}

func (m *FeedMetadata) GetNonce() uint64 {
	if m != nil {
		return m.Nonce
	}
	return 0
}

func (m *FeedMetadata) GetGenerationTimestamp() int64 {
	if m != nil {
		return m.GenerationTimestamp
	}
	return 0
}

type AvailabilityFeed struct {
	Metadata             *FeedMetadata          `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	ServiceAvailability  []*ServiceAvailability `protobuf:"bytes,2,rep,name=service_availability,json=serviceAvailability,proto3" json:"service_availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
	XXX_unrecognized     []byte                 `json:"-"`
	XXX_sizecache        int32                  `json:"-"`
}

func (m *AvailabilityFeed) Reset()         { *m = AvailabilityFeed{} }
func (m *AvailabilityFeed) String() string { return proto.CompactTextString(m) }
func (*AvailabilityFeed) ProtoMessage()    {}
func (*AvailabilityFeed) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{1}
}

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

var xxx_messageInfo_AvailabilityFeed proto.InternalMessageInfo

func (m *AvailabilityFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *AvailabilityFeed) GetServiceAvailability() []*ServiceAvailability {
	if m != nil {
		return m.ServiceAvailability
	}
	return nil
}

type ServiceAvailability struct {
	// If provided, we will consider the Availability entities provided to be a
	// complete snapshot from [start_timestamp_restrict, end_timestamp_restrict).
	// That is, all existing availability will be deleted if the following
	// condition holds true:
	//
	//    start_timestamp_restrict <= Availability.start_sec &&
	//    Availability.start_sec < end_timestamp_restrict
	//
	// If a resource_restrict message is set, the condition is further restricted:
	//
	//    Availability.resource.staff_id == resource_restrict.staff_id &&
	//    Availability.resource.room_id == resource_restrict.room_id
	//
	// These fields are typically used to provide a complete update of
	// availability in a given time range.
	//
	// Setting start_timestamp_restrict while leaving end_timestamp_restrict unset
	// is interpreted to mean all time beginning at start_timestamp_restrict.
	//
	// Setting end_timestamp_restrict while leaving start_timestamp_restrict unset
	// is interpreted to mean all time up to the end_timestamp_restrict.
	//
	// In Unix time format (seconds since the epoch).
	StartTimestampRestrict int64 `protobuf:"varint,1,opt,name=start_timestamp_restrict,json=startTimestampRestrict,proto3" json:"start_timestamp_restrict,omitempty"`
	EndTimestampRestrict   int64 `protobuf:"varint,2,opt,name=end_timestamp_restrict,json=endTimestampRestrict,proto3" json:"end_timestamp_restrict,omitempty"`
	// If provided, the timestamp restricts will be applied only to the given
	// merchant or service.
	//
	// These fields are typically used to provide complete snapshot of
	// availability in a given range (defined above) for a specific merchant or
	// service.
	//
	// Leaving these fields unset, or setting these to the empty string or null,
	// is interpreted to mean that no restrict is intended.
	MerchantIdRestrict string `protobuf:"bytes,3,opt,name=merchant_id_restrict,json=merchantIdRestrict,proto3" json:"merchant_id_restrict,omitempty"`
	ServiceIdRestrict  string `protobuf:"bytes,4,opt,name=service_id_restrict,json=serviceIdRestrict,proto3" json:"service_id_restrict,omitempty"`
	// Setting resources_restrict further restricts the scope of the update to
	// just this set of resources. All id fields of the resources must match
	// exactly.
	ResourcesRestrict    *Resources      `protobuf:"bytes,6,opt,name=resources_restrict,json=resourcesRestrict,proto3" json:"resources_restrict,omitempty"`
	Availability         []*Availability `protobuf:"bytes,5,rep,name=availability,proto3" json:"availability,omitempty"`
	XXX_NoUnkeyedLiteral struct{}        `json:"-"`
	XXX_unrecognized     []byte          `json:"-"`
	XXX_sizecache        int32           `json:"-"`
}

func (m *ServiceAvailability) Reset()         { *m = ServiceAvailability{} }
func (m *ServiceAvailability) String() string { return proto.CompactTextString(m) }
func (*ServiceAvailability) ProtoMessage()    {}
func (*ServiceAvailability) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{2}
}

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

var xxx_messageInfo_ServiceAvailability proto.InternalMessageInfo

func (m *ServiceAvailability) GetStartTimestampRestrict() int64 {
	if m != nil {
		return m.StartTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetEndTimestampRestrict() int64 {
	if m != nil {
		return m.EndTimestampRestrict
	}
	return 0
}

func (m *ServiceAvailability) GetMerchantIdRestrict() string {
	if m != nil {
		return m.MerchantIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetServiceIdRestrict() string {
	if m != nil {
		return m.ServiceIdRestrict
	}
	return ""
}

func (m *ServiceAvailability) GetResourcesRestrict() *Resources {
	if m != nil {
		return m.ResourcesRestrict
	}
	return nil
}

func (m *ServiceAvailability) GetAvailability() []*Availability {
	if m != nil {
		return m.Availability
	}
	return nil
}

// An availability of the merchant's service, indicating time and number
// of spots.
// The availability feed should be a list of this message.
// Please note that it's up to the partner to call out all the possible
// availabilities.
// If a massage therapist is available 9am-12pm, and they provide
// one-hour massage sessions, the aggregator should provide the feed as
//   availability {start_sec: 9am, duration: 60 minutes, ...}
//   availability {start_sec: 10am, duration: 60 minutes, ...}
//   availability {start_sec: 11am, duration: 60 minutes, ...}
// instead of
//   availability {start_sec: 9am, duration: 180 minutes, ...}
//
type Availability struct {
	// An opaque string from an aggregator to identify a merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from aggregator to identify a service of the
	// merchant. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// Start time of this availability, using epoch time in seconds in UTC.
	//(required)
	StartSec int64 `protobuf:"varint,3,opt,name=start_sec,json=startSec,proto3" json:"start_sec,omitempty"`
	// Duration of the service in seconds, e.g. 30 minutes for a chair massage.
	// (required)
	DurationSec int64 `protobuf:"varint,4,opt,name=duration_sec,json=durationSec,proto3" json:"duration_sec,omitempty"`
	// Number of total spots and open spots of this availability.
	// E.g. a Yoga class of 10 spots with 3 booked.
	//   availability {spots_total: 10, spots_open: 7 ...}
	// E.g. a chair massage session which was already booked.
	//   availability {spots_total: 1, spots_open: 0 ...}
	//
	// Note: If sending requests using the availability compression format defined
	//       below, these two fields will be inferred. A Recurrence
	//       implies spots_total=1 and spots_open=1. A ScheduleException implies
	//       spots_total=1 and spots_open=0.
	// (both required if recurrence not set)
	SpotsTotal int64 `protobuf:"varint,5,opt,name=spots_total,json=spotsTotal,proto3" json:"spots_total,omitempty"`
	SpotsOpen  int64 `protobuf:"varint,6,opt,name=spots_open,json=spotsOpen,proto3" json:"spots_open,omitempty"`
	// An optional opaque string to identify this availability slot. If set, it
	// will be included in the requests that book/update/cancel appointments.
	// (optional)
	AvailabilityTag string `protobuf:"bytes,7,opt,name=availability_tag,json=availabilityTag,proto3" json:"availability_tag,omitempty"`
	// Optional resources used to disambiguate this availability slot from
	// others when different staff, room, or party_size values are part
	// of the service.
	//
	// E.g. the same Yoga class with two 2 instructors.
	//  availability { resources { staff_id: "1" staff_name: "Amy" }
	//                 spots_total: 10 spots_open: 7 }
	//  availability { resources { staff_id: "2" staff_name: "John" }
	//                 spots_total: 5 spots_open: 2 }
	// (optional)
	Resources *Resources `protobuf:"bytes,8,opt,name=resources,proto3" json:"resources,omitempty"`
	// A list of IDs referencing the payment options which can be used to pay
	// for this slot. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants.
	//
	// This field overrides any payment_option_ids specified in the service
	// message. Similarly payment_option_ids specified here do NOT have to be
	// present in the service message, though must be defined at the
	// Merchant level.
	// Our current implementation limits the number of entries in this array to
	// one element. Multiple payment_option_id are still allowed at the Service
	// level, but an override at the availability slot level, is limited to a
	// single payment_option_id. (optional)
	PaymentOptionId []string `protobuf:"bytes,9,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// The recurrence information for the availability, representing more than one
	// start time. A recurrence should contain appointments for one working day.
	// (optional)
	Recurrence *Availability_Recurrence `protobuf:"bytes,10,opt,name=recurrence,proto3" json:"recurrence,omitempty"`
	// Times when this service cannot be scheduled. To limit the number of
	// schedule_exception messages, consider joining adjacent exceptions.
	// (optional)
	ScheduleException []*Availability_ScheduleException `protobuf:"bytes,11,rep,name=schedule_exception,json=scheduleException,proto3" json:"schedule_exception,omitempty"`
	// Defines how a deposit may be charged to the user. Overrides the service
	// deposit if one was specified. Setting this to an empty Deposit message
	// removes any service-level deposit. (optional)
	Deposit *Deposit `protobuf:"bytes,12,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Overrides the
	// service no show fee if one was specified. Setting this to an empty
	// NoShowFee message removes any service-level no show fee. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,13,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// availability slot.
	// If the value is not set, it is inherited from the service level if it's set
	// there. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,14,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// Indicates a list of supported ticket types for this availability slot. If
	// unset, all ticket types in the parent service are available for this slot.
	// Note that the values of this field must be defined in the parent service.
	// Examples:
	//
	// * Service with four ticket types:
	// TicketType {ticket_type_id: "adult_1" short_description: "Adult weekdays"}
	// TicketType {ticket_type_id: "adult_2" short_description: "Adult weekends"}
	// TicketType {ticket_type_id: "youth_1" short_description: "Youth weekdays"}
	// TicketType {ticket_type_id: "youth_2" short_description: "Youth weekends"}
	//
	// To represent the inventory during the weekdays:
	//   `availability {ticket_type_id: "adult_1" ticket_type_id: "youth_1"...}`.
	// To represent the inventory during the holidays:
	//   `availability {ticket_type_id: "adult_2" ticket_type_id: "youth_2"...}`.
	//
	// * Service with three ticket types:
	// TicketType {ticket_type_id: "adult" short_description: "Adult"}
	// TicketType {ticket_type_id: "youth" short_description: "Youth"}
	// TicketType {ticket_type_id: "senior" short_description: "Senior"}
	//
	// To indicate that all three ticket types are available for this time
	// slot, use either
	//   `availability {ticket_type_id: "adult" ticket_type_id: "youth"
	//   ticket_type_id: "senior" ...}`
	// or
	//   `availability {...}' (do not set ticket_type_id in this slot).
	//
	//  (optional)
	TicketTypeId []string `protobuf:"bytes,15,rep,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// Availability scheduling rules. If fields are populated, they will override
	// any corresponding scheduling rules on the service-level SchedulingRules.
	SchedulingRuleOverrides *Availability_SchedulingRuleOverrides `protobuf:"bytes,16,opt,name=scheduling_rule_overrides,json=schedulingRuleOverrides,proto3" json:"scheduling_rule_overrides,omitempty"`
	// The confirmation mode that will be used when booking this availability.
	// Attempts to create bookings for availabilities with a confirmation mode
	// of CONFIRMATION_MODE_SYNCHRONOUS must be immediatlely confirmed or denied.
	// Attempts to create bookings for availabilities with confirmation mode
	// of CONFIRMATION_MODE_ASYNCHRONOUS must be either immediately denied
	// or created with status PENDING.
	ConfirmationMode     Availability_ConfirmationMode `protobuf:"varint,17,opt,name=confirmation_mode,json=confirmationMode,proto3,enum=maps.booking.feeds.Availability_ConfirmationMode" json:"confirmation_mode,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                      `json:"-"`
	XXX_unrecognized     []byte                        `json:"-"`
	XXX_sizecache        int32                         `json:"-"`
}

func (m *Availability) Reset()         { *m = Availability{} }
func (m *Availability) String() string { return proto.CompactTextString(m) }
func (*Availability) ProtoMessage()    {}
func (*Availability) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3}
}

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

var xxx_messageInfo_Availability proto.InternalMessageInfo

func (m *Availability) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

func (m *Availability) GetServiceId() string {
	if m != nil {
		return m.ServiceId
	}
	return ""
}

func (m *Availability) GetStartSec() int64 {
	if m != nil {
		return m.StartSec
	}
	return 0
}

func (m *Availability) GetDurationSec() int64 {
	if m != nil {
		return m.DurationSec
	}
	return 0
}

func (m *Availability) GetSpotsTotal() int64 {
	if m != nil {
		return m.SpotsTotal
	}
	return 0
}

func (m *Availability) GetSpotsOpen() int64 {
	if m != nil {
		return m.SpotsOpen
	}
	return 0
}

func (m *Availability) GetAvailabilityTag() string {
	if m != nil {
		return m.AvailabilityTag
	}
	return ""
}

func (m *Availability) GetResources() *Resources {
	if m != nil {
		return m.Resources
	}
	return nil
}

func (m *Availability) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Availability) GetRecurrence() *Availability_Recurrence {
	if m != nil {
		return m.Recurrence
	}
	return nil
}

func (m *Availability) GetScheduleException() []*Availability_ScheduleException {
	if m != nil {
		return m.ScheduleException
	}
	return nil
}

func (m *Availability) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Availability) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Availability) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Availability) GetTicketTypeId() []string {
	if m != nil {
		return m.TicketTypeId
	}
	return nil
}

func (m *Availability) GetSchedulingRuleOverrides() *Availability_SchedulingRuleOverrides {
	if m != nil {
		return m.SchedulingRuleOverrides
	}
	return nil
}

func (m *Availability) GetConfirmationMode() Availability_ConfirmationMode {
	if m != nil {
		return m.ConfirmationMode
	}
	return Availability_CONFIRMATION_MODE_UNSPECIFIED
}

// Recurrence messages are optional, but allow for a more compact
// representation of consistently repeating availability slots. They typically
// represent a day's working schedule.
// ScheduleException messages are then used to represent booked/unavailable
// time ranges within the work day.
//
// Requirements:
//   1. The expansion of availability slots or recurrences must NOT create
//      identical slots. If the ids, start_sec, duration_sec, and resources
//      match, slots are considered identical.
//   2. Do NOT mix the standard availability format and recurrence within the
//      slots of a single service. Recurrence benefits merchants/services that
//      offer appointments. The standard format is geared towards
//      merchants/services with regularly scheduled classes.
//   3. Recurrences should not last for more than 24 hours.
type Availability_Recurrence struct {
	// The inclusive maximum UTC timestamp the availability repeats until.
	// (required)
	RepeatUntilSec int64 `protobuf:"varint,1,opt,name=repeat_until_sec,json=repeatUntilSec,proto3" json:"repeat_until_sec,omitempty"`
	// Defines the time between successive availability slots.
	//
	// Example: An availability with a duration of 20 min, a repeat_every_sec of
	// 30 min, a start_sec of 9:00am, and a repeat_until_sec of 11:00am will
	// yield slots at 9-9:20am, 9:30-9:50am, 10-10:20am, 10:30-10:50am,
	// 11-11:20am. (required)
	RepeatEverySec       int32    `protobuf:"varint,2,opt,name=repeat_every_sec,json=repeatEverySec,proto3" json:"repeat_every_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_Availability_Recurrence proto.InternalMessageInfo

func (m *Availability_Recurrence) GetRepeatUntilSec() int64 {
	if m != nil {
		return m.RepeatUntilSec
	}
	return 0
}

func (m *Availability_Recurrence) GetRepeatEverySec() int32 {
	if m != nil {
		return m.RepeatEverySec
	}
	return 0
}

// ScheduleException messages represent booked/unavailable time ranges within
// the workday, which are exceptions to the recurrence described above. As
// time slots are booked, the list of exceptions should be updated to reflect
// the newly unavailable time ranges. The recurrence itself shouldn't be
// modified.
type Availability_ScheduleException struct {
	// The time range of the exception. Any slots described by the recurrence
	// which overlap this closed-open time range will be considered unavailable.
	//
	// Example: If the recurrence specifies a duration of 20 min, a
	// repeat_every_sec of 30 min, a start_time of 9:00am, and a
	// repeat_until_sec of 11:00am, then a ScheduleException with a time_range
	// of 9:45am-11:00am would make unavailable the slots at 9:30-9:50am,
	// 10-10:20am, and 10:30-10:50am.
	//
	// Note that because the time range is closed-open, the slot beginning at
	// 11am slot would not be impacted.
	TimeRange            *TimeRange `protobuf:"bytes,1,opt,name=time_range,json=timeRange,proto3" json:"time_range,omitempty"`
	XXX_NoUnkeyedLiteral struct{}   `json:"-"`
	XXX_unrecognized     []byte     `json:"-"`
	XXX_sizecache        int32      `json:"-"`
}

func (m *Availability_ScheduleException) Reset()         { *m = Availability_ScheduleException{} }
func (m *Availability_ScheduleException) String() string { return proto.CompactTextString(m) }
func (*Availability_ScheduleException) ProtoMessage()    {}
func (*Availability_ScheduleException) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 1}
}

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

var xxx_messageInfo_Availability_ScheduleException proto.InternalMessageInfo

func (m *Availability_ScheduleException) GetTimeRange() *TimeRange {
	if m != nil {
		return m.TimeRange
	}
	return nil
}

// Availability level scheduling rules.
type Availability_SchedulingRuleOverrides struct {
	// The last time (in seconds) that this slot is able to be booked. This
	// timestamp must be before the start_sec of the slot to be respected
	// (if users should be able to book after the start time, use service level
	// SchedulingRules.min_booking_before_end_time). If present, will override
	// anything specified in the min_booking_buffer of the corresponding
	// Service's SchedulingRules.
	LastBookableSec      int64    `protobuf:"varint,1,opt,name=last_bookable_sec,json=lastBookableSec,proto3" json:"last_bookable_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Availability_SchedulingRuleOverrides) Reset()         { *m = Availability_SchedulingRuleOverrides{} }
func (m *Availability_SchedulingRuleOverrides) String() string { return proto.CompactTextString(m) }
func (*Availability_SchedulingRuleOverrides) ProtoMessage()    {}
func (*Availability_SchedulingRuleOverrides) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{3, 2}
}

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

var xxx_messageInfo_Availability_SchedulingRuleOverrides proto.InternalMessageInfo

func (m *Availability_SchedulingRuleOverrides) GetLastBookableSec() int64 {
	if m != nil {
		return m.LastBookableSec
	}
	return 0
}

// A resource is used to disambiguate availability slots from one another when
// different staff, room or party_size values are part of the service.
// Multiple slots for the same service and time interval can co-exist when they
// have different resources.
type Resources struct {
	// Optional id for a staff member providing the service. This field identifies
	// the staff member across all merchants, services, and availability records.
	// It also needs to be stable over time to allow correlation with past
	// bookings.
	// This field must be present if staff_name is present.
	StaffId string `protobuf:"bytes,1,opt,name=staff_id,json=staffId,proto3" json:"staff_id,omitempty"`
	// Optional name of a staff member providing the service. This field will be
	// displayed to users making a booking, and should be human readable, as
	// opposed to an opaque identifier.
	// This field must be present if staff_id is present.
	StaffName string `protobuf:"bytes,2,opt,name=staff_name,json=staffName,proto3" json:"staff_name,omitempty"`
	// An optional id for the room the service is located in. This field
	// identifies the room across all merchants, services, and availability
	// records. It also needs to be stable over time to allow correlation with
	// past bookings.
	// This field must be present if room_name is present.
	RoomId string `protobuf:"bytes,3,opt,name=room_id,json=roomId,proto3" json:"room_id,omitempty"`
	// An optional name for the room the service is located in. This
	// field will be displayed to users making a booking, and should be human
	// readable, as opposed to an opaque identifier.
	// This field must be present if room_id is present.
	RoomName string `protobuf:"bytes,4,opt,name=room_name,json=roomName,proto3" json:"room_name,omitempty"`
	// Applicable only for Dining: The party size which can be accommodated
	// during this time slot. A restaurant can be associated with multiple Slots
	// for the same time, each specifying a different party_size, if for instance
	// 2, 3, or 4 people can be seated with a reservation.
	PartySize            int32    `protobuf:"varint,5,opt,name=party_size,json=partySize,proto3" json:"party_size,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Resources) Reset()         { *m = Resources{} }
func (m *Resources) String() string { return proto.CompactTextString(m) }
func (*Resources) ProtoMessage()    {}
func (*Resources) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{4}
}

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

var xxx_messageInfo_Resources proto.InternalMessageInfo

func (m *Resources) GetStaffId() string {
	if m != nil {
		return m.StaffId
	}
	return ""
}

func (m *Resources) GetStaffName() string {
	if m != nil {
		return m.StaffName
	}
	return ""
}

func (m *Resources) GetRoomId() string {
	if m != nil {
		return m.RoomId
	}
	return ""
}

func (m *Resources) GetRoomName() string {
	if m != nil {
		return m.RoomName
	}
	return ""
}

func (m *Resources) GetPartySize() int32 {
	if m != nil {
		return m.PartySize
	}
	return 0
}

type TimeRange struct {
	BeginSec             int64    `protobuf:"varint,1,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
	EndSec               int64    `protobuf:"varint,2,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TimeRange) Reset()         { *m = TimeRange{} }
func (m *TimeRange) String() string { return proto.CompactTextString(m) }
func (*TimeRange) ProtoMessage()    {}
func (*TimeRange) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{5}
}

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

var xxx_messageInfo_TimeRange proto.InternalMessageInfo

func (m *TimeRange) GetBeginSec() int64 {
	if m != nil {
		return m.BeginSec
	}
	return 0
}

func (m *TimeRange) GetEndSec() int64 {
	if m != nil {
		return m.EndSec
	}
	return 0
}

type ServiceFeed struct {
	Metadata             *FeedMetadata `protobuf:"bytes,1,opt,name=metadata,proto3" json:"metadata,omitempty"`
	Service              []*Service    `protobuf:"bytes,2,rep,name=service,proto3" json:"service,omitempty"`
	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
	XXX_unrecognized     []byte        `json:"-"`
	XXX_sizecache        int32         `json:"-"`
}

func (m *ServiceFeed) Reset()         { *m = ServiceFeed{} }
func (m *ServiceFeed) String() string { return proto.CompactTextString(m) }
func (*ServiceFeed) ProtoMessage()    {}
func (*ServiceFeed) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{6}
}

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

var xxx_messageInfo_ServiceFeed proto.InternalMessageInfo

func (m *ServiceFeed) GetMetadata() *FeedMetadata {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func (m *ServiceFeed) GetService() []*Service {
	if m != nil {
		return m.Service
	}
	return nil
}

// The definition of a service provided by a merchant.
type Service struct {
	// An opaque string from an aggregator partner which uniquely identifies a
	// merchant. (required)
	MerchantId string `protobuf:"bytes,1,opt,name=merchant_id,json=merchantId,proto3" json:"merchant_id,omitempty"`
	// An opaque string from an aggregator partner which uniquely identifies the
	// service. (required)
	ServiceId string `protobuf:"bytes,2,opt,name=service_id,json=serviceId,proto3" json:"service_id,omitempty"`
	// The name of the service, suitable for display to users, e.g. "Men's
	// haircut". (required)
	Name string `protobuf:"bytes,3,opt,name=name,proto3" json:"name,omitempty"`
	// The description of the service, suitable for display to users.
	//
	// This field now supports both plain text and HTML-like formatting rules to
	// display structural contents to end-users. Unlike plain text sections,
	// customized layouts can be created here using headings, paragraphs, lists
	// and some phrase tags. Please read the following instructions and notes
	// carefully to create better user-experience.
	//
	// Supported HTML-like formatting tags:
	//
	// Heading tags: <h1>, <h2>, <h3>, <h4>, <h5>, <h6>
	//   Heading tags can be used to display titles and sub-titles. For example,
	//   <h1>Itinerary</h1> will display the inline text as the most important
	//   heading of the section. Note that any inner HTML tags, styles or
	//   attributes will be ignored. For example, <h1 style=".."> will be treated
	//   the same as <h1>. Only pure text wil be preserved.
	//
	// Paragraph tag: <p>:
	//   Paragraph tag can be used to wrap detailed introduction or contents. Any
	//   inner tags, styles or attributes will be ignored with a few exceptions:
	//   <br>, <strong> and <em>. Please see the phrase tag section below for more
	//   details.
	//
	// List tags: <ul>, <ol>, <li>
	//   <ul> tag can be used with <li> tag to display unordered lists, and <ol>
	//   tag can be used with <li> to display ordered lists. This is a good tool
	//   to display checklists, highlights or any other lists that fit your
	//   use-cases.
	// Example: To show a list of features of a cruise trip:
	//  <ol>
	//    <li>Wonderful ocean view and chances to play with wildlife.</li>
	//    <li>Carefully designed travel arrangements and services.</li>
	//    <li>Gauranteed lowest price.</li>
	// </ol>
	// Note that only <li> children under <ul> or <ol> tags will be converted. All
	// other children will be dropped. Also any inner tags, attributes and styles
	// will be ignored, only pure text contents are preserved.
	//
	// Division tag: <div>
	//   All supported inner tags of the <div> tag will be parsed with the rules
	//   stated above. But <div> tag itself does not mean any grouping or
	//   indenting here. Also any inner attributes and styles will be ignored.
	//
	// Phrase tags: <br>, <strong>, <em>:
	//   Only the three tags mentioned above are supported. <br> can be used to
	//   break lines in paragraphs, and <strong>/<em> can be used to highlight
	//   important text. Any other phrase tags will be ignored.
	//
	// Unsupported tags:
	//   * <html>, <header> and <body> tags are not allowed.
	//   * Any URLs, anchors, links will be striped, and will never be displayed
	//   to end-users. If you want to use photos to create a rich user experience,
	//   please use the "related_media" field below to send your photo urls
	//   * Any other tags not mentioned above are not supported (for example
	//   <table>, <td> ...).
	//
	// Important notes:
	//   * Try not to use other tags except for the supported ones mentioned
	//   above, because contents within unsupported tags will be excluded from UI
	//   rendering and may lead to undesired user experience.
	//   * Try avoid deep nested structures like more than 3 different heading
	//   levels or nested lists. Keeping the structure flat, simple and
	//   straightforward helps to create a better user experience.
	//   * If the currently supported layouts are not enough for your use cases,
	//   please contact Google with your requests and we will find the best
	//   approach for you.
	//
	// (required)
	Description string `protobuf:"bytes,4,opt,name=description,proto3" json:"description,omitempty"`
	// The price of the service. (optional, overridden when payment options or
	// ticket types present)
	Price *Price `protobuf:"bytes,5,opt,name=price,proto3" json:"price,omitempty"`
	// Rules to book/cancel an appointment. (optional)
	Rules *SchedulingRules `protobuf:"bytes,6,opt,name=rules,proto3" json:"rules,omitempty"`
	// Intake forms to customize the service. (optional)
	//
	// Deprecated. Please see intake_form and per_ticket_intake_form.
	Form []*ServiceIntakeForm `protobuf:"bytes,7,rep,name=form,proto3" json:"form,omitempty"` // Deprecated: Do not use.
	// A form requesting additional information from the user when they book this
	// service. (optional)
	IntakeForm *ServiceIntakeForm `protobuf:"bytes,20,opt,name=intake_form,json=intakeForm,proto3" json:"intake_form,omitempty"`
	// A form requesting additional information from the user when they book this
	// service. This form must be filled out once for each ticket the user is
	// booking. (optional)
	PerTicketIntakeForm *ServiceIntakeForm `protobuf:"bytes,21,opt,name=per_ticket_intake_form,json=perTicketIntakeForm,proto3" json:"per_ticket_intake_form,omitempty"`
	// Whether a prepayment is required, optional or not supported. (optional)
	PrepaymentType Service_PrepaymentType `protobuf:"varint,8,opt,name=prepayment_type,json=prepaymentType,proto3,enum=maps.booking.feeds.Service_PrepaymentType" json:"prepayment_type,omitempty"`
	// The service's tax rate. If present this field overrides any tax_rate set at
	// the merchant level. An empty message (i.e. tax_rate { }) will reset the
	// applied tax rate to zero. (optional)
	TaxRate *TaxRate `protobuf:"bytes,9,opt,name=tax_rate,json=taxRate,proto3" json:"tax_rate,omitempty"`
	// A list of ids referencing the payment options which can be used to pay
	// for this service. The actual payment options are defined at the Merchant
	// level, and can also be shared among multiple Merchants. (optional)
	PaymentOptionId []string `protobuf:"bytes,10,rep,name=payment_option_id,json=paymentOptionId,proto3" json:"payment_option_id,omitempty"`
	// Defines how a deposit may be charged to the user. Can be overridden at the
	// availability level. (optional)
	Deposit *Deposit `protobuf:"bytes,11,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Defines a no show fee that may be charged to the user. Can be overridden
	// at the availability level. (optional)
	NoShowFee *NoShowFee `protobuf:"bytes,12,opt,name=no_show_fee,json=noShowFee,proto3" json:"no_show_fee,omitempty"`
	// Indicates whether the user must provide a credit card in order to book this
	// service.
	// This value can be overridden at the availability level. (optional)
	RequireCreditCard RequireCreditCard `protobuf:"varint,13,opt,name=require_credit_card,json=requireCreditCard,proto3,enum=maps.booking.feeds.RequireCreditCard" json:"require_credit_card,omitempty"`
	// An action link related to this service.
	ActionLink []*ActionLink `protobuf:"bytes,14,rep,name=action_link,json=actionLink,proto3" json:"action_link,omitempty"`
	// The predefined type of this service. Currently, only used with action_link.
	Type Service_ServiceType `protobuf:"varint,15,opt,name=type,proto3,enum=maps.booking.feeds.Service_ServiceType" json:"type,omitempty"`
	// Types of tickets that can be booked/purchased for this service, if tickets
	// are supported. (optional)
	TicketType []*TicketType `protobuf:"bytes,16,rep,name=ticket_type,json=ticketType,proto3" json:"ticket_type,omitempty"`
	// Photos related to this service. Google will crawl these media to
	// ensure that they are displayed to end-users in the most efficient way.
	// (optional)
	RelatedMedia []*RelatedMedia `protobuf:"bytes,17,rep,name=related_media,json=relatedMedia,proto3" json:"related_media,omitempty"`
	// Service attribute values that apply to this service (optional).
	// Each Service may have zero or more values for each service attribute
	// defined in the corresponding Merchant.
	ServiceAttributeValueId []*ServiceAttributeValueId `protobuf:"bytes,18,rep,name=service_attribute_value_id,json=serviceAttributeValueId,proto3" json:"service_attribute_value_id,omitempty"`
	// Rules related to joining the waitlist. Should be populated if the service
	// and merchant support waitlist functionality. Should not be populated
	// otherwise.
	WaitlistRules        *WaitlistRules `protobuf:"bytes,19,opt,name=waitlist_rules,json=waitlistRules,proto3" json:"waitlist_rules,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_7aa923a38d4cd9d3, []int{7}
}

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) GetMerchantId() string {
	if m != nil {
		return m.MerchantId
	}
	return ""
}

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

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

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

func (m *Service) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *Service) GetRules() *SchedulingRules {
	if m != nil {
		return m.Rules
	}
	return nil
}

// Deprecated: Do not use.
func (m *Service) GetForm() []*ServiceIntakeForm {
	if m != nil {
		return m.Form
	}
	return nil
}

func (m *Service) GetIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.IntakeForm
	}
	return nil
}

func (m *Service) GetPerTicketIntakeForm() *ServiceIntakeForm {
	if m != nil {
		return m.PerTicketIntakeForm
	}
	return nil
}

func (m *Service) GetPrepaymentType() Service_PrepaymentType {
	if m != nil {
		return m.PrepaymentType
	}
	return Service_PREPAYMENT_TYPE_UNSPECIFIED
}

func (m *Service) GetTaxRate() *TaxRate {
	if m != nil {
		return m.TaxRate
	}
	return nil
}

func (m *Service) GetPaymentOptionId() []string {
	if m != nil {
		return m.PaymentOptionId
	}
	return nil
}

func (m *Service) GetDeposit() *Deposit {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Service) GetNoShowFee() *NoShowFee {
	if m != nil {
		return m.NoShowFee
	}
	return nil
}

func (m *Service) GetRequireCreditCard() RequireCreditCard {
	if m != nil {
		return m.RequireCreditCard
	}
	return RequireCreditCard_REQUIRE_CREDIT_CARD_UNSPECIFIED
}

func (m *Service) GetActionLink() []*ActionLink {
	if m != nil {
		return m.ActionLink
	}
	return nil
}

func (m *Service) GetType() Service_ServiceType {
	if m != nil {
		return m.Type
	}
	return Service_SERVICE_TYPE_UNSPECIFIED
}

func (m *Service) GetTicketType() []*TicketType {
	if m != nil {
		return m.TicketType
	}
	return nil
}

func (m *Service) GetRelatedMedia() []*RelatedMedia {
	if m != nil {
		return m.RelatedMedia
	}
	return nil
}

func (m *Service) GetServiceAttributeValueId() []*ServiceAttributeValueId {
	if m != nil {
		return m.ServiceAttributeValueId
	}
	return nil
}

func (m *Service) GetWaitlistRules() *WaitlistRules {
	if m != nil {
		return m.WaitlistRules
	}
	return nil
}

// The price of a service or a fee.
type Price struct {
	// The price in micro-units of the currency.
	// Fractions of smallest currency unit will be rounded using nearest even
	// rounding. (e.g. For USD 2.5 cents rounded to 2 cents, 3.5 cents rounded to
	// 4 cents, 0.5 cents rounded to 0 cents, 2.51 cents rounded to 3 cents).
	// (required)
	PriceMicros int64 `protobuf:"varint,1,opt,name=price_micros,json=priceMicros,proto3" json:"price_micros,omitempty"`
	// The currency of the price that is defined in ISO 4217. (required)
	CurrencyCode string `protobuf:"bytes,2,opt,name=currency_code,json=currencyCode,proto3" json:"currency_code,omitempty"`
	// An optional and opaque string that identifies the pricing option that is
	// associated with the extended price. (optional)
	PricingOptionTag     string   `protobuf:"bytes,3,opt,name=pricing_option_tag,json=pricingOptionTag,proto3" json:"pricing_option_tag,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Price) Reset()         { *m = Price{} }
func (m *Price) String() string { return proto.CompactTextString(m) }
func (*Price) ProtoMessage()    {}
func (*Price) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{8}
}

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

var xxx_messageInfo_Price proto.InternalMessageInfo

func (m *Price) GetPriceMicros() int64 {
	if m != nil {
		return m.PriceMicros
	}
	return 0
}

func (m *Price) GetCurrencyCode() string {
	if m != nil {
		return m.CurrencyCode
	}
	return ""
}

func (m *Price) GetPricingOptionTag() string {
	if m != nil {
		return m.PricingOptionTag
	}
	return ""
}

// The scheduling rules for a service.
type SchedulingRules struct {
	// The duration (in seconds) from when the last booking can be made to
	// when the availability slot starts or ends.
	//
	// If "min_advance_booking" is set, the last bookable time is calculated as
	// (<slot start time> - "min_advance_booking").
	// If "min_booking_buffer_before_end_time" is set, the last bookable time is
	// calculated as (<slot end time> - "min_booking_buffer_before_end_time").
	// Note that the value of "min_booking_buffer_before_end_time" must be
	// positive if set.
	// If both are unset, the slot is bookable until the slot begin time.
	//
	// Examples:
	//  * A haircut that needs to be booked at least 1 hour before the start time.
	//      'scheduling_rules{ min_advance_booking: 3600 ...}`
	//
	//  * A museum where the last ticket can be purchased 30 mins before closing:
	//     'scheduling_rules{ min_booking_buffer_before_end_time: 1800 ...}'
	//
	//  * A movie ticket that needs to be purchased before the start time.
	//        'scheduling_rules{ ...}' (leave this field empty)
	// (optional)
	//
	// Types that are valid to be assigned to MinBookingBuffer:
	//	*SchedulingRules_MinAdvanceBooking
	//	*SchedulingRules_MinBookingBufferBeforeEndTime
	MinBookingBuffer isSchedulingRules_MinBookingBuffer `protobuf_oneof:"min_booking_buffer"`
	// The minimum advance notice in seconds required to cancel a booked
	// appointment online. (optional)
	MinAdvanceOnlineCanceling int64 `protobuf:"varint,2,opt,name=min_advance_online_canceling,json=minAdvanceOnlineCanceling,proto3" json:"min_advance_online_canceling,omitempty"`
	// The fee for canceling within the minimum advance notice period.
	LateCancellationFee *Price `protobuf:"bytes,3,opt,name=late_cancellation_fee,json=lateCancellationFee,proto3" json:"late_cancellation_fee,omitempty"` // Deprecated: Do not use.
	// The fee for no-show without canceling.
	NoshowFee *Price `protobuf:"bytes,4,opt,name=noshow_fee,json=noshowFee,proto3" json:"noshow_fee,omitempty"` // Deprecated: Do not use.
	// The admission policy that applied to this service. If unset, defaults to
	// TIME_STRICT. (optional)
	AdmissionPolicy      SchedulingRules_AdmissionPolicy `protobuf:"varint,5,opt,name=admission_policy,json=admissionPolicy,proto3,enum=maps.booking.feeds.SchedulingRules_AdmissionPolicy" json:"admission_policy,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                        `json:"-"`
	XXX_unrecognized     []byte                          `json:"-"`
	XXX_sizecache        int32                           `json:"-"`
}

func (m *SchedulingRules) Reset()         { *m = SchedulingRules{} }
func (m *SchedulingRules) String() string { return proto.CompactTextString(m) }
func (*SchedulingRules) ProtoMessage()    {}
func (*SchedulingRules) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{9}
}

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

var xxx_messageInfo_SchedulingRules proto.InternalMessageInfo

type isSchedulingRules_MinBookingBuffer interface {
	isSchedulingRules_MinBookingBuffer()
}

type SchedulingRules_MinAdvanceBooking struct {
	MinAdvanceBooking int64 `protobuf:"varint,1,opt,name=min_advance_booking,json=minAdvanceBooking,proto3,oneof"`
}

type SchedulingRules_MinBookingBufferBeforeEndTime struct {
	MinBookingBufferBeforeEndTime int64 `protobuf:"varint,6,opt,name=min_booking_buffer_before_end_time,json=minBookingBufferBeforeEndTime,proto3,oneof"`
}

func (*SchedulingRules_MinAdvanceBooking) isSchedulingRules_MinBookingBuffer() {}

func (*SchedulingRules_MinBookingBufferBeforeEndTime) isSchedulingRules_MinBookingBuffer() {}

func (m *SchedulingRules) GetMinBookingBuffer() isSchedulingRules_MinBookingBuffer {
	if m != nil {
		return m.MinBookingBuffer
	}
	return nil
}

func (m *SchedulingRules) GetMinAdvanceBooking() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinAdvanceBooking); ok {
		return x.MinAdvanceBooking
	}
	return 0
}

func (m *SchedulingRules) GetMinBookingBufferBeforeEndTime() int64 {
	if x, ok := m.GetMinBookingBuffer().(*SchedulingRules_MinBookingBufferBeforeEndTime); ok {
		return x.MinBookingBufferBeforeEndTime
	}
	return 0
}

func (m *SchedulingRules) GetMinAdvanceOnlineCanceling() int64 {
	if m != nil {
		return m.MinAdvanceOnlineCanceling
	}
	return 0
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetLateCancellationFee() *Price {
	if m != nil {
		return m.LateCancellationFee
	}
	return nil
}

// Deprecated: Do not use.
func (m *SchedulingRules) GetNoshowFee() *Price {
	if m != nil {
		return m.NoshowFee
	}
	return nil
}

func (m *SchedulingRules) GetAdmissionPolicy() SchedulingRules_AdmissionPolicy {
	if m != nil {
		return m.AdmissionPolicy
	}
	return SchedulingRules_ADMISSION_POLICY_UNSPECIFIED
}

// XXX_OneofWrappers is for the internal use of the proto package.
func (*SchedulingRules) XXX_OneofWrappers() []interface{} {
	return []interface{}{
		(*SchedulingRules_MinAdvanceBooking)(nil),
		(*SchedulingRules_MinBookingBufferBeforeEndTime)(nil),
	}
}

// A tax rate applied when charging the user for a service, and which can be set
// on either a per merchant, or per service basis.
type TaxRate struct {
	// A tax rate in millionths of one percent, effectively giving 6 decimals of
	// precision. For example, if the tax rate is 7.253%, this field should be set
	// to 7253000.
	//
	// If this field is left unset or set to 0, the total price charged to a user
	// for any service provided by this merchant is the exact price specified by
	// Service.price. The service price is assumed to be exempt from or already
	// inclusive of applicable taxes. Taxes will not be shown to the user as a
	// separate line item.
	//
	// If this field is set to any nonzero value, the total price charged to a
	// user for any service provided by this merchant will include the service
	// price plus the tax assessed using the tax rate provided here. Fractions of
	// the smallest currency unit (for example, fractions of one cent) will be
	// rounded using nearest even rounding. Taxes will be shown to the user as a
	// separate line item. (required)
	MicroPercent         int32    `protobuf:"varint,1,opt,name=micro_percent,json=microPercent,proto3" json:"micro_percent,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TaxRate) Reset()         { *m = TaxRate{} }
func (m *TaxRate) String() string { return proto.CompactTextString(m) }
func (*TaxRate) ProtoMessage()    {}
func (*TaxRate) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{10}
}

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

var xxx_messageInfo_TaxRate proto.InternalMessageInfo

func (m *TaxRate) GetMicroPercent() int32 {
	if m != nil {
		return m.MicroPercent
	}
	return 0
}

// Defines a field that is included in a ServiceIntakeForm.
type ServiceIntakeFormField struct {
	// A string from an aggregator partner which uniquely identifies a form field.
	// This id should be the same as the id in the corresponding form field
	// answer. (required)
	Id string `protobuf:"bytes,5,opt,name=id,proto3" json:"id,omitempty"`
	// The type of this field. (required)
	Type ServiceIntakeFormField_FieldType `protobuf:"varint,1,opt,name=type,proto3,enum=maps.booking.feeds.ServiceIntakeFormField_FieldType" json:"type,omitempty"`
	// The text shown to the user for this field. (required)
	Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
	// For MULTIPLE_CHOICE, CHECKBOXES, or DROPDOWN, the values to enumerate.
	// (optional)
	Value []string `protobuf:"bytes,3,rep,name=value,proto3" json:"value,omitempty"`
	// Indicates whether an answer to this field is required by a user. (optional)
	IsRequired           bool     `protobuf:"varint,4,opt,name=is_required,json=isRequired,proto3" json:"is_required,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceIntakeFormField) Reset()         { *m = ServiceIntakeFormField{} }
func (m *ServiceIntakeFormField) String() string { return proto.CompactTextString(m) }
func (*ServiceIntakeFormField) ProtoMessage()    {}
func (*ServiceIntakeFormField) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{11}
}

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

var xxx_messageInfo_ServiceIntakeFormField proto.InternalMessageInfo

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

func (m *ServiceIntakeFormField) GetType() ServiceIntakeFormField_FieldType {
	if m != nil {
		return m.Type
	}
	return ServiceIntakeFormField_FIELD_TYPE_UNSPECIFIED
}

func (m *ServiceIntakeFormField) GetLabel() string {
	if m != nil {
		return m.Label
	}
	return ""
}

func (m *ServiceIntakeFormField) GetValue() []string {
	if m != nil {
		return m.Value
	}
	return nil
}

func (m *ServiceIntakeFormField) GetIsRequired() bool {
	if m != nil {
		return m.IsRequired
	}
	return false
}

// Defines an intake form that customizes the service provided by a merchant.
type ServiceIntakeForm struct {
	// Fields that will be displayed to the user. (required)
	Field []*ServiceIntakeFormField `protobuf:"bytes,1,rep,name=field,proto3" json:"field,omitempty"`
	// If true, this form will be shown to first time customers.
	// Deprecated. This functionality is not supported for intake forms.
	FirstTimeCustomers bool `protobuf:"varint,2,opt,name=first_time_customers,json=firstTimeCustomers,proto3" json:"first_time_customers,omitempty"` // Deprecated: Do not use.
	// If true, this form will be shown to repeat customers.
	// Deprecated. This functionality is not supported for intake forms.
	ReturningCustomers   bool     `protobuf:"varint,3,opt,name=returning_customers,json=returningCustomers,proto3" json:"returning_customers,omitempty"` // Deprecated: Do not use.
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceIntakeForm) Reset()         { *m = ServiceIntakeForm{} }
func (m *ServiceIntakeForm) String() string { return proto.CompactTextString(m) }
func (*ServiceIntakeForm) ProtoMessage()    {}
func (*ServiceIntakeForm) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{12}
}

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

var xxx_messageInfo_ServiceIntakeForm proto.InternalMessageInfo

func (m *ServiceIntakeForm) GetField() []*ServiceIntakeFormField {
	if m != nil {
		return m.Field
	}
	return nil
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetFirstTimeCustomers() bool {
	if m != nil {
		return m.FirstTimeCustomers
	}
	return false
}

// Deprecated: Do not use.
func (m *ServiceIntakeForm) GetReturningCustomers() bool {
	if m != nil {
		return m.ReturningCustomers
	}
	return false
}

// A deposit that the user may be charged or have a hold on their credit card
// for.
type Deposit struct {
	// Deposit amount.
	Deposit *Price `protobuf:"bytes,1,opt,name=deposit,proto3" json:"deposit,omitempty"`
	// Minimum advance cancellation for the deposit.
	MinAdvanceCancellationSec int64 `protobuf:"varint,2,opt,name=min_advance_cancellation_sec,json=minAdvanceCancellationSec,proto3" json:"min_advance_cancellation_sec,omitempty"`
	// Defines how the deposit is determined from the availability.
	DepositType          PriceType `protobuf:"varint,3,opt,name=deposit_type,json=depositType,proto3,enum=maps.booking.feeds.PriceType" json:"deposit_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *Deposit) Reset()         { *m = Deposit{} }
func (m *Deposit) String() string { return proto.CompactTextString(m) }
func (*Deposit) ProtoMessage()    {}
func (*Deposit) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{13}
}

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

var xxx_messageInfo_Deposit proto.InternalMessageInfo

func (m *Deposit) GetDeposit() *Price {
	if m != nil {
		return m.Deposit
	}
	return nil
}

func (m *Deposit) GetMinAdvanceCancellationSec() int64 {
	if m != nil {
		return m.MinAdvanceCancellationSec
	}
	return 0
}

func (m *Deposit) GetDepositType() PriceType {
	if m != nil {
		return m.DepositType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// A fee that a user may be charged if they have made a booking but do not
// show up.
type NoShowFee struct {
	// The amount the user may be charged if they do not show up for their
	// reservation.
	Fee *Price `protobuf:"bytes,1,opt,name=fee,proto3" json:"fee,omitempty"`
	// Defines how the fee is determined from the availability.
	FeeType              PriceType `protobuf:"varint,3,opt,name=fee_type,json=feeType,proto3,enum=maps.booking.feeds.PriceType" json:"fee_type,omitempty"`
	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
	XXX_unrecognized     []byte    `json:"-"`
	XXX_sizecache        int32     `json:"-"`
}

func (m *NoShowFee) Reset()         { *m = NoShowFee{} }
func (m *NoShowFee) String() string { return proto.CompactTextString(m) }
func (*NoShowFee) ProtoMessage()    {}
func (*NoShowFee) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{14}
}

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

var xxx_messageInfo_NoShowFee proto.InternalMessageInfo

func (m *NoShowFee) GetFee() *Price {
	if m != nil {
		return m.Fee
	}
	return nil
}

func (m *NoShowFee) GetFeeType() PriceType {
	if m != nil {
		return m.FeeType
	}
	return PriceType_FIXED_RATE_DEFAULT
}

// An action URL with associated language, list of countries restricted to, and
// optional platform that indicates which platform this action should be
// performed on.
type ActionLink struct {
	// The entry point URL for this action link.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// The BCP-47 language tag identifying the language in which the content
	// from this URI is available.
	Language string `protobuf:"bytes,2,opt,name=language,proto3" json:"language,omitempty"`
	// ISO 3166-1 alpha-2 country code. Leave empty for unrestricted visibility.
	RestrictedCountry []string `protobuf:"bytes,3,rep,name=restricted_country,json=restrictedCountry,proto3" json:"restricted_country,omitempty"`
	// The platform that this action should be performed on. If this field is
	// unset, ACTION_PLATFORM_WEB_APPLICATION will be used as fallback.
	Platform             ActionPlatform `protobuf:"varint,4,opt,name=platform,proto3,enum=maps.booking.feeds.ActionPlatform" json:"platform,omitempty"`
	XXX_NoUnkeyedLiteral struct{}       `json:"-"`
	XXX_unrecognized     []byte         `json:"-"`
	XXX_sizecache        int32          `json:"-"`
}

func (m *ActionLink) Reset()         { *m = ActionLink{} }
func (m *ActionLink) String() string { return proto.CompactTextString(m) }
func (*ActionLink) ProtoMessage()    {}
func (*ActionLink) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{15}
}

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

var xxx_messageInfo_ActionLink proto.InternalMessageInfo

func (m *ActionLink) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *ActionLink) GetLanguage() string {
	if m != nil {
		return m.Language
	}
	return ""
}

func (m *ActionLink) GetRestrictedCountry() []string {
	if m != nil {
		return m.RestrictedCountry
	}
	return nil
}

func (m *ActionLink) GetPlatform() ActionPlatform {
	if m != nil {
		return m.Platform
	}
	return ActionPlatform_ACTION_PLATFORM_UNSPECIFIED
}

// TicketType is used to differentiate among tickets with different prices
// and/or availabilities due to different user types, different
// service attributes, or different options/add-ons.
//
// A ticket is the minimal bookable unit to a service, e.g. a spot on a rafting
// trip, an admission to a museum, a full day double kayak rental.
type TicketType struct {
	// The ticket id is used to differentiate among different ticket types of the
	// same service, and is only expected to be unique within a service.
	TicketTypeId string `protobuf:"bytes,1,opt,name=ticket_type_id,json=ticketTypeId,proto3" json:"ticket_type_id,omitempty"`
	// A short description to this TicketType.
	//
	// This can be user visible, e.g., “adult”, "child", “veteran”, “Row J”, etc.
	// Required, each ticket type should have a description to be user visible.
	ShortDescription string `protobuf:"bytes,2,opt,name=short_description,json=shortDescription,proto3" json:"short_description,omitempty"`
	// The price of a single ticket of this type, exclusive of any taxes. The tax
	// rate of Service is applied to its tickets.
	Price *Price `protobuf:"bytes,3,opt,name=price,proto3" json:"price,omitempty"`
	// Description of any additional option which this ticket type represents, if
	// any.
	//
	// This is useful when the ticket type represents multiple dimensions.
	//
	// Example 1: an admission ticket with different types 'adult', 'child' and
	// language as an additional option, the expected TicketType list would be:
	//     - { ticket_type_id: "ticket_type_1" short_description: "adult"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "adult"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "child"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "child"
	//         option_description: "spanish" }
	//
	// Example 2: an multi-hour kayak rental with optional dry bag add-on, the
	// short_description could be "3 hours" and the option_description could be
	// either "with dry bag" or "without dry bag":
	//     - { ticket_type_id: "ticket_type_1" short_description: "2 hours"
	//         option_description: "english" }
	//     - { ticket_type_id: "ticket_type_2" short_description: "3 hours"
	//         option_description: "spanish" }
	//     - { ticket_type_id: "ticket_type_3" short_description: "2 hours"
	//          option_description: "english" }
	//     - { ticket_type_id: "ticket_type_4" short_description: "3 hours"
	//          option_description: "spanish" }
	//
	// Optional, but if any ticket type within the service has this field set, we
	// expect all other ticket types to have this field set as well (a default
	// option_description could be used). E.g.
	// [{ticket_type_1, adult, english}, {ticket_type_1, adult, ''}] is not a
	// valid list.
	OptionDescription    string   `protobuf:"bytes,4,opt,name=option_description,json=optionDescription,proto3" json:"option_description,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *TicketType) Reset()         { *m = TicketType{} }
func (m *TicketType) String() string { return proto.CompactTextString(m) }
func (*TicketType) ProtoMessage()    {}
func (*TicketType) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{16}
}

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

var xxx_messageInfo_TicketType proto.InternalMessageInfo

func (m *TicketType) GetTicketTypeId() string {
	if m != nil {
		return m.TicketTypeId
	}
	return ""
}

func (m *TicketType) GetShortDescription() string {
	if m != nil {
		return m.ShortDescription
	}
	return ""
}

func (m *TicketType) GetPrice() *Price {
	if m != nil {
		return m.Price
	}
	return nil
}

func (m *TicketType) GetOptionDescription() string {
	if m != nil {
		return m.OptionDescription
	}
	return ""
}

// Defines a media source. This field only contains the URL of this media source
// (only photos are supported for now). Google will crawl the media data to
// ensure that they are displayed to end-users in the most efficient way.
type RelatedMedia struct {
	// URL of this media source. Google will crawl the media hosted at this URL.
	Url string `protobuf:"bytes,1,opt,name=url,proto3" json:"url,omitempty"`
	// Type of this media source.
	Type RelatedMedia_MediaType `protobuf:"varint,2,opt,name=type,proto3,enum=maps.booking.feeds.RelatedMedia_MediaType" json:"type,omitempty"`
	// Caption of the media, only plain text is supported. Any HTML components
	// will be stripped. (optional)
	Caption string `protobuf:"bytes,3,opt,name=caption,proto3" json:"caption,omitempty"`
	// Attribution information about the source of the media. Note that if
	// the attribution is required to display with the media to give credit to
	// photographer or agency, this field must be set. (optional)
	Attribution          *RelatedMedia_Attribution `protobuf:"bytes,4,opt,name=attribution,proto3" json:"attribution,omitempty"`
	XXX_NoUnkeyedLiteral struct{}                  `json:"-"`
	XXX_unrecognized     []byte                    `json:"-"`
	XXX_sizecache        int32                     `json:"-"`
}

func (m *RelatedMedia) Reset()         { *m = RelatedMedia{} }
func (m *RelatedMedia) String() string { return proto.CompactTextString(m) }
func (*RelatedMedia) ProtoMessage()    {}
func (*RelatedMedia) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{17}
}

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

var xxx_messageInfo_RelatedMedia proto.InternalMessageInfo

func (m *RelatedMedia) GetUrl() string {
	if m != nil {
		return m.Url
	}
	return ""
}

func (m *RelatedMedia) GetType() RelatedMedia_MediaType {
	if m != nil {
		return m.Type
	}
	return RelatedMedia_TYPE_UNSPECIFIED
}

func (m *RelatedMedia) GetCaption() string {
	if m != nil {
		return m.Caption
	}
	return ""
}

func (m *RelatedMedia) GetAttribution() *RelatedMedia_Attribution {
	if m != nil {
		return m.Attribution
	}
	return nil
}

// Attribution information for this media.
type RelatedMedia_Attribution struct {
	// The text to give credit to the photographer or agency. This text will be
	// displayed together with the source media. Note that only plain text is
	// supported for this field, any HTML components will be stripped (hyperlink
	// based attribution is not supported).
	Text                 string   `protobuf:"bytes,1,opt,name=text,proto3" json:"text,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_RelatedMedia_Attribution proto.InternalMessageInfo

func (m *RelatedMedia_Attribution) GetText() string {
	if m != nil {
		return m.Text
	}
	return ""
}

// Identifies a particular value of a service attribute to be applied to a
// Service.
type ServiceAttributeValueId struct {
	// ID of an attribute as defined in Merchant.service_attribute, e.g.
	// "service-type".
	AttributeId string `protobuf:"bytes,1,opt,name=attribute_id,json=attributeId,proto3" json:"attribute_id,omitempty"`
	// ID of the value for this attribute, e.g. "haircut". Must match a value_id
	// in the service attribute definition.
	ValueId              string   `protobuf:"bytes,2,opt,name=value_id,json=valueId,proto3" json:"value_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *ServiceAttributeValueId) Reset()         { *m = ServiceAttributeValueId{} }
func (m *ServiceAttributeValueId) String() string { return proto.CompactTextString(m) }
func (*ServiceAttributeValueId) ProtoMessage()    {}
func (*ServiceAttributeValueId) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{18}
}

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

var xxx_messageInfo_ServiceAttributeValueId proto.InternalMessageInfo

func (m *ServiceAttributeValueId) GetAttributeId() string {
	if m != nil {
		return m.AttributeId
	}
	return ""
}

func (m *ServiceAttributeValueId) GetValueId() string {
	if m != nil {
		return m.ValueId
	}
	return ""
}

// Rules related to joining the waitlist.
type WaitlistRules struct {
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MinPartySize int32 `protobuf:"varint,1,opt,name=min_party_size,json=minPartySize,proto3" json:"min_party_size,omitempty"`
	// Required. Must be a positive integer for services providing waitlist
	// functionality. If the service or merchant does not provide waitlist
	// functionality, this must not be populated.
	MaxPartySize int32 `protobuf:"varint,2,opt,name=max_party_size,json=maxPartySize,proto3" json:"max_party_size,omitempty"`
	// If true, the user will be able to send a free-form additional text request
	// when joining the waitlist for this service.
	SupportsAdditionalRequest bool     `protobuf:"varint,3,opt,name=supports_additional_request,json=supportsAdditionalRequest,proto3" json:"supports_additional_request,omitempty"`
	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
	XXX_unrecognized          []byte   `json:"-"`
	XXX_sizecache             int32    `json:"-"`
}

func (m *WaitlistRules) Reset()         { *m = WaitlistRules{} }
func (m *WaitlistRules) String() string { return proto.CompactTextString(m) }
func (*WaitlistRules) ProtoMessage()    {}
func (*WaitlistRules) Descriptor() ([]byte, []int) {
	return fileDescriptor_7aa923a38d4cd9d3, []int{19}
}

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

var xxx_messageInfo_WaitlistRules proto.InternalMessageInfo

func (m *WaitlistRules) GetMinPartySize() int32 {
	if m != nil {
		return m.MinPartySize
	}
	return 0
}

func (m *WaitlistRules) GetMaxPartySize() int32 {
	if m != nil {
		return m.MaxPartySize
	}
	return 0
}

func (m *WaitlistRules) GetSupportsAdditionalRequest() bool {
	if m != nil {
		return m.SupportsAdditionalRequest
	}
	return false
}

func init() {
	proto.RegisterEnum("maps.booking.feeds.PriceType", PriceType_name, PriceType_value)
	proto.RegisterEnum("maps.booking.feeds.RequireCreditCard", RequireCreditCard_name, RequireCreditCard_value)
	proto.RegisterEnum("maps.booking.feeds.ActionPlatform", ActionPlatform_name, ActionPlatform_value)
	proto.RegisterEnum("maps.booking.feeds.FeedMetadata_ProcessingInstruction", FeedMetadata_ProcessingInstruction_name, FeedMetadata_ProcessingInstruction_value)
	proto.RegisterEnum("maps.booking.feeds.Availability_ConfirmationMode", Availability_ConfirmationMode_name, Availability_ConfirmationMode_value)
	proto.RegisterEnum("maps.booking.feeds.Service_PrepaymentType", Service_PrepaymentType_name, Service_PrepaymentType_value)
	proto.RegisterEnum("maps.booking.feeds.Service_ServiceType", Service_ServiceType_name, Service_ServiceType_value)
	proto.RegisterEnum("maps.booking.feeds.SchedulingRules_AdmissionPolicy", SchedulingRules_AdmissionPolicy_name, SchedulingRules_AdmissionPolicy_value)
	proto.RegisterEnum("maps.booking.feeds.ServiceIntakeFormField_FieldType", ServiceIntakeFormField_FieldType_name, ServiceIntakeFormField_FieldType_value)
	proto.RegisterEnum("maps.booking.feeds.RelatedMedia_MediaType", RelatedMedia_MediaType_name, RelatedMedia_MediaType_value)
	proto.RegisterType((*FeedMetadata)(nil), "maps.booking.feeds.FeedMetadata")
	proto.RegisterType((*AvailabilityFeed)(nil), "maps.booking.feeds.AvailabilityFeed")
	proto.RegisterType((*ServiceAvailability)(nil), "maps.booking.feeds.ServiceAvailability")
	proto.RegisterType((*Availability)(nil), "maps.booking.feeds.Availability")
	proto.RegisterType((*Availability_Recurrence)(nil), "maps.booking.feeds.Availability.Recurrence")
	proto.RegisterType((*Availability_ScheduleException)(nil), "maps.booking.feeds.Availability.ScheduleException")
	proto.RegisterType((*Availability_SchedulingRuleOverrides)(nil), "maps.booking.feeds.Availability.SchedulingRuleOverrides")
	proto.RegisterType((*Resources)(nil), "maps.booking.feeds.Resources")
	proto.RegisterType((*TimeRange)(nil), "maps.booking.feeds.TimeRange")
	proto.RegisterType((*ServiceFeed)(nil), "maps.booking.feeds.ServiceFeed")
	proto.RegisterType((*Service)(nil), "maps.booking.feeds.Service")
	proto.RegisterType((*Price)(nil), "maps.booking.feeds.Price")
	proto.RegisterType((*SchedulingRules)(nil), "maps.booking.feeds.SchedulingRules")
	proto.RegisterType((*TaxRate)(nil), "maps.booking.feeds.TaxRate")
	proto.RegisterType((*ServiceIntakeFormField)(nil), "maps.booking.feeds.ServiceIntakeFormField")
	proto.RegisterType((*ServiceIntakeForm)(nil), "maps.booking.feeds.ServiceIntakeForm")
	proto.RegisterType((*Deposit)(nil), "maps.booking.feeds.Deposit")
	proto.RegisterType((*NoShowFee)(nil), "maps.booking.feeds.NoShowFee")
	proto.RegisterType((*ActionLink)(nil), "maps.booking.feeds.ActionLink")
	proto.RegisterType((*TicketType)(nil), "maps.booking.feeds.TicketType")
	proto.RegisterType((*RelatedMedia)(nil), "maps.booking.feeds.RelatedMedia")
	proto.RegisterType((*RelatedMedia_Attribution)(nil), "maps.booking.feeds.RelatedMedia.Attribution")
	proto.RegisterType((*ServiceAttributeValueId)(nil), "maps.booking.feeds.ServiceAttributeValueId")
	proto.RegisterType((*WaitlistRules)(nil), "maps.booking.feeds.WaitlistRules")
}

func init() { proto.RegisterFile("feeds.proto", fileDescriptor_7aa923a38d4cd9d3) }

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