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

// Describes how a Price should be interpreted and displayed to the user.
type PriceInterpretation int32

const (
	// Price interpretation unspecified, defaults to EXACT_AMOUNT.
	PriceInterpretation_PRICE_INTERPRETATION_UNSPECIFIED PriceInterpretation = 0
	// When the price should be interpreted as a specific value.
	//
	// Examples:
	//   $20 for a yoga class; $15 for a child haircut
	PriceInterpretation_EXACT_AMOUNT PriceInterpretation = 1
	// When the price of a service is variable but a minimum price is known and
	// displayed to consumers. Consumers may make choices which increase the
	// price.
	//
	// Note that any service that uses this PriceInterpretation must use
	// PrepaymentType NOT_SUPPORTED.
	//
	// Examples:
	//   $30 for dog grooming, but additional consumer choices may increase the
	//   price
	PriceInterpretation_STARTS_AT PriceInterpretation = 2
	// When the price of a service is variable and no price information is
	// displayed to consumers ahead of time.
	//
	// Note that any service that uses this PriceInterpretation must use
	// PrepaymentType NOT_SUPPORTED and Price must be empty.
	//
	// Examples:
	//   A consultation for a home service
	PriceInterpretation_NOT_DISPLAYED PriceInterpretation = 3
)

var PriceInterpretation_name = map[int32]string{
	0: "PRICE_INTERPRETATION_UNSPECIFIED",
	1: "EXACT_AMOUNT",
	2: "STARTS_AT",
	3: "NOT_DISPLAYED",
}

var PriceInterpretation_value = map[string]int32{
	"PRICE_INTERPRETATION_UNSPECIFIED": 0,
	"EXACT_AMOUNT":                     1,
	"STARTS_AT":                        2,
	"NOT_DISPLAYED":                    3,
}

func (x PriceInterpretation) String() string {
	return proto.EnumName(PriceInterpretation_name, int32(x))
}

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

// 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{1}
}

// 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{2}
}

// 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{3}
}

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"`
	// The first time (in seconds) that this slot is able to be booked.
	FirstBookableSec     int64    `protobuf:"varint,2,opt,name=first_bookable_sec,json=firstBookableSec,proto3" json:"first_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
}

func (m *Availability_SchedulingRuleOverrides) GetFirstBookableSec() int64 {
	if m != nil {
		return m.FirstBookableSec
	}
	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"`
	// Describes how the price is interpreted and displayed to the user. Can be
	// used by any vertical except Dining and Things To Do to configure display of
	// the service price. (optional)
	PriceInterpretation PriceInterpretation `protobuf:"varint,23,opt,name=price_interpretation,json=priceInterpretation,proto3,enum=maps.booking.feeds.PriceInterpretation" json:"price_interpretation,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) GetPriceInterpretation() PriceInterpretation {
	if m != nil {
		return m.PriceInterpretation
	}
	return PriceInterpretation_PRICE_INTERPRETATION_UNSPECIFIED
}

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