szczanieckiej.git

commit cbf2c4222d9bfc6dd579efb1878292d983c2069a

Author: Adam Evyčędo <git@apiote.xyz>

update gtfs_rt proto

 gtfs_rt/transit_realtime/gtfs-realtime.pb.go | 2019 ++++++++++++++++-----
 traffic/realtime.go | 32 
 traffic/realtime_gtfs.go | 38 


diff --git a/gtfs_rt/transit_realtime/gtfs-realtime.pb.go b/gtfs_rt/transit_realtime/gtfs-realtime.pb.go
index 0890edddaf4a22d09811fe5f6f2c9f85a111d433..0a32f3a6dbbdd9f98e2f5b0ea8823ba84366dd99 100644
--- a/gtfs_rt/transit_realtime/gtfs-realtime.pb.go
+++ b/gtfs_rt/transit_realtime/gtfs-realtime.pb.go
@@ -24,16 +24,14 @@ // https://github.com/google/transit/tree/master/gtfs-realtime
 
 // Code generated by protoc-gen-go. DO NOT EDIT.
 // versions:
-// 	protoc-gen-go v1.25.0
-// 	protoc        v3.14.0
+// 	protoc-gen-go v1.31.0
+// 	protoc        v4.24.4
 // source: gtfs-realtime.proto
 
 package transit_realtime
 
 import (
-	proto "github.com/golang/protobuf/proto"
 	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
-	protoiface "google.golang.org/protobuf/runtime/protoiface"
 	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
 	reflect "reflect"
 	sync "sync"
@@ -45,10 +43,6 @@ 	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
 	// Verify that runtime/protoimpl is sufficiently up-to-date.
 	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
 )
-
-// This is a compile-time assertion that a sufficiently up-to-date version
-// of the legacy proto package is being used.
-const _ = proto.ProtoPackageIsVersion4
 
 // Determines whether the current fetch is incremental.  Currently,
 // DIFFERENTIAL mode is unsupported and behavior is unspecified for feeds
@@ -111,7 +105,7 @@ func (FeedHeader_Incrementality) EnumDescriptor() ([]byte, []int) {
 	return file_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,17 +113,26 @@ 	// The vehicle is proceeding in accordance with its static schedule of
 	// stops, although not necessarily according to the times of the schedule.
 	// At least one of arrival and departure must be provided. If the schedule
 	// for this stop contains both arrival and departure times then so must
-	// this update.
+	// this update. Frequency-based trips (GTFS frequencies.txt with exact_times = 0)
+	// should not have a SCHEDULED value and should use UNSCHEDULED instead.
 	TripUpdate_StopTimeUpdate_SCHEDULED TripUpdate_StopTimeUpdate_ScheduleRelationship = 0
 	// 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.
+	// This value should not be used for trips that are not defined in GTFS frequencies.txt,
+	// or trips in GTFS frequencies.txt with exact_times = 1. Trips containing StopTimeUpdates
+	// with ScheduleRelationship=UNSCHEDULED must also set TripDescriptor.ScheduleRelationship=UNSCHEDULED.
+	// NOTE: This field is still experimental, and subject to change. It may be
+	// formally adopted in the future.
+	TripUpdate_StopTimeUpdate_UNSCHEDULED TripUpdate_StopTimeUpdate_ScheduleRelationship = 3
 )
 
 // Enum value maps for TripUpdate_StopTimeUpdate_ScheduleRelationship.
@@ -138,11 +141,13 @@ 	TripUpdate_StopTimeUpdate_ScheduleRelationship_name = map[int32]string{
 		0: "SCHEDULED",
 		1: "SKIPPED",
 		2: "NO_DATA",
+		3: "UNSCHEDULED",
 	}
 	TripUpdate_StopTimeUpdate_ScheduleRelationship_value = map[string]int32{
-		"SCHEDULED": 0,
-		"SKIPPED":   1,
-		"NO_DATA":   2,
+		"SCHEDULED":   0,
+		"SKIPPED":     1,
+		"NO_DATA":     2,
+		"UNSCHEDULED": 3,
 	}
 )
 
@@ -312,35 +317,45 @@ func (VehiclePosition_CongestionLevel) EnumDescriptor() ([]byte, []int) {
 	return file_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.
@@ -353,6 +368,8 @@ 		3: "STANDING_ROOM_ONLY",
 		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,
@@ -362,6 +379,8 @@ 		"STANDING_ROOM_ONLY":         3,
 		"CRUSHED_STANDING_ROOM_ONLY": 4,
 		"FULL":                       5,
 		"NOT_ACCEPTING_PASSENGERS":   6,
+		"NO_DATA_AVAILABLE":          7,
+		"NOT_BOARDABLE":              8,
 	}
 )
 
@@ -402,7 +421,7 @@ func (VehiclePosition_OccupancyStatus) EnumDescriptor() ([]byte, []int) {
 	return file_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 (
@@ -489,7 +508,7 @@ func (Alert_Cause) EnumDescriptor() ([]byte, []int) {
 	return file_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 (
@@ -498,38 +517,44 @@ 	Alert_REDUCED_SERVICE Alert_Effect = 2
 	// We don't care about INsignificant delays: they are hard to detect, have
 	// little impact on the user, and would clutter the results as they are too
 	// frequent.
-	Alert_SIGNIFICANT_DELAYS Alert_Effect = 3
-	Alert_DETOUR             Alert_Effect = 4
-	Alert_ADDITIONAL_SERVICE Alert_Effect = 5
-	Alert_MODIFIED_SERVICE   Alert_Effect = 6
-	Alert_OTHER_EFFECT       Alert_Effect = 7
-	Alert_UNKNOWN_EFFECT     Alert_Effect = 8
-	Alert_STOP_MOVED         Alert_Effect = 9
+	Alert_SIGNIFICANT_DELAYS  Alert_Effect = 3
+	Alert_DETOUR              Alert_Effect = 4
+	Alert_ADDITIONAL_SERVICE  Alert_Effect = 5
+	Alert_MODIFIED_SERVICE    Alert_Effect = 6
+	Alert_OTHER_EFFECT        Alert_Effect = 7
+	Alert_UNKNOWN_EFFECT      Alert_Effect = 8
+	Alert_STOP_MOVED          Alert_Effect = 9
+	Alert_NO_EFFECT           Alert_Effect = 10
+	Alert_ACCESSIBILITY_ISSUE Alert_Effect = 11
 )
 
 // Enum value maps for Alert_Effect.
 var (
 	Alert_Effect_name = map[int32]string{
-		1: "NO_SERVICE",
-		2: "REDUCED_SERVICE",
-		3: "SIGNIFICANT_DELAYS",
-		4: "DETOUR",
-		5: "ADDITIONAL_SERVICE",
-		6: "MODIFIED_SERVICE",
-		7: "OTHER_EFFECT",
-		8: "UNKNOWN_EFFECT",
-		9: "STOP_MOVED",
+		1:  "NO_SERVICE",
+		2:  "REDUCED_SERVICE",
+		3:  "SIGNIFICANT_DELAYS",
+		4:  "DETOUR",
+		5:  "ADDITIONAL_SERVICE",
+		6:  "MODIFIED_SERVICE",
+		7:  "OTHER_EFFECT",
+		8:  "UNKNOWN_EFFECT",
+		9:  "STOP_MOVED",
+		10: "NO_EFFECT",
+		11: "ACCESSIBILITY_ISSUE",
 	}
 	Alert_Effect_value = map[string]int32{
-		"NO_SERVICE":         1,
-		"REDUCED_SERVICE":    2,
-		"SIGNIFICANT_DELAYS": 3,
-		"DETOUR":             4,
-		"ADDITIONAL_SERVICE": 5,
-		"MODIFIED_SERVICE":   6,
-		"OTHER_EFFECT":       7,
-		"UNKNOWN_EFFECT":     8,
-		"STOP_MOVED":         9,
+		"NO_SERVICE":          1,
+		"REDUCED_SERVICE":     2,
+		"SIGNIFICANT_DELAYS":  3,
+		"DETOUR":              4,
+		"ADDITIONAL_SERVICE":  5,
+		"MODIFIED_SERVICE":    6,
+		"OTHER_EFFECT":        7,
+		"UNKNOWN_EFFECT":      8,
+		"STOP_MOVED":          9,
+		"NO_EFFECT":           10,
+		"ACCESSIBILITY_ISSUE": 11,
 	}
 )
 
@@ -570,6 +595,69 @@ func (Alert_Effect) EnumDescriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{5, 1}
 }
 
+// Severity of this alert.
+type Alert_SeverityLevel int32
+
+const (
+	Alert_UNKNOWN_SEVERITY Alert_SeverityLevel = 1
+	Alert_INFO             Alert_SeverityLevel = 2
+	Alert_WARNING          Alert_SeverityLevel = 3
+	Alert_SEVERE           Alert_SeverityLevel = 4
+)
+
+// Enum value maps for Alert_SeverityLevel.
+var (
+	Alert_SeverityLevel_name = map[int32]string{
+		1: "UNKNOWN_SEVERITY",
+		2: "INFO",
+		3: "WARNING",
+		4: "SEVERE",
+	}
+	Alert_SeverityLevel_value = map[string]int32{
+		"UNKNOWN_SEVERITY": 1,
+		"INFO":             2,
+		"WARNING":          3,
+		"SEVERE":           4,
+	}
+)
+
+func (x Alert_SeverityLevel) Enum() *Alert_SeverityLevel {
+	p := new(Alert_SeverityLevel)
+	*p = x
+	return p
+}
+
+func (x Alert_SeverityLevel) String() string {
+	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
+}
+
+func (Alert_SeverityLevel) Descriptor() protoreflect.EnumDescriptor {
+	return file_gtfs_realtime_proto_enumTypes[7].Descriptor()
+}
+
+func (Alert_SeverityLevel) Type() protoreflect.EnumType {
+	return &file_gtfs_realtime_proto_enumTypes[7]
+}
+
+func (x Alert_SeverityLevel) Number() protoreflect.EnumNumber {
+	return protoreflect.EnumNumber(x)
+}
+
+// Deprecated: Do not use.
+func (x *Alert_SeverityLevel) UnmarshalJSON(b []byte) error {
+	num, err := protoimpl.X.UnmarshalJSONEnum(x.Descriptor(), b)
+	if err != nil {
+		return err
+	}
+	*x = Alert_SeverityLevel(num)
+	return nil
+}
+
+// Deprecated: Use Alert_SeverityLevel.Descriptor instead.
+func (Alert_SeverityLevel) EnumDescriptor() ([]byte, []int) {
+	return file_gtfs_realtime_proto_rawDescGZIP(), []int{5, 2}
+}
+
 // The relation between this trip and the static schedule. If a trip is done
 // in accordance with temporary schedule, not reflected in GTFS, then it
 // shouldn't be marked as SCHEDULED, but likely as ADDED.
@@ -582,12 +670,45 @@ 	TripDescriptor_SCHEDULED TripDescriptor_ScheduleRelationship = 0
 	// 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, for example, if
-	// there is no schedule at all.
+	// 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.
 	TripDescriptor_UNSCHEDULED TripDescriptor_ScheduleRelationship = 2
 	// A trip that existed in the schedule but was removed.
 	TripDescriptor_CANCELED TripDescriptor_ScheduleRelationship = 3
+	// Should not be used - for backwards-compatibility only.
+	//
+	// Deprecated: Marked as deprecated in 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.
@@ -597,12 +718,18 @@ 		0: "SCHEDULED",
 		1: "ADDED",
 		2: "UNSCHEDULED",
 		3: "CANCELED",
+		5: "REPLACEMENT",
+		6: "DUPLICATED",
+		7: "DELETED",
 	}
 	TripDescriptor_ScheduleRelationship_value = map[string]int32{
 		"SCHEDULED":   0,
 		"ADDED":       1,
 		"UNSCHEDULED": 2,
 		"CANCELED":    3,
+		"REPLACEMENT": 5,
+		"DUPLICATED":  6,
+		"DELETED":     7,
 	}
 )
 
@@ -617,11 +744,11 @@ 	return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
 }
 
 func (TripDescriptor_ScheduleRelationship) Descriptor() protoreflect.EnumDescriptor {
-	return file_gtfs_realtime_proto_enumTypes[7].Descriptor()
+	return file_gtfs_realtime_proto_enumTypes[8].Descriptor()
 }
 
 func (TripDescriptor_ScheduleRelationship) Type() protoreflect.EnumType {
-	return &file_gtfs_realtime_proto_enumTypes[7]
+	return &file_gtfs_realtime_proto_enumTypes[8]
 }
 
 func (x TripDescriptor_ScheduleRelationship) Number() protoreflect.EnumNumber {
@@ -643,6 +770,77 @@ func (TripDescriptor_ScheduleRelationship) EnumDescriptor() ([]byte, []int) {
 	return file_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_gtfs_realtime_proto_enumTypes[9].Descriptor()
+}
+
+func (VehicleDescriptor_WheelchairAccessible) Type() protoreflect.EnumType {
+	return &file_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_gtfs_realtime_proto_rawDescGZIP(), []int{9, 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.
@@ -696,15 +894,6 @@ func (*FeedMessage) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{0}
 }
 
-var extRange_FeedMessage = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use FeedMessage.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*FeedMessage) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_FeedMessage
-}
-
 func (x *FeedMessage) GetHeader() *FeedHeader {
 	if x != nil {
 		return x.Header
@@ -727,7 +916,7 @@ 	unknownFields   protoimpl.UnknownFields
 	extensionFields protoimpl.ExtensionFields
 
 	// Version of the feed specification.
-	// The current version is 2.0.
+	// The current version is 2.0.  Valid versions are "2.0", "1.0".
 	GtfsRealtimeVersion *string                    `protobuf:"bytes,1,req,name=gtfs_realtime_version,json=gtfsRealtimeVersion" json:"gtfs_realtime_version,omitempty"`
 	Incrementality      *FeedHeader_Incrementality `protobuf:"varint,2,opt,name=incrementality,enum=transit_realtime.FeedHeader_Incrementality,def=0" json:"incrementality,omitempty"`
 	// This timestamp identifies the moment when the content of this feed has been
@@ -773,15 +962,6 @@ func (*FeedHeader) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{1}
 }
 
-var extRange_FeedHeader = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use FeedHeader.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*FeedHeader) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_FeedHeader
-}
-
 func (x *FeedHeader) GetGtfsRealtimeVersion() string {
 	if x != nil && x.GtfsRealtimeVersion != nil {
 		return *x.GtfsRealtimeVersion
@@ -827,6 +1007,8 @@ 	// present (unless the entity is being deleted).
 	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"`
 }
 
 // Default values for FeedEntity fields.
@@ -866,15 +1048,6 @@ func (*FeedEntity) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{2}
 }
 
-var extRange_FeedEntity = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use FeedEntity.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*FeedEntity) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_FeedEntity
-}
-
 func (x *FeedEntity) GetId() string {
 	if x != nil && x.Id != nil {
 		return *x.Id
@@ -906,6 +1079,13 @@
 func (x *FeedEntity) GetAlert() *Alert {
 	if x != nil {
 		return x.Alert
+	}
+	return nil
+}
+
+func (x *FeedEntity) GetShape() *Shape {
+	if x != nil {
+		return x.Shape
 	}
 	return nil
 }
@@ -969,7 +1149,9 @@ 	// - stop_sequences 3,4,5,6,7 have delay of 5 min.
 	// - 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
@@ -990,7 +1172,8 @@ 	// evaluate the freshness of the data.
 	//
 	// 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() {
@@ -1025,15 +1208,6 @@ func (*TripUpdate) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{3}
 }
 
-var extRange_TripUpdate = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use TripUpdate.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TripUpdate) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TripUpdate
-}
-
 func (x *TripUpdate) GetTrip() *TripDescriptor {
 	if x != nil {
 		return x.Trip
@@ -1067,6 +1241,13 @@ 	if x != nil && x.Delay != nil {
 		return *x.Delay
 	}
 	return 0
+}
+
+func (x *TripUpdate) GetTripProperties() *TripUpdate_TripProperties {
+	if x != nil {
+		return x.TripProperties
+	}
+	return nil
 }
 
 // Realtime positioning information for a given vehicle.
@@ -1099,7 +1280,29 @@ 	// Moment at which the vehicle's position was measured. In POSIX time
 	// (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 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.
+	// 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.
@@ -1137,15 +1340,6 @@
 // Deprecated: Use VehiclePosition.ProtoReflect.Descriptor instead.
 func (*VehiclePosition) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{4}
-}
-
-var extRange_VehiclePosition = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use VehiclePosition.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*VehiclePosition) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_VehiclePosition
 }
 
 func (x *VehiclePosition) GetTrip() *TripDescriptor {
@@ -1211,6 +1405,20 @@ 	}
 	return VehiclePosition_EMPTY
 }
 
+func (x *VehiclePosition) GetOccupancyPercentage() uint32 {
+	if x != nil && x.OccupancyPercentage != nil {
+		return *x.OccupancyPercentage
+	}
+	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
@@ -1233,12 +1441,32 @@ 	HeaderText *TranslatedString `protobuf:"bytes,10,opt,name=header_text,json=headerText" json:"header_text,omitempty"`
 	// Full description for the alert as plain-text. The information in the
 	// 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.
+	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.
+	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.
 const (
-	Default_Alert_Cause  = Alert_UNKNOWN_CAUSE
-	Default_Alert_Effect = Alert_UNKNOWN_EFFECT
+	Default_Alert_Cause         = Alert_UNKNOWN_CAUSE
+	Default_Alert_Effect        = Alert_UNKNOWN_EFFECT
+	Default_Alert_SeverityLevel = Alert_UNKNOWN_SEVERITY
 )
 
 func (x *Alert) Reset() {
@@ -1271,15 +1499,6 @@
 // Deprecated: Use Alert.ProtoReflect.Descriptor instead.
 func (*Alert) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{5}
-}
-
-var extRange_Alert = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use Alert.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*Alert) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_Alert
 }
 
 func (x *Alert) GetActivePeriod() []*TimeRange {
@@ -1331,6 +1550,55 @@ 	}
 	return nil
 }
 
+func (x *Alert) GetTtsHeaderText() *TranslatedString {
+	if x != nil {
+		return x.TtsHeaderText
+	}
+	return nil
+}
+
+func (x *Alert) GetTtsDescriptionText() *TranslatedString {
+	if x != nil {
+		return x.TtsDescriptionText
+	}
+	return nil
+}
+
+func (x *Alert) GetSeverityLevel() Alert_SeverityLevel {
+	if x != nil && x.SeverityLevel != nil {
+		return *x.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 {
@@ -1379,15 +1647,6 @@
 // Deprecated: Use TimeRange.ProtoReflect.Descriptor instead.
 func (*TimeRange) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{6}
-}
-
-var extRange_TimeRange = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use TimeRange.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TimeRange) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TimeRange
 }
 
 func (x *TimeRange) GetStart() uint64 {
@@ -1459,15 +1718,6 @@ func (*Position) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{7}
 }
 
-var extRange_Position = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use Position.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*Position) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_Position
-}
-
 func (x *Position) GetLatitude() float32 {
 	if x != nil && x.Latitude != nil {
 		return *x.Latitude
@@ -1505,13 +1755,13 @@ }
 
 // A descriptor that identifies an instance of a GTFS trip, or all instances of
 // a trip along a route.
-// - To specify a single trip instance, the trip_id (and if necessary,
-//   start_time) is set. If route_id is also set, then it should be same as one
-//   that the given trip corresponds to.
-// - To specify all the trips along a given route, only the route_id should be
-//   set. Note that if the trip_id is not known, then stop sequence ids in
-//   TripUpdate are not sufficient, and stop_ids must be provided as well. In
-//   addition, absolute arrival/departure times must be provided.
+//   - To specify a single trip instance, the trip_id (and if necessary,
+//     start_time) is set. If route_id is also set, then it should be same as one
+//     that the given trip corresponds to.
+//   - To specify all the trips along a given route, only the route_id should be
+//     set. Note that if the trip_id is not known, then stop sequence ids in
+//     TripUpdate are not sufficient, and stop_ids must be provided as well. In
+//     addition, absolute arrival/departure times must be provided.
 type TripDescriptor struct {
 	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
@@ -1521,19 +1771,19 @@
 	// 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"`
 	// The direction_id from the GTFS feed trips.txt file, indicating the
-	// direction of travel for trips this selector refers to. This field is
-	// still experimental, and subject to change. It may be formally adopted in
-	// the future.
+	// direction of travel for trips this selector refers to.
 	DirectionId *uint32 `protobuf:"varint,6,opt,name=direction_id,json=directionId" json:"direction_id,omitempty"`
 	// The initially scheduled start time of this trip instance.
 	// When the trip_id corresponds to a non-frequency-based trip, this field
 	// should either be omitted or be equal to the value in the GTFS feed. When
-	// the trip_id corresponds to a frequency-based trip, the start_time must be
+	// the trip_id correponds to a frequency-based trip, the start_time must be
 	// specified for trip updates and vehicle positions. If the trip corresponds
 	// to exact_times=1 GTFS record, then start_time must be some multiple
 	// (including zero) of headway_secs later than frequencies.txt start_time for
@@ -1592,15 +1842,6 @@ func (*TripDescriptor) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{8}
 }
 
-var extRange_TripDescriptor = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use TripDescriptor.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TripDescriptor) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TripDescriptor
-}
-
 func (x *TripDescriptor) GetTripId() string {
 	if x != nil && x.TripId != nil {
 		return *x.TripId
@@ -1658,8 +1899,14 @@ 	// User visible label, i.e., something that must be shown to the passenger to
 	// 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{}
@@ -1693,15 +1940,6 @@ func (*VehicleDescriptor) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{9}
 }
 
-var extRange_VehicleDescriptor = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use VehicleDescriptor.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*VehicleDescriptor) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_VehicleDescriptor
-}
-
 func (x *VehicleDescriptor) GetId() string {
 	if x != nil && x.Id != nil {
 		return *x.Id
@@ -1723,6 +1961,13 @@ 	}
 	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
@@ -1740,6 +1985,9 @@ 	// corresponds to route_type in GTFS.
 	RouteType *int32          `protobuf:"varint,3,opt,name=route_type,json=routeType" json:"route_type,omitempty"`
 	Trip      *TripDescriptor `protobuf:"bytes,4,opt,name=trip" json:"trip,omitempty"`
 	StopId    *string         `protobuf:"bytes,5,opt,name=stop_id,json=stopId" json:"stop_id,omitempty"`
+	// Corresponds to trip direction_id in GTFS trips.txt. If provided the
+	// route_id must also be provided.
+	DirectionId *uint32 `protobuf:"varint,6,opt,name=direction_id,json=directionId" json:"direction_id,omitempty"`
 }
 
 func (x *EntitySelector) Reset() {
@@ -1774,15 +2022,6 @@ func (*EntitySelector) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{10}
 }
 
-var extRange_EntitySelector = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use EntitySelector.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*EntitySelector) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_EntitySelector
-}
-
 func (x *EntitySelector) GetAgencyId() string {
 	if x != nil && x.AgencyId != nil {
 		return *x.AgencyId
@@ -1818,16 +2057,23 @@ 	}
 	return ""
 }
 
+func (x *EntitySelector) GetDirectionId() uint32 {
+	if x != nil && x.DirectionId != nil {
+		return *x.DirectionId
+	}
+	return 0
+}
+
 // An internationalized message containing per-language versions of a snippet of
 // text or a URL.
 // One of the strings from a message will be picked up. 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.
+//  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.
 type TranslatedString struct {
 	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
@@ -1870,31 +2116,154 @@ func (*TranslatedString) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{11}
 }
 
-var extRange_TranslatedString = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
+func (x *TranslatedString) GetTranslation() []*TranslatedString_Translation {
+	if x != nil {
+		return x.Translation
+	}
+	return nil
+}
+
+// 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.
+type TranslatedImage struct {
+	state           protoimpl.MessageState
+	sizeCache       protoimpl.SizeCache
+	unknownFields   protoimpl.UnknownFields
+	extensionFields protoimpl.ExtensionFields
+
+	// 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 *TranslatedImage) Reset() {
+	*x = TranslatedImage{}
+	if protoimpl.UnsafeEnabled {
+		mi := &file_gtfs_realtime_proto_msgTypes[12]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *TranslatedImage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TranslatedImage) ProtoMessage() {}
+
+func (x *TranslatedImage) ProtoReflect() protoreflect.Message {
+	mi := &file_gtfs_realtime_proto_msgTypes[12]
+	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.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TranslatedString) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TranslatedString
+// Deprecated: Use TranslatedImage.ProtoReflect.Descriptor instead.
+func (*TranslatedImage) Descriptor() ([]byte, []int) {
+	return file_gtfs_realtime_proto_rawDescGZIP(), []int{12}
 }
 
-func (x *TranslatedString) GetTranslation() []*TranslatedString_Translation {
+func (x *TranslatedImage) GetLocalizedImage() []*TranslatedImage_LocalizedImage {
 	if x != nil {
-		return x.Translation
+		return x.LocalizedImage
 	}
 	return nil
 }
 
+// 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
+
+	// 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_gtfs_realtime_proto_msgTypes[13]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
+}
+
+func (x *Shape) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*Shape) ProtoMessage() {}
+
+func (x *Shape) ProtoReflect() protoreflect.Message {
+	mi := &file_gtfs_realtime_proto_msgTypes[13]
+	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 Shape.ProtoReflect.Descriptor instead.
+func (*Shape) Descriptor() ([]byte, []int) {
+	return file_gtfs_realtime_proto_rawDescGZIP(), []int{13}
+}
+
+func (x *Shape) GetShapeId() string {
+	if x != nil && x.ShapeId != nil {
+		return *x.ShapeId
+	}
+	return ""
+}
+
+func (x *Shape) GetEncodedPolyline() string {
+	if x != nil && x.EncodedPolyline != nil {
+		return *x.EncodedPolyline
+	}
+	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).
+//   - 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
@@ -1925,7 +2294,7 @@
 func (x *TripUpdate_StopTimeEvent) Reset() {
 	*x = TripUpdate_StopTimeEvent{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gtfs_realtime_proto_msgTypes[12]
+		mi := &file_gtfs_realtime_proto_msgTypes[14]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -1938,7 +2307,7 @@
 func (*TripUpdate_StopTimeEvent) ProtoMessage() {}
 
 func (x *TripUpdate_StopTimeEvent) ProtoReflect() protoreflect.Message {
-	mi := &file_gtfs_realtime_proto_msgTypes[12]
+	mi := &file_gtfs_realtime_proto_msgTypes[14]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -1952,15 +2321,6 @@
 // Deprecated: Use TripUpdate_StopTimeEvent.ProtoReflect.Descriptor instead.
 func (*TripUpdate_StopTimeEvent) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{3, 0}
-}
-
-var extRange_TripUpdate_StopTimeEvent = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use TripUpdate_StopTimeEvent.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TripUpdate_StopTimeEvent) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TripUpdate_StopTimeEvent
 }
 
 func (x *TripUpdate_StopTimeEvent) GetDelay() int32 {
@@ -1996,10 +2356,18 @@
 	// 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"`
+	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.
@@ -2010,7 +2378,7 @@
 func (x *TripUpdate_StopTimeUpdate) Reset() {
 	*x = TripUpdate_StopTimeUpdate{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gtfs_realtime_proto_msgTypes[13]
+		mi := &file_gtfs_realtime_proto_msgTypes[15]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2023,7 +2391,7 @@
 func (*TripUpdate_StopTimeUpdate) ProtoMessage() {}
 
 func (x *TripUpdate_StopTimeUpdate) ProtoReflect() protoreflect.Message {
-	mi := &file_gtfs_realtime_proto_msgTypes[13]
+	mi := &file_gtfs_realtime_proto_msgTypes[15]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2039,15 +2407,6 @@ func (*TripUpdate_StopTimeUpdate) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{3, 1}
 }
 
-var extRange_TripUpdate_StopTimeUpdate = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
-}
-
-// Deprecated: Use TripUpdate_StopTimeUpdate.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TripUpdate_StopTimeUpdate) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TripUpdate_StopTimeUpdate
-}
-
 func (x *TripUpdate_StopTimeUpdate) GetStopSequence() uint32 {
 	if x != nil && x.StopSequence != nil {
 		return *x.StopSequence
@@ -2076,6 +2435,13 @@ 	}
 	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
@@ -2083,6 +2449,289 @@ 	}
 	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_gtfs_realtime_proto_msgTypes[16]
+		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_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 TripUpdate_TripProperties.ProtoReflect.Descriptor instead.
+func (*TripUpdate_TripProperties) Descriptor() ([]byte, []int) {
+	return file_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_gtfs_realtime_proto_msgTypes[17]
+		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_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 TripUpdate_StopTimeUpdate_StopTimeProperties.ProtoReflect.Descriptor instead.
+func (*TripUpdate_StopTimeUpdate_StopTimeProperties) Descriptor() ([]byte, []int) {
+	return file_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_gtfs_realtime_proto_msgTypes[18]
+		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_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 VehiclePosition_CarriageDetails.ProtoReflect.Descriptor instead.
+func (*VehiclePosition_CarriageDetails) Descriptor() ([]byte, []int) {
+	return file_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 TranslatedString_Translation struct {
 	state           protoimpl.MessageState
 	sizeCache       protoimpl.SizeCache
@@ -2100,7 +2749,7 @@
 func (x *TranslatedString_Translation) Reset() {
 	*x = TranslatedString_Translation{}
 	if protoimpl.UnsafeEnabled {
-		mi := &file_gtfs_realtime_proto_msgTypes[14]
+		mi := &file_gtfs_realtime_proto_msgTypes[19]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		ms.StoreMessageInfo(mi)
 	}
@@ -2113,7 +2762,7 @@
 func (*TranslatedString_Translation) ProtoMessage() {}
 
 func (x *TranslatedString_Translation) ProtoReflect() protoreflect.Message {
-	mi := &file_gtfs_realtime_proto_msgTypes[14]
+	mi := &file_gtfs_realtime_proto_msgTypes[19]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
 		if ms.LoadMessageInfo() == nil {
@@ -2129,23 +2778,87 @@ func (*TranslatedString_Translation) Descriptor() ([]byte, []int) {
 	return file_gtfs_realtime_proto_rawDescGZIP(), []int{11, 0}
 }
 
-var extRange_TranslatedString_Translation = []protoiface.ExtensionRangeV1{
-	{Start: 1000, End: 1999},
+func (x *TranslatedString_Translation) GetText() string {
+	if x != nil && x.Text != nil {
+		return *x.Text
+	}
+	return ""
+}
+
+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_gtfs_realtime_proto_msgTypes[20]
+		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
+		ms.StoreMessageInfo(mi)
+	}
 }
 
-// Deprecated: Use TranslatedString_Translation.ProtoReflect.Descriptor.ExtensionRanges instead.
-func (*TranslatedString_Translation) ExtensionRangeArray() []protoiface.ExtensionRangeV1 {
-	return extRange_TranslatedString_Translation
+func (x *TranslatedImage_LocalizedImage) String() string {
+	return protoimpl.X.MessageStringOf(x)
+}
+
+func (*TranslatedImage_LocalizedImage) ProtoMessage() {}
+
+func (x *TranslatedImage_LocalizedImage) ProtoReflect() protoreflect.Message {
+	mi := &file_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 TranslatedImage_LocalizedImage.ProtoReflect.Descriptor instead.
+func (*TranslatedImage_LocalizedImage) Descriptor() ([]byte, []int) {
+	return file_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 *TranslatedString_Translation) GetText() string {
-	if x != nil && x.Text != nil {
-		return *x.Text
+func (x *TranslatedImage_LocalizedImage) GetMediaType() string {
+	if x != nil && x.MediaType != nil {
+		return *x.MediaType
 	}
 	return ""
 }
 
-func (x *TranslatedString_Translation) GetLanguage() string {
+func (x *TranslatedImage_LocalizedImage) GetLanguage() string {
 	if x != nil && x.Language != nil {
 		return *x.Language
 	}
@@ -2157,7 +2870,7 @@
 var file_gtfs_realtime_proto_rawDesc = []byte{
 	0x0a, 0x13, 0x67, 0x74, 0x66, 0x73, 0x2d, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e,
 	0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x10, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72,
-	0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x81, 0x01, 0x0a, 0x0b, 0x46, 0x65, 0x65, 0x64,
+	0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x89, 0x01, 0x0a, 0x0b, 0x46, 0x65, 0x65, 0x64,
 	0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x34, 0x0a, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65,
 	0x72, 0x18, 0x01, 0x20, 0x02, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69,
 	0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x48,
@@ -2165,23 +2878,24 @@ 	0x65, 0x61, 0x64, 0x65, 0x72, 0x52, 0x06, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x34, 0x0a,
 	0x06, 0x65, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e,
 	0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65,
 	0x2e, 0x46, 0x65, 0x65, 0x64, 0x45, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x52, 0x06, 0x65, 0x6e, 0x74,
-	0x69, 0x74, 0x79, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x22, 0xff, 0x01, 0x0a, 0x0a,
-	0x46, 0x65, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x67, 0x74,
-	0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73,
-	0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28, 0x09, 0x52, 0x13, 0x67, 0x74, 0x66, 0x73, 0x52,
-	0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x61,
-	0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74, 0x79,
-	0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b, 0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74,
-	0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x48, 0x65,
-	0x61, 0x64, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c,
-	0x69, 0x74, 0x79, 0x3a, 0x0c, 0x46, 0x55, 0x4c, 0x4c, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x53, 0x45,
-	0x54, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74,
-	0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03,
-	0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22,
-	0x34, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74,
-	0x79, 0x12, 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, 0x22, 0xf5, 0x01,
+	0x69, 0x74, 0x79, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xa8, 0x46,
+	0x10, 0x90, 0x4e, 0x22, 0x87, 0x02, 0x0a, 0x0a, 0x46, 0x65, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64,
+	0x65, 0x72, 0x12, 0x32, 0x0a, 0x15, 0x67, 0x74, 0x66, 0x73, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74,
+	0x69, 0x6d, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x02, 0x28,
+	0x09, 0x52, 0x13, 0x67, 0x74, 0x66, 0x73, 0x52, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65, 0x56,
+	0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x61, 0x0a, 0x0e, 0x69, 0x6e, 0x63, 0x72, 0x65, 0x6d,
+	0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x2b,
+	0x2e, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d,
+	0x65, 0x2e, 0x46, 0x65, 0x65, 0x64, 0x48, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x49, 0x6e, 0x63,
+	0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x3a, 0x0c, 0x46, 0x55, 0x4c,
+	0x4c, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x53, 0x45, 0x54, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x72, 0x65,
+	0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x74, 0x69, 0x6d,
+	0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x74, 0x69,
+	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x34, 0x0a, 0x0e, 0x49, 0x6e, 0x63, 0x72, 0x65,
+	0x6d, 0x65, 0x6e, 0x74, 0x61, 0x6c, 0x69, 0x74, 0x79, 0x12, 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, 0xac, 0x02,
 	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,
@@ -2196,150 +2910,255 @@ 	0x6c, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x50, 0x6f, 0x73,
 	0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x68, 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, 0x22, 0xa6, 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, 0x63, 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, 0x1a, 0xaa, 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,
+	0x2e, 0x41, 0x6c, 0x65, 0x72, 0x74, 0x52, 0x05, 0x61, 0x6c, 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, 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, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c,
-	0x65, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x22, 0x3f, 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, 0x2a, 0x06,
-	0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x22, 0xd2,
-	0x07, 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,
+	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, 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, 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, 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, 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, 0x22, 0x85, 0x07, 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,
+	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, 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,
+	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, 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,
+	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, 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, 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,
@@ -2353,7 +3172,7 @@ 	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, 0xb5, 0x01, 0x0a, 0x06,
+	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,
@@ -2365,75 +3184,130 @@ 	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, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x22, 0x3b, 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, 0x22, 0x98, 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, 0x22, 0xea, 0x02, 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,
+	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, 0xa5, 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, 0x52, 0x14, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x74,
-	0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x22, 0x4f, 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, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f,
-	0x22, 0x66, 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, 0x22, 0xbe, 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, 0x2a, 0x06, 0x08, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x22, 0xb3, 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, 0x45, 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, 0xe8, 0x07, 0x10, 0xd0, 0x0f, 0x42,
-	0x1d, 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,
+	0x70, 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, 0x42, 0x52, 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, 0x33, 0x61, 0x70, 0x69, 0x6f, 0x74, 0x65,
+	0x2e, 0x78, 0x79, 0x7a, 0x2f, 0x70, 0x2f, 0x73, 0x7a, 0x63, 0x7a, 0x61, 0x6e, 0x69, 0x65, 0x63,
+	0x6b, 0x69, 0x65, 0x6a, 0x2f, 0x67, 0x74, 0x66, 0x73, 0x5f, 0x72, 0x74, 0x2f, 0x74, 0x72, 0x61,
+	0x6e, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x61, 0x6c, 0x74, 0x69, 0x6d, 0x65,
 }
 
 var (
@@ -2448,67 +3322,90 @@ 	})
 	return file_gtfs_realtime_proto_rawDescData
 }
 
-var file_gtfs_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 8)
-var file_gtfs_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 15)
+var file_gtfs_realtime_proto_enumTypes = make([]protoimpl.EnumInfo, 10)
+var file_gtfs_realtime_proto_msgTypes = make([]protoimpl.MessageInfo, 21)
 var file_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
-	(TripDescriptor_ScheduleRelationship)(0),            // 7: transit_realtime.TripDescriptor.ScheduleRelationship
-	(*FeedMessage)(nil),                                 // 8: transit_realtime.FeedMessage
-	(*FeedHeader)(nil),                                  // 9: transit_realtime.FeedHeader
-	(*FeedEntity)(nil),                                  // 10: transit_realtime.FeedEntity
-	(*TripUpdate)(nil),                                  // 11: transit_realtime.TripUpdate
-	(*VehiclePosition)(nil),                             // 12: transit_realtime.VehiclePosition
-	(*Alert)(nil),                                       // 13: transit_realtime.Alert
-	(*TimeRange)(nil),                                   // 14: transit_realtime.TimeRange
-	(*Position)(nil),                                    // 15: transit_realtime.Position
-	(*TripDescriptor)(nil),                              // 16: transit_realtime.TripDescriptor
-	(*VehicleDescriptor)(nil),                           // 17: transit_realtime.VehicleDescriptor
-	(*EntitySelector)(nil),                              // 18: transit_realtime.EntitySelector
-	(*TranslatedString)(nil),                            // 19: transit_realtime.TranslatedString
-	(*TripUpdate_StopTimeEvent)(nil),                    // 20: transit_realtime.TripUpdate.StopTimeEvent
-	(*TripUpdate_StopTimeUpdate)(nil),                   // 21: transit_realtime.TripUpdate.StopTimeUpdate
-	(*TranslatedString_Translation)(nil),                // 22: 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
+	(*FeedMessage)(nil),                                  // 10: transit_realtime.FeedMessage
+	(*FeedHeader)(nil),                                   // 11: transit_realtime.FeedHeader
+	(*FeedEntity)(nil),                                   // 12: transit_realtime.FeedEntity
+	(*TripUpdate)(nil),                                   // 13: transit_realtime.TripUpdate
+	(*VehiclePosition)(nil),                              // 14: transit_realtime.VehiclePosition
+	(*Alert)(nil),                                        // 15: transit_realtime.Alert
+	(*TimeRange)(nil),                                    // 16: transit_realtime.TimeRange
+	(*Position)(nil),                                     // 17: transit_realtime.Position
+	(*TripDescriptor)(nil),                               // 18: transit_realtime.TripDescriptor
+	(*VehicleDescriptor)(nil),                            // 19: transit_realtime.VehicleDescriptor
+	(*EntitySelector)(nil),                               // 20: transit_realtime.EntitySelector
+	(*TranslatedString)(nil),                             // 21: transit_realtime.TranslatedString
+	(*TranslatedImage)(nil),                              // 22: transit_realtime.TranslatedImage
+	(*Shape)(nil),                                        // 23: transit_realtime.Shape
+	(*TripUpdate_StopTimeEvent)(nil),                     // 24: transit_realtime.TripUpdate.StopTimeEvent
+	(*TripUpdate_StopTimeUpdate)(nil),                    // 25: transit_realtime.TripUpdate.StopTimeUpdate
+	(*TripUpdate_TripProperties)(nil),                    // 26: transit_realtime.TripUpdate.TripProperties
+	(*TripUpdate_StopTimeUpdate_StopTimeProperties)(nil), // 27: transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
+	(*VehiclePosition_CarriageDetails)(nil),              // 28: transit_realtime.VehiclePosition.CarriageDetails
+	(*TranslatedString_Translation)(nil),                 // 29: transit_realtime.TranslatedString.Translation
+	(*TranslatedImage_LocalizedImage)(nil),               // 30: transit_realtime.TranslatedImage.LocalizedImage
 }
 var file_gtfs_realtime_proto_depIdxs = []int32{
-	9,  // 0: transit_realtime.FeedMessage.header:type_name -> transit_realtime.FeedHeader
-	10, // 1: transit_realtime.FeedMessage.entity:type_name -> transit_realtime.FeedEntity
+	11, // 0: transit_realtime.FeedMessage.header:type_name -> transit_realtime.FeedHeader
+	12, // 1: transit_realtime.FeedMessage.entity:type_name -> transit_realtime.FeedEntity
 	0,  // 2: transit_realtime.FeedHeader.incrementality:type_name -> transit_realtime.FeedHeader.Incrementality
-	11, // 3: transit_realtime.FeedEntity.trip_update:type_name -> transit_realtime.TripUpdate
-	12, // 4: transit_realtime.FeedEntity.vehicle:type_name -> transit_realtime.VehiclePosition
-	13, // 5: transit_realtime.FeedEntity.alert:type_name -> transit_realtime.Alert
-	16, // 6: transit_realtime.TripUpdate.trip:type_name -> transit_realtime.TripDescriptor
-	17, // 7: transit_realtime.TripUpdate.vehicle:type_name -> transit_realtime.VehicleDescriptor
-	21, // 8: transit_realtime.TripUpdate.stop_time_update:type_name -> transit_realtime.TripUpdate.StopTimeUpdate
-	16, // 9: transit_realtime.VehiclePosition.trip:type_name -> transit_realtime.TripDescriptor
-	17, // 10: transit_realtime.VehiclePosition.vehicle:type_name -> transit_realtime.VehicleDescriptor
-	15, // 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
-	14, // 15: transit_realtime.Alert.active_period:type_name -> transit_realtime.TimeRange
-	18, // 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
-	19, // 19: transit_realtime.Alert.url:type_name -> transit_realtime.TranslatedString
-	19, // 20: transit_realtime.Alert.header_text:type_name -> transit_realtime.TranslatedString
-	19, // 21: transit_realtime.Alert.description_text:type_name -> transit_realtime.TranslatedString
-	7,  // 22: transit_realtime.TripDescriptor.schedule_relationship:type_name -> transit_realtime.TripDescriptor.ScheduleRelationship
-	16, // 23: transit_realtime.EntitySelector.trip:type_name -> transit_realtime.TripDescriptor
-	22, // 24: transit_realtime.TranslatedString.translation:type_name -> transit_realtime.TranslatedString.Translation
-	20, // 25: transit_realtime.TripUpdate.StopTimeUpdate.arrival:type_name -> transit_realtime.TripUpdate.StopTimeEvent
-	20, // 26: transit_realtime.TripUpdate.StopTimeUpdate.departure:type_name -> transit_realtime.TripUpdate.StopTimeEvent
-	1,  // 27: transit_realtime.TripUpdate.StopTimeUpdate.schedule_relationship:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship
-	28, // [28:28] is the sub-list for method output_type
-	28, // [28:28] is the sub-list for method input_type
-	28, // [28:28] is the sub-list for extension type_name
-	28, // [28:28] is the sub-list for extension extendee
-	0,  // [0:28] is the sub-list for field type_name
+	13, // 3: transit_realtime.FeedEntity.trip_update:type_name -> transit_realtime.TripUpdate
+	14, // 4: transit_realtime.FeedEntity.vehicle:type_name -> transit_realtime.VehiclePosition
+	15, // 5: transit_realtime.FeedEntity.alert:type_name -> transit_realtime.Alert
+	23, // 6: transit_realtime.FeedEntity.shape:type_name -> transit_realtime.Shape
+	18, // 7: transit_realtime.TripUpdate.trip:type_name -> transit_realtime.TripDescriptor
+	19, // 8: transit_realtime.TripUpdate.vehicle:type_name -> transit_realtime.VehicleDescriptor
+	25, // 9: transit_realtime.TripUpdate.stop_time_update:type_name -> transit_realtime.TripUpdate.StopTimeUpdate
+	26, // 10: transit_realtime.TripUpdate.trip_properties:type_name -> transit_realtime.TripUpdate.TripProperties
+	18, // 11: transit_realtime.VehiclePosition.trip:type_name -> transit_realtime.TripDescriptor
+	19, // 12: transit_realtime.VehiclePosition.vehicle:type_name -> transit_realtime.VehicleDescriptor
+	17, // 13: transit_realtime.VehiclePosition.position:type_name -> transit_realtime.Position
+	2,  // 14: transit_realtime.VehiclePosition.current_status:type_name -> transit_realtime.VehiclePosition.VehicleStopStatus
+	3,  // 15: transit_realtime.VehiclePosition.congestion_level:type_name -> transit_realtime.VehiclePosition.CongestionLevel
+	4,  // 16: transit_realtime.VehiclePosition.occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus
+	28, // 17: transit_realtime.VehiclePosition.multi_carriage_details:type_name -> transit_realtime.VehiclePosition.CarriageDetails
+	16, // 18: transit_realtime.Alert.active_period:type_name -> transit_realtime.TimeRange
+	20, // 19: transit_realtime.Alert.informed_entity:type_name -> transit_realtime.EntitySelector
+	5,  // 20: transit_realtime.Alert.cause:type_name -> transit_realtime.Alert.Cause
+	6,  // 21: transit_realtime.Alert.effect:type_name -> transit_realtime.Alert.Effect
+	21, // 22: transit_realtime.Alert.url:type_name -> transit_realtime.TranslatedString
+	21, // 23: transit_realtime.Alert.header_text:type_name -> transit_realtime.TranslatedString
+	21, // 24: transit_realtime.Alert.description_text:type_name -> transit_realtime.TranslatedString
+	21, // 25: transit_realtime.Alert.tts_header_text:type_name -> transit_realtime.TranslatedString
+	21, // 26: transit_realtime.Alert.tts_description_text:type_name -> transit_realtime.TranslatedString
+	7,  // 27: transit_realtime.Alert.severity_level:type_name -> transit_realtime.Alert.SeverityLevel
+	22, // 28: transit_realtime.Alert.image:type_name -> transit_realtime.TranslatedImage
+	21, // 29: transit_realtime.Alert.image_alternative_text:type_name -> transit_realtime.TranslatedString
+	21, // 30: transit_realtime.Alert.cause_detail:type_name -> transit_realtime.TranslatedString
+	21, // 31: transit_realtime.Alert.effect_detail:type_name -> transit_realtime.TranslatedString
+	8,  // 32: transit_realtime.TripDescriptor.schedule_relationship:type_name -> transit_realtime.TripDescriptor.ScheduleRelationship
+	9,  // 33: transit_realtime.VehicleDescriptor.wheelchair_accessible:type_name -> transit_realtime.VehicleDescriptor.WheelchairAccessible
+	18, // 34: transit_realtime.EntitySelector.trip:type_name -> transit_realtime.TripDescriptor
+	29, // 35: transit_realtime.TranslatedString.translation:type_name -> transit_realtime.TranslatedString.Translation
+	30, // 36: transit_realtime.TranslatedImage.localized_image:type_name -> transit_realtime.TranslatedImage.LocalizedImage
+	24, // 37: transit_realtime.TripUpdate.StopTimeUpdate.arrival:type_name -> transit_realtime.TripUpdate.StopTimeEvent
+	24, // 38: transit_realtime.TripUpdate.StopTimeUpdate.departure:type_name -> transit_realtime.TripUpdate.StopTimeEvent
+	4,  // 39: transit_realtime.TripUpdate.StopTimeUpdate.departure_occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus
+	1,  // 40: transit_realtime.TripUpdate.StopTimeUpdate.schedule_relationship:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.ScheduleRelationship
+	27, // 41: transit_realtime.TripUpdate.StopTimeUpdate.stop_time_properties:type_name -> transit_realtime.TripUpdate.StopTimeUpdate.StopTimeProperties
+	4,  // 42: transit_realtime.VehiclePosition.CarriageDetails.occupancy_status:type_name -> transit_realtime.VehiclePosition.OccupancyStatus
+	43, // [43:43] is the sub-list for method output_type
+	43, // [43:43] is the sub-list for method input_type
+	43, // [43:43] is the sub-list for extension type_name
+	43, // [43:43] is the sub-list for extension extendee
+	0,  // [0:43] is the sub-list for field type_name
 }
 
 func init() { file_gtfs_realtime_proto_init() }
@@ -2686,7 +3583,7 @@ 				return nil
 			}
 		}
 		file_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:
@@ -2700,7 +3597,7 @@ 				return nil
 			}
 		}
 		file_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:
@@ -2714,6 +3611,76 @@ 				return nil
 			}
 		}
 		file_gtfs_realtime_proto_msgTypes[14].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_gtfs_realtime_proto_msgTypes[15].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_gtfs_realtime_proto_msgTypes[16].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_gtfs_realtime_proto_msgTypes[17].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_gtfs_realtime_proto_msgTypes[18].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_gtfs_realtime_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
 			switch v := v.(*TranslatedString_Translation); i {
 			case 0:
 				return &v.state
@@ -2727,14 +3694,28 @@ 			default:
 				return nil
 			}
 		}
+		file_gtfs_realtime_proto_msgTypes[20].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
+			}
+		}
 	}
 	type x struct{}
 	out := protoimpl.TypeBuilder{
 		File: protoimpl.DescBuilder{
 			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
 			RawDescriptor: file_gtfs_realtime_proto_rawDesc,
-			NumEnums:      8,
-			NumMessages:   15,
+			NumEnums:      10,
+			NumMessages:   21,
 			NumExtensions: 0,
 			NumServices:   0,
 		},




diff --git a/traffic/realtime.go b/traffic/realtime.go
index d5d6ae5de9496f7d517707d4d7cd6576bfc69ce7..0414e3bc88a8e8075948a193a6e945b66732cf6f 100644
--- a/traffic/realtime.go
+++ b/traffic/realtime.go
@@ -31,17 +31,18 @@ 	TimetableRelationship TimetableRelationship // TODO better name
 	VehicleStatus         VehicleStatus
 }
 type VehicleStatus struct {
-	Status          DepartureStatus
-	CongestionLevel CongestionLevel
-	OccupancyStatus OccupancyStatus
-	VehicleID       string
-	Latitude        float64
-	Longitude       float64
-	Speed           float32 // m/s
-	Bearing         float64 // radians clockwise from north // TODO maybe (-π, π)
-	LineName        string
-	Headsign        string
-	TripID          string
+	Status                  DepartureStatus
+	CongestionLevel         CongestionLevel
+	OccupancyStatus         OccupancyStatus
+	VehicleID               string
+	Latitude                float64
+	Longitude               float64
+	Speed                   float32 // m/s
+	Bearing                 float64 // radians clockwise from north // TODO maybe (-π, π)
+	LineName                string
+	Headsign                string
+	TripID                  string
+	WheelchairAccessibility WheelchairAccessibility
 }
 
 type CongestionLevel uint
@@ -65,6 +66,15 @@ 	OCCUPANCY_STANDING_ONLY
 	OCCUPANCY_CRUSHED
 	OCCUPANCY_FULL
 	OCCUPANCY_NOT_ACCEPTING
+)
+
+type WheelchairAccessibility uint
+
+const (
+	WHEELCHAIR_NO_DATA WheelchairAccessibility = iota
+	WHEELCHAIR_UNKNOWN
+	WHHELCHAIR_ACCESSIBLE
+	WHEELCHAIR_INACCESSIBLE
 )
 
 type DepartureStatus uint




diff --git a/traffic/realtime_gtfs.go b/traffic/realtime_gtfs.go
index b7acbcda465a2014bcd07a70f616b32f64e20993..07192defcaf295b2500be0583f9fdc590a7c2719 100644
--- a/traffic/realtime_gtfs.go
+++ b/traffic/realtime_gtfs.go
@@ -18,9 +18,8 @@ 	case pb.TripDescriptor_ADDED:
 		return TRIP_ADDED
 	case pb.TripDescriptor_CANCELED:
 		return TRIP_CANCELED
-	/* TODO update pb schema
 	case pb.TripDescriptor_DELETED:
-		return TRIP_DELETED*/
+		return TRIP_DELETED
 	default:
 		return TRIP_SCHEDULED
 	}
@@ -78,12 +77,28 @@ 		return OCCUPANCY_CRUSHED
 	case pb.VehiclePosition_FULL:
 		return OCCUPANCY_FULL
 	case pb.VehiclePosition_NOT_ACCEPTING_PASSENGERS:
+		fallthrough
+	case pb.VehiclePosition_NOT_BOARDABLE:
 		return OCCUPANCY_NOT_ACCEPTING
 	default:
 		return OCCUPANCY_UNKNOWN
 	}
 }
 
+func makeWheelchairAccessibility(a pb.VehicleDescriptor_WheelchairAccessible) WheelchairAccessibility {
+	switch a {
+	case pb.VehicleDescriptor_NO_VALUE:
+		return WHEELCHAIR_NO_DATA
+	case pb.VehicleDescriptor_WHEELCHAIR_ACCESSIBLE:
+		return WHEELCHAIR_INACCESSIBLE
+	case pb.VehicleDescriptor_WHEELCHAIR_INACCESSIBLE:
+		return WHEELCHAIR_INACCESSIBLE
+	default:
+		return WHEELCHAIR_UNKNOWN
+	}
+
+}
+
 func getGtfsRtData(entities []*pb.FeedEntity) map[RealtimeFeedType]int {
 	if vehicleStatuses == nil {
 		vehicleStatuses = map[string]VehicleStatus{}
@@ -102,15 +117,16 @@ 			which[VEHICLE_POSITIONS] = 1
 			u := updates[*v.Trip.TripId]
 
 			vehicleUpdate := VehicleStatus{
-				Status:          makeDepartureStatus(v.GetCurrentStatus()),
-				CongestionLevel: makeCongestionLevel(v.GetCongestionLevel()),
-				OccupancyStatus: makeOccupancyStatus(v.GetOccupancyStatus()),
-				VehicleID:       v.GetVehicle().GetId(),
-				Latitude:        float64(v.GetPosition().GetLatitude()),
-				Longitude:       float64(v.GetPosition().GetLongitude()),
-				Speed:           v.GetPosition().GetSpeed(),
-				Bearing:         float64(v.GetPosition().GetBearing() * math.Pi / 180),
-				TripID:          *v.Trip.TripId,
+				Status:                  makeDepartureStatus(v.GetCurrentStatus()),
+				CongestionLevel:         makeCongestionLevel(v.GetCongestionLevel()),
+				OccupancyStatus:         makeOccupancyStatus(v.GetOccupancyStatus()),
+				VehicleID:               v.GetVehicle().GetId(),
+				Latitude:                float64(v.GetPosition().GetLatitude()),
+				Longitude:               float64(v.GetPosition().GetLongitude()),
+				Speed:                   v.GetPosition().GetSpeed(),
+				Bearing:                 float64(v.GetPosition().GetBearing() * math.Pi / 180),
+				TripID:                  *v.Trip.TripId,
+				WheelchairAccessibility: makeWheelchairAccessibility(v.GetVehicle().GetWheelchairAccessible()),
 			}
 
 			vehicleStatuses[*v.Trip.TripId] = vehicleUpdate