From 2c262821e32fbb248bd2f0affabb712143b137bd Mon Sep 17 00:00:00 2001 From: Samuel Cedarbaum Date: Mon, 23 Sep 2024 02:15:34 -0400 Subject: [PATCH] Parse schedule relationships for trip descriptors and stop time updates --- hash.go | 2 + proto/gtfs-realtime.pb.go | 2843 ++++++++++++++++++++---- proto/gtfs-realtime.proto | 527 ++++- proto/us-ny-mta-alerts-extension.pb.go | 4 +- proto/us-ny-mta-trips-extension.pb.go | 4 +- realtime.go | 67 +- realtime_test.go | 85 +- 7 files changed, 2990 insertions(+), 542 deletions(-) diff --git a/hash.go b/hash.go index 9a8687f..1595437 100644 --- a/hash.go +++ b/hash.go @@ -45,11 +45,13 @@ func (h *hasher) trip(t *Trip) { h.number(t.ID.HasStartTime) h.number(t.ID.StartTime) h.number(int64(len(t.StopTimeUpdates))) + h.number(t.ID.ScheduleRelationship) for i := range t.StopTimeUpdates { stu := &t.StopTimeUpdates[i] hashNumberPtr(h, stu.StopSequence) h.stringPtr(stu.StopID) h.stringPtr(stu.NyctTrack) + h.number(stu.ScheduleRelationship) for _, event := range []*StopTimeEvent{stu.Arrival, stu.Departure} { h.number(event == nil) if event == nil { diff --git a/proto/gtfs-realtime.pb.go b/proto/gtfs-realtime.pb.go index 7891cb3..99540cf 100644 --- a/proto/gtfs-realtime.pb.go +++ b/proto/gtfs-realtime.pb.go @@ -24,8 +24,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.18.1 +// protoc-gen-go v1.30.0 +// protoc (unknown) // source: proto/gtfs-realtime.proto package proto @@ -105,7 +105,7 @@ func (FeedHeader_Incrementality) EnumDescriptor() ([]byte, []int) { return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{1, 0} } -// The relation between this StopTime and the static schedule. +// The relation between the StopTimeEvents and the static schedule. type TripUpdate_StopTimeUpdate_ScheduleRelationship int32 const ( @@ -119,10 +119,11 @@ const ( // The stop is skipped, i.e., the vehicle will not stop at this stop. // Arrival and departure are optional. TripUpdate_StopTimeUpdate_SKIPPED TripUpdate_StopTimeUpdate_ScheduleRelationship = 1 - // No data is given for this stop. The main intention for this value is to - // give the predictions only for part of a trip, i.e., if the last update - // for a trip has a NO_DATA specifier, then StopTimes for the rest of the - // stops in the trip are considered to be unspecified as well. + // No StopTimeEvents are given for this stop. + // The main intention for this value is to give time predictions only for + // part of a trip, i.e., if the last update for a trip has a NO_DATA + // specifier, then StopTimeEvents for the rest of the stops in the trip + // are considered to be unspecified as well. // Neither arrival nor departure should be supplied. TripUpdate_StopTimeUpdate_NO_DATA TripUpdate_StopTimeUpdate_ScheduleRelationship = 2 // The vehicle is operating a trip defined in GTFS frequencies.txt with exact_times = 0. @@ -316,35 +317,45 @@ func (VehiclePosition_CongestionLevel) EnumDescriptor() ([]byte, []int) { return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{4, 1} } -// The degree of passenger occupancy of the vehicle. This field is still -// experimental, and subject to change. It may be formally adopted in the -// future. +// The state of passenger occupancy for the vehicle or carriage. +// Individual producers may not publish all OccupancyStatus values. Therefore, consumers +// must not assume that the OccupancyStatus values follow a linear scale. +// Consumers should represent OccupancyStatus values as the state indicated +// and intended by the producer. Likewise, producers must use OccupancyStatus values that +// correspond to actual vehicle occupancy states. +// For describing passenger occupancy levels on a linear scale, see `occupancy_percentage`. +// This field is still experimental, and subject to change. It may be formally adopted in the future. type VehiclePosition_OccupancyStatus int32 const ( - // The vehicle is considered empty by most measures, and has few or no + // The vehicle or carriage is considered empty by most measures, and has few or no // passengers onboard, but is still accepting passengers. VehiclePosition_EMPTY VehiclePosition_OccupancyStatus = 0 - // The vehicle has a relatively large percentage of seats available. - // What percentage of free seats out of the total seats available is to be + // The vehicle or carriage has a large number of seats available. + // The amount of free seats out of the total seats available to be // considered large enough to fall into this category is determined at the // discretion of the producer. VehiclePosition_MANY_SEATS_AVAILABLE VehiclePosition_OccupancyStatus = 1 - // The vehicle has a relatively small percentage of seats available. - // What percentage of free seats out of the total seats available is to be + // The vehicle or carriage has a relatively small number of seats available. + // The amount of free seats out of the total seats available to be // considered small enough to fall into this category is determined at the // discretion of the feed producer. VehiclePosition_FEW_SEATS_AVAILABLE VehiclePosition_OccupancyStatus = 2 - // The vehicle can currently accommodate only standing passengers. + // The vehicle or carriage can currently accommodate only standing passengers. VehiclePosition_STANDING_ROOM_ONLY VehiclePosition_OccupancyStatus = 3 - // The vehicle can currently accommodate only standing passengers + // The vehicle or carriage can currently accommodate only standing passengers // and has limited space for them. VehiclePosition_CRUSHED_STANDING_ROOM_ONLY VehiclePosition_OccupancyStatus = 4 - // The vehicle is considered full by most measures, but may still be + // The vehicle or carriage is considered full by most measures, but may still be // allowing passengers to board. VehiclePosition_FULL VehiclePosition_OccupancyStatus = 5 - // The vehicle is not accepting additional passengers. + // The vehicle or carriage is not accepting passengers, but usually accepts passengers for boarding. VehiclePosition_NOT_ACCEPTING_PASSENGERS VehiclePosition_OccupancyStatus = 6 + // The vehicle or carriage doesn't have any occupancy data available at that time. + VehiclePosition_NO_DATA_AVAILABLE VehiclePosition_OccupancyStatus = 7 + // The vehicle or carriage is not boardable and never accepts passengers. + // Useful for special vehicles or carriages (engine, maintenance carriage, etc…). + VehiclePosition_NOT_BOARDABLE VehiclePosition_OccupancyStatus = 8 ) // Enum value maps for VehiclePosition_OccupancyStatus. @@ -357,6 +368,8 @@ var ( 4: "CRUSHED_STANDING_ROOM_ONLY", 5: "FULL", 6: "NOT_ACCEPTING_PASSENGERS", + 7: "NO_DATA_AVAILABLE", + 8: "NOT_BOARDABLE", } VehiclePosition_OccupancyStatus_value = map[string]int32{ "EMPTY": 0, @@ -366,6 +379,8 @@ var ( "CRUSHED_STANDING_ROOM_ONLY": 4, "FULL": 5, "NOT_ACCEPTING_PASSENGERS": 6, + "NO_DATA_AVAILABLE": 7, + "NOT_BOARDABLE": 8, } ) @@ -406,7 +421,7 @@ func (VehiclePosition_OccupancyStatus) EnumDescriptor() ([]byte, []int) { return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{4, 2} } -// Cause of this alert. +// Cause of this alert. If cause_detail is included, then Cause must also be included. type Alert_Cause int32 const ( @@ -493,7 +508,7 @@ func (Alert_Cause) EnumDescriptor() ([]byte, []int) { return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{5, 0} } -// What is the effect of this problem on the affected entity. +// What is the effect of this problem on the affected entity. If effect_detail is included, then Effect must also be included. type Alert_Effect int32 const ( @@ -655,6 +670,10 @@ const ( // An extra trip that was added in addition to a running schedule, for // example, to replace a broken vehicle or to respond to sudden passenger // load. + // NOTE: Currently, behavior is unspecified for feeds that use this mode. There are discussions on the GTFS GitHub + // [(1)](https://github.com/google/transit/issues/106) [(2)](https://github.com/google/transit/pull/221) + // [(3)](https://github.com/google/transit/pull/219) around fully specifying or deprecating ADDED trips and the + // documentation will be updated when those discussions are finalized. TripDescriptor_ADDED TripDescriptor_ScheduleRelationship = 1 // A trip that is running with no schedule associated to it (GTFS frequencies.txt exact_times=0). // Trips with ScheduleRelationship=UNSCHEDULED must also set all StopTimeUpdates.ScheduleRelationship=UNSCHEDULED. @@ -663,8 +682,33 @@ const ( TripDescriptor_CANCELED TripDescriptor_ScheduleRelationship = 3 // Should not be used - for backwards-compatibility only. // - // Deprecated: Do not use. + // Deprecated: Marked as deprecated in proto/gtfs-realtime.proto. TripDescriptor_REPLACEMENT TripDescriptor_ScheduleRelationship = 5 + // An extra trip that was added in addition to a running schedule, for example, to replace a broken vehicle or to + // respond to sudden passenger load. Used with TripUpdate.TripProperties.trip_id, TripUpdate.TripProperties.start_date, + // and TripUpdate.TripProperties.start_time to copy an existing trip from static GTFS but start at a different service + // date and/or time. Duplicating a trip is allowed if the service related to the original trip in (CSV) GTFS + // (in calendar.txt or calendar_dates.txt) is operating within the next 30 days. The trip to be duplicated is + // identified via TripUpdate.TripDescriptor.trip_id. This enumeration does not modify the existing trip referenced by + // TripUpdate.TripDescriptor.trip_id - if a producer wants to cancel the original trip, it must publish a separate + // TripUpdate with the value of CANCELED or DELETED. Trips defined in GTFS frequencies.txt with exact_times that is + // empty or equal to 0 cannot be duplicated. The VehiclePosition.TripDescriptor.trip_id for the new trip must contain + // the matching value from TripUpdate.TripProperties.trip_id and VehiclePosition.TripDescriptor.ScheduleRelationship + // must also be set to DUPLICATED. + // Existing producers and consumers that were using the ADDED enumeration to represent duplicated trips must follow + // the migration guide (https://github.com/google/transit/tree/master/gtfs-realtime/spec/en/examples/migration-duplicated.md) + // to transition to the DUPLICATED enumeration. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + TripDescriptor_DUPLICATED TripDescriptor_ScheduleRelationship = 6 + // A trip that existed in the schedule but was removed and must not be shown to users. + // DELETED should be used instead of CANCELED to indicate that a transit provider would like to entirely remove + // information about the corresponding trip from consuming applications, so the trip is not shown as cancelled to + // riders, e.g. a trip that is entirely being replaced by another trip. + // This designation becomes particularly important if several trips are cancelled and replaced with substitute service. + // If consumers were to show explicit information about the cancellations it would distract from the more important + // real-time predictions. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + TripDescriptor_DELETED TripDescriptor_ScheduleRelationship = 7 ) // Enum value maps for TripDescriptor_ScheduleRelationship. @@ -675,6 +719,8 @@ var ( 2: "UNSCHEDULED", 3: "CANCELED", 5: "REPLACEMENT", + 6: "DUPLICATED", + 7: "DELETED", } TripDescriptor_ScheduleRelationship_value = map[string]int32{ "SCHEDULED": 0, @@ -682,6 +728,8 @@ var ( "UNSCHEDULED": 2, "CANCELED": 3, "REPLACEMENT": 5, + "DUPLICATED": 6, + "DELETED": 7, } ) @@ -722,6 +770,136 @@ func (TripDescriptor_ScheduleRelationship) EnumDescriptor() ([]byte, []int) { return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{8, 0} } +type VehicleDescriptor_WheelchairAccessible int32 + +const ( + // The trip doesn't have information about wheelchair accessibility. + // This is the **default** behavior. If the static GTFS contains a + // _wheelchair_accessible_ value, it won't be overwritten. + VehicleDescriptor_NO_VALUE VehicleDescriptor_WheelchairAccessible = 0 + // The trip has no accessibility value present. + // This value will overwrite the value from the GTFS. + VehicleDescriptor_UNKNOWN VehicleDescriptor_WheelchairAccessible = 1 + // The trip is wheelchair accessible. + // This value will overwrite the value from the GTFS. + VehicleDescriptor_WHEELCHAIR_ACCESSIBLE VehicleDescriptor_WheelchairAccessible = 2 + // The trip is **not** wheelchair accessible. + // This value will overwrite the value from the GTFS. + VehicleDescriptor_WHEELCHAIR_INACCESSIBLE VehicleDescriptor_WheelchairAccessible = 3 +) + +// Enum value maps for VehicleDescriptor_WheelchairAccessible. +var ( + VehicleDescriptor_WheelchairAccessible_name = map[int32]string{ + 0: "NO_VALUE", + 1: "UNKNOWN", + 2: "WHEELCHAIR_ACCESSIBLE", + 3: "WHEELCHAIR_INACCESSIBLE", + } + VehicleDescriptor_WheelchairAccessible_value = map[string]int32{ + "NO_VALUE": 0, + "UNKNOWN": 1, + "WHEELCHAIR_ACCESSIBLE": 2, + "WHEELCHAIR_INACCESSIBLE": 3, + } +) + +func (x VehicleDescriptor_WheelchairAccessible) Enum() *VehicleDescriptor_WheelchairAccessible { + p := new(VehicleDescriptor_WheelchairAccessible) + *p = x + return p +} + +func (x VehicleDescriptor_WheelchairAccessible) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (VehicleDescriptor_WheelchairAccessible) Descriptor() protoreflect.EnumDescriptor { + return file_proto_gtfs_realtime_proto_enumTypes[9].Descriptor() +} + +func (VehicleDescriptor_WheelchairAccessible) Type() protoreflect.EnumType { + return &file_proto_gtfs_realtime_proto_enumTypes[9] +} + +func (x VehicleDescriptor_WheelchairAccessible) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *VehicleDescriptor_WheelchairAccessible) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = VehicleDescriptor_WheelchairAccessible(num) + return nil +} + +// Deprecated: Use VehicleDescriptor_WheelchairAccessible.Descriptor instead. +func (VehicleDescriptor_WheelchairAccessible) EnumDescriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{9, 0} +} + +type Stop_WheelchairBoarding int32 + +const ( + Stop_UNKNOWN Stop_WheelchairBoarding = 0 + Stop_AVAILABLE Stop_WheelchairBoarding = 1 + Stop_NOT_AVAILABLE Stop_WheelchairBoarding = 2 +) + +// Enum value maps for Stop_WheelchairBoarding. +var ( + Stop_WheelchairBoarding_name = map[int32]string{ + 0: "UNKNOWN", + 1: "AVAILABLE", + 2: "NOT_AVAILABLE", + } + Stop_WheelchairBoarding_value = map[string]int32{ + "UNKNOWN": 0, + "AVAILABLE": 1, + "NOT_AVAILABLE": 2, + } +) + +func (x Stop_WheelchairBoarding) Enum() *Stop_WheelchairBoarding { + p := new(Stop_WheelchairBoarding) + *p = x + return p +} + +func (x Stop_WheelchairBoarding) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (Stop_WheelchairBoarding) Descriptor() protoreflect.EnumDescriptor { + return file_proto_gtfs_realtime_proto_enumTypes[10].Descriptor() +} + +func (Stop_WheelchairBoarding) Type() protoreflect.EnumType { + return &file_proto_gtfs_realtime_proto_enumTypes[10] +} + +func (x Stop_WheelchairBoarding) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Do not use. +func (x *Stop_WheelchairBoarding) UnmarshalJSON(b []byte) error { + num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b) + if err != nil { + return err + } + *x = Stop_WheelchairBoarding(num) + return nil +} + +// Deprecated: Use Stop_WheelchairBoarding.Descriptor instead. +func (Stop_WheelchairBoarding) EnumDescriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{14, 0} +} + // The contents of a feed message. // A feed is a continuous stream of feed messages. Each message in the stream is // obtained as a response to an appropriate HTTP GET request. @@ -888,6 +1066,10 @@ type FeedEntity struct { TripUpdate *TripUpdate `protobuf:"bytes,3,opt,name=trip_update,json=tripUpdate" json:"trip_update,omitempty"` Vehicle *VehiclePosition `protobuf:"bytes,4,opt,name=vehicle" json:"vehicle,omitempty"` Alert *Alert `protobuf:"bytes,5,opt,name=alert" json:"alert,omitempty"` + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + Shape *Shape `protobuf:"bytes,6,opt,name=shape" json:"shape,omitempty"` + Stop *Stop `protobuf:"bytes,7,opt,name=stop" json:"stop,omitempty"` + TripModifications *TripModifications `protobuf:"bytes,8,opt,name=trip_modifications,json=tripModifications" json:"trip_modifications,omitempty"` } // Default values for FeedEntity fields. @@ -962,6 +1144,27 @@ func (x *FeedEntity) GetAlert() *Alert { return nil } +func (x *FeedEntity) GetShape() *Shape { + if x != nil { + return x.Shape + } + return nil +} + +func (x *FeedEntity) GetStop() *Stop { + if x != nil { + return x.Stop + } + return nil +} + +func (x *FeedEntity) GetTripModifications() *TripModifications { + if x != nil { + return x.TripModifications + } + return nil +} + // Realtime update of the progress of a vehicle along a trip. // Depending on the value of ScheduleRelationship, a TripUpdate can specify: // - A trip that proceeds along the schedule. @@ -1021,7 +1224,9 @@ type TripUpdate struct { // - stop_sequences 8,9 have delay of 1 min. // - stop_sequences 10,... have unknown delay. StopTimeUpdate []*TripUpdate_StopTimeUpdate `protobuf:"bytes,2,rep,name=stop_time_update,json=stopTimeUpdate" json:"stop_time_update,omitempty"` - // Moment at which the vehicle's real-time progress was measured. In POSIX + // The most recent moment at which the vehicle's real-time progress was measured + // to estimate StopTimes in the future. When StopTimes in the past are provided, + // arrival/departure times may be earlier than this value. In POSIX // time (i.e., the number of seconds since January 1st 1970 00:00:00 UTC). Timestamp *uint64 `protobuf:"varint,4,opt,name=timestamp" json:"timestamp,omitempty"` // The current schedule deviation for the trip. Delay should only be @@ -1042,7 +1247,8 @@ type TripUpdate struct { // // NOTE: This field is still experimental, and subject to change. It may be // formally adopted in the future. - Delay *int32 `protobuf:"varint,5,opt,name=delay" json:"delay,omitempty"` + Delay *int32 `protobuf:"varint,5,opt,name=delay" json:"delay,omitempty"` + TripProperties *TripUpdate_TripProperties `protobuf:"bytes,6,opt,name=trip_properties,json=tripProperties" json:"trip_properties,omitempty"` } func (x *TripUpdate) Reset() { @@ -1112,6 +1318,13 @@ func (x *TripUpdate) GetDelay() int32 { return 0 } +func (x *TripUpdate) GetTripProperties() *TripUpdate_TripProperties { + if x != nil { + return x.TripProperties + } + return nil +} + // Realtime positioning information for a given vehicle. type VehiclePosition struct { state protoimpl.MessageState @@ -1142,15 +1355,29 @@ type VehiclePosition struct { // (i.e., number of seconds since January 1st 1970 00:00:00 UTC). Timestamp *uint64 `protobuf:"varint,5,opt,name=timestamp" json:"timestamp,omitempty"` CongestionLevel *VehiclePosition_CongestionLevel `protobuf:"varint,6,opt,name=congestion_level,json=congestionLevel,enum=transit_realtime.VehiclePosition_CongestionLevel" json:"congestion_level,omitempty"` + // If multi_carriage_status is populated with per-carriage OccupancyStatus, + // then this field should describe the entire vehicle with all carriages accepting passengers considered. OccupancyStatus *VehiclePosition_OccupancyStatus `protobuf:"varint,9,opt,name=occupancy_status,json=occupancyStatus,enum=transit_realtime.VehiclePosition_OccupancyStatus" json:"occupancy_status,omitempty"` - // A percentage value representing the degree of passenger occupancy of the vehicle. + // A percentage value indicating the degree of passenger occupancy in the vehicle. // The values are represented as an integer without decimals. 0 means 0% and 100 means 100%. // The value 100 should represent the total maximum occupancy the vehicle was designed for, // including both seated and standing capacity, and current operating regulations allow. - // It is possible that the value goes over 100 if there are currently more passengers than what the vehicle was designed for. - // The precision of occupancy_percentage should be low enough that you can't track a single person boarding and alighting for privacy reasons. + // The value may exceed 100 if there are more passengers than the maximum designed capacity. + // The precision of occupancy_percentage should be low enough that individual passengers cannot be tracked boarding or alighting the vehicle. + // If multi_carriage_status is populated with per-carriage occupancy_percentage, + // then this field should describe the entire vehicle with all carriages accepting passengers considered. // This field is still experimental, and subject to change. It may be formally adopted in the future. OccupancyPercentage *uint32 `protobuf:"varint,10,opt,name=occupancy_percentage,json=occupancyPercentage" json:"occupancy_percentage,omitempty"` + // Details of the multiple carriages of this given vehicle. + // The first occurrence represents the first carriage of the vehicle, + // given the current direction of travel. + // The number of occurrences of the multi_carriage_details + // field represents the number of carriages of the vehicle. + // It also includes non boardable carriages, + // like engines, maintenance carriages, etc… as they provide valuable + // information to passengers about where to stand on a platform. + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + MultiCarriageDetails []*VehiclePosition_CarriageDetails `protobuf:"bytes,11,rep,name=multi_carriage_details,json=multiCarriageDetails" json:"multi_carriage_details,omitempty"` } // Default values for VehiclePosition fields. @@ -1260,6 +1487,13 @@ func (x *VehiclePosition) GetOccupancyPercentage() uint32 { return 0 } +func (x *VehiclePosition) GetMultiCarriageDetails() []*VehiclePosition_CarriageDetails { + if x != nil { + return x.MultiCarriageDetails + } + return nil +} + // An alert, indicating some sort of incident in the public transit network. type Alert struct { state protoimpl.MessageState @@ -1283,12 +1517,24 @@ type Alert struct { // description should add to the information of the header. DescriptionText *TranslatedString `protobuf:"bytes,11,opt,name=description_text,json=descriptionText" json:"description_text,omitempty"` // Text for alert header to be used in text-to-speech implementations. This field is the text-to-speech version of header_text. - // This field is still experimental, and subject to change. It may be formally adopted in the future. TtsHeaderText *TranslatedString `protobuf:"bytes,12,opt,name=tts_header_text,json=ttsHeaderText" json:"tts_header_text,omitempty"` // Text for full description for the alert to be used in text-to-speech implementations. This field is the text-to-speech version of description_text. - // This field is still experimental, and subject to change. It may be formally adopted in the future. TtsDescriptionText *TranslatedString `protobuf:"bytes,13,opt,name=tts_description_text,json=ttsDescriptionText" json:"tts_description_text,omitempty"` SeverityLevel *Alert_SeverityLevel `protobuf:"varint,14,opt,name=severity_level,json=severityLevel,enum=transit_realtime.Alert_SeverityLevel,def=1" json:"severity_level,omitempty"` + // TranslatedImage to be displayed along the alert text. Used to explain visually the alert effect of a detour, station closure, etc. The image must enhance the understanding of the alert. Any essential information communicated within the image must also be contained in the alert text. + // The following types of images are discouraged : image containing mainly text, marketing or branded images that add no additional information. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + Image *TranslatedImage `protobuf:"bytes,15,opt,name=image" json:"image,omitempty"` + // Text describing the appearance of the linked image in the `image` field (e.g., in case the image can't be displayed + // or the user can't see the image for accessibility reasons). See the HTML spec for alt image text - https://html.spec.whatwg.org/#alt. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + ImageAlternativeText *TranslatedString `protobuf:"bytes,16,opt,name=image_alternative_text,json=imageAlternativeText" json:"image_alternative_text,omitempty"` + // Description of the cause of the alert that allows for agency-specific language; more specific than the Cause. If cause_detail is included, then Cause must also be included. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + CauseDetail *TranslatedString `protobuf:"bytes,17,opt,name=cause_detail,json=causeDetail" json:"cause_detail,omitempty"` + // Description of the effect of the alert that allows for agency-specific language; more specific than the Effect. If effect_detail is included, then Effect must also be included. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + EffectDetail *TranslatedString `protobuf:"bytes,18,opt,name=effect_detail,json=effectDetail" json:"effect_detail,omitempty"` } // Default values for Alert fields. @@ -1400,6 +1646,34 @@ func (x *Alert) GetSeverityLevel() Alert_SeverityLevel { return Default_Alert_SeverityLevel } +func (x *Alert) GetImage() *TranslatedImage { + if x != nil { + return x.Image + } + return nil +} + +func (x *Alert) GetImageAlternativeText() *TranslatedString { + if x != nil { + return x.ImageAlternativeText + } + return nil +} + +func (x *Alert) GetCauseDetail() *TranslatedString { + if x != nil { + return x.CauseDetail + } + return nil +} + +func (x *Alert) GetEffectDetail() *TranslatedString { + if x != nil { + return x.EffectDetail + } + return nil +} + // A time interval. The interval is considered active at time 't' if 't' is // greater than or equal to the start time and less than the end time. type TimeRange struct { @@ -1572,7 +1846,9 @@ type TripDescriptor struct { // The trip_id from the GTFS feed that this selector refers to. // For non frequency-based trips, this field is enough to uniquely identify // the trip. For frequency-based trip, start_time and start_date might also be - // necessary. + // necessary. When schedule_relationship is DUPLICATED within a TripUpdate, the trip_id identifies the trip from + // static GTFS to be duplicated. When schedule_relationship is DUPLICATED within a VehiclePosition, the trip_id + // identifies the new duplicate trip and must contain the value for the corresponding TripUpdate.TripProperties.trip_id. TripId *string `protobuf:"bytes,1,opt,name=trip_id,json=tripId" json:"trip_id,omitempty"` // The route_id from the GTFS that this selector refers to. RouteId *string `protobuf:"bytes,5,opt,name=route_id,json=routeId" json:"route_id,omitempty"` @@ -1607,6 +1883,7 @@ type TripDescriptor struct { // In YYYYMMDD format. StartDate *string `protobuf:"bytes,3,opt,name=start_date,json=startDate" json:"start_date,omitempty"` ScheduleRelationship *TripDescriptor_ScheduleRelationship `protobuf:"varint,4,opt,name=schedule_relationship,json=scheduleRelationship,enum=transit_realtime.TripDescriptor_ScheduleRelationship" json:"schedule_relationship,omitempty"` + ModifiedTrip *TripDescriptor_ModifiedTripSelector `protobuf:"bytes,7,opt,name=modified_trip,json=modifiedTrip" json:"modified_trip,omitempty"` } func (x *TripDescriptor) Reset() { @@ -1683,6 +1960,13 @@ func (x *TripDescriptor) GetScheduleRelationship() TripDescriptor_ScheduleRelati return TripDescriptor_SCHEDULED } +func (x *TripDescriptor) GetModifiedTrip() *TripDescriptor_ModifiedTripSelector { + if x != nil { + return x.ModifiedTrip + } + return nil +} + // Identification information for the vehicle performing the trip. type VehicleDescriptor struct { state protoimpl.MessageState @@ -1698,9 +1982,15 @@ type VehicleDescriptor struct { // help identify the correct vehicle. Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` // The license plate of the vehicle. - LicensePlate *string `protobuf:"bytes,3,opt,name=license_plate,json=licensePlate" json:"license_plate,omitempty"` + LicensePlate *string `protobuf:"bytes,3,opt,name=license_plate,json=licensePlate" json:"license_plate,omitempty"` + WheelchairAccessible *VehicleDescriptor_WheelchairAccessible `protobuf:"varint,4,opt,name=wheelchair_accessible,json=wheelchairAccessible,enum=transit_realtime.VehicleDescriptor_WheelchairAccessible,def=0" json:"wheelchair_accessible,omitempty"` } +// Default values for VehicleDescriptor fields. +const ( + Default_VehicleDescriptor_WheelchairAccessible = VehicleDescriptor_NO_VALUE +) + func (x *VehicleDescriptor) Reset() { *x = VehicleDescriptor{} if protoimpl.UnsafeEnabled { @@ -1754,6 +2044,13 @@ func (x *VehicleDescriptor) GetLicensePlate() string { return "" } +func (x *VehicleDescriptor) GetWheelchairAccessible() VehicleDescriptor_WheelchairAccessible { + if x != nil && x.WheelchairAccessible != nil { + return *x.WheelchairAccessible + } + return Default_VehicleDescriptor_WheelchairAccessible +} + // A selector for an entity in a GTFS feed. type EntitySelector struct { state protoimpl.MessageState @@ -1909,44 +2206,30 @@ func (x *TranslatedString) GetTranslation() []*TranslatedString_Translation { return nil } -// Timing information for a single predicted event (either arrival or -// departure). -// Timing consists of delay and/or estimated time, and uncertainty. -// - delay should be used when the prediction is given relative to some -// existing schedule in GTFS. -// - time should be given whether there is a predicted schedule or not. If -// both time and delay are specified, time will take precedence -// (although normally, time, if given for a scheduled trip, should be -// equal to scheduled time in GTFS + delay). +// An internationalized image containing per-language versions of a URL linking to an image +// along with meta information +// Only one of the images from a message will be retained by consumers. The resolution proceeds +// as follows: +// 1. If the UI language matches the language code of a translation, +// the first matching translation is picked. +// 2. If a default UI language (e.g., English) matches the language code of a +// translation, the first matching translation is picked. +// 3. If some translation has an unspecified language code, that translation is +// picked. // -// Uncertainty applies equally to both time and delay. -// The uncertainty roughly specifies the expected error in true delay (but -// note, we don't yet define its precise statistical meaning). It's possible -// for the uncertainty to be 0, for example for trains that are driven under -// computer timing control. -type TripUpdate_StopTimeEvent struct { +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +type TranslatedImage struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields extensionFields protoimpl.ExtensionFields - // Delay (in seconds) can be positive (meaning that the vehicle is late) or - // negative (meaning that the vehicle is ahead of schedule). Delay of 0 - // means that the vehicle is exactly on time. - Delay *int32 `protobuf:"varint,1,opt,name=delay" json:"delay,omitempty"` - // Event as absolute time. - // In Unix time (i.e., number of seconds since January 1st 1970 00:00:00 - // UTC). - Time *int64 `protobuf:"varint,2,opt,name=time" json:"time,omitempty"` - // If uncertainty is omitted, it is interpreted as unknown. - // If the prediction is unknown or too uncertain, the delay (or time) field - // should be empty. In such case, the uncertainty field is ignored. - // To specify a completely certain prediction, set its uncertainty to 0. - Uncertainty *int32 `protobuf:"varint,3,opt,name=uncertainty" json:"uncertainty,omitempty"` + // At least one localized image must be provided. + LocalizedImage []*TranslatedImage_LocalizedImage `protobuf:"bytes,1,rep,name=localized_image,json=localizedImage" json:"localized_image,omitempty"` } -func (x *TripUpdate_StopTimeEvent) Reset() { - *x = TripUpdate_StopTimeEvent{} +func (x *TranslatedImage) Reset() { + *x = TranslatedImage{} if protoimpl.UnsafeEnabled { mi := &file_proto_gtfs_realtime_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1954,13 +2237,13 @@ func (x *TripUpdate_StopTimeEvent) Reset() { } } -func (x *TripUpdate_StopTimeEvent) String() string { +func (x *TranslatedImage) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TripUpdate_StopTimeEvent) ProtoMessage() {} +func (*TranslatedImage) ProtoMessage() {} -func (x *TripUpdate_StopTimeEvent) ProtoReflect() protoreflect.Message { +func (x *TranslatedImage) ProtoReflect() protoreflect.Message { mi := &file_proto_gtfs_realtime_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -1972,57 +2255,45 @@ func (x *TripUpdate_StopTimeEvent) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TripUpdate_StopTimeEvent.ProtoReflect.Descriptor instead. -func (*TripUpdate_StopTimeEvent) Descriptor() ([]byte, []int) { - return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 0} -} - -func (x *TripUpdate_StopTimeEvent) GetDelay() int32 { - if x != nil && x.Delay != nil { - return *x.Delay - } - return 0 -} - -func (x *TripUpdate_StopTimeEvent) GetTime() int64 { - if x != nil && x.Time != nil { - return *x.Time - } - return 0 +// Deprecated: Use TranslatedImage.ProtoReflect.Descriptor instead. +func (*TranslatedImage) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{12} } -func (x *TripUpdate_StopTimeEvent) GetUncertainty() int32 { - if x != nil && x.Uncertainty != nil { - return *x.Uncertainty +func (x *TranslatedImage) GetLocalizedImage() []*TranslatedImage_LocalizedImage { + if x != nil { + return x.LocalizedImage } - return 0 + return nil } -// Realtime update for arrival and/or departure events for a given stop on a -// trip. Updates can be supplied for both past and future events. -// The producer is allowed, although not required, to drop past events. -type TripUpdate_StopTimeUpdate struct { +// Describes the physical path that a vehicle takes when it's not part of the (CSV) GTFS, +// such as for a detour. Shapes belong to Trips, and consist of a sequence of shape points. +// Tracing the points in order provides the path of the vehicle. Shapes do not need to intercept +// the location of Stops exactly, but all Stops on a trip should lie within a small distance of +// the shape for that trip, i.e. close to straight line segments connecting the shape points +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +type Shape struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields extensionFields protoimpl.ExtensionFields - // Must be the same as in stop_times.txt in the corresponding GTFS feed. - StopSequence *uint32 `protobuf:"varint,1,opt,name=stop_sequence,json=stopSequence" json:"stop_sequence,omitempty"` - // Must be the same as in stops.txt in the corresponding GTFS feed. - StopId *string `protobuf:"bytes,4,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"` - Arrival *TripUpdate_StopTimeEvent `protobuf:"bytes,2,opt,name=arrival" json:"arrival,omitempty"` - Departure *TripUpdate_StopTimeEvent `protobuf:"bytes,3,opt,name=departure" json:"departure,omitempty"` - ScheduleRelationship *TripUpdate_StopTimeUpdate_ScheduleRelationship `protobuf:"varint,5,opt,name=schedule_relationship,json=scheduleRelationship,enum=transit_realtime.TripUpdate_StopTimeUpdate_ScheduleRelationship,def=0" json:"schedule_relationship,omitempty"` -} - -// Default values for TripUpdate_StopTimeUpdate fields. -const ( - Default_TripUpdate_StopTimeUpdate_ScheduleRelationship = TripUpdate_StopTimeUpdate_SCHEDULED -) - -func (x *TripUpdate_StopTimeUpdate) Reset() { - *x = TripUpdate_StopTimeUpdate{} + // Identifier of the shape. Must be different than any shape_id defined in the (CSV) GTFS. + // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever" + // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + ShapeId *string `protobuf:"bytes,1,opt,name=shape_id,json=shapeId" json:"shape_id,omitempty"` + // Encoded polyline representation of the shape. This polyline must contain at least two points. + // For more information about encoded polylines, see https://developers.google.com/maps/documentation/utilities/polylinealgorithm + // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever" + // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + EncodedPolyline *string `protobuf:"bytes,2,opt,name=encoded_polyline,json=encodedPolyline" json:"encoded_polyline,omitempty"` +} + +func (x *Shape) Reset() { + *x = Shape{} if protoimpl.UnsafeEnabled { mi := &file_proto_gtfs_realtime_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2030,13 +2301,13 @@ func (x *TripUpdate_StopTimeUpdate) Reset() { } } -func (x *TripUpdate_StopTimeUpdate) String() string { +func (x *Shape) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TripUpdate_StopTimeUpdate) ProtoMessage() {} +func (*Shape) ProtoMessage() {} -func (x *TripUpdate_StopTimeUpdate) ProtoReflect() protoreflect.Message { +func (x *Shape) ProtoReflect() protoreflect.Message { mi := &file_proto_gtfs_realtime_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2048,62 +2319,56 @@ func (x *TripUpdate_StopTimeUpdate) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TripUpdate_StopTimeUpdate.ProtoReflect.Descriptor instead. -func (*TripUpdate_StopTimeUpdate) Descriptor() ([]byte, []int) { - return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 1} -} - -func (x *TripUpdate_StopTimeUpdate) GetStopSequence() uint32 { - if x != nil && x.StopSequence != nil { - return *x.StopSequence - } - return 0 +// Deprecated: Use Shape.ProtoReflect.Descriptor instead. +func (*Shape) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{13} } -func (x *TripUpdate_StopTimeUpdate) GetStopId() string { - if x != nil && x.StopId != nil { - return *x.StopId +func (x *Shape) GetShapeId() string { + if x != nil && x.ShapeId != nil { + return *x.ShapeId } return "" } -func (x *TripUpdate_StopTimeUpdate) GetArrival() *TripUpdate_StopTimeEvent { - if x != nil { - return x.Arrival - } - return nil -} - -func (x *TripUpdate_StopTimeUpdate) GetDeparture() *TripUpdate_StopTimeEvent { - if x != nil { - return x.Departure - } - return nil -} - -func (x *TripUpdate_StopTimeUpdate) GetScheduleRelationship() TripUpdate_StopTimeUpdate_ScheduleRelationship { - if x != nil && x.ScheduleRelationship != nil { - return *x.ScheduleRelationship +func (x *Shape) GetEncodedPolyline() string { + if x != nil && x.EncodedPolyline != nil { + return *x.EncodedPolyline } - return Default_TripUpdate_StopTimeUpdate_ScheduleRelationship + return "" } -type TranslatedString_Translation struct { +// Describes a stop which is served by trips. All fields are as described in the GTFS-Static specification. +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +type Stop struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields extensionFields protoimpl.ExtensionFields - // A UTF-8 string containing the message. - Text *string `protobuf:"bytes,1,req,name=text" json:"text,omitempty"` - // BCP-47 language code. Can be omitted if the language is unknown or if - // no i18n is done at all for the feed. At most one translation is - // allowed to have an unspecified language tag. - Language *string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"` -} + StopId *string `protobuf:"bytes,1,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"` + StopCode *TranslatedString `protobuf:"bytes,2,opt,name=stop_code,json=stopCode" json:"stop_code,omitempty"` + StopName *TranslatedString `protobuf:"bytes,3,opt,name=stop_name,json=stopName" json:"stop_name,omitempty"` + TtsStopName *TranslatedString `protobuf:"bytes,4,opt,name=tts_stop_name,json=ttsStopName" json:"tts_stop_name,omitempty"` + StopDesc *TranslatedString `protobuf:"bytes,5,opt,name=stop_desc,json=stopDesc" json:"stop_desc,omitempty"` + StopLat *float32 `protobuf:"fixed32,6,opt,name=stop_lat,json=stopLat" json:"stop_lat,omitempty"` + StopLon *float32 `protobuf:"fixed32,7,opt,name=stop_lon,json=stopLon" json:"stop_lon,omitempty"` + ZoneId *string `protobuf:"bytes,8,opt,name=zone_id,json=zoneId" json:"zone_id,omitempty"` + StopUrl *TranslatedString `protobuf:"bytes,9,opt,name=stop_url,json=stopUrl" json:"stop_url,omitempty"` + ParentStation *string `protobuf:"bytes,11,opt,name=parent_station,json=parentStation" json:"parent_station,omitempty"` + StopTimezone *string `protobuf:"bytes,12,opt,name=stop_timezone,json=stopTimezone" json:"stop_timezone,omitempty"` + WheelchairBoarding *Stop_WheelchairBoarding `protobuf:"varint,13,opt,name=wheelchair_boarding,json=wheelchairBoarding,enum=transit_realtime.Stop_WheelchairBoarding,def=0" json:"wheelchair_boarding,omitempty"` + LevelId *string `protobuf:"bytes,14,opt,name=level_id,json=levelId" json:"level_id,omitempty"` + PlatformCode *TranslatedString `protobuf:"bytes,15,opt,name=platform_code,json=platformCode" json:"platform_code,omitempty"` +} + +// Default values for Stop fields. +const ( + Default_Stop_WheelchairBoarding = Stop_UNKNOWN +) -func (x *TranslatedString_Translation) Reset() { - *x = TranslatedString_Translation{} +func (x *Stop) Reset() { + *x = Stop{} if protoimpl.UnsafeEnabled { mi := &file_proto_gtfs_realtime_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2111,13 +2376,13 @@ func (x *TranslatedString_Translation) Reset() { } } -func (x *TranslatedString_Translation) String() string { +func (x *Stop) String() string { return protoimpl.X.MessageStringOf(x) } -func (*TranslatedString_Translation) ProtoMessage() {} +func (*Stop) ProtoMessage() {} -func (x *TranslatedString_Translation) ProtoReflect() protoreflect.Message { +func (x *Stop) ProtoReflect() protoreflect.Message { mi := &file_proto_gtfs_realtime_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -2129,9 +2394,886 @@ func (x *TranslatedString_Translation) ProtoReflect() protoreflect.Message { return mi.MessageOf(x) } -// Deprecated: Use TranslatedString_Translation.ProtoReflect.Descriptor instead. -func (*TranslatedString_Translation) Descriptor() ([]byte, []int) { - return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{11, 0} +// Deprecated: Use Stop.ProtoReflect.Descriptor instead. +func (*Stop) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{14} +} + +func (x *Stop) GetStopId() string { + if x != nil && x.StopId != nil { + return *x.StopId + } + return "" +} + +func (x *Stop) GetStopCode() *TranslatedString { + if x != nil { + return x.StopCode + } + return nil +} + +func (x *Stop) GetStopName() *TranslatedString { + if x != nil { + return x.StopName + } + return nil +} + +func (x *Stop) GetTtsStopName() *TranslatedString { + if x != nil { + return x.TtsStopName + } + return nil +} + +func (x *Stop) GetStopDesc() *TranslatedString { + if x != nil { + return x.StopDesc + } + return nil +} + +func (x *Stop) GetStopLat() float32 { + if x != nil && x.StopLat != nil { + return *x.StopLat + } + return 0 +} + +func (x *Stop) GetStopLon() float32 { + if x != nil && x.StopLon != nil { + return *x.StopLon + } + return 0 +} + +func (x *Stop) GetZoneId() string { + if x != nil && x.ZoneId != nil { + return *x.ZoneId + } + return "" +} + +func (x *Stop) GetStopUrl() *TranslatedString { + if x != nil { + return x.StopUrl + } + return nil +} + +func (x *Stop) GetParentStation() string { + if x != nil && x.ParentStation != nil { + return *x.ParentStation + } + return "" +} + +func (x *Stop) GetStopTimezone() string { + if x != nil && x.StopTimezone != nil { + return *x.StopTimezone + } + return "" +} + +func (x *Stop) GetWheelchairBoarding() Stop_WheelchairBoarding { + if x != nil && x.WheelchairBoarding != nil { + return *x.WheelchairBoarding + } + return Default_Stop_WheelchairBoarding +} + +func (x *Stop) GetLevelId() string { + if x != nil && x.LevelId != nil { + return *x.LevelId + } + return "" +} + +func (x *Stop) GetPlatformCode() *TranslatedString { + if x != nil { + return x.PlatformCode + } + return nil +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +type TripModifications struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // A list of selected trips affected by this TripModifications. + SelectedTrips []*TripModifications_SelectedTrips `protobuf:"bytes,1,rep,name=selected_trips,json=selectedTrips" json:"selected_trips,omitempty"` + // A list of start times in the real-time trip descriptor for the trip_id defined in trip_ids. + // Useful to target multiple departures of a trip_id in a frequency-based trip. + StartTimes []string `protobuf:"bytes,2,rep,name=start_times,json=startTimes" json:"start_times,omitempty"` + // Dates on which the modifications occurs, in the YYYYMMDD format. Producers SHOULD only transmit detours occurring within the next week. + // The dates provided should not be used as user-facing information, if a user-facing start and end date needs to be provided, they can be provided in the linked service alert with `service_alert_id` + ServiceDates []string `protobuf:"bytes,3,rep,name=service_dates,json=serviceDates" json:"service_dates,omitempty"` + // A list of modifications to apply to the affected trips. + Modifications []*TripModifications_Modification `protobuf:"bytes,4,rep,name=modifications" json:"modifications,omitempty"` +} + +func (x *TripModifications) Reset() { + *x = TripModifications{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripModifications) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripModifications) ProtoMessage() {} + +func (x *TripModifications) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripModifications.ProtoReflect.Descriptor instead. +func (*TripModifications) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{15} +} + +func (x *TripModifications) GetSelectedTrips() []*TripModifications_SelectedTrips { + if x != nil { + return x.SelectedTrips + } + return nil +} + +func (x *TripModifications) GetStartTimes() []string { + if x != nil { + return x.StartTimes + } + return nil +} + +func (x *TripModifications) GetServiceDates() []string { + if x != nil { + return x.ServiceDates + } + return nil +} + +func (x *TripModifications) GetModifications() []*TripModifications_Modification { + if x != nil { + return x.Modifications + } + return nil +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +// Select a stop by stop sequence or by stop_id. At least one of the two values must be provided. +type StopSelector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Must be the same as in stop_times.txt in the corresponding GTFS feed. + StopSequence *uint32 `protobuf:"varint,1,opt,name=stop_sequence,json=stopSequence" json:"stop_sequence,omitempty"` + // Must be the same as in stops.txt in the corresponding GTFS feed. + StopId *string `protobuf:"bytes,2,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"` +} + +func (x *StopSelector) Reset() { + *x = StopSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *StopSelector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*StopSelector) ProtoMessage() {} + +func (x *StopSelector) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[16] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use StopSelector.ProtoReflect.Descriptor instead. +func (*StopSelector) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{16} +} + +func (x *StopSelector) GetStopSequence() uint32 { + if x != nil && x.StopSequence != nil { + return *x.StopSequence + } + return 0 +} + +func (x *StopSelector) GetStopId() string { + if x != nil && x.StopId != nil { + return *x.StopId + } + return "" +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +type ReplacementStop struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // The difference in seconds between the arrival time at this stop and the arrival time at the reference stop. The reference stop is the stop prior to start_stop_selector. If the modification begins at the first stop of the trip, then the first stop of the trip is the reference stop. + // This value MUST be monotonically increasing and may only be a negative number if the first stop of the original trip is the reference stop. + TravelTimeToStop *int32 `protobuf:"varint,1,opt,name=travel_time_to_stop,json=travelTimeToStop" json:"travel_time_to_stop,omitempty"` + // The replacement stop ID which will now be visited by the trip. May refer to a new stop added using a GTFS-RT Stop message, or to an existing stop defined in the GTFS-Static feed’s stops.txt. The stop MUST have location_type=0 (routable stops). + StopId *string `protobuf:"bytes,2,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"` +} + +func (x *ReplacementStop) Reset() { + *x = ReplacementStop{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReplacementStop) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReplacementStop) ProtoMessage() {} + +func (x *ReplacementStop) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReplacementStop.ProtoReflect.Descriptor instead. +func (*ReplacementStop) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{17} +} + +func (x *ReplacementStop) GetTravelTimeToStop() int32 { + if x != nil && x.TravelTimeToStop != nil { + return *x.TravelTimeToStop + } + return 0 +} + +func (x *ReplacementStop) GetStopId() string { + if x != nil && x.StopId != nil { + return *x.StopId + } + return "" +} + +// Timing information for a single predicted event (either arrival or +// departure). +// Timing consists of delay and/or estimated time, and uncertainty. +// - delay should be used when the prediction is given relative to some +// existing schedule in GTFS. +// - time should be given whether there is a predicted schedule or not. If +// both time and delay are specified, time will take precedence +// (although normally, time, if given for a scheduled trip, should be +// equal to scheduled time in GTFS + delay). +// +// Uncertainty applies equally to both time and delay. +// The uncertainty roughly specifies the expected error in true delay (but +// note, we don't yet define its precise statistical meaning). It's possible +// for the uncertainty to be 0, for example for trains that are driven under +// computer timing control. +type TripUpdate_StopTimeEvent struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Delay (in seconds) can be positive (meaning that the vehicle is late) or + // negative (meaning that the vehicle is ahead of schedule). Delay of 0 + // means that the vehicle is exactly on time. + Delay *int32 `protobuf:"varint,1,opt,name=delay" json:"delay,omitempty"` + // Event as absolute time. + // In Unix time (i.e., number of seconds since January 1st 1970 00:00:00 + // UTC). + Time *int64 `protobuf:"varint,2,opt,name=time" json:"time,omitempty"` + // If uncertainty is omitted, it is interpreted as unknown. + // If the prediction is unknown or too uncertain, the delay (or time) field + // should be empty. In such case, the uncertainty field is ignored. + // To specify a completely certain prediction, set its uncertainty to 0. + Uncertainty *int32 `protobuf:"varint,3,opt,name=uncertainty" json:"uncertainty,omitempty"` +} + +func (x *TripUpdate_StopTimeEvent) Reset() { + *x = TripUpdate_StopTimeEvent{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripUpdate_StopTimeEvent) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripUpdate_StopTimeEvent) ProtoMessage() {} + +func (x *TripUpdate_StopTimeEvent) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[18] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripUpdate_StopTimeEvent.ProtoReflect.Descriptor instead. +func (*TripUpdate_StopTimeEvent) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 0} +} + +func (x *TripUpdate_StopTimeEvent) GetDelay() int32 { + if x != nil && x.Delay != nil { + return *x.Delay + } + return 0 +} + +func (x *TripUpdate_StopTimeEvent) GetTime() int64 { + if x != nil && x.Time != nil { + return *x.Time + } + return 0 +} + +func (x *TripUpdate_StopTimeEvent) GetUncertainty() int32 { + if x != nil && x.Uncertainty != nil { + return *x.Uncertainty + } + return 0 +} + +// Realtime update for arrival and/or departure events for a given stop on a +// trip. Updates can be supplied for both past and future events. +// The producer is allowed, although not required, to drop past events. +type TripUpdate_StopTimeUpdate struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Must be the same as in stop_times.txt in the corresponding GTFS feed. + StopSequence *uint32 `protobuf:"varint,1,opt,name=stop_sequence,json=stopSequence" json:"stop_sequence,omitempty"` + // Must be the same as in stops.txt in the corresponding GTFS feed. + StopId *string `protobuf:"bytes,4,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"` + Arrival *TripUpdate_StopTimeEvent `protobuf:"bytes,2,opt,name=arrival" json:"arrival,omitempty"` + Departure *TripUpdate_StopTimeEvent `protobuf:"bytes,3,opt,name=departure" json:"departure,omitempty"` + // Expected occupancy after departure from the given stop. + // Should be provided only for future stops. + // In order to provide departure_occupancy_status without either arrival or + // departure StopTimeEvents, ScheduleRelationship should be set to NO_DATA. + DepartureOccupancyStatus *VehiclePosition_OccupancyStatus `protobuf:"varint,7,opt,name=departure_occupancy_status,json=departureOccupancyStatus,enum=transit_realtime.VehiclePosition_OccupancyStatus" json:"departure_occupancy_status,omitempty"` + ScheduleRelationship *TripUpdate_StopTimeUpdate_ScheduleRelationship `protobuf:"varint,5,opt,name=schedule_relationship,json=scheduleRelationship,enum=transit_realtime.TripUpdate_StopTimeUpdate_ScheduleRelationship,def=0" json:"schedule_relationship,omitempty"` + // Realtime updates for certain properties defined within GTFS stop_times.txt + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + StopTimeProperties *TripUpdate_StopTimeUpdate_StopTimeProperties `protobuf:"bytes,6,opt,name=stop_time_properties,json=stopTimeProperties" json:"stop_time_properties,omitempty"` +} + +// Default values for TripUpdate_StopTimeUpdate fields. +const ( + Default_TripUpdate_StopTimeUpdate_ScheduleRelationship = TripUpdate_StopTimeUpdate_SCHEDULED +) + +func (x *TripUpdate_StopTimeUpdate) Reset() { + *x = TripUpdate_StopTimeUpdate{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripUpdate_StopTimeUpdate) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripUpdate_StopTimeUpdate) ProtoMessage() {} + +func (x *TripUpdate_StopTimeUpdate) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[19] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripUpdate_StopTimeUpdate.ProtoReflect.Descriptor instead. +func (*TripUpdate_StopTimeUpdate) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 1} +} + +func (x *TripUpdate_StopTimeUpdate) GetStopSequence() uint32 { + if x != nil && x.StopSequence != nil { + return *x.StopSequence + } + return 0 +} + +func (x *TripUpdate_StopTimeUpdate) GetStopId() string { + if x != nil && x.StopId != nil { + return *x.StopId + } + return "" +} + +func (x *TripUpdate_StopTimeUpdate) GetArrival() *TripUpdate_StopTimeEvent { + if x != nil { + return x.Arrival + } + return nil +} + +func (x *TripUpdate_StopTimeUpdate) GetDeparture() *TripUpdate_StopTimeEvent { + if x != nil { + return x.Departure + } + return nil +} + +func (x *TripUpdate_StopTimeUpdate) GetDepartureOccupancyStatus() VehiclePosition_OccupancyStatus { + if x != nil && x.DepartureOccupancyStatus != nil { + return *x.DepartureOccupancyStatus + } + return VehiclePosition_EMPTY +} + +func (x *TripUpdate_StopTimeUpdate) GetScheduleRelationship() TripUpdate_StopTimeUpdate_ScheduleRelationship { + if x != nil && x.ScheduleRelationship != nil { + return *x.ScheduleRelationship + } + return Default_TripUpdate_StopTimeUpdate_ScheduleRelationship +} + +func (x *TripUpdate_StopTimeUpdate) GetStopTimeProperties() *TripUpdate_StopTimeUpdate_StopTimeProperties { + if x != nil { + return x.StopTimeProperties + } + return nil +} + +// Defines updated properties of the trip, such as a new shape_id when there is a detour. Or defines the +// trip_id, start_date, and start_time of a DUPLICATED trip. +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +type TripUpdate_TripProperties struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Defines the identifier of a new trip that is a duplicate of an existing trip defined in (CSV) GTFS trips.txt + // but will start at a different service date and/or time (defined using the TripProperties.start_date and + // TripProperties.start_time fields). See definition of trips.trip_id in (CSV) GTFS. Its value must be different + // than the ones used in the (CSV) GTFS. Required if schedule_relationship=DUPLICATED, otherwise this field must not + // be populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + TripId *string `protobuf:"bytes,1,opt,name=trip_id,json=tripId" json:"trip_id,omitempty"` + // Service date on which the DUPLICATED trip will be run, in YYYYMMDD format. Required if + // schedule_relationship=DUPLICATED, otherwise this field must not be populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + StartDate *string `protobuf:"bytes,2,opt,name=start_date,json=startDate" json:"start_date,omitempty"` + // Defines the departure start time of the trip when it’s duplicated. See definition of stop_times.departure_time + // in (CSV) GTFS. Scheduled arrival and departure times for the duplicated trip are calculated based on the offset + // between the original trip departure_time and this field. For example, if a GTFS trip has stop A with a + // departure_time of 10:00:00 and stop B with departure_time of 10:01:00, and this field is populated with the value + // of 10:30:00, stop B on the duplicated trip will have a scheduled departure_time of 10:31:00. Real-time prediction + // delay values are applied to this calculated schedule time to determine the predicted time. For example, if a + // departure delay of 30 is provided for stop B, then the predicted departure time is 10:31:30. Real-time + // prediction time values do not have any offset applied to them and indicate the predicted time as provided. + // For example, if a departure time representing 10:31:30 is provided for stop B, then the predicted departure time + // is 10:31:30. This field is required if schedule_relationship is DUPLICATED, otherwise this field must not be + // populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + StartTime *string `protobuf:"bytes,3,opt,name=start_time,json=startTime" json:"start_time,omitempty"` + // Specifies the shape of the vehicle travel path when the trip shape differs from the shape specified in + // (CSV) GTFS or to specify it in real-time when it's not provided by (CSV) GTFS, such as a vehicle that takes differing + // paths based on rider demand. See definition of trips.shape_id in (CSV) GTFS. If a shape is neither defined in (CSV) GTFS + // nor in real-time, the shape is considered unknown. This field can refer to a shape defined in the (CSV) GTFS in shapes.txt + // or a Shape in the (protobuf) real-time feed. The order of stops (stop sequences) for this trip must remain the same as + // (CSV) GTFS. Stops that are a part of the original trip but will no longer be made, such as when a detour occurs, should + // be marked as schedule_relationship=SKIPPED. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + ShapeId *string `protobuf:"bytes,4,opt,name=shape_id,json=shapeId" json:"shape_id,omitempty"` +} + +func (x *TripUpdate_TripProperties) Reset() { + *x = TripUpdate_TripProperties{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[20] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripUpdate_TripProperties) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripUpdate_TripProperties) ProtoMessage() {} + +func (x *TripUpdate_TripProperties) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[20] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripUpdate_TripProperties.ProtoReflect.Descriptor instead. +func (*TripUpdate_TripProperties) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 2} +} + +func (x *TripUpdate_TripProperties) GetTripId() string { + if x != nil && x.TripId != nil { + return *x.TripId + } + return "" +} + +func (x *TripUpdate_TripProperties) GetStartDate() string { + if x != nil && x.StartDate != nil { + return *x.StartDate + } + return "" +} + +func (x *TripUpdate_TripProperties) GetStartTime() string { + if x != nil && x.StartTime != nil { + return *x.StartTime + } + return "" +} + +func (x *TripUpdate_TripProperties) GetShapeId() string { + if x != nil && x.ShapeId != nil { + return *x.ShapeId + } + return "" +} + +// Provides the updated values for the stop time. +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +type TripUpdate_StopTimeUpdate_StopTimeProperties struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Supports real-time stop assignments. Refers to a stop_id defined in the GTFS stops.txt. + // The new assigned_stop_id should not result in a significantly different trip experience for the end user than + // the stop_id defined in GTFS stop_times.txt. In other words, the end user should not view this new stop_id as an + // "unusual change" if the new stop was presented within an app without any additional context. + // For example, this field is intended to be used for platform assignments by using a stop_id that belongs to the + // same station as the stop originally defined in GTFS stop_times.txt. + // To assign a stop without providing any real-time arrival or departure predictions, populate this field and set + // StopTimeUpdate.schedule_relationship = NO_DATA. + // If this field is populated, it is preferred to omit `StopTimeUpdate.stop_id` and use only `StopTimeUpdate.stop_sequence`. If + // `StopTimeProperties.assigned_stop_id` and `StopTimeUpdate.stop_id` are populated, `StopTimeUpdate.stop_id` must match `assigned_stop_id`. + // Platform assignments should be reflected in other GTFS-realtime fields as well + // (e.g., `VehiclePosition.stop_id`). + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + AssignedStopId *string `protobuf:"bytes,1,opt,name=assigned_stop_id,json=assignedStopId" json:"assigned_stop_id,omitempty"` +} + +func (x *TripUpdate_StopTimeUpdate_StopTimeProperties) Reset() { + *x = TripUpdate_StopTimeUpdate_StopTimeProperties{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[21] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripUpdate_StopTimeUpdate_StopTimeProperties) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripUpdate_StopTimeUpdate_StopTimeProperties) ProtoMessage() {} + +func (x *TripUpdate_StopTimeUpdate_StopTimeProperties) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[21] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripUpdate_StopTimeUpdate_StopTimeProperties.ProtoReflect.Descriptor instead. +func (*TripUpdate_StopTimeUpdate_StopTimeProperties) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{3, 1, 0} +} + +func (x *TripUpdate_StopTimeUpdate_StopTimeProperties) GetAssignedStopId() string { + if x != nil && x.AssignedStopId != nil { + return *x.AssignedStopId + } + return "" +} + +// Carriage specific details, used for vehicles composed of several carriages +// This message/field is still experimental, and subject to change. It may be formally adopted in the future. +type VehiclePosition_CarriageDetails struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // Identification of the carriage. Should be unique per vehicle. + Id *string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"` + // User visible label that may be shown to the passenger to help identify + // the carriage. Example: "7712", "Car ABC-32", etc... + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + Label *string `protobuf:"bytes,2,opt,name=label" json:"label,omitempty"` + // Occupancy status for this given carriage, in this vehicle + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + OccupancyStatus *VehiclePosition_OccupancyStatus `protobuf:"varint,3,opt,name=occupancy_status,json=occupancyStatus,enum=transit_realtime.VehiclePosition_OccupancyStatus,def=7" json:"occupancy_status,omitempty"` + // Occupancy percentage for this given carriage, in this vehicle. + // Follows the same rules as "VehiclePosition.occupancy_percentage" + // -1 in case data is not available for this given carriage (as protobuf defaults to 0 otherwise) + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + OccupancyPercentage *int32 `protobuf:"varint,4,opt,name=occupancy_percentage,json=occupancyPercentage,def=-1" json:"occupancy_percentage,omitempty"` + // Identifies the order of this carriage with respect to the other + // carriages in the vehicle's list of CarriageDetails. + // The first carriage in the direction of travel must have a value of 1. + // The second value corresponds to the second carriage in the direction + // of travel and must have a value of 2, and so forth. + // For example, the first carriage in the direction of travel has a value of 1. + // If the second carriage in the direction of travel has a value of 3, + // consumers will discard data for all carriages (i.e., the multi_carriage_details field). + // Carriages without data must be represented with a valid carriage_sequence number and the fields + // without data should be omitted (alternately, those fields could also be included and set to the "no data" values). + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + CarriageSequence *uint32 `protobuf:"varint,5,opt,name=carriage_sequence,json=carriageSequence" json:"carriage_sequence,omitempty"` +} + +// Default values for VehiclePosition_CarriageDetails fields. +const ( + Default_VehiclePosition_CarriageDetails_OccupancyStatus = VehiclePosition_NO_DATA_AVAILABLE + Default_VehiclePosition_CarriageDetails_OccupancyPercentage = int32(-1) +) + +func (x *VehiclePosition_CarriageDetails) Reset() { + *x = VehiclePosition_CarriageDetails{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *VehiclePosition_CarriageDetails) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*VehiclePosition_CarriageDetails) ProtoMessage() {} + +func (x *VehiclePosition_CarriageDetails) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use VehiclePosition_CarriageDetails.ProtoReflect.Descriptor instead. +func (*VehiclePosition_CarriageDetails) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{4, 0} +} + +func (x *VehiclePosition_CarriageDetails) GetId() string { + if x != nil && x.Id != nil { + return *x.Id + } + return "" +} + +func (x *VehiclePosition_CarriageDetails) GetLabel() string { + if x != nil && x.Label != nil { + return *x.Label + } + return "" +} + +func (x *VehiclePosition_CarriageDetails) GetOccupancyStatus() VehiclePosition_OccupancyStatus { + if x != nil && x.OccupancyStatus != nil { + return *x.OccupancyStatus + } + return Default_VehiclePosition_CarriageDetails_OccupancyStatus +} + +func (x *VehiclePosition_CarriageDetails) GetOccupancyPercentage() int32 { + if x != nil && x.OccupancyPercentage != nil { + return *x.OccupancyPercentage + } + return Default_VehiclePosition_CarriageDetails_OccupancyPercentage +} + +func (x *VehiclePosition_CarriageDetails) GetCarriageSequence() uint32 { + if x != nil && x.CarriageSequence != nil { + return *x.CarriageSequence + } + return 0 +} + +type TripDescriptor_ModifiedTripSelector struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The 'id' from the FeedEntity in which the contained TripModifications object affects this trip. + ModificationsId *string `protobuf:"bytes,1,opt,name=modifications_id,json=modificationsId" json:"modifications_id,omitempty"` + // The trip_id from the GTFS feed that is modified by the modifications_id + AffectedTripId *string `protobuf:"bytes,2,opt,name=affected_trip_id,json=affectedTripId" json:"affected_trip_id,omitempty"` +} + +func (x *TripDescriptor_ModifiedTripSelector) Reset() { + *x = TripDescriptor_ModifiedTripSelector{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[23] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripDescriptor_ModifiedTripSelector) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripDescriptor_ModifiedTripSelector) ProtoMessage() {} + +func (x *TripDescriptor_ModifiedTripSelector) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[23] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripDescriptor_ModifiedTripSelector.ProtoReflect.Descriptor instead. +func (*TripDescriptor_ModifiedTripSelector) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{8, 0} +} + +func (x *TripDescriptor_ModifiedTripSelector) GetModificationsId() string { + if x != nil && x.ModificationsId != nil { + return *x.ModificationsId + } + return "" +} + +func (x *TripDescriptor_ModifiedTripSelector) GetAffectedTripId() string { + if x != nil && x.AffectedTripId != nil { + return *x.AffectedTripId + } + return "" +} + +type TranslatedString_Translation struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // A UTF-8 string containing the message. + Text *string `protobuf:"bytes,1,req,name=text" json:"text,omitempty"` + // BCP-47 language code. Can be omitted if the language is unknown or if + // no i18n is done at all for the feed. At most one translation is + // allowed to have an unspecified language tag. + Language *string `protobuf:"bytes,2,opt,name=language" json:"language,omitempty"` +} + +func (x *TranslatedString_Translation) Reset() { + *x = TranslatedString_Translation{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[24] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TranslatedString_Translation) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TranslatedString_Translation) ProtoMessage() {} + +func (x *TranslatedString_Translation) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[24] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TranslatedString_Translation.ProtoReflect.Descriptor instead. +func (*TranslatedString_Translation) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{11, 0} } func (x *TranslatedString_Translation) GetText() string { @@ -2141,9 +3283,248 @@ func (x *TranslatedString_Translation) GetText() string { return "" } -func (x *TranslatedString_Translation) GetLanguage() string { - if x != nil && x.Language != nil { - return *x.Language +func (x *TranslatedString_Translation) GetLanguage() string { + if x != nil && x.Language != nil { + return *x.Language + } + return "" +} + +type TranslatedImage_LocalizedImage struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // String containing an URL linking to an image + // The image linked must be less than 2MB. + // If an image changes in a significant enough way that an update is required on the consumer side, the producer must update the URL to a new one. + // The URL should be a fully qualified URL that includes http:// or https://, and any special characters in the URL must be correctly escaped. See the following http://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URL values. + Url *string `protobuf:"bytes,1,req,name=url" json:"url,omitempty"` + // IANA media type as to specify the type of image to be displayed. + // The type must start with "image/" + MediaType *string `protobuf:"bytes,2,req,name=media_type,json=mediaType" json:"media_type,omitempty"` + // BCP-47 language code. Can be omitted if the language is unknown or if + // no i18n is done at all for the feed. At most one translation is + // allowed to have an unspecified language tag. + Language *string `protobuf:"bytes,3,opt,name=language" json:"language,omitempty"` +} + +func (x *TranslatedImage_LocalizedImage) Reset() { + *x = TranslatedImage_LocalizedImage{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[25] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TranslatedImage_LocalizedImage) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TranslatedImage_LocalizedImage) ProtoMessage() {} + +func (x *TranslatedImage_LocalizedImage) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[25] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TranslatedImage_LocalizedImage.ProtoReflect.Descriptor instead. +func (*TranslatedImage_LocalizedImage) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{12, 0} +} + +func (x *TranslatedImage_LocalizedImage) GetUrl() string { + if x != nil && x.Url != nil { + return *x.Url + } + return "" +} + +func (x *TranslatedImage_LocalizedImage) GetMediaType() string { + if x != nil && x.MediaType != nil { + return *x.MediaType + } + return "" +} + +func (x *TranslatedImage_LocalizedImage) GetLanguage() string { + if x != nil && x.Language != nil { + return *x.Language + } + return "" +} + +// A `Modification` message replaces a span of n stop times from each affected trip starting at `start_stop_selector`. +type TripModifications_Modification struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // The stop selector of the first stop_time of the original trip that is to be affected by this modification. + // Used in conjuction with `end_stop_selector`. + // `start_stop_selector` is required and is used to define the reference stop used with `travel_time_to_stop`. + StartStopSelector *StopSelector `protobuf:"bytes,1,opt,name=start_stop_selector,json=startStopSelector" json:"start_stop_selector,omitempty"` + // The stop selector of the last stop of the original trip that is to be affected by this modification. + // The selection is inclusive, so if only one stop_time is replaced by that modification, `start_stop_selector` and `end_stop_selector` must be equivalent. + // If no stop_time is replaced, `end_stop_selector` must not be provided. It's otherwise required. + EndStopSelector *StopSelector `protobuf:"bytes,2,opt,name=end_stop_selector,json=endStopSelector" json:"end_stop_selector,omitempty"` + // The number of seconds of delay to add to all departure and arrival times following the end of this modification. + // If multiple modifications apply to the same trip, the delays accumulate as the trip advances. + PropagatedModificationDelay *int32 `protobuf:"varint,3,opt,name=propagated_modification_delay,json=propagatedModificationDelay,def=0" json:"propagated_modification_delay,omitempty"` + // A list of replacement stops, replacing those of the original trip. + // The length of the new stop times may be less, the same, or greater than the number of replaced stop times. + ReplacementStops []*ReplacementStop `protobuf:"bytes,4,rep,name=replacement_stops,json=replacementStops" json:"replacement_stops,omitempty"` + // An `id` value from the `FeedEntity` message that contains the `Alert` describing this Modification for user-facing communication. + ServiceAlertId *string `protobuf:"bytes,5,opt,name=service_alert_id,json=serviceAlertId" json:"service_alert_id,omitempty"` + // This timestamp identifies the moment when the modification has last been changed. + // In POSIX time (i.e., number of seconds since January 1st 1970 00:00:00 UTC). + LastModifiedTime *uint64 `protobuf:"varint,6,opt,name=last_modified_time,json=lastModifiedTime" json:"last_modified_time,omitempty"` +} + +// Default values for TripModifications_Modification fields. +const ( + Default_TripModifications_Modification_PropagatedModificationDelay = int32(0) +) + +func (x *TripModifications_Modification) Reset() { + *x = TripModifications_Modification{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[26] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripModifications_Modification) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripModifications_Modification) ProtoMessage() {} + +func (x *TripModifications_Modification) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[26] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripModifications_Modification.ProtoReflect.Descriptor instead. +func (*TripModifications_Modification) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{15, 0} +} + +func (x *TripModifications_Modification) GetStartStopSelector() *StopSelector { + if x != nil { + return x.StartStopSelector + } + return nil +} + +func (x *TripModifications_Modification) GetEndStopSelector() *StopSelector { + if x != nil { + return x.EndStopSelector + } + return nil +} + +func (x *TripModifications_Modification) GetPropagatedModificationDelay() int32 { + if x != nil && x.PropagatedModificationDelay != nil { + return *x.PropagatedModificationDelay + } + return Default_TripModifications_Modification_PropagatedModificationDelay +} + +func (x *TripModifications_Modification) GetReplacementStops() []*ReplacementStop { + if x != nil { + return x.ReplacementStops + } + return nil +} + +func (x *TripModifications_Modification) GetServiceAlertId() string { + if x != nil && x.ServiceAlertId != nil { + return *x.ServiceAlertId + } + return "" +} + +func (x *TripModifications_Modification) GetLastModifiedTime() uint64 { + if x != nil && x.LastModifiedTime != nil { + return *x.LastModifiedTime + } + return 0 +} + +type TripModifications_SelectedTrips struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + extensionFields protoimpl.ExtensionFields + + // A list of trips affected with this replacement that all have the same new `shape_id`. + TripIds []string `protobuf:"bytes,1,rep,name=trip_ids,json=tripIds" json:"trip_ids,omitempty"` + // The ID of the new shape for the modified trips in this SelectedTrips. + // May refer to a new shape added using a GTFS-RT Shape message, or to an existing shape defined in the GTFS-Static feed’s shapes.txt. + ShapeId *string `protobuf:"bytes,2,opt,name=shape_id,json=shapeId" json:"shape_id,omitempty"` +} + +func (x *TripModifications_SelectedTrips) Reset() { + *x = TripModifications_SelectedTrips{} + if protoimpl.UnsafeEnabled { + mi := &file_proto_gtfs_realtime_proto_msgTypes[27] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TripModifications_SelectedTrips) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TripModifications_SelectedTrips) ProtoMessage() {} + +func (x *TripModifications_SelectedTrips) ProtoReflect() protoreflect.Message { + mi := &file_proto_gtfs_realtime_proto_msgTypes[27] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TripModifications_SelectedTrips.ProtoReflect.Descriptor instead. +func (*TripModifications_SelectedTrips) Descriptor() ([]byte, []int) { + return file_proto_gtfs_realtime_proto_rawDescGZIP(), []int{15, 1} +} + +func (x *TripModifications_SelectedTrips) GetTripIds() []string { + if x != nil { + return x.TripIds + } + return nil +} + +func (x *TripModifications_SelectedTrips) GetShapeId() string { + if x != nil && x.ShapeId != nil { + return *x.ShapeId } return "" } @@ -2179,7 +3560,7 @@ var file_proto_gtfs_realtime_proto_rawDesc = []byte{ 0x10, 0x0a, 0x0c, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x53, 0x45, 0x54, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x44, 0x49, 0x46, 0x46, 0x45, 0x52, 0x45, 0x4e, 0x54, 0x49, 0x41, 0x4c, 0x10, 0x01, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, - 0x10, 0x90, 0x4e, 0x22, 0xfd, 0x01, 0x0a, 0x0a, 0x46, 0x65, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, + 0x10, 0x90, 0x4e, 0x22, 0xac, 0x03, 0x0a, 0x0a, 0x46, 0x65, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x24, 0x0a, 0x0a, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x3a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x09, 0x69, @@ -2194,284 +3575,536 @@ var file_proto_gtfs_realtime_proto_rawDesc = []byte{ 0x69, 0x63, 0x6c, 0x65, 0x12, 0x2d, 0x0a, 0x05, 0x61, 0x6c, 0x65, 0x72, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, - 0x65, 0x72, 0x74, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, - 0x10, 0x90, 0x4e, 0x22, 0xcf, 0x06, 0x0a, 0x0a, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, - 0x6f, 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, - 0x63, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, - 0x69, 0x63, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, - 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0e, - 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c, - 0x61, 0x79, 0x1a, 0x6b, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x75, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x74, 0x79, 0x2a, - 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x1a, - 0xc3, 0x03, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, - 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x53, - 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, - 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x64, - 0x12, 0x44, 0x0a, 0x07, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x12, 0x48, 0x0a, 0x09, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, - 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, - 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x80, 0x01, 0x0a, 0x15, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x40, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x65, 0x72, 0x74, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x68, 0x61, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x68, 0x61, 0x70, 0x65, 0x52, 0x05, 0x73, 0x68, 0x61, + 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, + 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x04, 0x73, 0x74, 0x6f, 0x70, 0x12, 0x52, + 0x0a, 0x12, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, + 0x69, 0x70, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x11, 0x74, 0x72, 0x69, 0x70, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, + 0x90, 0x4e, 0x22, 0xed, 0x0a, 0x0a, 0x0a, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, + 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, + 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, 0x3d, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, + 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x76, + 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x55, 0x0a, 0x10, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, - 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x63, - 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, - 0x69, 0x70, 0x3a, 0x09, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x52, 0x14, 0x73, + 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x0e, 0x73, + 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, + 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x64, + 0x65, 0x6c, 0x61, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x12, 0x54, 0x0a, 0x0f, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, + 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0e, 0x74, 0x72, 0x69, 0x70, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x6b, 0x0a, 0x0d, 0x53, 0x74, 0x6f, 0x70, 0x54, + 0x69, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x75, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x74, + 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x75, 0x6e, 0x63, 0x65, 0x72, 0x74, 0x61, + 0x69, 0x6e, 0x74, 0x79, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, + 0x46, 0x10, 0x90, 0x4e, 0x1a, 0xf6, 0x05, 0x0a, 0x0e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, + 0x73, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, + 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, + 0x74, 0x6f, 0x70, 0x49, 0x64, 0x12, 0x44, 0x0a, 0x07, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x12, 0x48, 0x0a, 0x09, 0x64, + 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x54, 0x69, 0x6d, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x09, 0x64, 0x65, 0x70, 0x61, + 0x72, 0x74, 0x75, 0x72, 0x65, 0x12, 0x6f, 0x0a, 0x1a, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, + 0x72, 0x65, 0x5f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, + 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x63, 0x63, + 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x18, 0x64, 0x65, + 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x15, 0x73, 0x63, 0x68, 0x65, 0x64, + 0x75, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x40, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x3a, 0x09, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, + 0x4c, 0x45, 0x44, 0x52, 0x14, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x12, 0x70, 0x0a, 0x14, 0x73, 0x74, 0x6f, + 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, + 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x52, 0x12, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, 0x1a, 0x4e, 0x0a, 0x12, 0x53, + 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, + 0x73, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x73, 0x73, 0x69, 0x67, 0x6e, 0x65, 0x64, 0x5f, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x73, 0x73, + 0x69, 0x67, 0x6e, 0x65, 0x64, 0x53, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, + 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x50, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x68, 0x69, 0x70, 0x22, 0x50, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4b, - 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x44, 0x41, - 0x54, 0x41, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, - 0x4c, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, - 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, - 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x8d, 0x08, 0x0a, 0x0f, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, - 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, - 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, - 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, - 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, - 0x3d, 0x0a, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x36, - 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x6f, 0x70, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, - 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, - 0x70, 0x49, 0x64, 0x12, 0x69, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x3a, 0x0d, 0x49, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x5f, 0x54, 0x4f, 0x52, - 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, - 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5c, 0x0a, 0x10, - 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, - 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, - 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x67, 0x65, - 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5c, 0x0a, 0x10, 0x6f, 0x63, - 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, - 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, - 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, - 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x6f, 0x63, 0x63, 0x75, - 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, - 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x22, 0x47, 0x0a, 0x11, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x49, 0x4e, 0x47, 0x5f, 0x41, 0x54, 0x10, - 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, 0x44, 0x5f, 0x41, 0x54, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x5f, - 0x54, 0x4f, 0x10, 0x02, 0x22, 0x7d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, - 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x18, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, - 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x45, - 0x56, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, 0x4e, 0x4e, 0x49, 0x4e, 0x47, - 0x5f, 0x53, 0x4d, 0x4f, 0x4f, 0x54, 0x48, 0x4c, 0x59, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x53, - 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x47, 0x4f, 0x10, 0x02, 0x12, 0x0e, 0x0a, 0x0a, - 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x03, 0x12, 0x15, 0x0a, 0x11, - 0x53, 0x45, 0x56, 0x45, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x04, 0x22, 0xaf, 0x01, 0x0a, 0x0f, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, - 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x0a, 0x05, 0x45, 0x4d, 0x50, 0x54, 0x59, - 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x41, 0x4e, 0x59, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, - 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, - 0x46, 0x45, 0x57, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, - 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x03, 0x12, 0x1e, 0x0a, - 0x1a, 0x43, 0x52, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x49, 0x4e, - 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x04, 0x12, 0x08, 0x0a, - 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, 0x4e, 0x4f, 0x54, 0x5f, 0x41, - 0x43, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, 0x53, 0x53, 0x45, 0x4e, 0x47, - 0x45, 0x52, 0x53, 0x10, 0x06, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, - 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x81, 0x0a, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, - 0x40, 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, - 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, - 0x6e, 0x67, 0x65, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x12, 0x49, 0x0a, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0e, 0x69, 0x6e, - 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x05, - 0x63, 0x61, 0x75, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x41, - 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x3a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, - 0x12, 0x46, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, - 0x3a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, - 0x52, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, - 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, - 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x43, - 0x0a, 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, - 0x65, 0x78, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x68, 0x69, 0x70, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x4b, 0x49, 0x50, 0x50, 0x45, 0x44, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x4e, 0x4f, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x10, 0x02, 0x12, 0x0f, 0x0a, 0x0b, + 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x06, 0x08, + 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x1a, 0x92, 0x01, + 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x70, 0x50, 0x72, 0x6f, 0x70, 0x65, 0x72, 0x74, 0x69, 0x65, 0x73, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x06, 0x74, 0x72, 0x69, 0x70, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x68, 0x61, 0x70, 0x65, + 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, + 0x90, 0x4e, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, + 0x90, 0x4e, 0x22, 0xbf, 0x0b, 0x0a, 0x0f, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, 0x3d, 0x0a, 0x07, + 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, - 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, - 0x78, 0x74, 0x12, 0x4a, 0x0a, 0x0f, 0x74, 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, + 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, + 0x6f, 0x72, 0x52, 0x07, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x36, 0x0a, 0x08, 0x70, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x13, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, + 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x64, + 0x12, 0x69, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x33, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x0d, 0x49, + 0x4e, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x49, 0x54, 0x5f, 0x54, 0x4f, 0x52, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x5c, 0x0a, 0x10, 0x63, 0x6f, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, + 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x67, 0x65, 0x73, 0x74, 0x69, + 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x5c, 0x0a, 0x10, 0x6f, 0x63, 0x63, 0x75, 0x70, + 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x0f, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x31, 0x0a, 0x14, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, + 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x13, 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x50, 0x65, + 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x67, 0x0a, 0x16, 0x6d, 0x75, 0x6c, 0x74, + 0x69, 0x5f, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, + 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x43, 0x61, 0x72, 0x72, + 0x69, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x14, 0x6d, 0x75, 0x6c, + 0x74, 0x69, 0x43, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x1a, 0x9c, 0x02, 0x0a, 0x0f, 0x43, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x6f, 0x0a, 0x10, 0x6f, + 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, + 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, + 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x3a, 0x11, 0x4e, 0x4f, 0x5f, 0x44, 0x41, 0x54, + 0x41, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x52, 0x0f, 0x6f, 0x63, 0x63, + 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x35, 0x0a, 0x14, + 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x3a, 0x02, 0x2d, 0x31, 0x52, 0x13, + 0x6f, 0x63, 0x63, 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, + 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, + 0x63, 0x61, 0x72, 0x72, 0x69, 0x61, 0x67, 0x65, 0x53, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, + 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, + 0x22, 0x47, 0x0a, 0x11, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x0f, 0x0a, 0x0b, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x49, 0x4e, + 0x47, 0x5f, 0x41, 0x54, 0x10, 0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x50, 0x50, 0x45, + 0x44, 0x5f, 0x41, 0x54, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x49, 0x4e, 0x5f, 0x54, 0x52, 0x41, + 0x4e, 0x53, 0x49, 0x54, 0x5f, 0x54, 0x4f, 0x10, 0x02, 0x22, 0x7d, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, + 0x67, 0x65, 0x73, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x1c, 0x0a, 0x18, + 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, + 0x4f, 0x4e, 0x5f, 0x4c, 0x45, 0x56, 0x45, 0x4c, 0x10, 0x00, 0x12, 0x14, 0x0a, 0x10, 0x52, 0x55, + 0x4e, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x4d, 0x4f, 0x4f, 0x54, 0x48, 0x4c, 0x59, 0x10, 0x01, + 0x12, 0x0f, 0x0a, 0x0b, 0x53, 0x54, 0x4f, 0x50, 0x5f, 0x41, 0x4e, 0x44, 0x5f, 0x47, 0x4f, 0x10, + 0x02, 0x12, 0x0e, 0x0a, 0x0a, 0x43, 0x4f, 0x4e, 0x47, 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, + 0x03, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x45, 0x56, 0x45, 0x52, 0x45, 0x5f, 0x43, 0x4f, 0x4e, 0x47, + 0x45, 0x53, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x04, 0x22, 0xd9, 0x01, 0x0a, 0x0f, 0x4f, 0x63, 0x63, + 0x75, 0x70, 0x61, 0x6e, 0x63, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x09, 0x0a, 0x05, + 0x45, 0x4d, 0x50, 0x54, 0x59, 0x10, 0x00, 0x12, 0x18, 0x0a, 0x14, 0x4d, 0x41, 0x4e, 0x59, 0x5f, + 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x01, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x57, 0x5f, 0x53, 0x45, 0x41, 0x54, 0x53, 0x5f, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x54, + 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x03, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x52, 0x55, 0x53, 0x48, 0x45, 0x44, 0x5f, 0x53, 0x54, + 0x41, 0x4e, 0x44, 0x49, 0x4e, 0x47, 0x5f, 0x52, 0x4f, 0x4f, 0x4d, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, + 0x10, 0x04, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x05, 0x12, 0x1c, 0x0a, 0x18, + 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x50, 0x54, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x41, + 0x53, 0x53, 0x45, 0x4e, 0x47, 0x45, 0x52, 0x53, 0x10, 0x06, 0x12, 0x15, 0x0a, 0x11, 0x4e, 0x4f, + 0x5f, 0x44, 0x41, 0x54, 0x41, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, + 0x07, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, 0x54, 0x5f, 0x42, 0x4f, 0x41, 0x52, 0x44, 0x41, 0x42, + 0x4c, 0x45, 0x10, 0x08, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, + 0x46, 0x10, 0x90, 0x4e, 0x22, 0xa4, 0x0c, 0x0a, 0x05, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x12, 0x40, + 0x0a, 0x0d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, + 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x12, 0x49, 0x0a, 0x0f, 0x69, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x65, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x45, 0x6e, 0x74, + 0x69, 0x74, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0e, 0x69, 0x6e, 0x66, + 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x42, 0x0a, 0x05, 0x63, + 0x61, 0x75, 0x73, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x41, 0x6c, + 0x65, 0x72, 0x74, 0x2e, 0x43, 0x61, 0x75, 0x73, 0x65, 0x3a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, 0x52, 0x05, 0x63, 0x61, 0x75, 0x73, 0x65, 0x12, + 0x46, 0x0a, 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x3a, + 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x52, + 0x06, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x34, 0x0a, 0x03, 0x75, 0x72, 0x6c, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x43, 0x0a, + 0x0b, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0a, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x65, + 0x78, 0x74, 0x12, 0x4d, 0x0a, 0x10, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x0f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x65, 0x78, + 0x74, 0x12, 0x4a, 0x0a, 0x0f, 0x74, 0x74, 0x73, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x5f, + 0x74, 0x65, 0x78, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0d, + 0x74, 0x74, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x65, 0x78, 0x74, 0x12, 0x54, 0x0a, + 0x14, 0x74, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x0d, 0x74, 0x74, 0x73, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x54, 0x65, 0x78, 0x74, 0x12, 0x54, - 0x0a, 0x14, 0x74, 0x74, 0x73, 0x5f, 0x64, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x12, 0x74, 0x74, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x65, 0x78, 0x74, 0x12, 0x5e, 0x0a, 0x0e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x5f, + 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x41, + 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x3a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, + 0x52, 0x49, 0x54, 0x59, 0x52, 0x0d, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, + 0x76, 0x65, 0x6c, 0x12, 0x37, 0x0a, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0f, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, + 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x05, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x58, 0x0a, 0x16, + 0x69, 0x6d, 0x61, 0x67, 0x65, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, + 0x65, 0x5f, 0x74, 0x65, 0x78, 0x74, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, + 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x14, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x41, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, + 0x76, 0x65, 0x54, 0x65, 0x78, 0x74, 0x12, 0x45, 0x0a, 0x0c, 0x63, 0x61, 0x75, 0x73, 0x65, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x12, 0x74, 0x74, 0x73, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x69, 0x6f, 0x6e, - 0x54, 0x65, 0x78, 0x74, 0x12, 0x5e, 0x0a, 0x0e, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, - 0x5f, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x25, 0x2e, 0x74, + 0x52, 0x0b, 0x63, 0x61, 0x75, 0x73, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x47, 0x0a, + 0x0d, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x12, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, + 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x22, 0xd8, 0x01, 0x0a, 0x05, 0x43, 0x61, 0x75, 0x73, 0x65, + 0x12, 0x11, 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x41, 0x55, 0x53, + 0x45, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x55, + 0x53, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, + 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x42, 0x4c, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, + 0x54, 0x52, 0x49, 0x4b, 0x45, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4d, 0x4f, 0x4e, + 0x53, 0x54, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x43, + 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x4f, 0x4c, 0x49, + 0x44, 0x41, 0x59, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x45, 0x41, 0x54, 0x48, 0x45, 0x52, + 0x10, 0x08, 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, + 0x45, 0x10, 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, + 0x49, 0x4f, 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x45, 0x5f, + 0x41, 0x43, 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x45, + 0x44, 0x49, 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x10, + 0x0c, 0x22, 0xdd, 0x01, 0x0a, 0x06, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x0a, + 0x4e, 0x4f, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, + 0x52, 0x45, 0x44, 0x55, 0x43, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, + 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x49, 0x47, 0x4e, 0x49, 0x46, 0x49, 0x43, 0x41, 0x4e, 0x54, + 0x5f, 0x44, 0x45, 0x4c, 0x41, 0x59, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x54, + 0x4f, 0x55, 0x52, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x44, 0x49, 0x54, 0x49, 0x4f, + 0x4e, 0x41, 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x05, 0x12, 0x14, 0x0a, + 0x10, 0x4d, 0x4f, 0x44, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, + 0x45, 0x10, 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x46, 0x46, + 0x45, 0x43, 0x54, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, + 0x50, 0x5f, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, + 0x45, 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, 0x45, + 0x53, 0x53, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, + 0x0b, 0x22, 0x48, 0x0a, 0x0d, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, + 0x65, 0x6c, 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, + 0x56, 0x45, 0x52, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, + 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, + 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x56, 0x45, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x06, 0x08, 0xe8, 0x07, + 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x43, 0x0a, 0x09, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, + 0x0a, 0x03, 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x65, 0x6e, 0x64, + 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, + 0x22, 0xa0, 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, + 0x08, 0x6c, 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, + 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, + 0x6e, 0x67, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, + 0x67, 0x12, 0x1a, 0x0a, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x01, 0x52, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, + 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x73, 0x70, + 0x65, 0x65, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, + 0x10, 0x90, 0x4e, 0x22, 0xee, 0x04, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, + 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x72, 0x69, 0x70, 0x49, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, + 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x6a, 0x0a, 0x15, 0x73, + 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, + 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, + 0x70, 0x52, 0x14, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x12, 0x5a, 0x0a, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, + 0x2e, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, 0x72, 0x69, 0x70, 0x53, 0x65, 0x6c, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0c, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, + 0x72, 0x69, 0x70, 0x1a, 0x6b, 0x0a, 0x14, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x54, + 0x72, 0x69, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x29, 0x0a, 0x10, 0x6d, + 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, + 0x65, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x72, 0x69, 0x70, 0x49, 0x64, + 0x22, 0x81, 0x01, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x43, 0x48, + 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x41, 0x44, 0x44, 0x45, + 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, + 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, + 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0b, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, + 0x54, 0x10, 0x05, 0x1a, 0x02, 0x08, 0x01, 0x12, 0x0e, 0x0a, 0x0a, 0x44, 0x55, 0x50, 0x4c, 0x49, + 0x43, 0x41, 0x54, 0x45, 0x44, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x44, 0x10, 0x07, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, + 0x46, 0x10, 0x90, 0x4e, 0x22, 0xd2, 0x02, 0x0a, 0x11, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, + 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, + 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, + 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, + 0x50, 0x6c, 0x61, 0x74, 0x65, 0x12, 0x77, 0x0a, 0x15, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, + 0x61, 0x69, 0x72, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x38, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, + 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x44, + 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x57, 0x68, 0x65, 0x65, 0x6c, 0x63, + 0x68, 0x61, 0x69, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x3a, 0x08, + 0x4e, 0x4f, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x52, 0x14, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, + 0x68, 0x61, 0x69, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x22, 0x69, + 0x0a, 0x14, 0x57, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x72, 0x41, 0x63, 0x63, 0x65, + 0x73, 0x73, 0x69, 0x62, 0x6c, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4e, 0x4f, 0x5f, 0x56, 0x41, 0x4c, + 0x55, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, + 0x01, 0x12, 0x19, 0x0a, 0x15, 0x57, 0x48, 0x45, 0x45, 0x4c, 0x43, 0x48, 0x41, 0x49, 0x52, 0x5f, + 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x12, 0x1b, 0x0a, 0x17, + 0x57, 0x48, 0x45, 0x45, 0x4c, 0x43, 0x48, 0x41, 0x49, 0x52, 0x5f, 0x49, 0x4e, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, + 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xe9, 0x01, 0x0a, 0x0e, 0x45, 0x6e, + 0x74, 0x69, 0x74, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, 0x0a, 0x09, + 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, + 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, + 0x74, 0x6f, 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, + 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, + 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, + 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x50, 0x0a, 0x0b, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, + 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4d, 0x0a, 0x0b, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x12, + 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2a, 0x06, 0x08, 0xe8, 0x07, + 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x2a, 0x06, 0x08, 0xe8, 0x07, + 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xeb, 0x01, 0x0a, 0x0f, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, + 0x59, 0x0a, 0x0f, 0x6c, 0x6f, 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x5f, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, + 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x2e, 0x4c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x52, 0x0e, 0x6c, 0x6f, 0x63, 0x61, + 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x1a, 0x6d, 0x0a, 0x0e, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x69, 0x7a, 0x65, 0x64, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x10, 0x0a, 0x03, + 0x75, 0x72, 0x6c, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x03, 0x75, 0x72, 0x6c, 0x12, 0x1d, + 0x0a, 0x0a, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x02, + 0x28, 0x09, 0x52, 0x09, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, + 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, + 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x5d, 0x0a, 0x05, 0x53, 0x68, 0x61, + 0x70, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x68, 0x61, 0x70, 0x65, 0x49, 0x64, 0x12, 0x29, 0x0a, + 0x10, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, + 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, + 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xa2, 0x06, 0x0a, 0x04, 0x53, 0x74, 0x6f, + 0x70, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, + 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x3f, 0x0a, 0x09, 0x73, + 0x74, 0x6f, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, + 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x46, 0x0a, 0x0d, + 0x74, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0b, 0x74, 0x74, 0x73, 0x53, 0x74, 0x6f, 0x70, + 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x3f, 0x0a, 0x09, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x64, 0x65, 0x73, + 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x08, 0x73, 0x74, 0x6f, + 0x70, 0x44, 0x65, 0x73, 0x63, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x61, + 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4c, 0x61, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x6c, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x02, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x4c, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x07, 0x7a, + 0x6f, 0x6e, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x7a, 0x6f, + 0x6e, 0x65, 0x49, 0x64, 0x12, 0x3d, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x75, 0x72, 0x6c, + 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x73, 0x74, 0x6f, 0x70, + 0x55, 0x72, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, + 0x6f, 0x70, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x7a, 0x6f, 0x6e, 0x65, 0x12, + 0x63, 0x0a, 0x13, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x72, 0x5f, 0x62, 0x6f, + 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, - 0x41, 0x6c, 0x65, 0x72, 0x74, 0x2e, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, - 0x76, 0x65, 0x6c, 0x3a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, 0x56, - 0x45, 0x52, 0x49, 0x54, 0x59, 0x52, 0x0d, 0x73, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, - 0x65, 0x76, 0x65, 0x6c, 0x22, 0xd8, 0x01, 0x0a, 0x05, 0x43, 0x61, 0x75, 0x73, 0x65, 0x12, 0x11, - 0x0a, 0x0d, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, 0x10, - 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x43, 0x41, 0x55, 0x53, 0x45, - 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x54, 0x45, 0x43, 0x48, 0x4e, 0x49, 0x43, 0x41, 0x4c, 0x5f, - 0x50, 0x52, 0x4f, 0x42, 0x4c, 0x45, 0x4d, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x54, 0x52, - 0x49, 0x4b, 0x45, 0x10, 0x04, 0x12, 0x11, 0x0a, 0x0d, 0x44, 0x45, 0x4d, 0x4f, 0x4e, 0x53, 0x54, - 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x05, 0x12, 0x0c, 0x0a, 0x08, 0x41, 0x43, 0x43, 0x49, - 0x44, 0x45, 0x4e, 0x54, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x48, 0x4f, 0x4c, 0x49, 0x44, 0x41, - 0x59, 0x10, 0x07, 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x45, 0x41, 0x54, 0x48, 0x45, 0x52, 0x10, 0x08, - 0x12, 0x0f, 0x0a, 0x0b, 0x4d, 0x41, 0x49, 0x4e, 0x54, 0x45, 0x4e, 0x41, 0x4e, 0x43, 0x45, 0x10, - 0x09, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x4f, 0x4e, 0x53, 0x54, 0x52, 0x55, 0x43, 0x54, 0x49, 0x4f, - 0x4e, 0x10, 0x0a, 0x12, 0x13, 0x0a, 0x0f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x45, 0x5f, 0x41, 0x43, - 0x54, 0x49, 0x56, 0x49, 0x54, 0x59, 0x10, 0x0b, 0x12, 0x15, 0x0a, 0x11, 0x4d, 0x45, 0x44, 0x49, - 0x43, 0x41, 0x4c, 0x5f, 0x45, 0x4d, 0x45, 0x52, 0x47, 0x45, 0x4e, 0x43, 0x59, 0x10, 0x0c, 0x22, - 0xdd, 0x01, 0x0a, 0x06, 0x45, 0x66, 0x66, 0x65, 0x63, 0x74, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, - 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x01, 0x12, 0x13, 0x0a, 0x0f, 0x52, 0x45, - 0x44, 0x55, 0x43, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x02, 0x12, - 0x16, 0x0a, 0x12, 0x53, 0x49, 0x47, 0x4e, 0x49, 0x46, 0x49, 0x43, 0x41, 0x4e, 0x54, 0x5f, 0x44, - 0x45, 0x4c, 0x41, 0x59, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x54, 0x4f, 0x55, - 0x52, 0x10, 0x04, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x44, 0x44, 0x49, 0x54, 0x49, 0x4f, 0x4e, 0x41, - 0x4c, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, 0x05, 0x12, 0x14, 0x0a, 0x10, 0x4d, - 0x4f, 0x44, 0x49, 0x46, 0x49, 0x45, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x10, - 0x06, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x54, 0x48, 0x45, 0x52, 0x5f, 0x45, 0x46, 0x46, 0x45, 0x43, - 0x54, 0x10, 0x07, 0x12, 0x12, 0x0a, 0x0e, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x45, - 0x46, 0x46, 0x45, 0x43, 0x54, 0x10, 0x08, 0x12, 0x0e, 0x0a, 0x0a, 0x53, 0x54, 0x4f, 0x50, 0x5f, - 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x09, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x45, 0x46, - 0x46, 0x45, 0x43, 0x54, 0x10, 0x0a, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, - 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54, 0x59, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x45, 0x10, 0x0b, 0x22, - 0x48, 0x0a, 0x0d, 0x53, 0x65, 0x76, 0x65, 0x72, 0x69, 0x74, 0x79, 0x4c, 0x65, 0x76, 0x65, 0x6c, - 0x12, 0x14, 0x0a, 0x10, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x53, 0x45, 0x56, 0x45, - 0x52, 0x49, 0x54, 0x59, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x46, 0x4f, 0x10, 0x02, - 0x12, 0x0b, 0x0a, 0x07, 0x57, 0x41, 0x52, 0x4e, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x0a, 0x0a, - 0x06, 0x53, 0x45, 0x56, 0x45, 0x52, 0x45, 0x10, 0x04, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, - 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x43, 0x0a, 0x09, 0x54, 0x69, 0x6d, - 0x65, 0x52, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x73, 0x74, 0x61, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x03, - 0x65, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x65, 0x6e, 0x64, 0x2a, 0x06, - 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xa0, - 0x01, 0x0a, 0x08, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x6c, - 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x18, 0x01, 0x20, 0x02, 0x28, 0x02, 0x52, 0x08, 0x6c, - 0x61, 0x74, 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x6c, 0x6f, 0x6e, 0x67, 0x69, - 0x74, 0x75, 0x64, 0x65, 0x18, 0x02, 0x20, 0x02, 0x28, 0x02, 0x52, 0x09, 0x6c, 0x6f, 0x6e, 0x67, - 0x69, 0x74, 0x75, 0x64, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, - 0x1a, 0x0a, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x08, 0x6f, 0x64, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x73, - 0x70, 0x65, 0x65, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, - 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, - 0x4e, 0x22, 0x87, 0x03, 0x0a, 0x0e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, - 0x70, 0x74, 0x6f, 0x72, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x74, 0x72, 0x69, 0x70, 0x49, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, - 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x73, - 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x44, 0x61, 0x74, 0x65, 0x12, 0x6a, 0x0a, 0x15, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, - 0x69, 0x70, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x35, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, - 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, - 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, 0x2e, 0x53, 0x63, 0x68, 0x65, 0x64, - 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x52, - 0x14, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x68, 0x69, 0x70, 0x22, 0x64, 0x0a, 0x14, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, - 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x12, 0x0d, 0x0a, - 0x09, 0x53, 0x43, 0x48, 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, - 0x41, 0x44, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x0f, 0x0a, 0x0b, 0x55, 0x4e, 0x53, 0x43, 0x48, - 0x45, 0x44, 0x55, 0x4c, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x41, 0x4e, 0x43, - 0x45, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x12, 0x13, 0x0a, 0x0b, 0x52, 0x45, 0x50, 0x4c, 0x41, 0x43, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x05, 0x1a, 0x02, 0x08, 0x01, 0x2a, 0x06, 0x08, 0xe8, 0x07, - 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x6e, 0x0a, 0x11, 0x56, - 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x44, 0x65, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x6f, 0x72, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, - 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x23, 0x0a, 0x0d, 0x6c, 0x69, 0x63, 0x65, 0x6e, 0x73, - 0x65, 0x5f, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x6c, - 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x50, 0x6c, 0x61, 0x74, 0x65, 0x2a, 0x06, 0x08, 0xe8, 0x07, - 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xe9, 0x01, 0x0a, 0x0e, - 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x1b, - 0x0a, 0x09, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x61, 0x67, 0x65, 0x6e, 0x63, 0x79, 0x49, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x34, 0x0a, 0x04, 0x74, 0x72, 0x69, 0x70, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, - 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x69, 0x70, 0x44, 0x65, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x6f, 0x72, 0x52, 0x04, 0x74, 0x72, 0x69, 0x70, 0x12, 0x17, 0x0a, 0x07, 0x73, - 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, - 0x6f, 0x70, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0b, 0x64, 0x69, 0x72, 0x65, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, - 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0xc3, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x50, 0x0a, 0x0b, - 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, - 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x53, - 0x74, 0x72, 0x69, 0x6e, 0x67, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x4d, - 0x0a, 0x0b, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, - 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, - 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x2a, 0x06, 0x08, - 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x2a, 0x06, 0x08, - 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x42, 0x42, 0x0a, - 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x69, 0x74, 0x2e, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x23, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x66, - 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x6c, 0x2f, 0x67, 0x74, 0x66, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, + 0x53, 0x74, 0x6f, 0x70, 0x2e, 0x57, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x72, 0x42, + 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x3a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x52, 0x12, 0x77, 0x68, 0x65, 0x65, 0x6c, 0x63, 0x68, 0x61, 0x69, 0x72, 0x42, 0x6f, 0x61, 0x72, + 0x64, 0x69, 0x6e, 0x67, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x69, 0x64, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x49, 0x64, 0x12, + 0x47, 0x0a, 0x0d, 0x70, 0x6c, 0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x5f, 0x63, 0x6f, 0x64, 0x65, + 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, + 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x6c, + 0x61, 0x74, 0x65, 0x64, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x0c, 0x70, 0x6c, 0x61, 0x74, + 0x66, 0x6f, 0x72, 0x6d, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x43, 0x0a, 0x12, 0x57, 0x68, 0x65, 0x65, + 0x6c, 0x63, 0x68, 0x61, 0x69, 0x72, 0x42, 0x6f, 0x61, 0x72, 0x64, 0x69, 0x6e, 0x67, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x41, + 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x4e, 0x4f, + 0x54, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x2a, 0x06, 0x08, + 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x9e, 0x06, + 0x0a, 0x11, 0x54, 0x72, 0x69, 0x70, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x58, 0x0a, 0x0e, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x74, 0x72, 0x69, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x72, + 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, + 0x72, 0x69, 0x70, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x72, 0x69, 0x70, 0x73, 0x52, 0x0d, + 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x54, 0x72, 0x69, 0x70, 0x73, 0x12, 0x1f, 0x0a, + 0x0b, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x44, 0x61, + 0x74, 0x65, 0x73, 0x12, 0x56, 0x0a, 0x0d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x54, 0x72, + 0x69, 0x70, 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xa9, 0x03, 0x0a, 0x0c, + 0x4d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x13, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, + 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x6f, + 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x11, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x11, + 0x65, 0x6e, 0x64, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, + 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x53, 0x74, 0x6f, 0x70, 0x53, + 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x53, 0x74, 0x6f, 0x70, + 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x45, 0x0a, 0x1d, 0x70, 0x72, 0x6f, 0x70, + 0x61, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x3a, + 0x01, 0x30, 0x52, 0x1b, 0x70, 0x72, 0x6f, 0x70, 0x61, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x6f, + 0x64, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, + 0x4e, 0x0a, 0x11, 0x72, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x74, 0x6f, 0x70, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x74, 0x72, 0x61, + 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x52, 0x65, + 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x52, 0x10, 0x72, + 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x73, 0x12, + 0x28, 0x0a, 0x10, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x5f, 0x61, 0x6c, 0x65, 0x72, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x49, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, + 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x64, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, + 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x1a, 0x55, 0x0a, 0x0d, 0x53, 0x65, 0x6c, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x54, 0x72, 0x69, 0x70, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x74, 0x72, 0x69, 0x70, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x07, 0x74, 0x72, 0x69, 0x70, + 0x49, 0x64, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x68, 0x61, 0x70, 0x65, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x68, 0x61, 0x70, 0x65, 0x49, 0x64, 0x2a, 0x06, + 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x2a, 0x06, + 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x5c, + 0x0a, 0x0c, 0x53, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x6c, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x73, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0c, 0x73, 0x74, 0x6f, 0x70, 0x53, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x63, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, + 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x22, 0x69, 0x0a, 0x0f, + 0x52, 0x65, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x6f, 0x70, 0x12, + 0x2d, 0x0a, 0x13, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x73, 0x74, 0x6f, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x74, 0x72, + 0x61, 0x76, 0x65, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x53, 0x74, 0x6f, 0x70, 0x12, 0x17, + 0x0a, 0x07, 0x73, 0x74, 0x6f, 0x70, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x73, 0x74, 0x6f, 0x70, 0x49, 0x64, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, + 0x06, 0x08, 0xa8, 0x46, 0x10, 0x90, 0x4e, 0x42, 0x42, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x2e, 0x72, 0x65, + 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5a, 0x23, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6a, 0x61, 0x6d, 0x65, 0x73, 0x70, 0x66, 0x65, 0x6e, 0x6e, 0x65, 0x6c, 0x6c, + 0x2f, 0x67, 0x74, 0x66, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, } var ( @@ -2486,71 +4119,113 @@ func file_proto_gtfs_realtime_proto_rawDescGZIP() []byte { return file_proto_gtfs_realtime_proto_rawDescData } -var file_proto_gtfs_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 9) -var file_proto_gtfs_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 15) +var file_proto_gtfs_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 11) +var file_proto_gtfs_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 28) var file_proto_gtfs_realtime_proto_goTypes = []interface{}{ - (FeedHeader_Incrementality)(0), // 0: transit_realtime.FeedHeader.Incrementality - (TripUpdate_StopTimeUpdate_ScheduleRelationship)(0), // 1: transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship - (VehiclePosition_VehicleStopStatus)(0), // 2: transit_realtime.VehiclePosition.VehicleStopStatus - (VehiclePosition_CongestionLevel)(0), // 3: transit_realtime.VehiclePosition.CongestionLevel - (VehiclePosition_OccupancyStatus)(0), // 4: transit_realtime.VehiclePosition.OccupancyStatus - (Alert_Cause)(0), // 5: transit_realtime.Alert.Cause - (Alert_Effect)(0), // 6: transit_realtime.Alert.Effect - (Alert_SeverityLevel)(0), // 7: transit_realtime.Alert.SeverityLevel - (TripDescriptor_ScheduleRelationship)(0), // 8: transit_realtime.TripDescriptor.ScheduleRelationship - (*FeedMessage)(nil), // 9: transit_realtime.FeedMessage - (*FeedHeader)(nil), // 10: transit_realtime.FeedHeader - (*FeedEntity)(nil), // 11: transit_realtime.FeedEntity - (*TripUpdate)(nil), // 12: transit_realtime.TripUpdate - (*VehiclePosition)(nil), // 13: transit_realtime.VehiclePosition - (*Alert)(nil), // 14: transit_realtime.Alert - (*TimeRange)(nil), // 15: transit_realtime.TimeRange - (*Position)(nil), // 16: transit_realtime.Position - (*TripDescriptor)(nil), // 17: transit_realtime.TripDescriptor - (*VehicleDescriptor)(nil), // 18: transit_realtime.VehicleDescriptor - (*EntitySelector)(nil), // 19: transit_realtime.EntitySelector - (*TranslatedString)(nil), // 20: transit_realtime.TranslatedString - (*TripUpdate_StopTimeEvent)(nil), // 21: transit_realtime.TripUpdate.StopTimeEvent - (*TripUpdate_StopTimeUpdate)(nil), // 22: transit_realtime.TripUpdate.StopTimeUpdate - (*TranslatedString_Translation)(nil), // 23: transit_realtime.TranslatedString.Translation + (FeedHeader_Incrementality)(0), // 0: transit_realtime.FeedHeader.Incrementality + (TripUpdate_StopTimeUpdate_ScheduleRelationship)(0), // 1: transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship + (VehiclePosition_VehicleStopStatus)(0), // 2: transit_realtime.VehiclePosition.VehicleStopStatus + (VehiclePosition_CongestionLevel)(0), // 3: transit_realtime.VehiclePosition.CongestionLevel + (VehiclePosition_OccupancyStatus)(0), // 4: transit_realtime.VehiclePosition.OccupancyStatus + (Alert_Cause)(0), // 5: transit_realtime.Alert.Cause + (Alert_Effect)(0), // 6: transit_realtime.Alert.Effect + (Alert_SeverityLevel)(0), // 7: transit_realtime.Alert.SeverityLevel + (TripDescriptor_ScheduleRelationship)(0), // 8: transit_realtime.TripDescriptor.ScheduleRelationship + (VehicleDescriptor_WheelchairAccessible)(0), // 9: transit_realtime.VehicleDescriptor.WheelchairAccessible + (Stop_WheelchairBoarding)(0), // 10: transit_realtime.Stop.WheelchairBoarding + (*FeedMessage)(nil), // 11: transit_realtime.FeedMessage + (*FeedHeader)(nil), // 12: transit_realtime.FeedHeader + (*FeedEntity)(nil), // 13: transit_realtime.FeedEntity + (*TripUpdate)(nil), // 14: transit_realtime.TripUpdate + (*VehiclePosition)(nil), // 15: transit_realtime.VehiclePosition + (*Alert)(nil), // 16: transit_realtime.Alert + (*TimeRange)(nil), // 17: transit_realtime.TimeRange + (*Position)(nil), // 18: transit_realtime.Position + (*TripDescriptor)(nil), // 19: transit_realtime.TripDescriptor + (*VehicleDescriptor)(nil), // 20: transit_realtime.VehicleDescriptor + (*EntitySelector)(nil), // 21: transit_realtime.EntitySelector + (*TranslatedString)(nil), // 22: transit_realtime.TranslatedString + (*TranslatedImage)(nil), // 23: transit_realtime.TranslatedImage + (*Shape)(nil), // 24: transit_realtime.Shape + (*Stop)(nil), // 25: transit_realtime.Stop + (*TripModifications)(nil), // 26: transit_realtime.TripModifications + (*StopSelector)(nil), // 27: transit_realtime.StopSelector + (*ReplacementStop)(nil), // 28: transit_realtime.ReplacementStop + (*TripUpdate_StopTimeEvent)(nil), // 29: transit_realtime.TripUpdate.StopTimeEvent + (*TripUpdate_StopTimeUpdate)(nil), // 30: transit_realtime.TripUpdate.StopTimeUpdate + (*TripUpdate_TripProperties)(nil), // 31: transit_realtime.TripUpdate.TripProperties + (*TripUpdate_StopTimeUpdate_StopTimeProperties)(nil), // 32: transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties + (*VehiclePosition_CarriageDetails)(nil), // 33: transit_realtime.VehiclePosition.CarriageDetails + (*TripDescriptor_ModifiedTripSelector)(nil), // 34: transit_realtime.TripDescriptor.ModifiedTripSelector + (*TranslatedString_Translation)(nil), // 35: transit_realtime.TranslatedString.Translation + (*TranslatedImage_LocalizedImage)(nil), // 36: transit_realtime.TranslatedImage.LocalizedImage + (*TripModifications_Modification)(nil), // 37: transit_realtime.TripModifications.Modification + (*TripModifications_SelectedTrips)(nil), // 38: transit_realtime.TripModifications.SelectedTrips } var file_proto_gtfs_realtime_proto_depIdxs = []int32{ - 10, // 0: transit_realtime.FeedMessage.header:type_name -> transit_realtime.FeedHeader - 11, // 1: transit_realtime.FeedMessage.entity:type_name -> transit_realtime.FeedEntity + 12, // 0: transit_realtime.FeedMessage.header:type_name -> transit_realtime.FeedHeader + 13, // 1: transit_realtime.FeedMessage.entity:type_name -> transit_realtime.FeedEntity 0, // 2: transit_realtime.FeedHeader.incrementality:type_name -> transit_realtime.FeedHeader.Incrementality - 12, // 3: transit_realtime.FeedEntity.trip_update:type_name -> transit_realtime.TripUpdate - 13, // 4: transit_realtime.FeedEntity.vehicle:type_name -> transit_realtime.VehiclePosition - 14, // 5: transit_realtime.FeedEntity.alert:type_name -> transit_realtime.Alert - 17, // 6: transit_realtime.TripUpdate.trip:type_name -> transit_realtime.TripDescriptor - 18, // 7: transit_realtime.TripUpdate.vehicle:type_name -> transit_realtime.VehicleDescriptor - 22, // 8: transit_realtime.TripUpdate.stop_time_update:type_name -> transit_realtime.TripUpdate.StopTimeUpdate - 17, // 9: transit_realtime.VehiclePosition.trip:type_name -> transit_realtime.TripDescriptor - 18, // 10: transit_realtime.VehiclePosition.vehicle:type_name -> transit_realtime.VehicleDescriptor - 16, // 11: transit_realtime.VehiclePosition.position:type_name -> transit_realtime.Position - 2, // 12: transit_realtime.VehiclePosition.current_status:type_name -> transit_realtime.VehiclePosition.VehicleStopStatus - 3, // 13: transit_realtime.VehiclePosition.congestion_level:type_name -> transit_realtime.VehiclePosition.CongestionLevel - 4, // 14: transit_realtime.VehiclePosition.occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus - 15, // 15: transit_realtime.Alert.active_period:type_name -> transit_realtime.TimeRange - 19, // 16: transit_realtime.Alert.informed_entity:type_name -> transit_realtime.EntitySelector - 5, // 17: transit_realtime.Alert.cause:type_name -> transit_realtime.Alert.Cause - 6, // 18: transit_realtime.Alert.effect:type_name -> transit_realtime.Alert.Effect - 20, // 19: transit_realtime.Alert.url:type_name -> transit_realtime.TranslatedString - 20, // 20: transit_realtime.Alert.header_text:type_name -> transit_realtime.TranslatedString - 20, // 21: transit_realtime.Alert.description_text:type_name -> transit_realtime.TranslatedString - 20, // 22: transit_realtime.Alert.tts_header_text:type_name -> transit_realtime.TranslatedString - 20, // 23: transit_realtime.Alert.tts_description_text:type_name -> transit_realtime.TranslatedString - 7, // 24: transit_realtime.Alert.severity_level:type_name -> transit_realtime.Alert.SeverityLevel - 8, // 25: transit_realtime.TripDescriptor.schedule_relationship:type_name -> transit_realtime.TripDescriptor.ScheduleRelationship - 17, // 26: transit_realtime.EntitySelector.trip:type_name -> transit_realtime.TripDescriptor - 23, // 27: transit_realtime.TranslatedString.translation:type_name -> transit_realtime.TranslatedString.Translation - 21, // 28: transit_realtime.TripUpdate.StopTimeUpdate.arrival:type_name -> transit_realtime.TripUpdate.StopTimeEvent - 21, // 29: transit_realtime.TripUpdate.StopTimeUpdate.departure:type_name -> transit_realtime.TripUpdate.StopTimeEvent - 1, // 30: transit_realtime.TripUpdate.StopTimeUpdate.schedule_relationship:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship - 31, // [31:31] is the sub-list for method output_type - 31, // [31:31] is the sub-list for method input_type - 31, // [31:31] is the sub-list for extension type_name - 31, // [31:31] is the sub-list for extension extendee - 0, // [0:31] is the sub-list for field type_name + 14, // 3: transit_realtime.FeedEntity.trip_update:type_name -> transit_realtime.TripUpdate + 15, // 4: transit_realtime.FeedEntity.vehicle:type_name -> transit_realtime.VehiclePosition + 16, // 5: transit_realtime.FeedEntity.alert:type_name -> transit_realtime.Alert + 24, // 6: transit_realtime.FeedEntity.shape:type_name -> transit_realtime.Shape + 25, // 7: transit_realtime.FeedEntity.stop:type_name -> transit_realtime.Stop + 26, // 8: transit_realtime.FeedEntity.trip_modifications:type_name -> transit_realtime.TripModifications + 19, // 9: transit_realtime.TripUpdate.trip:type_name -> transit_realtime.TripDescriptor + 20, // 10: transit_realtime.TripUpdate.vehicle:type_name -> transit_realtime.VehicleDescriptor + 30, // 11: transit_realtime.TripUpdate.stop_time_update:type_name -> transit_realtime.TripUpdate.StopTimeUpdate + 31, // 12: transit_realtime.TripUpdate.trip_properties:type_name -> transit_realtime.TripUpdate.TripProperties + 19, // 13: transit_realtime.VehiclePosition.trip:type_name -> transit_realtime.TripDescriptor + 20, // 14: transit_realtime.VehiclePosition.vehicle:type_name -> transit_realtime.VehicleDescriptor + 18, // 15: transit_realtime.VehiclePosition.position:type_name -> transit_realtime.Position + 2, // 16: transit_realtime.VehiclePosition.current_status:type_name -> transit_realtime.VehiclePosition.VehicleStopStatus + 3, // 17: transit_realtime.VehiclePosition.congestion_level:type_name -> transit_realtime.VehiclePosition.CongestionLevel + 4, // 18: transit_realtime.VehiclePosition.occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus + 33, // 19: transit_realtime.VehiclePosition.multi_carriage_details:type_name -> transit_realtime.VehiclePosition.CarriageDetails + 17, // 20: transit_realtime.Alert.active_period:type_name -> transit_realtime.TimeRange + 21, // 21: transit_realtime.Alert.informed_entity:type_name -> transit_realtime.EntitySelector + 5, // 22: transit_realtime.Alert.cause:type_name -> transit_realtime.Alert.Cause + 6, // 23: transit_realtime.Alert.effect:type_name -> transit_realtime.Alert.Effect + 22, // 24: transit_realtime.Alert.url:type_name -> transit_realtime.TranslatedString + 22, // 25: transit_realtime.Alert.header_text:type_name -> transit_realtime.TranslatedString + 22, // 26: transit_realtime.Alert.description_text:type_name -> transit_realtime.TranslatedString + 22, // 27: transit_realtime.Alert.tts_header_text:type_name -> transit_realtime.TranslatedString + 22, // 28: transit_realtime.Alert.tts_description_text:type_name -> transit_realtime.TranslatedString + 7, // 29: transit_realtime.Alert.severity_level:type_name -> transit_realtime.Alert.SeverityLevel + 23, // 30: transit_realtime.Alert.image:type_name -> transit_realtime.TranslatedImage + 22, // 31: transit_realtime.Alert.image_alternative_text:type_name -> transit_realtime.TranslatedString + 22, // 32: transit_realtime.Alert.cause_detail:type_name -> transit_realtime.TranslatedString + 22, // 33: transit_realtime.Alert.effect_detail:type_name -> transit_realtime.TranslatedString + 8, // 34: transit_realtime.TripDescriptor.schedule_relationship:type_name -> transit_realtime.TripDescriptor.ScheduleRelationship + 34, // 35: transit_realtime.TripDescriptor.modified_trip:type_name -> transit_realtime.TripDescriptor.ModifiedTripSelector + 9, // 36: transit_realtime.VehicleDescriptor.wheelchair_accessible:type_name -> transit_realtime.VehicleDescriptor.WheelchairAccessible + 19, // 37: transit_realtime.EntitySelector.trip:type_name -> transit_realtime.TripDescriptor + 35, // 38: transit_realtime.TranslatedString.translation:type_name -> transit_realtime.TranslatedString.Translation + 36, // 39: transit_realtime.TranslatedImage.localized_image:type_name -> transit_realtime.TranslatedImage.LocalizedImage + 22, // 40: transit_realtime.Stop.stop_code:type_name -> transit_realtime.TranslatedString + 22, // 41: transit_realtime.Stop.stop_name:type_name -> transit_realtime.TranslatedString + 22, // 42: transit_realtime.Stop.tts_stop_name:type_name -> transit_realtime.TranslatedString + 22, // 43: transit_realtime.Stop.stop_desc:type_name -> transit_realtime.TranslatedString + 22, // 44: transit_realtime.Stop.stop_url:type_name -> transit_realtime.TranslatedString + 10, // 45: transit_realtime.Stop.wheelchair_boarding:type_name -> transit_realtime.Stop.WheelchairBoarding + 22, // 46: transit_realtime.Stop.platform_code:type_name -> transit_realtime.TranslatedString + 38, // 47: transit_realtime.TripModifications.selected_trips:type_name -> transit_realtime.TripModifications.SelectedTrips + 37, // 48: transit_realtime.TripModifications.modifications:type_name -> transit_realtime.TripModifications.Modification + 29, // 49: transit_realtime.TripUpdate.StopTimeUpdate.arrival:type_name -> transit_realtime.TripUpdate.StopTimeEvent + 29, // 50: transit_realtime.TripUpdate.StopTimeUpdate.departure:type_name -> transit_realtime.TripUpdate.StopTimeEvent + 4, // 51: transit_realtime.TripUpdate.StopTimeUpdate.departure_occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus + 1, // 52: transit_realtime.TripUpdate.StopTimeUpdate.schedule_relationship:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship + 32, // 53: transit_realtime.TripUpdate.StopTimeUpdate.stop_time_properties:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties + 4, // 54: transit_realtime.VehiclePosition.CarriageDetails.occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus + 27, // 55: transit_realtime.TripModifications.Modification.start_stop_selector:type_name -> transit_realtime.StopSelector + 27, // 56: transit_realtime.TripModifications.Modification.end_stop_selector:type_name -> transit_realtime.StopSelector + 28, // 57: transit_realtime.TripModifications.Modification.replacement_stops:type_name -> transit_realtime.ReplacementStop + 58, // [58:58] is the sub-list for method output_type + 58, // [58:58] is the sub-list for method input_type + 58, // [58:58] is the sub-list for extension type_name + 58, // [58:58] is the sub-list for extension extendee + 0, // [0:58] is the sub-list for field type_name } func init() { file_proto_gtfs_realtime_proto_init() } @@ -2728,7 +4403,7 @@ func file_proto_gtfs_realtime_proto_init() { } } file_proto_gtfs_realtime_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TripUpdate_StopTimeEvent); i { + switch v := v.(*TranslatedImage); i { case 0: return &v.state case 1: @@ -2742,7 +4417,7 @@ func file_proto_gtfs_realtime_proto_init() { } } file_proto_gtfs_realtime_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TripUpdate_StopTimeUpdate); i { + switch v := v.(*Shape); i { case 0: return &v.state case 1: @@ -2756,6 +4431,144 @@ func file_proto_gtfs_realtime_proto_init() { } } file_proto_gtfs_realtime_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Stop); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripModifications); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*StopSelector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ReplacementStop); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripUpdate_StopTimeEvent); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripUpdate_StopTimeUpdate); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripUpdate_TripProperties); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripUpdate_StopTimeUpdate_StopTimeProperties); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*VehiclePosition_CarriageDetails); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripDescriptor_ModifiedTripSelector); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TranslatedString_Translation); i { case 0: return &v.state @@ -2769,14 +4582,56 @@ func file_proto_gtfs_realtime_proto_init() { return nil } } + file_proto_gtfs_realtime_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TranslatedImage_LocalizedImage); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripModifications_Modification); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } + file_proto_gtfs_realtime_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TripModifications_SelectedTrips); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + case 3: + return &v.extensionFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_proto_gtfs_realtime_proto_rawDesc, - NumEnums: 9, - NumMessages: 15, + NumEnums: 11, + NumMessages: 28, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/gtfs-realtime.proto b/proto/gtfs-realtime.proto index c7f2ad4..902f038 100644 --- a/proto/gtfs-realtime.proto +++ b/proto/gtfs-realtime.proto @@ -105,6 +105,11 @@ message FeedEntity { optional VehiclePosition vehicle = 4; optional Alert alert = 5; + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional Shape shape = 6; + optional Stop stop = 7; + optional TripModifications trip_modifications = 8; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features and // modifications to the spec. @@ -211,7 +216,13 @@ message TripUpdate { optional StopTimeEvent arrival = 2; optional StopTimeEvent departure = 3; - // The relation between this StopTime and the static schedule. + // Expected occupancy after departure from the given stop. + // Should be provided only for future stops. + // In order to provide departure_occupancy_status without either arrival or + // departure StopTimeEvents, ScheduleRelationship should be set to NO_DATA. + optional VehiclePosition.OccupancyStatus departure_occupancy_status = 7; + + // The relation between the StopTimeEvents and the static schedule. enum ScheduleRelationship { // The vehicle is proceeding in accordance with its static schedule of // stops, although not necessarily according to the times of the schedule. @@ -225,10 +236,11 @@ message TripUpdate { // Arrival and departure are optional. SKIPPED = 1; - // No data is given for this stop. The main intention for this value is to - // give the predictions only for part of a trip, i.e., if the last update - // for a trip has a NO_DATA specifier, then StopTimes for the rest of the - // stops in the trip are considered to be unspecified as well. + // No StopTimeEvents are given for this stop. + // The main intention for this value is to give time predictions only for + // part of a trip, i.e., if the last update for a trip has a NO_DATA + // specifier, then StopTimeEvents for the rest of the stops in the trip + // are considered to be unspecified as well. // Neither arrival nor departure should be supplied. NO_DATA = 2; @@ -243,6 +255,37 @@ message TripUpdate { optional ScheduleRelationship schedule_relationship = 5 [default = SCHEDULED]; + // Provides the updated values for the stop time. + // NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. + message StopTimeProperties { + // Supports real-time stop assignments. Refers to a stop_id defined in the GTFS stops.txt. + // The new assigned_stop_id should not result in a significantly different trip experience for the end user than + // the stop_id defined in GTFS stop_times.txt. In other words, the end user should not view this new stop_id as an + // "unusual change" if the new stop was presented within an app without any additional context. + // For example, this field is intended to be used for platform assignments by using a stop_id that belongs to the + // same station as the stop originally defined in GTFS stop_times.txt. + // To assign a stop without providing any real-time arrival or departure predictions, populate this field and set + // StopTimeUpdate.schedule_relationship = NO_DATA. + // If this field is populated, it is preferred to omit `StopTimeUpdate.stop_id` and use only `StopTimeUpdate.stop_sequence`. If + // `StopTimeProperties.assigned_stop_id` and `StopTimeUpdate.stop_id` are populated, `StopTimeUpdate.stop_id` must match `assigned_stop_id`. + // Platform assignments should be reflected in other GTFS-realtime fields as well + // (e.g., `VehiclePosition.stop_id`). + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string assigned_stop_id = 1; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features + // and modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; + } + + // Realtime updates for certain properties defined within GTFS stop_times.txt + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional StopTimeProperties stop_time_properties = 6; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features // and modifications to the spec. @@ -273,7 +316,9 @@ message TripUpdate { // - stop_sequences 10,... have unknown delay. repeated StopTimeUpdate stop_time_update = 2; - // Moment at which the vehicle's real-time progress was measured. In POSIX + // The most recent moment at which the vehicle's real-time progress was measured + // to estimate StopTimes in the future. When StopTimes in the past are provided, + // arrival/departure times may be earlier than this value. In POSIX // time (i.e., the number of seconds since January 1st 1970 00:00:00 UTC). optional uint64 timestamp = 4; @@ -297,6 +342,54 @@ message TripUpdate { // formally adopted in the future. optional int32 delay = 5; + // Defines updated properties of the trip, such as a new shape_id when there is a detour. Or defines the + // trip_id, start_date, and start_time of a DUPLICATED trip. + // NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. + message TripProperties { + // Defines the identifier of a new trip that is a duplicate of an existing trip defined in (CSV) GTFS trips.txt + // but will start at a different service date and/or time (defined using the TripProperties.start_date and + // TripProperties.start_time fields). See definition of trips.trip_id in (CSV) GTFS. Its value must be different + // than the ones used in the (CSV) GTFS. Required if schedule_relationship=DUPLICATED, otherwise this field must not + // be populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string trip_id = 1; + // Service date on which the DUPLICATED trip will be run, in YYYYMMDD format. Required if + // schedule_relationship=DUPLICATED, otherwise this field must not be populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string start_date = 2; + // Defines the departure start time of the trip when it’s duplicated. See definition of stop_times.departure_time + // in (CSV) GTFS. Scheduled arrival and departure times for the duplicated trip are calculated based on the offset + // between the original trip departure_time and this field. For example, if a GTFS trip has stop A with a + // departure_time of 10:00:00 and stop B with departure_time of 10:01:00, and this field is populated with the value + // of 10:30:00, stop B on the duplicated trip will have a scheduled departure_time of 10:31:00. Real-time prediction + // delay values are applied to this calculated schedule time to determine the predicted time. For example, if a + // departure delay of 30 is provided for stop B, then the predicted departure time is 10:31:30. Real-time + // prediction time values do not have any offset applied to them and indicate the predicted time as provided. + // For example, if a departure time representing 10:31:30 is provided for stop B, then the predicted departure time + // is 10:31:30. This field is required if schedule_relationship is DUPLICATED, otherwise this field must not be + // populated and will be ignored by consumers. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string start_time = 3; + // Specifies the shape of the vehicle travel path when the trip shape differs from the shape specified in + // (CSV) GTFS or to specify it in real-time when it's not provided by (CSV) GTFS, such as a vehicle that takes differing + // paths based on rider demand. See definition of trips.shape_id in (CSV) GTFS. If a shape is neither defined in (CSV) GTFS + // nor in real-time, the shape is considered unknown. This field can refer to a shape defined in the (CSV) GTFS in shapes.txt + // or a Shape in the (protobuf) real-time feed. The order of stops (stop sequences) for this trip must remain the same as + // (CSV) GTFS. Stops that are a part of the original trip but will no longer be made, such as when a detour occurs, should + // be marked as schedule_relationship=SKIPPED. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string shape_id = 4; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features + // and modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; + } + optional TripProperties trip_properties = 6; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features and // modifications to the spec. @@ -357,52 +450,123 @@ message VehiclePosition { } optional CongestionLevel congestion_level = 6; - // The degree of passenger occupancy of the vehicle. This field is still - // experimental, and subject to change. It may be formally adopted in the - // future. + // The state of passenger occupancy for the vehicle or carriage. + // Individual producers may not publish all OccupancyStatus values. Therefore, consumers + // must not assume that the OccupancyStatus values follow a linear scale. + // Consumers should represent OccupancyStatus values as the state indicated + // and intended by the producer. Likewise, producers must use OccupancyStatus values that + // correspond to actual vehicle occupancy states. + // For describing passenger occupancy levels on a linear scale, see `occupancy_percentage`. + // This field is still experimental, and subject to change. It may be formally adopted in the future. enum OccupancyStatus { - // The vehicle is considered empty by most measures, and has few or no + // The vehicle or carriage is considered empty by most measures, and has few or no // passengers onboard, but is still accepting passengers. EMPTY = 0; - // The vehicle has a relatively large percentage of seats available. - // What percentage of free seats out of the total seats available is to be + // The vehicle or carriage has a large number of seats available. + // The amount of free seats out of the total seats available to be // considered large enough to fall into this category is determined at the // discretion of the producer. MANY_SEATS_AVAILABLE = 1; - // The vehicle has a relatively small percentage of seats available. - // What percentage of free seats out of the total seats available is to be + // The vehicle or carriage has a relatively small number of seats available. + // The amount of free seats out of the total seats available to be // considered small enough to fall into this category is determined at the // discretion of the feed producer. FEW_SEATS_AVAILABLE = 2; - // The vehicle can currently accommodate only standing passengers. + // The vehicle or carriage can currently accommodate only standing passengers. STANDING_ROOM_ONLY = 3; - // The vehicle can currently accommodate only standing passengers + // The vehicle or carriage can currently accommodate only standing passengers // and has limited space for them. CRUSHED_STANDING_ROOM_ONLY = 4; - // The vehicle is considered full by most measures, but may still be + // The vehicle or carriage is considered full by most measures, but may still be // allowing passengers to board. FULL = 5; - // The vehicle is not accepting additional passengers. + // The vehicle or carriage is not accepting passengers, but usually accepts passengers for boarding. NOT_ACCEPTING_PASSENGERS = 6; + // The vehicle or carriage doesn't have any occupancy data available at that time. + NO_DATA_AVAILABLE = 7; + + // The vehicle or carriage is not boardable and never accepts passengers. + // Useful for special vehicles or carriages (engine, maintenance carriage, etc…). + NOT_BOARDABLE = 8; + } + // If multi_carriage_status is populated with per-carriage OccupancyStatus, + // then this field should describe the entire vehicle with all carriages accepting passengers considered. optional OccupancyStatus occupancy_status = 9; - // A percentage value representing the degree of passenger occupancy of the vehicle. + // A percentage value indicating the degree of passenger occupancy in the vehicle. // The values are represented as an integer without decimals. 0 means 0% and 100 means 100%. // The value 100 should represent the total maximum occupancy the vehicle was designed for, // including both seated and standing capacity, and current operating regulations allow. - // It is possible that the value goes over 100 if there are currently more passengers than what the vehicle was designed for. - // The precision of occupancy_percentage should be low enough that you can't track a single person boarding and alighting for privacy reasons. + // The value may exceed 100 if there are more passengers than the maximum designed capacity. + // The precision of occupancy_percentage should be low enough that individual passengers cannot be tracked boarding or alighting the vehicle. + // If multi_carriage_status is populated with per-carriage occupancy_percentage, + // then this field should describe the entire vehicle with all carriages accepting passengers considered. // This field is still experimental, and subject to change. It may be formally adopted in the future. optional uint32 occupancy_percentage = 10; + // Carriage specific details, used for vehicles composed of several carriages + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + message CarriageDetails { + + // Identification of the carriage. Should be unique per vehicle. + optional string id = 1; + + // User visible label that may be shown to the passenger to help identify + // the carriage. Example: "7712", "Car ABC-32", etc... + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + optional string label = 2; + + // Occupancy status for this given carriage, in this vehicle + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + optional OccupancyStatus occupancy_status = 3 [default = NO_DATA_AVAILABLE]; + + // Occupancy percentage for this given carriage, in this vehicle. + // Follows the same rules as "VehiclePosition.occupancy_percentage" + // -1 in case data is not available for this given carriage (as protobuf defaults to 0 otherwise) + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + optional int32 occupancy_percentage = 4 [default = -1]; + + // Identifies the order of this carriage with respect to the other + // carriages in the vehicle's list of CarriageDetails. + // The first carriage in the direction of travel must have a value of 1. + // The second value corresponds to the second carriage in the direction + // of travel and must have a value of 2, and so forth. + // For example, the first carriage in the direction of travel has a value of 1. + // If the second carriage in the direction of travel has a value of 3, + // consumers will discard data for all carriages (i.e., the multi_carriage_details field). + // Carriages without data must be represented with a valid carriage_sequence number and the fields + // without data should be omitted (alternately, those fields could also be included and set to the "no data" values). + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + optional uint32 carriage_sequence = 5; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; + } + + // Details of the multiple carriages of this given vehicle. + // The first occurrence represents the first carriage of the vehicle, + // given the current direction of travel. + // The number of occurrences of the multi_carriage_details + // field represents the number of carriages of the vehicle. + // It also includes non boardable carriages, + // like engines, maintenance carriages, etc… as they provide valuable + // information to passengers about where to stand on a platform. + // This message/field is still experimental, and subject to change. It may be formally adopted in the future. + repeated CarriageDetails multi_carriage_details = 11; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features and // modifications to the spec. @@ -422,7 +586,7 @@ message Alert { // Entities whose users we should notify of this alert. repeated EntitySelector informed_entity = 5; - // Cause of this alert. + // Cause of this alert. If cause_detail is included, then Cause must also be included. enum Cause { UNKNOWN_CAUSE = 1; OTHER_CAUSE = 2; // Not machine-representable. @@ -439,7 +603,7 @@ message Alert { } optional Cause cause = 6 [default = UNKNOWN_CAUSE]; - // What is the effect of this problem on the affected entity. + // What is the effect of this problem on the affected entity. If effect_detail is included, then Effect must also be included. enum Effect { NO_SERVICE = 1; REDUCED_SERVICE = 2; @@ -471,23 +635,40 @@ message Alert { optional TranslatedString description_text = 11; // Text for alert header to be used in text-to-speech implementations. This field is the text-to-speech version of header_text. - // This field is still experimental, and subject to change. It may be formally adopted in the future. optional TranslatedString tts_header_text = 12; // Text for full description for the alert to be used in text-to-speech implementations. This field is the text-to-speech version of description_text. - // This field is still experimental, and subject to change. It may be formally adopted in the future. optional TranslatedString tts_description_text = 13; // Severity of this alert. enum SeverityLevel { - UNKNOWN_SEVERITY = 1; - INFO = 2; - WARNING = 3; - SEVERE = 4; + UNKNOWN_SEVERITY = 1; + INFO = 2; + WARNING = 3; + SEVERE = 4; } optional SeverityLevel severity_level = 14 [default = UNKNOWN_SEVERITY]; + // TranslatedImage to be displayed along the alert text. Used to explain visually the alert effect of a detour, station closure, etc. The image must enhance the understanding of the alert. Any essential information communicated within the image must also be contained in the alert text. + // The following types of images are discouraged : image containing mainly text, marketing or branded images that add no additional information. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional TranslatedImage image = 15; + + // Text describing the appearance of the linked image in the `image` field (e.g., in case the image can't be displayed + // or the user can't see the image for accessibility reasons). See the HTML spec for alt image text - https://html.spec.whatwg.org/#alt. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional TranslatedString image_alternative_text = 16; + + + // Description of the cause of the alert that allows for agency-specific language; more specific than the Cause. If cause_detail is included, then Cause must also be included. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional TranslatedString cause_detail = 17; + + // Description of the effect of the alert that allows for agency-specific language; more specific than the Effect. If effect_detail is included, then Effect must also be included. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional TranslatedString effect_detail = 18; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features // and modifications to the spec. @@ -565,7 +746,9 @@ message TripDescriptor { // The trip_id from the GTFS feed that this selector refers to. // For non frequency-based trips, this field is enough to uniquely identify // the trip. For frequency-based trip, start_time and start_date might also be - // necessary. + // necessary. When schedule_relationship is DUPLICATED within a TripUpdate, the trip_id identifies the trip from + // static GTFS to be duplicated. When schedule_relationship is DUPLICATED within a VehiclePosition, the trip_id + // identifies the new duplicate trip and must contain the value for the corresponding TripUpdate.TripProperties.trip_id. optional string trip_id = 1; // The route_id from the GTFS that this selector refers to. @@ -614,6 +797,10 @@ message TripDescriptor { // An extra trip that was added in addition to a running schedule, for // example, to replace a broken vehicle or to respond to sudden passenger // load. + // NOTE: Currently, behavior is unspecified for feeds that use this mode. There are discussions on the GTFS GitHub + // [(1)](https://github.com/google/transit/issues/106) [(2)](https://github.com/google/transit/pull/221) + // [(3)](https://github.com/google/transit/pull/219) around fully specifying or deprecating ADDED trips and the + // documentation will be updated when those discussions are finalized. ADDED = 1; // A trip that is running with no schedule associated to it (GTFS frequencies.txt exact_times=0). @@ -625,9 +812,46 @@ message TripDescriptor { // Should not be used - for backwards-compatibility only. REPLACEMENT = 5 [deprecated=true]; + + // An extra trip that was added in addition to a running schedule, for example, to replace a broken vehicle or to + // respond to sudden passenger load. Used with TripUpdate.TripProperties.trip_id, TripUpdate.TripProperties.start_date, + // and TripUpdate.TripProperties.start_time to copy an existing trip from static GTFS but start at a different service + // date and/or time. Duplicating a trip is allowed if the service related to the original trip in (CSV) GTFS + // (in calendar.txt or calendar_dates.txt) is operating within the next 30 days. The trip to be duplicated is + // identified via TripUpdate.TripDescriptor.trip_id. This enumeration does not modify the existing trip referenced by + // TripUpdate.TripDescriptor.trip_id - if a producer wants to cancel the original trip, it must publish a separate + // TripUpdate with the value of CANCELED or DELETED. Trips defined in GTFS frequencies.txt with exact_times that is + // empty or equal to 0 cannot be duplicated. The VehiclePosition.TripDescriptor.trip_id for the new trip must contain + // the matching value from TripUpdate.TripProperties.trip_id and VehiclePosition.TripDescriptor.ScheduleRelationship + // must also be set to DUPLICATED. + // Existing producers and consumers that were using the ADDED enumeration to represent duplicated trips must follow + // the migration guide (https://github.com/google/transit/tree/master/gtfs-realtime/spec/en/examples/migration-duplicated.md) + // to transition to the DUPLICATED enumeration. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + DUPLICATED = 6; + + + // A trip that existed in the schedule but was removed and must not be shown to users. + // DELETED should be used instead of CANCELED to indicate that a transit provider would like to entirely remove + // information about the corresponding trip from consuming applications, so the trip is not shown as cancelled to + // riders, e.g. a trip that is entirely being replaced by another trip. + // This designation becomes particularly important if several trips are cancelled and replaced with substitute service. + // If consumers were to show explicit information about the cancellations it would distract from the more important + // real-time predictions. + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + DELETED = 7; } optional ScheduleRelationship schedule_relationship = 4; + message ModifiedTripSelector { + // The 'id' from the FeedEntity in which the contained TripModifications object affects this trip. + optional string modifications_id = 1; + + // The trip_id from the GTFS feed that is modified by the modifications_id + optional string affected_trip_id = 2; + } + optional ModifiedTripSelector modified_trip = 7; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features and // modifications to the spec. @@ -651,6 +875,26 @@ message VehicleDescriptor { // The license plate of the vehicle. optional string license_plate = 3; + enum WheelchairAccessible { + // The trip doesn't have information about wheelchair accessibility. + // This is the **default** behavior. If the static GTFS contains a + // _wheelchair_accessible_ value, it won't be overwritten. + NO_VALUE = 0; + + // The trip has no accessibility value present. + // This value will overwrite the value from the GTFS. + UNKNOWN = 1; + + // The trip is wheelchair accessible. + // This value will overwrite the value from the GTFS. + WHEELCHAIR_ACCESSIBLE = 2; + + // The trip is **not** wheelchair accessible. + // This value will overwrite the value from the GTFS. + WHEELCHAIR_INACCESSIBLE = 3; + } + optional WheelchairAccessible wheelchair_accessible = 4 [default = NO_VALUE]; + // The extensions namespace allows 3rd-party developers to extend the // GTFS Realtime Specification in order to add and evaluate new features and // modifications to the spec. @@ -723,3 +967,226 @@ message TranslatedString { // The following extension IDs are reserved for private use by any organization. extensions 9000 to 9999; } + +// An internationalized image containing per-language versions of a URL linking to an image +// along with meta information +// Only one of the images from a message will be retained by consumers. The resolution proceeds +// as follows: +// 1. If the UI language matches the language code of a translation, +// the first matching translation is picked. +// 2. If a default UI language (e.g., English) matches the language code of a +// translation, the first matching translation is picked. +// 3. If some translation has an unspecified language code, that translation is +// picked. +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +message TranslatedImage { + message LocalizedImage { + // String containing an URL linking to an image + // The image linked must be less than 2MB. + // If an image changes in a significant enough way that an update is required on the consumer side, the producer must update the URL to a new one. + // The URL should be a fully qualified URL that includes http:// or https://, and any special characters in the URL must be correctly escaped. See the following http://www.w3.org/Addressing/URL/4_URI_Recommentations.html for a description of how to create fully qualified URL values. + required string url = 1; + + // IANA media type as to specify the type of image to be displayed. + // The type must start with "image/" + required string media_type = 2; + + // BCP-47 language code. Can be omitted if the language is unknown or if + // no i18n is done at all for the feed. At most one translation is + // allowed to have an unspecified language tag. + optional string language = 3; + + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; + } + // At least one localized image must be provided. + repeated LocalizedImage localized_image = 1; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + +// Describes the physical path that a vehicle takes when it's not part of the (CSV) GTFS, +// such as for a detour. Shapes belong to Trips, and consist of a sequence of shape points. +// Tracing the points in order provides the path of the vehicle. Shapes do not need to intercept +// the location of Stops exactly, but all Stops on a trip should lie within a small distance of +// the shape for that trip, i.e. close to straight line segments connecting the shape points +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +message Shape { + // Identifier of the shape. Must be different than any shape_id defined in the (CSV) GTFS. + // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever" + // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string shape_id = 1; + + // Encoded polyline representation of the shape. This polyline must contain at least two points. + // For more information about encoded polylines, see https://developers.google.com/maps/documentation/utilities/polylinealgorithm + // This field is required as per reference.md, but needs to be specified here optional because "Required is Forever" + // See https://developers.google.com/protocol-buffers/docs/proto#specifying_field_rules + // NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. + optional string encoded_polyline = 2; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + +// Describes a stop which is served by trips. All fields are as described in the GTFS-Static specification. +// NOTE: This message is still experimental, and subject to change. It may be formally adopted in the future. +message Stop { + enum WheelchairBoarding { + UNKNOWN = 0; + AVAILABLE = 1; + NOT_AVAILABLE = 2; + } + + optional string stop_id = 1; + optional TranslatedString stop_code = 2; + optional TranslatedString stop_name = 3; + optional TranslatedString tts_stop_name = 4; + optional TranslatedString stop_desc = 5; + optional float stop_lat = 6; + optional float stop_lon = 7; + optional string zone_id = 8; + optional TranslatedString stop_url = 9; + optional string parent_station = 11; + optional string stop_timezone = 12; + optional WheelchairBoarding wheelchair_boarding = 13 [default = UNKNOWN]; + optional string level_id = 14; + optional TranslatedString platform_code = 15; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +message TripModifications { + // A `Modification` message replaces a span of n stop times from each affected trip starting at `start_stop_selector`. + message Modification { + // The stop selector of the first stop_time of the original trip that is to be affected by this modification. + // Used in conjuction with `end_stop_selector`. + // `start_stop_selector` is required and is used to define the reference stop used with `travel_time_to_stop`. + optional StopSelector start_stop_selector = 1; + + // The stop selector of the last stop of the original trip that is to be affected by this modification. + // The selection is inclusive, so if only one stop_time is replaced by that modification, `start_stop_selector` and `end_stop_selector` must be equivalent. + // If no stop_time is replaced, `end_stop_selector` must not be provided. It's otherwise required. + optional StopSelector end_stop_selector = 2; + + // The number of seconds of delay to add to all departure and arrival times following the end of this modification. + // If multiple modifications apply to the same trip, the delays accumulate as the trip advances. + optional int32 propagated_modification_delay = 3 [default = 0]; + + // A list of replacement stops, replacing those of the original trip. + // The length of the new stop times may be less, the same, or greater than the number of replaced stop times. + repeated ReplacementStop replacement_stops = 4; + + // An `id` value from the `FeedEntity` message that contains the `Alert` describing this Modification for user-facing communication. + optional string service_alert_id = 5; + + // This timestamp identifies the moment when the modification has last been changed. + // In POSIX time (i.e., number of seconds since January 1st 1970 00:00:00 UTC). + optional uint64 last_modified_time = 6; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; + } + + message SelectedTrips { + // A list of trips affected with this replacement that all have the same new `shape_id`. + repeated string trip_ids = 1; + // The ID of the new shape for the modified trips in this SelectedTrips. + // May refer to a new shape added using a GTFS-RT Shape message, or to an existing shape defined in the GTFS-Static feed’s shapes.txt. + optional string shape_id = 2; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + + // A list of selected trips affected by this TripModifications. + repeated SelectedTrips selected_trips = 1; + + // A list of start times in the real-time trip descriptor for the trip_id defined in trip_ids. + // Useful to target multiple departures of a trip_id in a frequency-based trip. + repeated string start_times = 2; + + // Dates on which the modifications occurs, in the YYYYMMDD format. Producers SHOULD only transmit detours occurring within the next week. + // The dates provided should not be used as user-facing information, if a user-facing start and end date needs to be provided, they can be provided in the linked service alert with `service_alert_id` + repeated string service_dates = 3; + + // A list of modifications to apply to the affected trips. + repeated Modification modifications = 4; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +// Select a stop by stop sequence or by stop_id. At least one of the two values must be provided. +message StopSelector { + // Must be the same as in stop_times.txt in the corresponding GTFS feed. + optional uint32 stop_sequence = 1; + // Must be the same as in stops.txt in the corresponding GTFS feed. + optional string stop_id = 2; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} + +// NOTE: This field is still experimental, and subject to change. It may be formally adopted in the future. +message ReplacementStop { + // The difference in seconds between the arrival time at this stop and the arrival time at the reference stop. The reference stop is the stop prior to start_stop_selector. If the modification begins at the first stop of the trip, then the first stop of the trip is the reference stop. + // This value MUST be monotonically increasing and may only be a negative number if the first stop of the original trip is the reference stop. + optional int32 travel_time_to_stop = 1; + + // The replacement stop ID which will now be visited by the trip. May refer to a new stop added using a GTFS-RT Stop message, or to an existing stop defined in the GTFS-Static feed’s stops.txt. The stop MUST have location_type=0 (routable stops). + optional string stop_id = 2; + + // The extensions namespace allows 3rd-party developers to extend the + // GTFS Realtime Specification in order to add and evaluate new features and + // modifications to the spec. + extensions 1000 to 1999; + + // The following extension IDs are reserved for private use by any organization. + extensions 9000 to 9999; +} diff --git a/proto/us-ny-mta-alerts-extension.pb.go b/proto/us-ny-mta-alerts-extension.pb.go index 4395a5e..e1a4429 100644 --- a/proto/us-ny-mta-alerts-extension.pb.go +++ b/proto/us-ny-mta-alerts-extension.pb.go @@ -6,8 +6,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.18.1 +// protoc-gen-go v1.30.0 +// protoc (unknown) // source: proto/us-ny-mta-alerts-extension.proto package proto diff --git a/proto/us-ny-mta-trips-extension.pb.go b/proto/us-ny-mta-trips-extension.pb.go index f2d0da9..f074434 100644 --- a/proto/us-ny-mta-trips-extension.pb.go +++ b/proto/us-ny-mta-trips-extension.pb.go @@ -8,8 +8,8 @@ // Code generated by protoc-gen-go. DO NOT EDIT. // versions: -// protoc-gen-go v1.28.0 -// protoc v3.18.1 +// protoc-gen-go v1.30.0 +// protoc (unknown) // source: proto/us-ny-mta-trips-extension.proto package proto diff --git a/realtime.go b/realtime.go index d0d9626..96c360e 100644 --- a/realtime.go +++ b/realtime.go @@ -3,6 +3,7 @@ package gtfs import ( "fmt" "regexp" + "sort" "strconv" "time" @@ -38,6 +39,8 @@ func (trip *Trip) GetVehicle() Vehicle { return Vehicle{} } +type TripScheduleRelationship = gtfsrt.TripDescriptor_ScheduleRelationship + type TripID struct { ID string RouteID string @@ -48,15 +51,46 @@ type TripID struct { HasStartDate bool StartDate time.Time + + ScheduleRelationship TripScheduleRelationship +} + +// Define ordering on trip ids for test consistency +func (t1 TripID) Less(t2 TripID) bool { + if t1.ID != t2.ID { + return t1.ID < t2.ID + } + if t1.RouteID != t2.RouteID { + return t1.RouteID < t2.RouteID + } + if t1.DirectionID != t2.DirectionID { + return t1.DirectionID < t2.DirectionID + } + if t1.HasStartTime != t2.HasStartTime { + return !t1.HasStartTime && t2.HasStartTime + } + if t1.HasStartTime && t1.StartTime != t2.StartTime { + return t1.StartTime < t2.StartTime + } + if t1.HasStartDate != t2.HasStartDate { + return !t1.HasStartDate && t2.HasStartDate + } + if t1.HasStartDate && !t1.StartDate.Equal(t2.StartDate) { + return t1.StartDate.Before(t2.StartDate) + } + return t1.ScheduleRelationship < t2.ScheduleRelationship } +type StopTimeUpdateScheduleRelationship = gtfsrt.TripUpdate_StopTimeUpdate_ScheduleRelationship + // TODO: shouldn't this just be StopTime? type StopTimeUpdate struct { - StopSequence *uint32 - StopID *string - Arrival *StopTimeEvent - Departure *StopTimeEvent - NyctTrack *string + StopSequence *uint32 + StopID *string + Arrival *StopTimeEvent + Departure *StopTimeEvent + NyctTrack *string + ScheduleRelationship StopTimeUpdateScheduleRelationship } func (stopTimeUpdate *StopTimeUpdate) GetArrival() StopTimeEvent { @@ -326,6 +360,11 @@ func ParseRealtime(content []byte, opts *ParseRealtimeOptions) (*Realtime, error } result.Trips = append(result.Trips, *trip) } + + sort.Slice(result.Trips, func(i, j int) bool { + return result.Trips[i].ID.Less(result.Trips[j].ID) + }) + for vehicleID, vehicle := range vehiclesByID { if tripID, ok := vehicleIDToTripID[vehicleID]; ok { vehicle.Trip = tripsById[tripID] @@ -363,11 +402,12 @@ func parseTripUpdate(tripUpdate *gtfsrt.TripUpdate, opts *ParseRealtimeOptions) } for _, stopTimeUpdate := range tripUpdate.StopTimeUpdate { trip.StopTimeUpdates = append(trip.StopTimeUpdates, StopTimeUpdate{ - StopSequence: stopTimeUpdate.StopSequence, - StopID: stopTimeUpdate.StopId, - Arrival: convertStopTimeEvent(stopTimeUpdate.Arrival), - Departure: convertStopTimeEvent(stopTimeUpdate.Departure), - NyctTrack: opts.Extension.GetTrack(stopTimeUpdate), + StopSequence: stopTimeUpdate.StopSequence, + StopID: stopTimeUpdate.StopId, + Arrival: convertStopTimeEvent(stopTimeUpdate.Arrival), + Departure: convertStopTimeEvent(stopTimeUpdate.Departure), + NyctTrack: opts.Extension.GetTrack(stopTimeUpdate), + ScheduleRelationship: stopTimeUpdate.GetScheduleRelationship(), }) } if tripUpdate.Vehicle == nil { @@ -453,9 +493,10 @@ func parseOptionalTripDescriptor(tripDesc *gtfsrt.TripDescriptor, opts *ParseRea func parseTripDescriptor(tripDesc *gtfsrt.TripDescriptor, opts *ParseRealtimeOptions) TripID { id := TripID{ - ID: tripDesc.GetTripId(), - RouteID: tripDesc.GetRouteId(), - DirectionID: parseDirectionID_GTFSRealtime(tripDesc.DirectionId), + ID: tripDesc.GetTripId(), + RouteID: tripDesc.GetRouteId(), + DirectionID: parseDirectionID_GTFSRealtime(tripDesc.DirectionId), + ScheduleRelationship: tripDesc.GetScheduleRelationship(), } id.HasStartTime, id.StartTime = parseStartTime(tripDesc.StartTime) id.HasStartDate, id.StartDate = parseStartDate(tripDesc.StartDate, opts.timezoneOrUTC()) diff --git a/realtime_test.go b/realtime_test.go index cf40ec2..1d2cde0 100644 --- a/realtime_test.go +++ b/realtime_test.go @@ -12,8 +12,12 @@ import ( const ( tripID1 = "tripID1" + tripID2 = "tripID2" + tripID3 = "tripID3" vehicleID1 = "vehicleID1" stopID1 = "stopID1" + stopID2 = "stopID2" + stopID3 = "stopID3" ) var createTime time.Time = time.Unix(2<<28, 0).UTC() @@ -41,6 +45,46 @@ func TestRealtime(t *testing.T) { // TODO: other fields }, }, + { + Id: ptr("2"), + TripUpdate: >fsrt.TripUpdate{ + Trip: >fsrt.TripDescriptor{ + TripId: ptr(tripID2), + ScheduleRelationship: ptr(gtfsrt.TripDescriptor_ADDED), + }, + StopTimeUpdate: []*gtfsrt.TripUpdate_StopTimeUpdate{ + { + StopId: ptr(stopID1), + StopSequence: ptr(uint32(1)), + Arrival: >fsrt.TripUpdate_StopTimeEvent{ + Time: ptr(int64(time1.Unix())), + }, + }, + { + StopId: ptr(stopID2), + StopSequence: ptr(uint32(2)), + ScheduleRelationship: ptr(gtfsrt.TripUpdate_StopTimeUpdate_SKIPPED), + Arrival: >fsrt.TripUpdate_StopTimeEvent{ + Time: ptr(int64(time2.Unix())), + }, + }, + { + StopId: ptr(stopID3), + StopSequence: ptr(uint32(3)), + ScheduleRelationship: ptr(gtfsrt.TripUpdate_StopTimeUpdate_NO_DATA), + }, + }, + }, + }, + { + Id: ptr("3"), + TripUpdate: >fsrt.TripUpdate{ + Trip: >fsrt.TripDescriptor{ + TripId: ptr(tripID3), + ScheduleRelationship: ptr(gtfsrt.TripDescriptor_CANCELED), + }, + }, + }, }, want: func() *gtfs.Realtime { trip := gtfs.Trip{ @@ -58,9 +102,48 @@ func TestRealtime(t *testing.T) { } trip.Vehicle = &vehicle vehicle.Trip = &trip + + trip2 := gtfs.Trip{ + ID: gtfs.TripID{ + ID: tripID2, + ScheduleRelationship: gtfsrt.TripDescriptor_ADDED, + }, + StopTimeUpdates: []gtfs.StopTimeUpdate{ + { + StopID: ptr(stopID1), + StopSequence: ptr(uint32(1)), + Arrival: >fs.StopTimeEvent{ + Time: &time1, + }, + }, + { + StopID: ptr(stopID2), + StopSequence: ptr(uint32(2)), + Arrival: >fs.StopTimeEvent{ + Time: &time2, + }, + ScheduleRelationship: gtfsrt.TripUpdate_StopTimeUpdate_SKIPPED, + }, + { + StopID: ptr(stopID3), + StopSequence: ptr(uint32(3)), + ScheduleRelationship: gtfsrt.TripUpdate_StopTimeUpdate_NO_DATA, + }, + }, + IsEntityInMessage: true, + } + + trip3 := gtfs.Trip{ + ID: gtfs.TripID{ + ID: tripID3, + ScheduleRelationship: gtfsrt.TripDescriptor_CANCELED, + }, + IsEntityInMessage: true, + } + return >fs.Realtime{ CreatedAt: createTime, - Trips: []gtfs.Trip{trip}, + Trips: []gtfs.Trip{trip, trip2, trip3}, Vehicles: []gtfs.Vehicle{vehicle}, } }(),