blob: 011e4bfe5b1aee3326c144f96c3e697d3bf72631 [file] [log] [blame]
// Copyright 2022 Google LLC
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.26.0
// protoc v3.12.2
// source: google/cloud/optimization/v1/fleet_routing.proto
package optimizationpb
import (
context "context"
reflect "reflect"
sync "sync"
duration "github.com/golang/protobuf/ptypes/duration"
timestamp "github.com/golang/protobuf/ptypes/timestamp"
_ "google.golang.org/genproto/googleapis/api/annotations"
longrunning "google.golang.org/genproto/googleapis/longrunning"
latlng "google.golang.org/genproto/googleapis/type/latlng"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// Defines how the solver should handle the request. In all modes but
// `VALIDATE_ONLY`, if the request is invalid, you will receive an
// `INVALID_REQUEST` error. See [max_validation_errors][google.cloud.optimization.v1.OptimizeToursRequest.max_validation_errors] to cap the number of
// errors returned.
type OptimizeToursRequest_SolvingMode int32
const (
// Solve the model.
OptimizeToursRequest_DEFAULT_SOLVE OptimizeToursRequest_SolvingMode = 0
// Only validates the model without solving it: populates as many
// [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors]
// as possible.
OptimizeToursRequest_VALIDATE_ONLY OptimizeToursRequest_SolvingMode = 1
// Only populates
// [OptimizeToursResponse.skipped_shipments][google.cloud.optimization.v1.OptimizeToursResponse.skipped_shipments],
// and doesn't actually solve the rest of the request (`status` and `routes`
// are unset in the response).
//
// *IMPORTANT*: not all infeasible shipments are returned here, but only the
// ones that are detected as infeasible as a preprocessing.
OptimizeToursRequest_DETECT_SOME_INFEASIBLE_SHIPMENTS OptimizeToursRequest_SolvingMode = 2
)
// Enum value maps for OptimizeToursRequest_SolvingMode.
var (
OptimizeToursRequest_SolvingMode_name = map[int32]string{
0: "DEFAULT_SOLVE",
1: "VALIDATE_ONLY",
2: "DETECT_SOME_INFEASIBLE_SHIPMENTS",
}
OptimizeToursRequest_SolvingMode_value = map[string]int32{
"DEFAULT_SOLVE": 0,
"VALIDATE_ONLY": 1,
"DETECT_SOME_INFEASIBLE_SHIPMENTS": 2,
}
)
func (x OptimizeToursRequest_SolvingMode) Enum() *OptimizeToursRequest_SolvingMode {
p := new(OptimizeToursRequest_SolvingMode)
*p = x
return p
}
func (x OptimizeToursRequest_SolvingMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (OptimizeToursRequest_SolvingMode) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[0].Descriptor()
}
func (OptimizeToursRequest_SolvingMode) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[0]
}
func (x OptimizeToursRequest_SolvingMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use OptimizeToursRequest_SolvingMode.Descriptor instead.
func (OptimizeToursRequest_SolvingMode) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{0, 0}
}
// Mode defining the behavior of the search, trading off latency versus
// solution quality. In all modes, the global request deadline is enforced.
type OptimizeToursRequest_SearchMode int32
const (
// Unspecified search mode, equivalent to `RETURN_FAST`.
OptimizeToursRequest_SEARCH_MODE_UNSPECIFIED OptimizeToursRequest_SearchMode = 0
// Stop the search after finding the first good solution.
OptimizeToursRequest_RETURN_FAST OptimizeToursRequest_SearchMode = 1
// Spend all the available time to search for better solutions.
OptimizeToursRequest_CONSUME_ALL_AVAILABLE_TIME OptimizeToursRequest_SearchMode = 2
)
// Enum value maps for OptimizeToursRequest_SearchMode.
var (
OptimizeToursRequest_SearchMode_name = map[int32]string{
0: "SEARCH_MODE_UNSPECIFIED",
1: "RETURN_FAST",
2: "CONSUME_ALL_AVAILABLE_TIME",
}
OptimizeToursRequest_SearchMode_value = map[string]int32{
"SEARCH_MODE_UNSPECIFIED": 0,
"RETURN_FAST": 1,
"CONSUME_ALL_AVAILABLE_TIME": 2,
}
)
func (x OptimizeToursRequest_SearchMode) Enum() *OptimizeToursRequest_SearchMode {
p := new(OptimizeToursRequest_SearchMode)
*p = x
return p
}
func (x OptimizeToursRequest_SearchMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (OptimizeToursRequest_SearchMode) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[1].Descriptor()
}
func (OptimizeToursRequest_SearchMode) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[1]
}
func (x OptimizeToursRequest_SearchMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use OptimizeToursRequest_SearchMode.Descriptor instead.
func (OptimizeToursRequest_SearchMode) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{0, 1}
}
// Modes defining how the appearance of incompatible shipments are restricted
// on the same route.
type ShipmentTypeIncompatibility_IncompatibilityMode int32
const (
// Unspecified incompatibility mode. This value should never be used.
ShipmentTypeIncompatibility_INCOMPATIBILITY_MODE_UNSPECIFIED ShipmentTypeIncompatibility_IncompatibilityMode = 0
// In this mode, two shipments with incompatible types can never share the
// same vehicle.
ShipmentTypeIncompatibility_NOT_PERFORMED_BY_SAME_VEHICLE ShipmentTypeIncompatibility_IncompatibilityMode = 1
// For two shipments with incompatible types with the
// `NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY` incompatibility mode:
//
// - If both are pickups only (no deliveries) or deliveries only (no
// pickups), they cannot share the same vehicle at all.
// - If one of the shipments has a delivery and the other a pickup, the two
// shipments can share the same vehicle iff the former shipment is
// delivered before the latter is picked up.
ShipmentTypeIncompatibility_NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY ShipmentTypeIncompatibility_IncompatibilityMode = 2
)
// Enum value maps for ShipmentTypeIncompatibility_IncompatibilityMode.
var (
ShipmentTypeIncompatibility_IncompatibilityMode_name = map[int32]string{
0: "INCOMPATIBILITY_MODE_UNSPECIFIED",
1: "NOT_PERFORMED_BY_SAME_VEHICLE",
2: "NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY",
}
ShipmentTypeIncompatibility_IncompatibilityMode_value = map[string]int32{
"INCOMPATIBILITY_MODE_UNSPECIFIED": 0,
"NOT_PERFORMED_BY_SAME_VEHICLE": 1,
"NOT_IN_SAME_VEHICLE_SIMULTANEOUSLY": 2,
}
)
func (x ShipmentTypeIncompatibility_IncompatibilityMode) Enum() *ShipmentTypeIncompatibility_IncompatibilityMode {
p := new(ShipmentTypeIncompatibility_IncompatibilityMode)
*p = x
return p
}
func (x ShipmentTypeIncompatibility_IncompatibilityMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (ShipmentTypeIncompatibility_IncompatibilityMode) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[2].Descriptor()
}
func (ShipmentTypeIncompatibility_IncompatibilityMode) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[2]
}
func (x ShipmentTypeIncompatibility_IncompatibilityMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use ShipmentTypeIncompatibility_IncompatibilityMode.Descriptor instead.
func (ShipmentTypeIncompatibility_IncompatibilityMode) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{6, 0}
}
// Modes defining the appearance of dependent shipments on a route.
type ShipmentTypeRequirement_RequirementMode int32
const (
// Unspecified requirement mode. This value should never be used.
ShipmentTypeRequirement_REQUIREMENT_MODE_UNSPECIFIED ShipmentTypeRequirement_RequirementMode = 0
// In this mode, all "dependent" shipments must share the same vehicle as at
// least one of their "required" shipments.
ShipmentTypeRequirement_PERFORMED_BY_SAME_VEHICLE ShipmentTypeRequirement_RequirementMode = 1
// With the `IN_SAME_VEHICLE_AT_PICKUP_TIME` mode, all "dependent"
// shipments need to have at least one "required" shipment on their vehicle
// at the time of their pickup.
//
// A "dependent" shipment pickup must therefore have either:
//
// - A delivery-only "required" shipment delivered on the route after, or
// - A "required" shipment picked up on the route before it, and if the
// "required" shipment has a delivery, this delivery must be performed
// after the "dependent" shipment's pickup.
ShipmentTypeRequirement_IN_SAME_VEHICLE_AT_PICKUP_TIME ShipmentTypeRequirement_RequirementMode = 2
// Same as before, except the "dependent" shipments need to have a
// "required" shipment on their vehicle at the time of their *delivery*.
ShipmentTypeRequirement_IN_SAME_VEHICLE_AT_DELIVERY_TIME ShipmentTypeRequirement_RequirementMode = 3
)
// Enum value maps for ShipmentTypeRequirement_RequirementMode.
var (
ShipmentTypeRequirement_RequirementMode_name = map[int32]string{
0: "REQUIREMENT_MODE_UNSPECIFIED",
1: "PERFORMED_BY_SAME_VEHICLE",
2: "IN_SAME_VEHICLE_AT_PICKUP_TIME",
3: "IN_SAME_VEHICLE_AT_DELIVERY_TIME",
}
ShipmentTypeRequirement_RequirementMode_value = map[string]int32{
"REQUIREMENT_MODE_UNSPECIFIED": 0,
"PERFORMED_BY_SAME_VEHICLE": 1,
"IN_SAME_VEHICLE_AT_PICKUP_TIME": 2,
"IN_SAME_VEHICLE_AT_DELIVERY_TIME": 3,
}
)
func (x ShipmentTypeRequirement_RequirementMode) Enum() *ShipmentTypeRequirement_RequirementMode {
p := new(ShipmentTypeRequirement_RequirementMode)
*p = x
return p
}
func (x ShipmentTypeRequirement_RequirementMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (ShipmentTypeRequirement_RequirementMode) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[3].Descriptor()
}
func (ShipmentTypeRequirement_RequirementMode) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[3]
}
func (x ShipmentTypeRequirement_RequirementMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use ShipmentTypeRequirement_RequirementMode.Descriptor instead.
func (ShipmentTypeRequirement_RequirementMode) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{7, 0}
}
// Travel modes which can be used by vehicles.
//
// These should be a subset of the Google Maps Platform Routes Preferred API
// travel modes, see:
// https://developers.google.com/maps/documentation/routes_preferred/reference/rest/Shared.Types/RouteTravelMode.
type Vehicle_TravelMode int32
const (
// Unspecified travel mode, equivalent to `DRIVING`.
Vehicle_TRAVEL_MODE_UNSPECIFIED Vehicle_TravelMode = 0
// Travel mode corresponding to driving directions (car, ...).
Vehicle_DRIVING Vehicle_TravelMode = 1
)
// Enum value maps for Vehicle_TravelMode.
var (
Vehicle_TravelMode_name = map[int32]string{
0: "TRAVEL_MODE_UNSPECIFIED",
1: "DRIVING",
}
Vehicle_TravelMode_value = map[string]int32{
"TRAVEL_MODE_UNSPECIFIED": 0,
"DRIVING": 1,
}
)
func (x Vehicle_TravelMode) Enum() *Vehicle_TravelMode {
p := new(Vehicle_TravelMode)
*p = x
return p
}
func (x Vehicle_TravelMode) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Vehicle_TravelMode) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[4].Descriptor()
}
func (Vehicle_TravelMode) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[4]
}
func (x Vehicle_TravelMode) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Vehicle_TravelMode.Descriptor instead.
func (Vehicle_TravelMode) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8, 0}
}
// Policy on how a vehicle can be unloaded. Applies only to shipments having
// both a pickup and a delivery.
//
// Other shipments are free to occur anywhere on the route independent of
// `unloading_policy`.
type Vehicle_UnloadingPolicy int32
const (
// Unspecified unloading policy; deliveries must just occur after their
// corresponding pickups.
Vehicle_UNLOADING_POLICY_UNSPECIFIED Vehicle_UnloadingPolicy = 0
// Deliveries must occur in reverse order of pickups
Vehicle_LAST_IN_FIRST_OUT Vehicle_UnloadingPolicy = 1
// Deliveries must occur in the same order as pickups
Vehicle_FIRST_IN_FIRST_OUT Vehicle_UnloadingPolicy = 2
)
// Enum value maps for Vehicle_UnloadingPolicy.
var (
Vehicle_UnloadingPolicy_name = map[int32]string{
0: "UNLOADING_POLICY_UNSPECIFIED",
1: "LAST_IN_FIRST_OUT",
2: "FIRST_IN_FIRST_OUT",
}
Vehicle_UnloadingPolicy_value = map[string]int32{
"UNLOADING_POLICY_UNSPECIFIED": 0,
"LAST_IN_FIRST_OUT": 1,
"FIRST_IN_FIRST_OUT": 2,
}
)
func (x Vehicle_UnloadingPolicy) Enum() *Vehicle_UnloadingPolicy {
p := new(Vehicle_UnloadingPolicy)
*p = x
return p
}
func (x Vehicle_UnloadingPolicy) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (Vehicle_UnloadingPolicy) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[5].Descriptor()
}
func (Vehicle_UnloadingPolicy) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[5]
}
func (x Vehicle_UnloadingPolicy) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use Vehicle_UnloadingPolicy.Descriptor instead.
func (Vehicle_UnloadingPolicy) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8, 1}
}
// Code identifying the reason type. The order here is meaningless. In
// particular, it gives no indication of whether a given reason will
// appear before another in the solution, if both apply.
type SkippedShipment_Reason_Code int32
const (
// This should never be used. If we are unable to understand why a
// shipment was skipped, we simply return an empty set of reasons.
SkippedShipment_Reason_CODE_UNSPECIFIED SkippedShipment_Reason_Code = 0
// There is no vehicle in the model making all shipments infeasible.
SkippedShipment_Reason_NO_VEHICLE SkippedShipment_Reason_Code = 1
// The demand of the shipment exceeds a vehicle's capacity for some
// capacity types, one of which is `example_exceeded_capacity_type`.
SkippedShipment_Reason_DEMAND_EXCEEDS_VEHICLE_CAPACITY SkippedShipment_Reason_Code = 2
// The minimum distance necessary to perform this shipment, i.e. from
// the vehicle's `start_location` to the shipment's pickup and/or delivery
// locations and to the vehicle's end location exceeds the vehicle's
// `route_distance_limit`.
//
// Note that for this computation we use the geodesic distances.
SkippedShipment_Reason_CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT SkippedShipment_Reason_Code = 3
// The minimum time necessary to perform this shipment, including travel
// time, wait time and service time exceeds the vehicle's
// `route_duration_limit`.
//
// Note: travel time is computed in the best-case scenario, namely as
// geodesic distance x 36 m/s (roughly 130 km/hour).
SkippedShipment_Reason_CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT SkippedShipment_Reason_Code = 4
// Same as above but we only compare minimum travel time and the
// vehicle's `travel_duration_limit`.
SkippedShipment_Reason_CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT SkippedShipment_Reason_Code = 5
// The vehicle cannot perform this shipment in the best-case scenario
// (see `CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT` for time
// computation) if it starts at its earliest start time: the total time
// would make the vehicle end after its latest end time.
SkippedShipment_Reason_CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS SkippedShipment_Reason_Code = 6
// The `allowed_vehicle_indices` field of the shipment is not empty and
// this vehicle does not belong to it.
SkippedShipment_Reason_VEHICLE_NOT_ALLOWED SkippedShipment_Reason_Code = 7
)
// Enum value maps for SkippedShipment_Reason_Code.
var (
SkippedShipment_Reason_Code_name = map[int32]string{
0: "CODE_UNSPECIFIED",
1: "NO_VEHICLE",
2: "DEMAND_EXCEEDS_VEHICLE_CAPACITY",
3: "CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT",
4: "CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT",
5: "CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT",
6: "CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS",
7: "VEHICLE_NOT_ALLOWED",
}
SkippedShipment_Reason_Code_value = map[string]int32{
"CODE_UNSPECIFIED": 0,
"NO_VEHICLE": 1,
"DEMAND_EXCEEDS_VEHICLE_CAPACITY": 2,
"CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT": 3,
"CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DURATION_LIMIT": 4,
"CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TRAVEL_DURATION_LIMIT": 5,
"CANNOT_BE_PERFORMED_WITHIN_VEHICLE_TIME_WINDOWS": 6,
"VEHICLE_NOT_ALLOWED": 7,
}
)
func (x SkippedShipment_Reason_Code) Enum() *SkippedShipment_Reason_Code {
p := new(SkippedShipment_Reason_Code)
*p = x
return p
}
func (x SkippedShipment_Reason_Code) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (SkippedShipment_Reason_Code) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[6].Descriptor()
}
func (SkippedShipment_Reason_Code) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[6]
}
func (x SkippedShipment_Reason_Code) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use SkippedShipment_Reason_Code.Descriptor instead.
func (SkippedShipment_Reason_Code) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{18, 0, 0}
}
// Expresses the different constraint relaxation levels, which are
// applied for a visit and those that follow when it satifies the
// threshold conditions.
//
// The enumeration below is in order of increasing relaxation.
type InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level int32
const (
// Implicit default relaxation level: no constraints are relaxed,
// i.e., all visits are fully constrained.
//
// This value must not be explicly used in `level`.
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_LEVEL_UNSPECIFIED InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level = 0
// Visit start times and vehicle start/end times will be relaxed, but
// each visit remains bound to the same vehicle and the visit sequence
// must be observed: no visit can be inserted between them or before
// them.
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_RELAX_VISIT_TIMES_AFTER_THRESHOLD InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level = 1
// Same as `RELAX_VISIT_TIMES_AFTER_THRESHOLD`, but the visit sequence
// is also relaxed: visits remain simply bound to their vehicle.
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level = 2
// Same as `RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD`, but the
// vehicle is also relaxed: visits are completely free at or after the
// threshold time and can potentially become unperformed.
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_RELAX_ALL_AFTER_THRESHOLD InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level = 3
)
// Enum value maps for InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level.
var (
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level_name = map[int32]string{
0: "LEVEL_UNSPECIFIED",
1: "RELAX_VISIT_TIMES_AFTER_THRESHOLD",
2: "RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD",
3: "RELAX_ALL_AFTER_THRESHOLD",
}
InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level_value = map[string]int32{
"LEVEL_UNSPECIFIED": 0,
"RELAX_VISIT_TIMES_AFTER_THRESHOLD": 1,
"RELAX_VISIT_TIMES_AND_SEQUENCE_AFTER_THRESHOLD": 2,
"RELAX_ALL_AFTER_THRESHOLD": 3,
}
)
func (x InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) Enum() *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level {
p := new(InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level)
*p = x
return p
}
func (x InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) String() string {
return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x))
}
func (InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) Descriptor() protoreflect.EnumDescriptor {
return file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[7].Descriptor()
}
func (InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) Type() protoreflect.EnumType {
return &file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes[7]
}
func (x InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) Number() protoreflect.EnumNumber {
return protoreflect.EnumNumber(x)
}
// Deprecated: Use InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level.Descriptor instead.
func (InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level) EnumDescriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{20, 0, 0, 0}
}
// Request to be given to a tour optimization solver which defines the
// shipment model to solve as well as optimization parameters.
type OptimizeToursRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Target project and location to make a call.
//
// Format: `projects/{project-id}/locations/{location-id}`.
//
// If no location is specified, a region will be chosen automatically.
Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
// If this timeout is set, the server returns a response before the timeout
// period has elapsed or the server deadline for synchronous requests is
// reached, whichever is sooner.
//
// For asynchronous requests, the server will generate a solution (if
// possible) before the timeout has elapsed.
Timeout *duration.Duration `protobuf:"bytes,2,opt,name=timeout,proto3" json:"timeout,omitempty"`
// Shipment model to solve.
Model *ShipmentModel `protobuf:"bytes,3,opt,name=model,proto3" json:"model,omitempty"`
// By default, the solving mode is `DEFAULT_SOLVE` (0).
SolvingMode OptimizeToursRequest_SolvingMode `protobuf:"varint,4,opt,name=solving_mode,json=solvingMode,proto3,enum=google.cloud.optimization.v1.OptimizeToursRequest_SolvingMode" json:"solving_mode,omitempty"`
// Truncates the number of validation errors returned. Those errors are
// typically attached to an INVALID_ARGUMENT error payload as a BadRequest
// error detail (https://cloud.google.com/apis/design/errors#error_details),
// unless solving_mode=VALIDATE_ONLY: see the
// [OptimizeToursResponse.validation_errors][google.cloud.optimization.v1.OptimizeToursResponse.validation_errors]
// field.
// This defaults to 100 and is capped at 10,000.
MaxValidationErrors *int32 `protobuf:"varint,5,opt,name=max_validation_errors,json=maxValidationErrors,proto3,oneof" json:"max_validation_errors,omitempty"`
// Search mode used to solve the request.
SearchMode OptimizeToursRequest_SearchMode `protobuf:"varint,6,opt,name=search_mode,json=searchMode,proto3,enum=google.cloud.optimization.v1.OptimizeToursRequest_SearchMode" json:"search_mode,omitempty"`
// Guide the optimization algorithm in finding a first solution that is
// similar to a previous solution.
//
// The model is constrained when the first solution is built.
// Any shipments not performed on a route are implicitly skipped in the first
// solution, but they may be performed in successive solutions.
//
// The solution must satisfy some basic validity assumptions:
//
// - for all routes, `vehicle_index` must be in range and not be duplicated.
// - for all visits, `shipment_index` and `visit_request_index` must be
// in range.
// - a shipment may only be referenced on one route.
// - the pickup of a pickup-delivery shipment must be performed before
// the delivery.
// - no more than one pickup alternative or delivery alternative of
// a shipment may be performed.
// - for all routes, times are increasing (i.e., `vehicle_start_time
// <= visits[0].start_time <= visits[1].start_time ...
// <= vehicle_end_time`).
// - a shipment may only be performed on a vehicle that is allowed. A
// vehicle is allowed if [Shipment.allowed_vehicle_indices][google.cloud.optimization.v1.Shipment.allowed_vehicle_indices] is empty or
// its `vehicle_index` is included in
// [Shipment.allowed_vehicle_indices][google.cloud.optimization.v1.Shipment.allowed_vehicle_indices].
//
// If the injected solution is not feasible, a validation error is not
// necessarily returned and an error indicating infeasibility may be returned
// instead.
InjectedFirstSolutionRoutes []*ShipmentRoute `protobuf:"bytes,7,rep,name=injected_first_solution_routes,json=injectedFirstSolutionRoutes,proto3" json:"injected_first_solution_routes,omitempty"`
// Constrain the optimization algorithm to find a final solution that is
// similar to a previous solution. For example, this may be used to freeze
// portions of routes which have already been completed or which are to be
// completed but must not be modified.
//
// If the injected solution is not feasible, a validation error is not
// necessarily returned and an error indicating infeasibility may be returned
// instead.
InjectedSolutionConstraint *InjectedSolutionConstraint `protobuf:"bytes,8,opt,name=injected_solution_constraint,json=injectedSolutionConstraint,proto3" json:"injected_solution_constraint,omitempty"`
// If non-empty, the given routes will be refreshed, without modifying their
// underlying sequence of visits or travel times: only other details will be
// updated. This does not solve the model.
//
// As of 2020/11, this only populates the polylines of non-empty routes and
// requires that `populate_polylines` is true.
//
// The `route_polyline` fields of the passed-in routes may be inconsistent
// with route `transitions`.
//
// This field must not be used together with `injected_first_solution_routes`
// or `injected_solution_constraint`.
//
// `Shipment.ignore` and `Vehicle.ignore` have no effect on the behavior.
// Polylines are still populated between all visits in all non-empty routes
// regardless of whether the related shipments or vehicles are ignored.
RefreshDetailsRoutes []*ShipmentRoute `protobuf:"bytes,9,rep,name=refresh_details_routes,json=refreshDetailsRoutes,proto3" json:"refresh_details_routes,omitempty"`
// If true:
//
// - uses [ShipmentRoute.vehicle_label][google.cloud.optimization.v1.ShipmentRoute.vehicle_label] instead of `vehicle_index` to
// match routes in an injected solution with vehicles in the request;
// reuses the mapping of original [ShipmentRoute.vehicle_index][google.cloud.optimization.v1.ShipmentRoute.vehicle_index] to new
// [ShipmentRoute.vehicle_index][google.cloud.optimization.v1.ShipmentRoute.vehicle_index] to update
// [ConstraintRelaxation.vehicle_indices][google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.vehicle_indices]
// if non-empty, but the mapping must be unambiguous (i.e., multiple
// `ShipmentRoute`s must not share the same original `vehicle_index`).
// - uses [ShipmentRoute.Visit.shipment_label][google.cloud.optimization.v1.ShipmentRoute.Visit.shipment_label] instead of `shipment_index`
// to match visits in an injected solution with shipments in the request;
// - uses [SkippedShipment.label][google.cloud.optimization.v1.SkippedShipment.label] instead of [SkippedShipment.index][google.cloud.optimization.v1.SkippedShipment.index] to
// match skipped shipments in the injected solution with request
// shipments.
//
// This interpretation applies to the `injected_first_solution_routes`,
// `injected_solution_constraint`, and `refresh_details_routes` fields.
// It can be used when shipment or vehicle indices in the request have
// changed since the solution was created, perhaps because shipments or
// vehicles have been removed from or added to the request.
//
// If true, labels in the following categories must appear at most once in
// their category:
//
// - [Vehicle.label][google.cloud.optimization.v1.Vehicle.label] in the request;
// - [Shipment.label][google.cloud.optimization.v1.Shipment.label] in the request;
// - [ShipmentRoute.vehicle_label][google.cloud.optimization.v1.ShipmentRoute.vehicle_label] in the injected solution;
// - [SkippedShipment.label][google.cloud.optimization.v1.SkippedShipment.label] and [ShipmentRoute.Visit.shipment_label][google.cloud.optimization.v1.ShipmentRoute.Visit.shipment_label] in
// the injected solution (except pickup/delivery visit pairs, whose
// `shipment_label` must appear twice).
//
// If a `vehicle_label` in the injected solution does not correspond to a
// request vehicle, the corresponding route is removed from the solution
// along with its visits. If a `shipment_label` in the injected solution does
// not correspond to a request shipment, the corresponding visit is removed
// from the solution. If a [SkippedShipment.label][google.cloud.optimization.v1.SkippedShipment.label] in the injected solution
// does not correspond to a request shipment, the `SkippedShipment` is removed
// from the solution.
//
// Removing route visits or entire routes from an injected solution may
// have an effect on the implied constraints, which may lead to change in
// solution, validation errors, or infeasibility.
//
// NOTE: The caller must ensure that each [Vehicle.label][google.cloud.optimization.v1.Vehicle.label]
// (resp. [Shipment.label][google.cloud.optimization.v1.Shipment.label]) uniquely identifies a vehicle (resp. shipment)
// entity used across the two relevant requests: the past request that
// produced the `OptimizeToursResponse` used in the injected solution and the
// current request that includes the injected solution. The uniqueness checks
// described above are not enough to guarantee this requirement.
InterpretInjectedSolutionsUsingLabels bool `protobuf:"varint,10,opt,name=interpret_injected_solutions_using_labels,json=interpretInjectedSolutionsUsingLabels,proto3" json:"interpret_injected_solutions_using_labels,omitempty"`
// Consider traffic estimation in calculating `ShipmentRoute` fields
// [Transition.travel_duration][google.cloud.optimization.v1.ShipmentRoute.Transition.travel_duration],
// [Visit.start_time][google.cloud.optimization.v1.ShipmentRoute.Visit.start_time],
// and `vehicle_end_time`; in setting the
// [ShipmentRoute.has_traffic_infeasibilities][google.cloud.optimization.v1.ShipmentRoute.has_traffic_infeasibilities] field, and in calculating the
// [OptimizeToursResponse.total_cost][google.cloud.optimization.v1.OptimizeToursResponse.total_cost] field.
ConsiderRoadTraffic bool `protobuf:"varint,11,opt,name=consider_road_traffic,json=considerRoadTraffic,proto3" json:"consider_road_traffic,omitempty"`
// If true, polylines will be populated in response `ShipmentRoute`s.
PopulatePolylines bool `protobuf:"varint,12,opt,name=populate_polylines,json=populatePolylines,proto3" json:"populate_polylines,omitempty"`
// If true, polylines will be populated in response
// [ShipmentRoute.transitions][google.cloud.optimization.v1.ShipmentRoute.transitions].
// Note that in this case, the polylines will also be populated in the
// deprecated `travel_steps`.
PopulateTransitionPolylines bool `protobuf:"varint,13,opt,name=populate_transition_polylines,json=populateTransitionPolylines,proto3" json:"populate_transition_polylines,omitempty"`
// If this is set, then the request can have a deadline
// (see https://grpc.io/blog/deadlines) of up to 60 minutes.
// Otherwise, the maximum deadline is only 30 minutes.
// Note that long-lived requests have a significantly larger (but still small)
// risk of interruption.
AllowLargeDeadlineDespiteInterruptionRisk bool `protobuf:"varint,14,opt,name=allow_large_deadline_despite_interruption_risk,json=allowLargeDeadlineDespiteInterruptionRisk,proto3" json:"allow_large_deadline_despite_interruption_risk,omitempty"`
// If true, travel distances will be computed using geodesic distances instead
// of Google Maps distances, and travel times will be computed using geodesic
// distances with a speed defined by `geodesic_meters_per_second`.
UseGeodesicDistances bool `protobuf:"varint,15,opt,name=use_geodesic_distances,json=useGeodesicDistances,proto3" json:"use_geodesic_distances,omitempty"`
// When `use_geodesic_distances` is true, this field must be set and defines
// the speed applied to compute travel times. Its value must be at least 1.0
// meters/seconds.
GeodesicMetersPerSecond *float64 `protobuf:"fixed64,16,opt,name=geodesic_meters_per_second,json=geodesicMetersPerSecond,proto3,oneof" json:"geodesic_meters_per_second,omitempty"`
// Label that may be used to identify this request, reported back in the
// [OptimizeToursResponse.request_label][google.cloud.optimization.v1.OptimizeToursResponse.request_label].
Label string `protobuf:"bytes,17,opt,name=label,proto3" json:"label,omitempty"`
// Deprecated: Use [OptimizeToursRequest.populate_transition_polylines][] instead.
// If true, polylines will be populated in response
// [ShipmentRoute.transitions][google.cloud.optimization.v1.ShipmentRoute.transitions]. Note that in this case, the polylines will
// also be populated in the deprecated `travel_steps`.
//
// Deprecated: Do not use.
PopulateTravelStepPolylines bool `protobuf:"varint,20,opt,name=populate_travel_step_polylines,json=populateTravelStepPolylines,proto3" json:"populate_travel_step_polylines,omitempty"`
}
func (x *OptimizeToursRequest) Reset() {
*x = OptimizeToursRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *OptimizeToursRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OptimizeToursRequest) ProtoMessage() {}
func (x *OptimizeToursRequest) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[0]
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 OptimizeToursRequest.ProtoReflect.Descriptor instead.
func (*OptimizeToursRequest) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{0}
}
func (x *OptimizeToursRequest) GetParent() string {
if x != nil {
return x.Parent
}
return ""
}
func (x *OptimizeToursRequest) GetTimeout() *duration.Duration {
if x != nil {
return x.Timeout
}
return nil
}
func (x *OptimizeToursRequest) GetModel() *ShipmentModel {
if x != nil {
return x.Model
}
return nil
}
func (x *OptimizeToursRequest) GetSolvingMode() OptimizeToursRequest_SolvingMode {
if x != nil {
return x.SolvingMode
}
return OptimizeToursRequest_DEFAULT_SOLVE
}
func (x *OptimizeToursRequest) GetMaxValidationErrors() int32 {
if x != nil && x.MaxValidationErrors != nil {
return *x.MaxValidationErrors
}
return 0
}
func (x *OptimizeToursRequest) GetSearchMode() OptimizeToursRequest_SearchMode {
if x != nil {
return x.SearchMode
}
return OptimizeToursRequest_SEARCH_MODE_UNSPECIFIED
}
func (x *OptimizeToursRequest) GetInjectedFirstSolutionRoutes() []*ShipmentRoute {
if x != nil {
return x.InjectedFirstSolutionRoutes
}
return nil
}
func (x *OptimizeToursRequest) GetInjectedSolutionConstraint() *InjectedSolutionConstraint {
if x != nil {
return x.InjectedSolutionConstraint
}
return nil
}
func (x *OptimizeToursRequest) GetRefreshDetailsRoutes() []*ShipmentRoute {
if x != nil {
return x.RefreshDetailsRoutes
}
return nil
}
func (x *OptimizeToursRequest) GetInterpretInjectedSolutionsUsingLabels() bool {
if x != nil {
return x.InterpretInjectedSolutionsUsingLabels
}
return false
}
func (x *OptimizeToursRequest) GetConsiderRoadTraffic() bool {
if x != nil {
return x.ConsiderRoadTraffic
}
return false
}
func (x *OptimizeToursRequest) GetPopulatePolylines() bool {
if x != nil {
return x.PopulatePolylines
}
return false
}
func (x *OptimizeToursRequest) GetPopulateTransitionPolylines() bool {
if x != nil {
return x.PopulateTransitionPolylines
}
return false
}
func (x *OptimizeToursRequest) GetAllowLargeDeadlineDespiteInterruptionRisk() bool {
if x != nil {
return x.AllowLargeDeadlineDespiteInterruptionRisk
}
return false
}
func (x *OptimizeToursRequest) GetUseGeodesicDistances() bool {
if x != nil {
return x.UseGeodesicDistances
}
return false
}
func (x *OptimizeToursRequest) GetGeodesicMetersPerSecond() float64 {
if x != nil && x.GeodesicMetersPerSecond != nil {
return *x.GeodesicMetersPerSecond
}
return 0
}
func (x *OptimizeToursRequest) GetLabel() string {
if x != nil {
return x.Label
}
return ""
}
// Deprecated: Do not use.
func (x *OptimizeToursRequest) GetPopulateTravelStepPolylines() bool {
if x != nil {
return x.PopulateTravelStepPolylines
}
return false
}
// Response after solving a tour optimization problem containing the routes
// followed by each vehicle, the shipments which have been skipped and the
// overall cost of the solution.
type OptimizeToursResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Routes computed for each vehicle; the i-th route corresponds to the i-th
// vehicle in the model.
Routes []*ShipmentRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"`
// Copy of the [OptimizeToursRequest.label][google.cloud.optimization.v1.OptimizeToursRequest.label], if a label was specified in the
// request.
RequestLabel string `protobuf:"bytes,3,opt,name=request_label,json=requestLabel,proto3" json:"request_label,omitempty"`
// The list of all shipments skipped.
SkippedShipments []*SkippedShipment `protobuf:"bytes,4,rep,name=skipped_shipments,json=skippedShipments,proto3" json:"skipped_shipments,omitempty"`
// List of all the validation errors that we were able to detect
// independently. See the "MULTIPLE ERRORS" explanation for the
// [OptimizeToursValidationError][google.cloud.optimization.v1.OptimizeToursValidationError] message.
ValidationErrors []*OptimizeToursValidationError `protobuf:"bytes,5,rep,name=validation_errors,json=validationErrors,proto3" json:"validation_errors,omitempty"`
// Duration, distance and usage metrics for this solution.
Metrics *OptimizeToursResponse_Metrics `protobuf:"bytes,6,opt,name=metrics,proto3" json:"metrics,omitempty"`
// Deprecated: Use [Metrics.total_cost][] instead.
// Total cost of the solution. This takes into account all costs: costs per
// per hour and travel hour, fixed vehicle costs, unperformed shipment penalty
// costs, global duration cost, etc.
//
// Deprecated: Do not use.
TotalCost float64 `protobuf:"fixed64,2,opt,name=total_cost,json=totalCost,proto3" json:"total_cost,omitempty"`
}
func (x *OptimizeToursResponse) Reset() {
*x = OptimizeToursResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *OptimizeToursResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OptimizeToursResponse) ProtoMessage() {}
func (x *OptimizeToursResponse) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[1]
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 OptimizeToursResponse.ProtoReflect.Descriptor instead.
func (*OptimizeToursResponse) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{1}
}
func (x *OptimizeToursResponse) GetRoutes() []*ShipmentRoute {
if x != nil {
return x.Routes
}
return nil
}
func (x *OptimizeToursResponse) GetRequestLabel() string {
if x != nil {
return x.RequestLabel
}
return ""
}
func (x *OptimizeToursResponse) GetSkippedShipments() []*SkippedShipment {
if x != nil {
return x.SkippedShipments
}
return nil
}
func (x *OptimizeToursResponse) GetValidationErrors() []*OptimizeToursValidationError {
if x != nil {
return x.ValidationErrors
}
return nil
}
func (x *OptimizeToursResponse) GetMetrics() *OptimizeToursResponse_Metrics {
if x != nil {
return x.Metrics
}
return nil
}
// Deprecated: Do not use.
func (x *OptimizeToursResponse) GetTotalCost() float64 {
if x != nil {
return x.TotalCost
}
return 0
}
// Request to batch optimize tours as an asynchronous operation.
// Each input file should contain one `OptimizeToursRequest`, and each output
// file will contain one `OptimizeToursResponse`. The request contains
// information to read/write and parse the files. All the input and output files
// should be under the same project.
type BatchOptimizeToursRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Target project and location to make a call.
//
// Format: `projects/{project-id}/locations/{location-id}`.
//
// If no location is specified, a region will be chosen automatically.
Parent string `protobuf:"bytes,1,opt,name=parent,proto3" json:"parent,omitempty"`
// Required. Input/Output information each purchase model, such as file paths and data
// formats.
ModelConfigs []*BatchOptimizeToursRequest_AsyncModelConfig `protobuf:"bytes,2,rep,name=model_configs,json=modelConfigs,proto3" json:"model_configs,omitempty"`
}
func (x *BatchOptimizeToursRequest) Reset() {
*x = BatchOptimizeToursRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BatchOptimizeToursRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BatchOptimizeToursRequest) ProtoMessage() {}
func (x *BatchOptimizeToursRequest) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[2]
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 BatchOptimizeToursRequest.ProtoReflect.Descriptor instead.
func (*BatchOptimizeToursRequest) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{2}
}
func (x *BatchOptimizeToursRequest) GetParent() string {
if x != nil {
return x.Parent
}
return ""
}
func (x *BatchOptimizeToursRequest) GetModelConfigs() []*BatchOptimizeToursRequest_AsyncModelConfig {
if x != nil {
return x.ModelConfigs
}
return nil
}
// Response to a `BatchOptimizeToursRequest`. This is returned in
// the LRO Operation after the operation is complete.
type BatchOptimizeToursResponse struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
}
func (x *BatchOptimizeToursResponse) Reset() {
*x = BatchOptimizeToursResponse{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[3]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BatchOptimizeToursResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BatchOptimizeToursResponse) ProtoMessage() {}
func (x *BatchOptimizeToursResponse) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[3]
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 BatchOptimizeToursResponse.ProtoReflect.Descriptor instead.
func (*BatchOptimizeToursResponse) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{3}
}
// A shipment model contains a set of shipments which must be performed by a
// set of vehicles, while minimizing the overall cost, which is the sum of:
//
// - the cost of routing the vehicles (sum of cost per total time, cost per
// travel time, and fixed cost over all vehicles).
// - the unperformed shipment penalties.
// - the cost of the global duration of the shipments
type ShipmentModel struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Set of shipments which must be performed in the model.
Shipments []*Shipment `protobuf:"bytes,1,rep,name=shipments,proto3" json:"shipments,omitempty"`
// Set of vehicles which can be used to perform visits.
Vehicles []*Vehicle `protobuf:"bytes,2,rep,name=vehicles,proto3" json:"vehicles,omitempty"`
// Constrains the maximum number of active vehicles. A vehicle is active if
// its route performs at least one shipment. This can be used to limit the
// number of routes in the case where there are fewer drivers than
// vehicles and that the fleet of vehicles is heterogeneous. The optimization
// will then select the best subset of vehicles to use.
// Must be strictly positive.
MaxActiveVehicles *int32 `protobuf:"varint,4,opt,name=max_active_vehicles,json=maxActiveVehicles,proto3,oneof" json:"max_active_vehicles,omitempty"`
// Global start and end time of the model: no times outside of this range
// can be considered valid.
//
// The model's time span must be less than a year, i.e. the `global_end_time`
// and the `global_start_time` must be within 31536000 seconds of each other.
//
// When using `cost_per_*hour` fields, you might want to set this window to a
// smaller interval to increase performance (eg. if you model a single day,
// you should set the global time limits to that day).
// If unset, 00:00:00 UTC, January 1, 1970 (i.e. seconds: 0, nanos: 0) is used
// as default.
GlobalStartTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=global_start_time,json=globalStartTime,proto3" json:"global_start_time,omitempty"`
// If unset, 00:00:00 UTC, January 1, 1971 (i.e. seconds: 31536000, nanos: 0)
// is used as default.
GlobalEndTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=global_end_time,json=globalEndTime,proto3" json:"global_end_time,omitempty"`
// The "global duration" of the overall plan is the difference between the
// earliest effective start time and the latest effective end time of
// all vehicles. Users can assign a cost per hour to that quantity to try
// and optimize for earliest job completion, for example. This cost must be in
// the same unit as [Shipment.penalty_cost][google.cloud.optimization.v1.Shipment.penalty_cost].
GlobalDurationCostPerHour float64 `protobuf:"fixed64,7,opt,name=global_duration_cost_per_hour,json=globalDurationCostPerHour,proto3" json:"global_duration_cost_per_hour,omitempty"`
// Specifies duration and distance matrices used in the model. If this field
// is empty, Google Maps or geodesic distances will be used instead, depending
// on the value of the `use_geodesic_distances` field. If it is not empty,
// `use_geodesic_distances` cannot be true and neither
// `duration_distance_matrix_src_tags` nor `duration_distance_matrix_dst_tags`
// can be empty.
//
// Usage examples:
//
// * There are two locations: locA and locB.
// * 1 vehicle starting its route at locA and ending it at locA.
// * 1 pickup visit request at locB.
//
// ```
//
// model {
// vehicles { start_tags: "locA" end_tags: "locA" }
// shipments { pickups { tags: "locB" } }
// duration_distance_matrix_src_tags: "locA"
// duration_distance_matrix_src_tags: "locB"
// duration_distance_matrix_dst_tags: "locA"
// duration_distance_matrix_dst_tags: "locB"
// duration_distance_matrices {
// rows { # from: locA
// durations { seconds: 0 } meters: 0 # to: locA
// durations { seconds: 100 } meters: 1000 # to: locB
// }
// rows { # from: locB
// durations { seconds: 102 } meters: 990 # to: locA
// durations { seconds: 0 } meters: 0 # to: locB
// }
// }
// }
//
// ```
//
// - There are three locations: locA, locB and locC.
// - 1 vehicle starting its route at locA and ending it at locB, using
// matrix "fast".
// - 1 vehicle starting its route at locB and ending it at locB, using
// matrix "slow".
// - 1 vehicle starting its route at locB and ending it at locB, using
// matrix "fast".
// - 1 pickup visit request at locC.
//
// ```
//
// model {
// vehicles { start_tags: "locA" end_tags: "locB" start_tags: "fast" }
// vehicles { start_tags: "locB" end_tags: "locB" start_tags: "slow" }
// vehicles { start_tags: "locB" end_tags: "locB" start_tags: "fast" }
// shipments { pickups { tags: "locC" } }
// duration_distance_matrix_src_tags: "locA"
// duration_distance_matrix_src_tags: "locB"
// duration_distance_matrix_src_tags: "locC"
// duration_distance_matrix_dst_tags: "locB"
// duration_distance_matrix_dst_tags: "locC"
// duration_distance_matrices {
// vehicle_start_tag: "fast"
// rows { # from: locA
// durations { seconds: 1000 } meters: 2000 # to: locB
// durations { seconds: 600 } meters: 1000 # to: locC
// }
// rows { # from: locB
// durations { seconds: 0 } meters: 0 # to: locB
// durations { seconds: 700 } meters: 1200 # to: locC
// }
// rows { # from: locC
// durations { seconds: 702 } meters: 1190 # to: locB
// durations { seconds: 0 } meters: 0 # to: locC
// }
// }
// duration_distance_matrices {
// vehicle_start_tag: "slow"
// rows { # from: locA
// durations { seconds: 1800 } meters: 2001 # to: locB
// durations { seconds: 900 } meters: 1002 # to: locC
// }
// rows { # from: locB
// durations { seconds: 0 } meters: 0 # to: locB
// durations { seconds: 1000 } meters: 1202 # to: locC
// }
// rows { # from: locC
// durations { seconds: 1001 } meters: 1195 # to: locB
// durations { seconds: 0 } meters: 0 # to: locC
// }
// }
// }
//
// ```
DurationDistanceMatrices []*ShipmentModel_DurationDistanceMatrix `protobuf:"bytes,8,rep,name=duration_distance_matrices,json=durationDistanceMatrices,proto3" json:"duration_distance_matrices,omitempty"`
// Tags defining the sources of the duration and distance matrices;
// `duration_distance_matrices(i).rows(j)` defines durations and distances
// from visits with tag `duration_distance_matrix_src_tags(j)` to other visits
// in matrix i.
//
// Tags correspond to
// [VisitRequest.tags][google.cloud.optimization.v1.Shipment.VisitRequest.tags]
// or [Vehicle.start_tags][google.cloud.optimization.v1.Vehicle.start_tags].
// A given `VisitRequest` or `Vehicle` must match exactly one tag in this
// field. Note that a `Vehicle`'s source, destination and matrix tags may be
// the same; similarly a `VisitRequest`'s source and destination tags may be
// the same. All tags must be different and cannot be empty strings. If this
// field is not empty, then `duration_distance_matrices` must not be empty.
DurationDistanceMatrixSrcTags []string `protobuf:"bytes,9,rep,name=duration_distance_matrix_src_tags,json=durationDistanceMatrixSrcTags,proto3" json:"duration_distance_matrix_src_tags,omitempty"`
// Tags defining the destinations of the duration and distance matrices;
// `duration_distance_matrices(i).rows(j).durations(k)` (resp.
// `duration_distance_matrices(i).rows(j).meters(k))` defines the duration
// (resp. the distance) of the travel from visits with tag
// `duration_distance_matrix_src_tags(j)` to visits with tag
// `duration_distance_matrix_dst_tags(k)` in matrix i.
//
// Tags correspond to
// [VisitRequest.tags][google.cloud.optimization.v1.Shipment.VisitRequest.tags]
// or [Vehicle.start_tags][google.cloud.optimization.v1.Vehicle.start_tags].
// A given `VisitRequest` or `Vehicle` must match exactly one tag in this
// field. Note that a `Vehicle`'s source, destination and matrix tags may be
// the same; similarly a `VisitRequest`'s source and destination tags may be
// the same. All tags must be different and cannot be empty strings. If this
// field is not empty, then `duration_distance_matrices` must not be empty.
DurationDistanceMatrixDstTags []string `protobuf:"bytes,10,rep,name=duration_distance_matrix_dst_tags,json=durationDistanceMatrixDstTags,proto3" json:"duration_distance_matrix_dst_tags,omitempty"`
// Transition attributes added to the model.
TransitionAttributes []*TransitionAttributes `protobuf:"bytes,11,rep,name=transition_attributes,json=transitionAttributes,proto3" json:"transition_attributes,omitempty"`
// Sets of incompatible shipment_types (see `ShipmentTypeIncompatibility`).
ShipmentTypeIncompatibilities []*ShipmentTypeIncompatibility `protobuf:"bytes,12,rep,name=shipment_type_incompatibilities,json=shipmentTypeIncompatibilities,proto3" json:"shipment_type_incompatibilities,omitempty"`
// Sets of `shipment_type` requirements (see `ShipmentTypeRequirement`).
ShipmentTypeRequirements []*ShipmentTypeRequirement `protobuf:"bytes,13,rep,name=shipment_type_requirements,json=shipmentTypeRequirements,proto3" json:"shipment_type_requirements,omitempty"`
// Set of precedence rules which must be enforced in the model.
PrecedenceRules []*ShipmentModel_PrecedenceRule `protobuf:"bytes,14,rep,name=precedence_rules,json=precedenceRules,proto3" json:"precedence_rules,omitempty"`
// Deprecated: No longer used.
// Set of break rules used in the model.
// Each vehicle specifies the `BreakRule` that applies to it via the
// [Vehicle.break_rule_indices][google.cloud.optimization.v1.Vehicle.break_rule_indices] field (which must be a singleton).
//
// Deprecated: Do not use.
BreakRules []*ShipmentModel_BreakRule `protobuf:"bytes,15,rep,name=break_rules,json=breakRules,proto3" json:"break_rules,omitempty"`
}
func (x *ShipmentModel) Reset() {
*x = ShipmentModel{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[4]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel) ProtoMessage() {}
func (x *ShipmentModel) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[4]
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 ShipmentModel.ProtoReflect.Descriptor instead.
func (*ShipmentModel) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4}
}
func (x *ShipmentModel) GetShipments() []*Shipment {
if x != nil {
return x.Shipments
}
return nil
}
func (x *ShipmentModel) GetVehicles() []*Vehicle {
if x != nil {
return x.Vehicles
}
return nil
}
func (x *ShipmentModel) GetMaxActiveVehicles() int32 {
if x != nil && x.MaxActiveVehicles != nil {
return *x.MaxActiveVehicles
}
return 0
}
func (x *ShipmentModel) GetGlobalStartTime() *timestamp.Timestamp {
if x != nil {
return x.GlobalStartTime
}
return nil
}
func (x *ShipmentModel) GetGlobalEndTime() *timestamp.Timestamp {
if x != nil {
return x.GlobalEndTime
}
return nil
}
func (x *ShipmentModel) GetGlobalDurationCostPerHour() float64 {
if x != nil {
return x.GlobalDurationCostPerHour
}
return 0
}
func (x *ShipmentModel) GetDurationDistanceMatrices() []*ShipmentModel_DurationDistanceMatrix {
if x != nil {
return x.DurationDistanceMatrices
}
return nil
}
func (x *ShipmentModel) GetDurationDistanceMatrixSrcTags() []string {
if x != nil {
return x.DurationDistanceMatrixSrcTags
}
return nil
}
func (x *ShipmentModel) GetDurationDistanceMatrixDstTags() []string {
if x != nil {
return x.DurationDistanceMatrixDstTags
}
return nil
}
func (x *ShipmentModel) GetTransitionAttributes() []*TransitionAttributes {
if x != nil {
return x.TransitionAttributes
}
return nil
}
func (x *ShipmentModel) GetShipmentTypeIncompatibilities() []*ShipmentTypeIncompatibility {
if x != nil {
return x.ShipmentTypeIncompatibilities
}
return nil
}
func (x *ShipmentModel) GetShipmentTypeRequirements() []*ShipmentTypeRequirement {
if x != nil {
return x.ShipmentTypeRequirements
}
return nil
}
func (x *ShipmentModel) GetPrecedenceRules() []*ShipmentModel_PrecedenceRule {
if x != nil {
return x.PrecedenceRules
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentModel) GetBreakRules() []*ShipmentModel_BreakRule {
if x != nil {
return x.BreakRules
}
return nil
}
// The shipment of a single item, from one of its pickups to one of its
// deliveries. For the shipment to be considered as performed, a unique vehicle
// must visit one of its pickup locations (and decrease its spare capacities
// accordingly), then visit one of its delivery locations later on (and
// therefore re-increase its spare capacities accordingly).
type Shipment struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Set of pickup alternatives associated to the shipment. If not specified,
// the vehicle only needs to visit a location corresponding to the deliveries.
Pickups []*Shipment_VisitRequest `protobuf:"bytes,1,rep,name=pickups,proto3" json:"pickups,omitempty"`
// Set of delivery alternatives associated to the shipment. If not specified,
// the vehicle only needs to visit a location corresponding to the pickups.
Deliveries []*Shipment_VisitRequest `protobuf:"bytes,2,rep,name=deliveries,proto3" json:"deliveries,omitempty"`
// Load demands of the shipment (for example weight, volume, number of
// pallets etc). The keys in the map should be identifiers describing the type
// of the corresponding load, ideally also including the units.
// For example: "weight_kg", "volume_gallons", "pallet_count", etc.
// If a given key does not appear in the map, the corresponding load is
// considered as null.
LoadDemands map[string]*Shipment_Load `protobuf:"bytes,14,rep,name=load_demands,json=loadDemands,proto3" json:"load_demands,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// If the shipment is not completed, this penalty is added to the overall
// cost of the routes. A shipment is considered completed if one of its pickup
// and delivery alternatives is visited. The cost may be expressed in the
// same unit used for all other cost-related fields in the model and must be
// positive.
//
// *IMPORTANT*: If this penalty is not specified, it is considered infinite,
// i.e. the shipment must be completed.
PenaltyCost *float64 `protobuf:"fixed64,4,opt,name=penalty_cost,json=penaltyCost,proto3,oneof" json:"penalty_cost,omitempty"`
// The set of vehicles that may perform this shipment. If empty, all vehicles
// may perform it. Vehicles are given by their index in the `ShipmentModel`'s
// `vehicles` list.
AllowedVehicleIndices []int32 `protobuf:"varint,5,rep,packed,name=allowed_vehicle_indices,json=allowedVehicleIndices,proto3" json:"allowed_vehicle_indices,omitempty"`
// Specifies the cost that is incurred when this shipment is delivered by each
// vehicle. If specified, it must have EITHER:
//
// - the same number of elements as `costs_per_vehicle_indices`.
// `costs_per_vehicle[i]` corresponds to vehicle
// `costs_per_vehicle_indices[i]` of the model.
// - the same number of elements as there are vehicles in the model. The
// i-th element corresponds to vehicle #i of the model.
//
// These costs must be in the same unit as `penalty_cost` and must not be
// negative. Leave this field empty, if there are no such costs.
CostsPerVehicle []float64 `protobuf:"fixed64,6,rep,packed,name=costs_per_vehicle,json=costsPerVehicle,proto3" json:"costs_per_vehicle,omitempty"`
// Indices of the vehicles to which `costs_per_vehicle` applies. If non-empty,
// it must have the same number of elements as `costs_per_vehicle`. A vehicle
// index may not be specified more than once. If a vehicle is excluded from
// `costs_per_vehicle_indices`, its cost is zero.
CostsPerVehicleIndices []int32 `protobuf:"varint,7,rep,packed,name=costs_per_vehicle_indices,json=costsPerVehicleIndices,proto3" json:"costs_per_vehicle_indices,omitempty"`
// Specifies the maximum relative detour time compared to the shortest path
// from pickup to delivery. If specified, it must be nonnegative, and the
// shipment must contain at least a pickup and a delivery.
//
// For example, let t be the shortest time taken to go from the selected
// pickup alternative directly to the selected delivery alternative. Then
// setting `pickup_to_delivery_relative_detour_limit` enforces:
//
// ```
// start_time(delivery) - start_time(pickup) <=
// std::ceil(t * (1.0 + pickup_to_delivery_relative_detour_limit))
// ```
//
// If both relative and absolute limits are specified on the same shipment,
// the more constraining limit is used for each possible pickup/delivery pair.
// As of 2017/10, detours are only supported when travel durations do not
// depend on vehicles.
PickupToDeliveryRelativeDetourLimit *float64 `protobuf:"fixed64,8,opt,name=pickup_to_delivery_relative_detour_limit,json=pickupToDeliveryRelativeDetourLimit,proto3,oneof" json:"pickup_to_delivery_relative_detour_limit,omitempty"`
// Specifies the maximum absolute detour time compared to the shortest path
// from pickup to delivery. If specified, it must be nonnegative, and the
// shipment must contain at least a pickup and a delivery.
//
// For example, let t be the shortest time taken to go from the selected
// pickup alternative directly to the selected delivery alternative. Then
// setting `pickup_to_delivery_absolute_detour_limit` enforces:
//
// ```
// start_time(delivery) - start_time(pickup) <=
// t + pickup_to_delivery_absolute_detour_limit
// ```
//
// If both relative and absolute limits are specified on the same shipment,
// the more constraining limit is used for each possible pickup/delivery pair.
// As of 2017/10, detours are only supported when travel durations do not
// depend on vehicles.
PickupToDeliveryAbsoluteDetourLimit *duration.Duration `protobuf:"bytes,9,opt,name=pickup_to_delivery_absolute_detour_limit,json=pickupToDeliveryAbsoluteDetourLimit,proto3" json:"pickup_to_delivery_absolute_detour_limit,omitempty"`
// Specifies the maximum duration from start of pickup to start of delivery of
// a shipment. If specified, it must be nonnegative, and the shipment must
// contain at least a pickup and a delivery. This does not depend on which
// alternatives are selected for pickup and delivery, nor on vehicle speed.
// This can be specified alongside maximum detour constraints: the solution
// will respect both specifications.
PickupToDeliveryTimeLimit *duration.Duration `protobuf:"bytes,10,opt,name=pickup_to_delivery_time_limit,json=pickupToDeliveryTimeLimit,proto3" json:"pickup_to_delivery_time_limit,omitempty"`
// Non-empty string specifying a "type" for this shipment.
// This feature can be used to define incompatibilities or requirements
// between `shipment_types` (see `shipment_type_incompatibilities` and
// `shipment_type_requirements` in `ShipmentModel`).
//
// Differs from `visit_types` which is specified for a single visit: All
// pickup/deliveries belonging to the same shipment share the same
// `shipment_type`.
ShipmentType string `protobuf:"bytes,11,opt,name=shipment_type,json=shipmentType,proto3" json:"shipment_type,omitempty"`
// Specifies a label for this shipment. This label is reported in the response
// in the `shipment_label` of the corresponding [ShipmentRoute.Visit][google.cloud.optimization.v1.ShipmentRoute.Visit].
Label string `protobuf:"bytes,12,opt,name=label,proto3" json:"label,omitempty"`
// If true, skip this shipment, but don't apply a `penalty_cost`.
//
// Ignoring a shipment results in a validation error when there are any
// `shipment_type_requirements` in the model.
//
// Ignoring a shipment that is performed in `injected_first_solution_routes`
// or `injected_solution_constraint` is permitted; the solver removes the
// related pickup/delivery visits from the performing route.
// `precedence_rules` that reference ignored shipments will also be ignored.
Ignore bool `protobuf:"varint,13,opt,name=ignore,proto3" json:"ignore,omitempty"`
// Deprecated: Use [Shipment.load_demands][] instead.
//
// Deprecated: Do not use.
Demands []*CapacityQuantity `protobuf:"bytes,3,rep,name=demands,proto3" json:"demands,omitempty"`
}
func (x *Shipment) Reset() {
*x = Shipment{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[5]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Shipment) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Shipment) ProtoMessage() {}
func (x *Shipment) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[5]
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 Shipment.ProtoReflect.Descriptor instead.
func (*Shipment) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{5}
}
func (x *Shipment) GetPickups() []*Shipment_VisitRequest {
if x != nil {
return x.Pickups
}
return nil
}
func (x *Shipment) GetDeliveries() []*Shipment_VisitRequest {
if x != nil {
return x.Deliveries
}
return nil
}
func (x *Shipment) GetLoadDemands() map[string]*Shipment_Load {
if x != nil {
return x.LoadDemands
}
return nil
}
func (x *Shipment) GetPenaltyCost() float64 {
if x != nil && x.PenaltyCost != nil {
return *x.PenaltyCost
}
return 0
}
func (x *Shipment) GetAllowedVehicleIndices() []int32 {
if x != nil {
return x.AllowedVehicleIndices
}
return nil
}
func (x *Shipment) GetCostsPerVehicle() []float64 {
if x != nil {
return x.CostsPerVehicle
}
return nil
}
func (x *Shipment) GetCostsPerVehicleIndices() []int32 {
if x != nil {
return x.CostsPerVehicleIndices
}
return nil
}
func (x *Shipment) GetPickupToDeliveryRelativeDetourLimit() float64 {
if x != nil && x.PickupToDeliveryRelativeDetourLimit != nil {
return *x.PickupToDeliveryRelativeDetourLimit
}
return 0
}
func (x *Shipment) GetPickupToDeliveryAbsoluteDetourLimit() *duration.Duration {
if x != nil {
return x.PickupToDeliveryAbsoluteDetourLimit
}
return nil
}
func (x *Shipment) GetPickupToDeliveryTimeLimit() *duration.Duration {
if x != nil {
return x.PickupToDeliveryTimeLimit
}
return nil
}
func (x *Shipment) GetShipmentType() string {
if x != nil {
return x.ShipmentType
}
return ""
}
func (x *Shipment) GetLabel() string {
if x != nil {
return x.Label
}
return ""
}
func (x *Shipment) GetIgnore() bool {
if x != nil {
return x.Ignore
}
return false
}
// Deprecated: Do not use.
func (x *Shipment) GetDemands() []*CapacityQuantity {
if x != nil {
return x.Demands
}
return nil
}
// Specifies incompatibilties between shipments depending on their
// shipment_type. The appearance of incompatible shipments on the same route is
// restricted based on the incompatibility mode.
type ShipmentTypeIncompatibility struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// List of incompatible types. Two shipments having different `shipment_types`
// among those listed are "incompatible".
Types []string `protobuf:"bytes,1,rep,name=types,proto3" json:"types,omitempty"`
// Mode applied to the incompatibility.
IncompatibilityMode ShipmentTypeIncompatibility_IncompatibilityMode `protobuf:"varint,2,opt,name=incompatibility_mode,json=incompatibilityMode,proto3,enum=google.cloud.optimization.v1.ShipmentTypeIncompatibility_IncompatibilityMode" json:"incompatibility_mode,omitempty"`
}
func (x *ShipmentTypeIncompatibility) Reset() {
*x = ShipmentTypeIncompatibility{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[6]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentTypeIncompatibility) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentTypeIncompatibility) ProtoMessage() {}
func (x *ShipmentTypeIncompatibility) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[6]
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 ShipmentTypeIncompatibility.ProtoReflect.Descriptor instead.
func (*ShipmentTypeIncompatibility) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{6}
}
func (x *ShipmentTypeIncompatibility) GetTypes() []string {
if x != nil {
return x.Types
}
return nil
}
func (x *ShipmentTypeIncompatibility) GetIncompatibilityMode() ShipmentTypeIncompatibility_IncompatibilityMode {
if x != nil {
return x.IncompatibilityMode
}
return ShipmentTypeIncompatibility_INCOMPATIBILITY_MODE_UNSPECIFIED
}
// Specifies requirements between shipments based on their shipment_type.
// The specifics of the requirement are defined by the requirement mode.
type ShipmentTypeRequirement struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// List of alternative shipment types required by the
// `dependent_shipment_types`.
RequiredShipmentTypeAlternatives []string `protobuf:"bytes,1,rep,name=required_shipment_type_alternatives,json=requiredShipmentTypeAlternatives,proto3" json:"required_shipment_type_alternatives,omitempty"`
// All shipments with a type in the `dependent_shipment_types` field require
// at least one shipment of type `required_shipment_type_alternatives` to be
// visited on the same route.
//
// NOTE: Chains of requirements such that a `shipment_type` depends on itself
// are not allowed.
DependentShipmentTypes []string `protobuf:"bytes,2,rep,name=dependent_shipment_types,json=dependentShipmentTypes,proto3" json:"dependent_shipment_types,omitempty"`
// Mode applied to the requirement.
RequirementMode ShipmentTypeRequirement_RequirementMode `protobuf:"varint,3,opt,name=requirement_mode,json=requirementMode,proto3,enum=google.cloud.optimization.v1.ShipmentTypeRequirement_RequirementMode" json:"requirement_mode,omitempty"`
}
func (x *ShipmentTypeRequirement) Reset() {
*x = ShipmentTypeRequirement{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[7]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentTypeRequirement) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentTypeRequirement) ProtoMessage() {}
func (x *ShipmentTypeRequirement) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[7]
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 ShipmentTypeRequirement.ProtoReflect.Descriptor instead.
func (*ShipmentTypeRequirement) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{7}
}
func (x *ShipmentTypeRequirement) GetRequiredShipmentTypeAlternatives() []string {
if x != nil {
return x.RequiredShipmentTypeAlternatives
}
return nil
}
func (x *ShipmentTypeRequirement) GetDependentShipmentTypes() []string {
if x != nil {
return x.DependentShipmentTypes
}
return nil
}
func (x *ShipmentTypeRequirement) GetRequirementMode() ShipmentTypeRequirement_RequirementMode {
if x != nil {
return x.RequirementMode
}
return ShipmentTypeRequirement_REQUIREMENT_MODE_UNSPECIFIED
}
// Models a vehicle in a shipment problem. Solving a shipment problem will
// build a route starting from `start_location` and ending at `end_location`
// for this vehicle. A route is a sequence of visits (see `ShipmentRoute`).
type Vehicle struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The travel mode which affects the roads usable by the vehicle and its
// speed. See also `travel_duration_multiple`.
TravelMode Vehicle_TravelMode `protobuf:"varint,1,opt,name=travel_mode,json=travelMode,proto3,enum=google.cloud.optimization.v1.Vehicle_TravelMode" json:"travel_mode,omitempty"`
// Geographic location where the vehicle starts before picking up any
// shipments. If not specified, the vehicle starts at its first pickup.
// If the shipment model has duration and distance matrices, `start_location`
// must not be specified.
StartLocation *latlng.LatLng `protobuf:"bytes,3,opt,name=start_location,json=startLocation,proto3" json:"start_location,omitempty"`
// Waypoint representing a geographic location where the vehicle starts before
// picking up any shipments. If neither `start_waypoint` nor `start_location`
// is specified, the vehicle starts at its first pickup.
// If the shipment model has duration and distance matrices, `start_waypoint`
// must not be specified.
StartWaypoint *Waypoint `protobuf:"bytes,4,opt,name=start_waypoint,json=startWaypoint,proto3" json:"start_waypoint,omitempty"`
// Geographic location where the vehicle ends after it has completed its last
// `VisitRequest`. If not specified the vehicle's `ShipmentRoute` ends
// immediately when it completes its last `VisitRequest`.
// If the shipment model has duration and distance matrices, `end_location`
// must not be specified.
EndLocation *latlng.LatLng `protobuf:"bytes,5,opt,name=end_location,json=endLocation,proto3" json:"end_location,omitempty"`
// Waypoint representing a geographic location where the vehicle ends after
// it has completed its last `VisitRequest`. If neither `end_waypoint` nor
// `end_location` is specified, the vehicle's `ShipmentRoute` ends immediately
// when it completes its last `VisitRequest`.
// If the shipment model has duration and distance matrices, `end_waypoint`
// must not be specified.
EndWaypoint *Waypoint `protobuf:"bytes,6,opt,name=end_waypoint,json=endWaypoint,proto3" json:"end_waypoint,omitempty"`
// Specifies tags attached to the start of the vehicle's route.
//
// Empty or duplicate strings are not allowed.
StartTags []string `protobuf:"bytes,7,rep,name=start_tags,json=startTags,proto3" json:"start_tags,omitempty"`
// Specifies tags attached to the end of the vehicle's route.
//
// Empty or duplicate strings are not allowed.
EndTags []string `protobuf:"bytes,8,rep,name=end_tags,json=endTags,proto3" json:"end_tags,omitempty"`
// Time windows during which the vehicle may depart its start location.
// They must be within the global time limits (see
// [ShipmentModel.global_*][google.cloud.optimization.v1.ShipmentModel.global_start_time]
// fields). If unspecified, there is no limitation besides those global time
// limits.
//
// Time windows belonging to the same repeated field must be disjoint, i.e. no
// time window can overlap with or be adjacent to another, and they must be in
// chronological order.
//
// `cost_per_hour_after_soft_end_time` and `soft_end_time` can only be set if
// there is a single time window.
StartTimeWindows []*TimeWindow `protobuf:"bytes,9,rep,name=start_time_windows,json=startTimeWindows,proto3" json:"start_time_windows,omitempty"`
// Time windows during which the vehicle may arrive at its end location.
// They must be within the global time limits (see
// [ShipmentModel.global_*][google.cloud.optimization.v1.ShipmentModel.global_start_time]
// fields). If unspecified, there is no limitation besides those global time
// limits.
//
// Time windows belonging to the same repeated field must be disjoint, i.e. no
// time window can overlap with or be adjacent to another, and they must be in
// chronological order.
//
// `cost_per_hour_after_soft_end_time` and `soft_end_time` can only be set if
// there is a single time window.
EndTimeWindows []*TimeWindow `protobuf:"bytes,10,rep,name=end_time_windows,json=endTimeWindows,proto3" json:"end_time_windows,omitempty"`
// Specifies a multiplicative factor that can be used to increase or decrease
// travel times of this vehicle. For example, setting this to 2.0 means
// that this vehicle is slower and has travel times that are twice what they
// are for standard vehicles. This multiple does not affect visit durations.
// It does affect cost if `cost_per_hour` or `cost_per_traveled_hour` are
// specified. This must be in the range [0.001, 1000.0]. If unset, the vehicle
// is standard, and this multiple is considered 1.0.
//
// WARNING: Travel times will be rounded to the nearest second after this
// multiple is applied but before performing any numerical operations, thus,
// a small multiple may result in a loss of precision.
//
// See also `extra_visit_duration_for_visit_type` below.
TravelDurationMultiple *float64 `protobuf:"fixed64,11,opt,name=travel_duration_multiple,json=travelDurationMultiple,proto3,oneof" json:"travel_duration_multiple,omitempty"`
// Unloading policy enforced on the vehicle.
UnloadingPolicy Vehicle_UnloadingPolicy `protobuf:"varint,12,opt,name=unloading_policy,json=unloadingPolicy,proto3,enum=google.cloud.optimization.v1.Vehicle_UnloadingPolicy" json:"unloading_policy,omitempty"`
// Capacities of the vehicle (weight, volume, # of pallets for example).
// The keys in the map are the identifiers of the type of load, consistent
// with the keys of the
// [Shipment.load_demands][google.cloud.optimization.v1.Shipment.load_demands]
// field. If a given key is absent from this map, the corresponding capacity
// is considered to be limitless.
LoadLimits map[string]*Vehicle_LoadLimit `protobuf:"bytes,30,rep,name=load_limits,json=loadLimits,proto3" json:"load_limits,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Vehicle costs: all costs add up and must be in the same unit as
// [Shipment.penalty_cost][google.cloud.optimization.v1.Shipment.penalty_cost].
//
// Cost per hour of the vehicle route. This cost is applied to the total time
// taken by the route, and includes travel time, waiting time, and visit time.
// Using `cost_per_hour` instead of just `cost_per_traveled_hour` may result
// in additional latency.
CostPerHour float64 `protobuf:"fixed64,16,opt,name=cost_per_hour,json=costPerHour,proto3" json:"cost_per_hour,omitempty"`
// Cost per traveled hour of the vehicle route. This cost is applied only to
// travel time taken by the route (i.e., that reported in
// [ShipmentRoute.transitions][google.cloud.optimization.v1.ShipmentRoute.transitions]), and excludes waiting time and visit time.
CostPerTraveledHour float64 `protobuf:"fixed64,17,opt,name=cost_per_traveled_hour,json=costPerTraveledHour,proto3" json:"cost_per_traveled_hour,omitempty"`
// Cost per kilometer of the vehicle route. This cost is applied to the
// distance reported in the [ShipmentRoute.transitions][google.cloud.optimization.v1.ShipmentRoute.transitions] and does not apply
// to any distance implicitly traveled from the `arrival_location` to the
// `departure_location` of a single `VisitRequest`.
CostPerKilometer float64 `protobuf:"fixed64,18,opt,name=cost_per_kilometer,json=costPerKilometer,proto3" json:"cost_per_kilometer,omitempty"`
// Fixed cost applied if this vehicle is used to handle a shipment.
FixedCost float64 `protobuf:"fixed64,19,opt,name=fixed_cost,json=fixedCost,proto3" json:"fixed_cost,omitempty"`
// This field only applies to vehicles when their route does not serve any
// shipments. It indicates if the vehicle should be considered as used or not
// in this case.
//
// If true, the vehicle goes from its start to its end location even if it
// doesn't serve any shipments, and time and distance costs resulting from its
// start --> end travel are taken into account.
//
// Otherwise, it doesn't travel from its start to its end location, and no
// `break_rule` or delay (from `TransitionAttributes`) are scheduled for this
// vehicle. In this case, the vehicle's `ShipmentRoute` doesn't contain any
// information except for the vehicle index and label.
UsedIfRouteIsEmpty bool `protobuf:"varint,20,opt,name=used_if_route_is_empty,json=usedIfRouteIsEmpty,proto3" json:"used_if_route_is_empty,omitempty"`
// Limit applied to the total duration of the vehicle's route. In a given
// `OptimizeToursResponse`, the route duration of a vehicle is the
// difference between its `vehicle_end_time` and `vehicle_start_time`.
RouteDurationLimit *Vehicle_DurationLimit `protobuf:"bytes,21,opt,name=route_duration_limit,json=routeDurationLimit,proto3" json:"route_duration_limit,omitempty"`
// Limit applied to the travel duration of the vehicle's route. In a given
// `OptimizeToursResponse`, the route travel duration is the sum of all its
// [transitions.travel_duration][google.cloud.optimization.v1.ShipmentRoute.Transition.travel_duration].
TravelDurationLimit *Vehicle_DurationLimit `protobuf:"bytes,22,opt,name=travel_duration_limit,json=travelDurationLimit,proto3" json:"travel_duration_limit,omitempty"`
// Limit applied to the total distance of the vehicle's route. In a given
// `OptimizeToursResponse`, the route distance is the sum of all its
// [transitions.travel_distance_meters][google.cloud.optimization.v1.ShipmentRoute.Transition.travel_distance_meters].
RouteDistanceLimit *DistanceLimit `protobuf:"bytes,23,opt,name=route_distance_limit,json=routeDistanceLimit,proto3" json:"route_distance_limit,omitempty"`
// Specifies a map from visit_types strings to durations. The duration is time
// in addition to
// [VisitRequest.duration][google.cloud.optimization.v1.Shipment.VisitRequest.duration]
// to be taken at visits with the specified `visit_types`. This extra visit
// duration adds cost if `cost_per_hour` is specified. Keys (i.e.
// `visit_types`) cannot be empty strings.
//
// If a visit request has multiple types, a duration will be added for each
// type in the map.
ExtraVisitDurationForVisitType map[string]*duration.Duration `protobuf:"bytes,24,rep,name=extra_visit_duration_for_visit_type,json=extraVisitDurationForVisitType,proto3" json:"extra_visit_duration_for_visit_type,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Describes the break schedule to be enforced on this vehicle.
// If empty, no breaks will be scheduled for this vehicle.
BreakRule *BreakRule `protobuf:"bytes,25,opt,name=break_rule,json=breakRule,proto3" json:"break_rule,omitempty"`
// Specifies a label for this vehicle. This label is reported in the response
// as the `vehicle_label` of the corresponding [ShipmentRoute][google.cloud.optimization.v1.ShipmentRoute].
Label string `protobuf:"bytes,27,opt,name=label,proto3" json:"label,omitempty"`
// If true, `used_if_route_is_empty` must be false, and this vehicle will
// remain unused.
//
// If a shipment is performed by an ignored vehicle in
// `injected_first_solution_routes`, it is skipped in the first solution but
// is free to be performed in the response.
//
// If a shipment is performed by an ignored vehicle in
// `injected_solution_constraint` and any related pickup/delivery is
// constrained to remain on the vehicle (i.e., not relaxed to level
// `RELAX_ALL_AFTER_THRESHOLD`), it is skipped in the response.
// If a shipment has a non-empty `allowed_vehicle_indices` field and all of
// the allowed vehicles are ignored, it is skipped in the response.
Ignore bool `protobuf:"varint,28,opt,name=ignore,proto3" json:"ignore,omitempty"`
// Deprecated: No longer used.
// Indices in the `break_rule` field in the source
// [ShipmentModel][]. They correspond to break rules enforced on the vehicle.
//
// As of 2018/03, at most one rule index per vehicle can be specified.
//
// Deprecated: Do not use.
BreakRuleIndices []int32 `protobuf:"varint,29,rep,packed,name=break_rule_indices,json=breakRuleIndices,proto3" json:"break_rule_indices,omitempty"`
// Deprecated: Use [Vehicle.load_limits][] instead.
//
// Deprecated: Do not use.
Capacities []*CapacityQuantity `protobuf:"bytes,13,rep,name=capacities,proto3" json:"capacities,omitempty"`
// Deprecated: Use [Vehicle.LoadLimit.start_load_interval][] instead.
//
// Deprecated: Do not use.
StartLoadIntervals []*CapacityQuantityInterval `protobuf:"bytes,14,rep,name=start_load_intervals,json=startLoadIntervals,proto3" json:"start_load_intervals,omitempty"`
// Deprecated: Use [Vehicle.LoadLimit.end_load_interval][] instead.
//
// Deprecated: Do not use.
EndLoadIntervals []*CapacityQuantityInterval `protobuf:"bytes,15,rep,name=end_load_intervals,json=endLoadIntervals,proto3" json:"end_load_intervals,omitempty"`
}
func (x *Vehicle) Reset() {
*x = Vehicle{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[8]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Vehicle) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Vehicle) ProtoMessage() {}
func (x *Vehicle) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[8]
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 Vehicle.ProtoReflect.Descriptor instead.
func (*Vehicle) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8}
}
func (x *Vehicle) GetTravelMode() Vehicle_TravelMode {
if x != nil {
return x.TravelMode
}
return Vehicle_TRAVEL_MODE_UNSPECIFIED
}
func (x *Vehicle) GetStartLocation() *latlng.LatLng {
if x != nil {
return x.StartLocation
}
return nil
}
func (x *Vehicle) GetStartWaypoint() *Waypoint {
if x != nil {
return x.StartWaypoint
}
return nil
}
func (x *Vehicle) GetEndLocation() *latlng.LatLng {
if x != nil {
return x.EndLocation
}
return nil
}
func (x *Vehicle) GetEndWaypoint() *Waypoint {
if x != nil {
return x.EndWaypoint
}
return nil
}
func (x *Vehicle) GetStartTags() []string {
if x != nil {
return x.StartTags
}
return nil
}
func (x *Vehicle) GetEndTags() []string {
if x != nil {
return x.EndTags
}
return nil
}
func (x *Vehicle) GetStartTimeWindows() []*TimeWindow {
if x != nil {
return x.StartTimeWindows
}
return nil
}
func (x *Vehicle) GetEndTimeWindows() []*TimeWindow {
if x != nil {
return x.EndTimeWindows
}
return nil
}
func (x *Vehicle) GetTravelDurationMultiple() float64 {
if x != nil && x.TravelDurationMultiple != nil {
return *x.TravelDurationMultiple
}
return 0
}
func (x *Vehicle) GetUnloadingPolicy() Vehicle_UnloadingPolicy {
if x != nil {
return x.UnloadingPolicy
}
return Vehicle_UNLOADING_POLICY_UNSPECIFIED
}
func (x *Vehicle) GetLoadLimits() map[string]*Vehicle_LoadLimit {
if x != nil {
return x.LoadLimits
}
return nil
}
func (x *Vehicle) GetCostPerHour() float64 {
if x != nil {
return x.CostPerHour
}
return 0
}
func (x *Vehicle) GetCostPerTraveledHour() float64 {
if x != nil {
return x.CostPerTraveledHour
}
return 0
}
func (x *Vehicle) GetCostPerKilometer() float64 {
if x != nil {
return x.CostPerKilometer
}
return 0
}
func (x *Vehicle) GetFixedCost() float64 {
if x != nil {
return x.FixedCost
}
return 0
}
func (x *Vehicle) GetUsedIfRouteIsEmpty() bool {
if x != nil {
return x.UsedIfRouteIsEmpty
}
return false
}
func (x *Vehicle) GetRouteDurationLimit() *Vehicle_DurationLimit {
if x != nil {
return x.RouteDurationLimit
}
return nil
}
func (x *Vehicle) GetTravelDurationLimit() *Vehicle_DurationLimit {
if x != nil {
return x.TravelDurationLimit
}
return nil
}
func (x *Vehicle) GetRouteDistanceLimit() *DistanceLimit {
if x != nil {
return x.RouteDistanceLimit
}
return nil
}
func (x *Vehicle) GetExtraVisitDurationForVisitType() map[string]*duration.Duration {
if x != nil {
return x.ExtraVisitDurationForVisitType
}
return nil
}
func (x *Vehicle) GetBreakRule() *BreakRule {
if x != nil {
return x.BreakRule
}
return nil
}
func (x *Vehicle) GetLabel() string {
if x != nil {
return x.Label
}
return ""
}
func (x *Vehicle) GetIgnore() bool {
if x != nil {
return x.Ignore
}
return false
}
// Deprecated: Do not use.
func (x *Vehicle) GetBreakRuleIndices() []int32 {
if x != nil {
return x.BreakRuleIndices
}
return nil
}
// Deprecated: Do not use.
func (x *Vehicle) GetCapacities() []*CapacityQuantity {
if x != nil {
return x.Capacities
}
return nil
}
// Deprecated: Do not use.
func (x *Vehicle) GetStartLoadIntervals() []*CapacityQuantityInterval {
if x != nil {
return x.StartLoadIntervals
}
return nil
}
// Deprecated: Do not use.
func (x *Vehicle) GetEndLoadIntervals() []*CapacityQuantityInterval {
if x != nil {
return x.EndLoadIntervals
}
return nil
}
// Time windows constrain the time of an event, such as the arrival time at a
// visit, or the start and end time of a vehicle.
//
// Hard time window bounds, `start_time` and `end_time`, enforce the earliest
// and latest time of the event, such that `start_time <= event_time <=
// end_time`. The soft time window lower bound, `soft_start_time`, expresses a
// preference for the event to happen at or after `soft_start_time` by incurring
// a cost proportional to how long before soft_start_time the event occurs. The
// soft time window upper bound, `soft_end_time`, expresses a preference for the
// event to happen at or before `soft_end_time` by incurring a cost proportional
// to how long after `soft_end_time` the event occurs. `start_time`, `end_time`,
// `soft_start_time` and `soft_end_time` should be within the global time limits
// (see [ShipmentModel.global_start_time][google.cloud.optimization.v1.ShipmentModel.global_start_time] and
// [ShipmentModel.global_end_time][google.cloud.optimization.v1.ShipmentModel.global_end_time]) and should respect:
// ```
//
// 0 <= `start_time` <= `soft_start_time` <= `end_time` and
// 0 <= `start_time` <= `soft_end_time` <= `end_time`.
//
// ```
type TimeWindow struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The hard time window start time. If unspecified it will be set to
// `ShipmentModel.global_start_time`.
StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
// The hard time window end time. If unspecified it will be set to
// `ShipmentModel.global_end_time`.
EndTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
// The soft start time of the time window.
SoftStartTime *timestamp.Timestamp `protobuf:"bytes,3,opt,name=soft_start_time,json=softStartTime,proto3" json:"soft_start_time,omitempty"`
// The soft end time of the time window.
SoftEndTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=soft_end_time,json=softEndTime,proto3" json:"soft_end_time,omitempty"`
// A cost per hour added to other costs in the model if the event occurs
// before soft_start_time, computed as:
//
// ```
//
// max(0, soft_start_time - t.seconds)
// * cost_per_hour_before_soft_start_time / 3600,
//
// t being the time of the event.
// ```
//
// This cost must be positive, and the field can only be set if
// soft_start_time has been set.
CostPerHourBeforeSoftStartTime *float64 `protobuf:"fixed64,5,opt,name=cost_per_hour_before_soft_start_time,json=costPerHourBeforeSoftStartTime,proto3,oneof" json:"cost_per_hour_before_soft_start_time,omitempty"`
// A cost per hour added to other costs in the model if the event occurs after
// `soft_end_time`, computed as:
//
// ```
//
// max(0, t.seconds - soft_end_time.seconds)
// * cost_per_hour_after_soft_end_time / 3600,
//
// t being the time of the event.
// ```
//
// This cost must be positive, and the field can only be set if
// `soft_end_time` has been set.
CostPerHourAfterSoftEndTime *float64 `protobuf:"fixed64,6,opt,name=cost_per_hour_after_soft_end_time,json=costPerHourAfterSoftEndTime,proto3,oneof" json:"cost_per_hour_after_soft_end_time,omitempty"`
}
func (x *TimeWindow) Reset() {
*x = TimeWindow{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[9]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *TimeWindow) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*TimeWindow) ProtoMessage() {}
func (x *TimeWindow) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[9]
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 TimeWindow.ProtoReflect.Descriptor instead.
func (*TimeWindow) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{9}
}
func (x *TimeWindow) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *TimeWindow) GetEndTime() *timestamp.Timestamp {
if x != nil {
return x.EndTime
}
return nil
}
func (x *TimeWindow) GetSoftStartTime() *timestamp.Timestamp {
if x != nil {
return x.SoftStartTime
}
return nil
}
func (x *TimeWindow) GetSoftEndTime() *timestamp.Timestamp {
if x != nil {
return x.SoftEndTime
}
return nil
}
func (x *TimeWindow) GetCostPerHourBeforeSoftStartTime() float64 {
if x != nil && x.CostPerHourBeforeSoftStartTime != nil {
return *x.CostPerHourBeforeSoftStartTime
}
return 0
}
func (x *TimeWindow) GetCostPerHourAfterSoftEndTime() float64 {
if x != nil && x.CostPerHourAfterSoftEndTime != nil {
return *x.CostPerHourAfterSoftEndTime
}
return 0
}
// Deprecated: Use [Shipment.Load][], [Vehicle.LoadLimit][] and [ShipmentRoute.VehicleLoad][] instead.
//
// Deprecated: Do not use.
type CapacityQuantity struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
Value int64 `protobuf:"varint,2,opt,name=value,proto3" json:"value,omitempty"`
}
func (x *CapacityQuantity) Reset() {
*x = CapacityQuantity{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[10]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CapacityQuantity) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CapacityQuantity) ProtoMessage() {}
func (x *CapacityQuantity) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[10]
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 CapacityQuantity.ProtoReflect.Descriptor instead.
func (*CapacityQuantity) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{10}
}
func (x *CapacityQuantity) GetType() string {
if x != nil {
return x.Type
}
return ""
}
func (x *CapacityQuantity) GetValue() int64 {
if x != nil {
return x.Value
}
return 0
}
// Deprecated: Use [Vehicle.LoadLimit.Interval][] instead.
//
// Deprecated: Do not use.
type CapacityQuantityInterval struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
MinValue *int64 `protobuf:"varint,2,opt,name=min_value,json=minValue,proto3,oneof" json:"min_value,omitempty"`
MaxValue *int64 `protobuf:"varint,3,opt,name=max_value,json=maxValue,proto3,oneof" json:"max_value,omitempty"`
}
func (x *CapacityQuantityInterval) Reset() {
*x = CapacityQuantityInterval{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[11]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *CapacityQuantityInterval) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*CapacityQuantityInterval) ProtoMessage() {}
func (x *CapacityQuantityInterval) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[11]
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 CapacityQuantityInterval.ProtoReflect.Descriptor instead.
func (*CapacityQuantityInterval) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{11}
}
func (x *CapacityQuantityInterval) GetType() string {
if x != nil {
return x.Type
}
return ""
}
func (x *CapacityQuantityInterval) GetMinValue() int64 {
if x != nil && x.MinValue != nil {
return *x.MinValue
}
return 0
}
func (x *CapacityQuantityInterval) GetMaxValue() int64 {
if x != nil && x.MaxValue != nil {
return *x.MaxValue
}
return 0
}
// A limit defining a maximum distance which can be traveled. It can be either
// hard or soft.
//
// If a soft limit is defined, both `soft_max_meters` and
// `cost_per_kilometer_above_soft_max` must be defined and be nonnegative.
type DistanceLimit struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// A hard limit constraining the distance to be at most max_meters. The limit
// must be nonnegative.
MaxMeters *int64 `protobuf:"varint,1,opt,name=max_meters,json=maxMeters,proto3,oneof" json:"max_meters,omitempty"`
// A soft limit not enforcing a maximum distance limit, but when violated
// results in a cost which adds up to other costs defined in the model,
// with the same unit.
//
// If defined soft_max_meters must be less than max_meters and must be
// nonnegative.
SoftMaxMeters *int64 `protobuf:"varint,2,opt,name=soft_max_meters,json=softMaxMeters,proto3,oneof" json:"soft_max_meters,omitempty"`
// Cost per kilometer incurred if `soft_max_meters` limit is violated. The
// additional cost is 0 if the distance is under the limit, otherwise the
// formula used to compute the cost is the following:
// ```
//
// (distance_meters - soft_max_meters) / 1000.0 *
// cost_per_kilometer_above_soft_max.
//
// ```
// The cost must be nonnegative.
CostPerKilometerAboveSoftMax *float64 `protobuf:"fixed64,3,opt,name=cost_per_kilometer_above_soft_max,json=costPerKilometerAboveSoftMax,proto3,oneof" json:"cost_per_kilometer_above_soft_max,omitempty"`
}
func (x *DistanceLimit) Reset() {
*x = DistanceLimit{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[12]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *DistanceLimit) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*DistanceLimit) ProtoMessage() {}
func (x *DistanceLimit) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 DistanceLimit.ProtoReflect.Descriptor instead.
func (*DistanceLimit) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{12}
}
func (x *DistanceLimit) GetMaxMeters() int64 {
if x != nil && x.MaxMeters != nil {
return *x.MaxMeters
}
return 0
}
func (x *DistanceLimit) GetSoftMaxMeters() int64 {
if x != nil && x.SoftMaxMeters != nil {
return *x.SoftMaxMeters
}
return 0
}
func (x *DistanceLimit) GetCostPerKilometerAboveSoftMax() float64 {
if x != nil && x.CostPerKilometerAboveSoftMax != nil {
return *x.CostPerKilometerAboveSoftMax
}
return 0
}
// Specifies attributes of transitions between two consecutive visits on a
// route. Several `TransitionAttributes` may apply to the same transition: in
// that case, all extra costs add up and the strictest constraint or limit
// applies (following natural "AND" semantics).
type TransitionAttributes struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Tags defining the set of (src->dst) transitions these attributes apply to.
//
// A source visit or vehicle start matches iff its
// [VisitRequest.tags][google.cloud.optimization.v1.Shipment.VisitRequest.tags]
// or [Vehicle.start_tags][google.cloud.optimization.v1.Vehicle.start_tags]
// either contains `src_tag` or does not contain `excluded_src_tag` (depending
// on which of these two fields is non-empty).
SrcTag string `protobuf:"bytes,1,opt,name=src_tag,json=srcTag,proto3" json:"src_tag,omitempty"`
// See `src_tag`. Exactly one of `src_tag` and `excluded_src_tag` must be
// non-empty.
ExcludedSrcTag string `protobuf:"bytes,2,opt,name=excluded_src_tag,json=excludedSrcTag,proto3" json:"excluded_src_tag,omitempty"`
// A destination visit or vehicle end matches iff its
// [VisitRequest.tags][google.cloud.optimization.v1.Shipment.VisitRequest.tags]
// or [Vehicle.end_tags][google.cloud.optimization.v1.Vehicle.end_tags] either contains `dst_tag` or does not contain
// `excluded_dst_tag` (depending on which of these two fields is non-empty).
DstTag string `protobuf:"bytes,3,opt,name=dst_tag,json=dstTag,proto3" json:"dst_tag,omitempty"`
// See `dst_tag`. Exactly one of `dst_tag` and `excluded_dst_tag` must be
// non-empty.
ExcludedDstTag string `protobuf:"bytes,4,opt,name=excluded_dst_tag,json=excludedDstTag,proto3" json:"excluded_dst_tag,omitempty"`
// Specifies a cost for performing this transition. This is in the same unit
// as all other costs in the model and must not be negative. It is applied on
// top of all other existing costs.
Cost float64 `protobuf:"fixed64,5,opt,name=cost,proto3" json:"cost,omitempty"`
// Specifies a cost per kilometer applied to the distance traveled while
// performing this transition. It adds up to any
// [Vehicle.cost_per_kilometer][google.cloud.optimization.v1.Vehicle.cost_per_kilometer] specified on vehicles.
CostPerKilometer float64 `protobuf:"fixed64,6,opt,name=cost_per_kilometer,json=costPerKilometer,proto3" json:"cost_per_kilometer,omitempty"`
// Specifies a limit on the distance traveled while performing this
// transition.
//
// As of 2021/06, only soft limits are supported.
DistanceLimit *DistanceLimit `protobuf:"bytes,7,opt,name=distance_limit,json=distanceLimit,proto3" json:"distance_limit,omitempty"`
// Specifies a delay incurred when performing this transition.
//
// This delay always occurs *after* finishing the source visit and *before*
// starting the destination visit.
Delay *duration.Duration `protobuf:"bytes,8,opt,name=delay,proto3" json:"delay,omitempty"`
}
func (x *TransitionAttributes) Reset() {
*x = TransitionAttributes{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[13]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *TransitionAttributes) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*TransitionAttributes) ProtoMessage() {}
func (x *TransitionAttributes) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 TransitionAttributes.ProtoReflect.Descriptor instead.
func (*TransitionAttributes) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{13}
}
func (x *TransitionAttributes) GetSrcTag() string {
if x != nil {
return x.SrcTag
}
return ""
}
func (x *TransitionAttributes) GetExcludedSrcTag() string {
if x != nil {
return x.ExcludedSrcTag
}
return ""
}
func (x *TransitionAttributes) GetDstTag() string {
if x != nil {
return x.DstTag
}
return ""
}
func (x *TransitionAttributes) GetExcludedDstTag() string {
if x != nil {
return x.ExcludedDstTag
}
return ""
}
func (x *TransitionAttributes) GetCost() float64 {
if x != nil {
return x.Cost
}
return 0
}
func (x *TransitionAttributes) GetCostPerKilometer() float64 {
if x != nil {
return x.CostPerKilometer
}
return 0
}
func (x *TransitionAttributes) GetDistanceLimit() *DistanceLimit {
if x != nil {
return x.DistanceLimit
}
return nil
}
func (x *TransitionAttributes) GetDelay() *duration.Duration {
if x != nil {
return x.Delay
}
return nil
}
// Encapsulates a waypoint. Waypoints mark arrival and departure locations of
// VisitRequests, and start and end locations of Vehicles.
type Waypoint struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Different ways to represent a location.
//
// Types that are assignable to LocationType:
//
// *Waypoint_Location
// *Waypoint_PlaceId
LocationType isWaypoint_LocationType `protobuf_oneof:"location_type"`
// Indicates that the location of this waypoint is meant to have a preference
// for the vehicle to stop at a particular side of road. When you set this
// value, the route will pass through the location so that the vehicle can
// stop at the side of road that the location is biased towards from the
// center of the road. This option works only for the 'DRIVING' travel mode,
// and when the 'location_type' is set to 'location'.
SideOfRoad bool `protobuf:"varint,3,opt,name=side_of_road,json=sideOfRoad,proto3" json:"side_of_road,omitempty"`
}
func (x *Waypoint) Reset() {
*x = Waypoint{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[14]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Waypoint) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Waypoint) ProtoMessage() {}
func (x *Waypoint) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[14]
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 Waypoint.ProtoReflect.Descriptor instead.
func (*Waypoint) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{14}
}
func (m *Waypoint) GetLocationType() isWaypoint_LocationType {
if m != nil {
return m.LocationType
}
return nil
}
func (x *Waypoint) GetLocation() *Location {
if x, ok := x.GetLocationType().(*Waypoint_Location); ok {
return x.Location
}
return nil
}
func (x *Waypoint) GetPlaceId() string {
if x, ok := x.GetLocationType().(*Waypoint_PlaceId); ok {
return x.PlaceId
}
return ""
}
func (x *Waypoint) GetSideOfRoad() bool {
if x != nil {
return x.SideOfRoad
}
return false
}
type isWaypoint_LocationType interface {
isWaypoint_LocationType()
}
type Waypoint_Location struct {
// A point specified using geographic coordinates, including an optional
// heading.
Location *Location `protobuf:"bytes,1,opt,name=location,proto3,oneof"`
}
type Waypoint_PlaceId struct {
// The POI Place ID associated with the waypoint.
PlaceId string `protobuf:"bytes,2,opt,name=place_id,json=placeId,proto3,oneof"`
}
func (*Waypoint_Location) isWaypoint_LocationType() {}
func (*Waypoint_PlaceId) isWaypoint_LocationType() {}
// Encapsulates a location (a geographic point, and an optional heading).
type Location struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The waypoint's geographic coordinates.
LatLng *latlng.LatLng `protobuf:"bytes,1,opt,name=lat_lng,json=latLng,proto3" json:"lat_lng,omitempty"`
// The compass heading associated with the direction of the flow of traffic.
// This value is used to specify the side of the road to use for pickup and
// drop-off. Heading values can be from 0 to 360, where 0 specifies a heading
// of due North, 90 specifies a heading of due East, etc.
Heading *int32 `protobuf:"varint,2,opt,name=heading,proto3,oneof" json:"heading,omitempty"`
}
func (x *Location) Reset() {
*x = Location{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[15]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Location) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Location) ProtoMessage() {}
func (x *Location) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[15]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use Location.ProtoReflect.Descriptor instead.
func (*Location) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{15}
}
func (x *Location) GetLatLng() *latlng.LatLng {
if x != nil {
return x.LatLng
}
return nil
}
func (x *Location) GetHeading() int32 {
if x != nil && x.Heading != nil {
return *x.Heading
}
return 0
}
// Rules to generate time breaks for a vehicle (e.g. lunch breaks). A break
// is a contiguous period of time during which the vehicle remains idle at its
// current position and cannot perform any visit. A break may occur:
//
// - during the travel between two visits (which includes the time right
// before or right after a visit, but not in the middle of a visit), in
// which case it extends the corresponding transit time between the visits,
// - or before the vehicle start (the vehicle may not start in the middle of
// a break), in which case it does not affect the vehicle start time.
// - or after the vehicle end (ditto, with the vehicle end time).
type BreakRule struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Sequence of breaks. See the `BreakRequest` message.
BreakRequests []*BreakRule_BreakRequest `protobuf:"bytes,1,rep,name=break_requests,json=breakRequests,proto3" json:"break_requests,omitempty"`
// Several `FrequencyConstraint` may apply. They must all be satisfied by
// the `BreakRequest`s of this `BreakRule`. See `FrequencyConstraint`.
FrequencyConstraints []*BreakRule_FrequencyConstraint `protobuf:"bytes,2,rep,name=frequency_constraints,json=frequencyConstraints,proto3" json:"frequency_constraints,omitempty"`
}
func (x *BreakRule) Reset() {
*x = BreakRule{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[16]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BreakRule) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BreakRule) ProtoMessage() {}
func (x *BreakRule) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 BreakRule.ProtoReflect.Descriptor instead.
func (*BreakRule) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{16}
}
func (x *BreakRule) GetBreakRequests() []*BreakRule_BreakRequest {
if x != nil {
return x.BreakRequests
}
return nil
}
func (x *BreakRule) GetFrequencyConstraints() []*BreakRule_FrequencyConstraint {
if x != nil {
return x.FrequencyConstraints
}
return nil
}
// A vehicle's route can be decomposed, along the time axis, like this (we
// assume there are n visits):
// ```
//
// | | | | | T[2], | | |
// | Transition | Visit #0 | | | V[2], | | |
// | #0 | aka | T[1] | V[1] | ... | V[n-1] | T[n] |
// | aka T[0] | V[0] | | | V[n-2],| | |
// | | | | | T[n-1] | | |
// ^ ^ ^ ^ ^ ^ ^ ^
//
// vehicle V[0].start V[0].end V[1]. V[1]. V[n]. V[n]. vehicle
//
// start (arrival) (departure) start end start end end
//
// ```
// Note that we make a difference between:
//
// - "punctual events", such as the vehicle start and end and each visit's start
// and end (aka arrival and departure). They happen at a given second.
// - "time intervals", such as the visits themselves, and the transition between
// visits. Though time intervals can sometimes have zero duration, i.e. start
// and end at the same second, they often have a positive duration.
//
// Invariants:
//
// - If there are n visits, there are n+1 transitions.
// - A visit is always surrounded by a transition before it (same index) and a
// transition after it (index + 1).
// - The vehicle start is always followed by transition #0.
// - The vehicle end is always preceded by transition #n.
//
// Zooming in, here is what happens during a `Transition` and a `Visit`:
// ```
// ---+-------------------------------------+-----------------------------+-->
//
// | TRANSITION[i] | VISIT[i] |
// | | |
// | * TRAVEL: the vehicle moves from | PERFORM the visit: |
// | VISIT[i-1].departure_location to | |
// | VISIT[i].arrival_location, which | * Spend some time: |
// | takes a given travel duration | the "visit duration". |
// | and distance | |
// | | * Load or unload |
// | * BREAKS: the driver may have | some quantities from the |
// | breaks (e.g. lunch break). | vehicle: the "demand". |
// | | |
// | * WAIT: the driver/vehicle does | |
// | nothing. This can happen for | |
// | many reasons, for example when | |
// | the vehicle reaches the next | |
// | event's destination before the | |
// | start of its time window | |
// | | |
// | * DELAY: *right before* the next | |
// | arrival. E.g. the vehicle and/or | |
// | driver spends time unloading. | |
// | | |
//
// ---+-------------------------------------+-----------------------------+-->
//
// ^ ^ ^
//
// V[i-1].end V[i].start V[i].end
// ```
// Lastly, here is how the TRAVEL, BREAKS, DELAY and WAIT can be arranged
// during a transition.
//
// - They don't overlap.
// - The DELAY is unique and *must* be a contiguous period of time right
// before the next visit (or vehicle end). Thus, it suffice to know the
// delay duration to know its start and end time.
// - The BREAKS are contiguous, non-overlapping periods of time. The
// response specifies the start time and duration of each break.
// - TRAVEL and WAIT are "preemptable": they can be interrupted several times
// during this transition. Clients can assume that travel happens "as soon as
// possible" and that "wait" fills the remaining time.
//
// A (complex) example:
// ```
//
// TRANSITION[i]
//
// --++-----+-----------------------------------------------------------++-->
//
// || | | | | | | ||
// || T | B | T | | B | | D ||
// || r | r | r | W | r | W | e ||
// || a | e | a | a | e | a | l ||
// || v | a | v | i | a | i | a ||
// || e | k | e | t | k | t | y ||
// || l | | l | | | | ||
// || | | | | | | ||
//
// --++-----------------------------------------------------------------++-->
// ```
type ShipmentRoute struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Vehicle performing the route, identified by its index in the source
// `ShipmentModel`.
VehicleIndex int32 `protobuf:"varint,1,opt,name=vehicle_index,json=vehicleIndex,proto3" json:"vehicle_index,omitempty"`
// Label of the vehicle performing this route, equal to
// `ShipmentModel.vehicles(vehicle_index).label`, if specified.
VehicleLabel string `protobuf:"bytes,2,opt,name=vehicle_label,json=vehicleLabel,proto3" json:"vehicle_label,omitempty"`
// Time at which the vehicle starts its route.
VehicleStartTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=vehicle_start_time,json=vehicleStartTime,proto3" json:"vehicle_start_time,omitempty"`
// Time at which the vehicle finishes its route.
VehicleEndTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=vehicle_end_time,json=vehicleEndTime,proto3" json:"vehicle_end_time,omitempty"`
// Ordered sequence of visits representing a route.
// visits[i] is the i-th visit in the route.
// If this field is empty, the vehicle is considered as unused.
Visits []*ShipmentRoute_Visit `protobuf:"bytes,7,rep,name=visits,proto3" json:"visits,omitempty"`
// Ordered list of transitions for the route.
Transitions []*ShipmentRoute_Transition `protobuf:"bytes,8,rep,name=transitions,proto3" json:"transitions,omitempty"`
// When
// [OptimizeToursRequest.consider_road_traffic][google.cloud.optimization.v1.OptimizeToursRequest.consider_road_traffic],
// is set to true, this field indicates that inconsistencies in route timings
// are predicted using traffic-based travel duration estimates. There may be
// insufficient time to complete traffic-adjusted travel, delays, and breaks
// between visits, before the first visit, or after the last visit, while
// still satisfying the visit and vehicle time windows. For example,
//
// ```start_time(previous_visit) + duration(previous_visit) +
// travel_duration(previous_visit, next_visit) > start_time(next_visit)```
//
// Arrival at next_visit will likely happen later than its current
// time window due the increased estimate of travel time
// `travel_duration(previous_visit, next_visit)` due to traffic. Also, a break
// may be forced to overlap with a visit due to an increase in travel time
// estimates and visit or break time window restrictions.
HasTrafficInfeasibilities bool `protobuf:"varint,9,opt,name=has_traffic_infeasibilities,json=hasTrafficInfeasibilities,proto3" json:"has_traffic_infeasibilities,omitempty"`
// The encoded polyline representation of the route.
// This field is only populated if
// [OptimizeToursRequest.populate_polylines][google.cloud.optimization.v1.OptimizeToursRequest.populate_polylines]
// is set to true.
RoutePolyline *ShipmentRoute_EncodedPolyline `protobuf:"bytes,10,opt,name=route_polyline,json=routePolyline,proto3" json:"route_polyline,omitempty"`
// Breaks scheduled for the vehicle performing this route.
// The `breaks` sequence represents time intervals, each starting at the
// corresponding `start_time` and lasting `duration` seconds.
Breaks []*ShipmentRoute_Break `protobuf:"bytes,11,rep,name=breaks,proto3" json:"breaks,omitempty"`
// Duration, distance and load metrics for this route. The fields of
// [AggregatedMetrics][google.cloud.optimization.v1.AggregatedMetrics] are summed over all [ShipmentRoute.transitions][google.cloud.optimization.v1.ShipmentRoute.transitions] or
// [ShipmentRoute.visits][google.cloud.optimization.v1.ShipmentRoute.visits], depending on the context.
Metrics *AggregatedMetrics `protobuf:"bytes,12,opt,name=metrics,proto3" json:"metrics,omitempty"`
// Cost of the route, broken down by cost-related request fields.
// The keys are proto paths, relative to the input OptimizeToursRequest, e.g.
// "model.shipments.pickups.cost", and the values are the total cost
// generated by the corresponding cost field, aggregated over the whole route.
// In other words, costs["model.shipments.pickups.cost"] is the sum of all
// pickup costs over the route. All costs defined in the model are reported in
// detail here with the exception of costs related to TransitionAttributes
// that are only reported in an aggregated way as of 2022/01.
RouteCosts map[string]float64 `protobuf:"bytes,17,rep,name=route_costs,json=routeCosts,proto3" json:"route_costs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"`
// Total cost of the route. The sum of all costs in the cost map.
RouteTotalCost float64 `protobuf:"fixed64,18,opt,name=route_total_cost,json=routeTotalCost,proto3" json:"route_total_cost,omitempty"`
// Deprecated: Use [ShipmentRoute.Transition.loads][] instead.
// Vehicle loads upon arrival at its end location, for each
// type specified in [Vehicle.capacities][google.cloud.optimization.v1.Vehicle.capacities],
// `start_load_intervals`, `end_load_intervals` or demands. Exception: we omit
// loads for quantity types unconstrained by intervals and that don't have any
// non-zero demand on the route.
//
// Deprecated: Do not use.
EndLoads []*CapacityQuantity `protobuf:"bytes,13,rep,name=end_loads,json=endLoads,proto3" json:"end_loads,omitempty"`
// Deprecated: Use [ShipmentRoute.Transition][] instead.
// Ordered list of travel steps for the route.
//
// Deprecated: Do not use.
TravelSteps []*ShipmentRoute_TravelStep `protobuf:"bytes,14,rep,name=travel_steps,json=travelSteps,proto3" json:"travel_steps,omitempty"`
// Deprecated: No longer used.
// This field will only be populated at the
// [ShipmentRoute.Visit][google.cloud.optimization.v1.ShipmentRoute.Visit] level.
// Extra detour time due to the shipments visited on the route.
//
// It is equal to `vehicle_end_time` - `vehicle_start_time` - travel duration
// from the vehicle's start_location to its `end_location`.
//
// Deprecated: Do not use.
VehicleDetour *duration.Duration `protobuf:"bytes,15,opt,name=vehicle_detour,json=vehicleDetour,proto3" json:"vehicle_detour,omitempty"`
// Deprecated: Use [ShipmentRoute.Transition.delay_duration][] instead.
// Delay occurring before the vehicle end. See
// [TransitionAttributes.delay][google.cloud.optimization.v1.TransitionAttributes.delay].
//
// Deprecated: Do not use.
DelayBeforeVehicleEnd *ShipmentRoute_Delay `protobuf:"bytes,16,opt,name=delay_before_vehicle_end,json=delayBeforeVehicleEnd,proto3" json:"delay_before_vehicle_end,omitempty"`
}
func (x *ShipmentRoute) Reset() {
*x = ShipmentRoute{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[17]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute) ProtoMessage() {}
func (x *ShipmentRoute) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 ShipmentRoute.ProtoReflect.Descriptor instead.
func (*ShipmentRoute) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17}
}
func (x *ShipmentRoute) GetVehicleIndex() int32 {
if x != nil {
return x.VehicleIndex
}
return 0
}
func (x *ShipmentRoute) GetVehicleLabel() string {
if x != nil {
return x.VehicleLabel
}
return ""
}
func (x *ShipmentRoute) GetVehicleStartTime() *timestamp.Timestamp {
if x != nil {
return x.VehicleStartTime
}
return nil
}
func (x *ShipmentRoute) GetVehicleEndTime() *timestamp.Timestamp {
if x != nil {
return x.VehicleEndTime
}
return nil
}
func (x *ShipmentRoute) GetVisits() []*ShipmentRoute_Visit {
if x != nil {
return x.Visits
}
return nil
}
func (x *ShipmentRoute) GetTransitions() []*ShipmentRoute_Transition {
if x != nil {
return x.Transitions
}
return nil
}
func (x *ShipmentRoute) GetHasTrafficInfeasibilities() bool {
if x != nil {
return x.HasTrafficInfeasibilities
}
return false
}
func (x *ShipmentRoute) GetRoutePolyline() *ShipmentRoute_EncodedPolyline {
if x != nil {
return x.RoutePolyline
}
return nil
}
func (x *ShipmentRoute) GetBreaks() []*ShipmentRoute_Break {
if x != nil {
return x.Breaks
}
return nil
}
func (x *ShipmentRoute) GetMetrics() *AggregatedMetrics {
if x != nil {
return x.Metrics
}
return nil
}
func (x *ShipmentRoute) GetRouteCosts() map[string]float64 {
if x != nil {
return x.RouteCosts
}
return nil
}
func (x *ShipmentRoute) GetRouteTotalCost() float64 {
if x != nil {
return x.RouteTotalCost
}
return 0
}
// Deprecated: Do not use.
func (x *ShipmentRoute) GetEndLoads() []*CapacityQuantity {
if x != nil {
return x.EndLoads
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute) GetTravelSteps() []*ShipmentRoute_TravelStep {
if x != nil {
return x.TravelSteps
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute) GetVehicleDetour() *duration.Duration {
if x != nil {
return x.VehicleDetour
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute) GetDelayBeforeVehicleEnd() *ShipmentRoute_Delay {
if x != nil {
return x.DelayBeforeVehicleEnd
}
return nil
}
// Specifies details of unperformed shipments in a solution. For trivial cases
// and/or if we are able to identify the cause for skipping, we report the
// reason here.
type SkippedShipment struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The index corresponds to the index of the shipment in the source
// `ShipmentModel`.
Index int32 `protobuf:"varint,1,opt,name=index,proto3" json:"index,omitempty"`
// Copy of the corresponding [Shipment.label][google.cloud.optimization.v1.Shipment.label], if specified in the
// `Shipment`.
Label string `protobuf:"bytes,2,opt,name=label,proto3" json:"label,omitempty"`
// A list of reasons that explain why the shipment was skipped. See comment
// above `Reason`.
Reasons []*SkippedShipment_Reason `protobuf:"bytes,3,rep,name=reasons,proto3" json:"reasons,omitempty"`
}
func (x *SkippedShipment) Reset() {
*x = SkippedShipment{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[18]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *SkippedShipment) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SkippedShipment) ProtoMessage() {}
func (x *SkippedShipment) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 SkippedShipment.ProtoReflect.Descriptor instead.
func (*SkippedShipment) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{18}
}
func (x *SkippedShipment) GetIndex() int32 {
if x != nil {
return x.Index
}
return 0
}
func (x *SkippedShipment) GetLabel() string {
if x != nil {
return x.Label
}
return ""
}
func (x *SkippedShipment) GetReasons() []*SkippedShipment_Reason {
if x != nil {
return x.Reasons
}
return nil
}
// Aggregated metrics for [ShipmentRoute][google.cloud.optimization.v1.ShipmentRoute] (resp. for [OptimizeToursResponse][google.cloud.optimization.v1.OptimizeToursResponse]
// over all [Transition][google.cloud.optimization.v1.ShipmentRoute.Transition]
// and/or [Visit][google.cloud.optimization.v1.ShipmentRoute.Visit] (resp. over
// all [ShipmentRoute][google.cloud.optimization.v1.ShipmentRoute]) elements.
type AggregatedMetrics struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Number of shipments performed. Note that a pickup and delivery pair only
// counts once.
PerformedShipmentCount int32 `protobuf:"varint,1,opt,name=performed_shipment_count,json=performedShipmentCount,proto3" json:"performed_shipment_count,omitempty"`
// Total travel duration for a route or a solution.
TravelDuration *duration.Duration `protobuf:"bytes,2,opt,name=travel_duration,json=travelDuration,proto3" json:"travel_duration,omitempty"`
// Total wait duration for a route or a solution.
WaitDuration *duration.Duration `protobuf:"bytes,3,opt,name=wait_duration,json=waitDuration,proto3" json:"wait_duration,omitempty"`
// Total delay duration for a route or a solution.
DelayDuration *duration.Duration `protobuf:"bytes,4,opt,name=delay_duration,json=delayDuration,proto3" json:"delay_duration,omitempty"`
// Total break duration for a route or a solution.
BreakDuration *duration.Duration `protobuf:"bytes,5,opt,name=break_duration,json=breakDuration,proto3" json:"break_duration,omitempty"`
// Total visit duration for a route or a solution.
VisitDuration *duration.Duration `protobuf:"bytes,6,opt,name=visit_duration,json=visitDuration,proto3" json:"visit_duration,omitempty"`
// The total duration should be equal to the sum of all durations above.
// For routes, it also corresponds to [ShipmentRoute.vehicle_end_time][google.cloud.optimization.v1.ShipmentRoute.vehicle_end_time] -
// [ShipmentRoute.vehicle_start_time][google.cloud.optimization.v1.ShipmentRoute.vehicle_start_time].
TotalDuration *duration.Duration `protobuf:"bytes,7,opt,name=total_duration,json=totalDuration,proto3" json:"total_duration,omitempty"`
// Total travel distance for a route or a solution.
TravelDistanceMeters float64 `protobuf:"fixed64,8,opt,name=travel_distance_meters,json=travelDistanceMeters,proto3" json:"travel_distance_meters,omitempty"`
// Maximum load achieved over the entire route (resp. solution), for each of
// the quantities on this route (resp. solution), computed as the maximum over
// all
// [Transition.vehicle_loads][google.cloud.optimization.v1.ShipmentRoute.Transition.vehicle_loads]
// (resp.
// [ShipmentRoute.metrics.max_loads][google.cloud.optimization.v1.AggregatedMetrics.max_loads].
MaxLoads map[string]*ShipmentRoute_VehicleLoad `protobuf:"bytes,9,rep,name=max_loads,json=maxLoads,proto3" json:"max_loads,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Deprecated: Use [ShipmentRoute.route_costs][] and [OptimizeToursResponse.Metrics.costs][] instead.
//
// Deprecated: Do not use.
Costs map[string]float64 `protobuf:"bytes,10,rep,name=costs,proto3" json:"costs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"`
// Deprecated: Use [ShipmentRoute.route_total_cost][] and [OptimizeToursResponse.Metrics.total_cost][] instead.
//
// Deprecated: Do not use.
TotalCost float64 `protobuf:"fixed64,11,opt,name=total_cost,json=totalCost,proto3" json:"total_cost,omitempty"`
}
func (x *AggregatedMetrics) Reset() {
*x = AggregatedMetrics{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[19]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *AggregatedMetrics) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*AggregatedMetrics) ProtoMessage() {}
func (x *AggregatedMetrics) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[19]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use AggregatedMetrics.ProtoReflect.Descriptor instead.
func (*AggregatedMetrics) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{19}
}
func (x *AggregatedMetrics) GetPerformedShipmentCount() int32 {
if x != nil {
return x.PerformedShipmentCount
}
return 0
}
func (x *AggregatedMetrics) GetTravelDuration() *duration.Duration {
if x != nil {
return x.TravelDuration
}
return nil
}
func (x *AggregatedMetrics) GetWaitDuration() *duration.Duration {
if x != nil {
return x.WaitDuration
}
return nil
}
func (x *AggregatedMetrics) GetDelayDuration() *duration.Duration {
if x != nil {
return x.DelayDuration
}
return nil
}
func (x *AggregatedMetrics) GetBreakDuration() *duration.Duration {
if x != nil {
return x.BreakDuration
}
return nil
}
func (x *AggregatedMetrics) GetVisitDuration() *duration.Duration {
if x != nil {
return x.VisitDuration
}
return nil
}
func (x *AggregatedMetrics) GetTotalDuration() *duration.Duration {
if x != nil {
return x.TotalDuration
}
return nil
}
func (x *AggregatedMetrics) GetTravelDistanceMeters() float64 {
if x != nil {
return x.TravelDistanceMeters
}
return 0
}
func (x *AggregatedMetrics) GetMaxLoads() map[string]*ShipmentRoute_VehicleLoad {
if x != nil {
return x.MaxLoads
}
return nil
}
// Deprecated: Do not use.
func (x *AggregatedMetrics) GetCosts() map[string]float64 {
if x != nil {
return x.Costs
}
return nil
}
// Deprecated: Do not use.
func (x *AggregatedMetrics) GetTotalCost() float64 {
if x != nil {
return x.TotalCost
}
return 0
}
// Solution injected in the request including information about which visits
// must be constrained and how they must be constrained.
type InjectedSolutionConstraint struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Routes of the solution to inject. Some routes may be omitted from the
// original solution. The routes and skipped shipments must satisfy the basic
// validity assumptions listed for `injected_first_solution_routes`.
Routes []*ShipmentRoute `protobuf:"bytes,1,rep,name=routes,proto3" json:"routes,omitempty"`
// Skipped shipments of the solution to inject. Some may be omitted from the
// original solution. See the `routes` field.
SkippedShipments []*SkippedShipment `protobuf:"bytes,2,rep,name=skipped_shipments,json=skippedShipments,proto3" json:"skipped_shipments,omitempty"`
// For zero or more groups of vehicles, specifies when and how much to relax
// constraints. If this field is empty, all non-empty vehicle routes are
// fully constrained.
ConstraintRelaxations []*InjectedSolutionConstraint_ConstraintRelaxation `protobuf:"bytes,3,rep,name=constraint_relaxations,json=constraintRelaxations,proto3" json:"constraint_relaxations,omitempty"`
}
func (x *InjectedSolutionConstraint) Reset() {
*x = InjectedSolutionConstraint{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[20]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *InjectedSolutionConstraint) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*InjectedSolutionConstraint) ProtoMessage() {}
func (x *InjectedSolutionConstraint) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_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 InjectedSolutionConstraint.ProtoReflect.Descriptor instead.
func (*InjectedSolutionConstraint) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{20}
}
func (x *InjectedSolutionConstraint) GetRoutes() []*ShipmentRoute {
if x != nil {
return x.Routes
}
return nil
}
func (x *InjectedSolutionConstraint) GetSkippedShipments() []*SkippedShipment {
if x != nil {
return x.SkippedShipments
}
return nil
}
func (x *InjectedSolutionConstraint) GetConstraintRelaxations() []*InjectedSolutionConstraint_ConstraintRelaxation {
if x != nil {
return x.ConstraintRelaxations
}
return nil
}
// Describes an error encountered when validating an `OptimizeToursRequest`.
type OptimizeToursValidationError struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// A validation error is defined by the pair (`code`, `display_name`) which
// are always present.
//
// Other fields (below) provide more context about the error.
//
// *MULTIPLE ERRORS*:
// When there are multiple errors, the validation process tries to output
// several of them. Much like a compiler, this is an imperfect process. Some
// validation errors will be "fatal", meaning that they stop the entire
// validation process. This is the case for `display_name="UNSPECIFIED"`
// errors, among others. Some may cause the validation process to skip other
// errors.
//
// *STABILITY*:
// `code` and `display_name` should be very stable. But new codes and
// display names may appear over time, which may cause a given (invalid)
// request to yield a different (`code`, `display_name`) pair because the new
// error hid the old one (see "MULTIPLE ERRORS").
//
// *REFERENCE*: A list of all (code, name) pairs:
//
// * UNSPECIFIED = 0;
// * VALIDATION_TIMEOUT_ERROR = 10; Validation couldn't be completed within
// the deadline.
//
// * REQUEST_OPTIONS_ERROR = 12;
// - REQUEST_OPTIONS_INVALID_SOLVING_MODE = 1201;
// - REQUEST_OPTIONS_INVALID_MAX_VALIDATION_ERRORS = 1203;
// - REQUEST_OPTIONS_INVALID_GEODESIC_METERS_PER_SECOND = 1204;
// - REQUEST_OPTIONS_GEODESIC_METERS_PER_SECOND_TOO_SMALL = 1205;
// - REQUEST_OPTIONS_MISSING_GEODESIC_METERS_PER_SECOND = 1206;
// - REQUEST_OPTIONS_POPULATE_PATHFINDER_TRIPS_AND_GEODESIC_DISTANCE
// = 1207;
// - REQUEST_OPTIONS_COST_MODEL_OPTIONS_AND_GEODESIC_DISTANCE = 1208;
// - REQUEST_OPTIONS_TRAVEL_MODE_INCOMPATIBLE_WITH_TRAFFIC = 1211;
// - REQUEST_OPTIONS_MULTIPLE_TRAFFIC_FLAVORS = 1212;
// - REQUEST_OPTIONS_INVALID_TRAFFIC_FLAVOR = 1213;
// - REQUEST_OPTIONS_TRAFFIC_ENABLED_WITHOUT_GLOBAL_START_TIME = 1214;
// - REQUEST_OPTIONS_TRAFFIC_ENABLED_WITH_PRECEDENCES = 1215;
// - REQUEST_OPTIONS_TRAFFIC_PREFILL_MODE_INVALID = 1216;
// - REQUEST_OPTIONS_TRAFFIC_PREFILL_ENABLED_WITHOUT_TRAFFIC = 1217;
//
// * INJECTED_SOLUTION_ERROR = 20;
// - INJECTED_SOLUTION_MISSING_LABEL = 2000;
// - INJECTED_SOLUTION_DUPLICATE_LABEL = 2001;
// - INJECTED_SOLUTION_AMBIGUOUS_INDEX = 2002;
//
// * SHIPMENT_MODEL_ERROR = 22;
// - SHIPMENT_MODEL_TOO_LARGE = 2200;
// - SHIPMENT_MODEL_TOO_MANY_CAPACITY_TYPES = 2201;
// - SHIPMENT_MODEL_GLOBAL_START_TIME_NEGATIVE_OR_NAN = 2202;
// - SHIPMENT_MODEL_GLOBAL_END_TIME_TOO_LARGE_OR_NAN = 2203;
// - SHIPMENT_MODEL_GLOBAL_START_TIME_AFTER_GLOBAL_END_TIME = 2204;
// - SHIPMENT_MODEL_GLOBAL_DURATION_TOO_LONG = 2205;
//
// * INDEX_ERROR = 24;
// * TAG_ERROR = 26;
// * TIME_WINDOW_ERROR = 28;
// - TIME_WINDOW_INVALID_START_TIME = 2800;
// - TIME_WINDOW_INVALID_END_TIME = 2801;
// - TIME_WINDOW_INVALID_SOFT_START_TIME = 2802;
// - TIME_WINDOW_INVALID_SOFT_END_TIME = 2803;
// - TIME_WINDOW_OUTSIDE_GLOBAL_TIME_WINDOW = 2804;
// - TIME_WINDOW_START_TIME_AFTER_END_TIME = 2805;
// - TIME_WINDOW_INVALID_COST_PER_HOUR_BEFORE_SOFT_START_TIME = 2806;
// - TIME_WINDOW_INVALID_COST_PER_HOUR_AFTER_SOFT_END_TIME = 2807;
// - TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_WITHOUT_SOFT_START_TIME
// = 2808;
// - TIME_WINDOW_COST_AFTER_SOFT_END_TIME_WITHOUT_SOFT_END_TIME = 2809;
// - TIME_WINDOW_SOFT_START_TIME_WITHOUT_COST_BEFORE_SOFT_START_TIME
// = 2810;
// - TIME_WINDOW_SOFT_END_TIME_WITHOUT_COST_AFTER_SOFT_END_TIME = 2811;
// - TIME_WINDOW_OVERLAPPING_ADJACENT_OR_EARLIER_THAN_PREVIOUS = 2812;
// - TIME_WINDOW_START_TIME_AFTER_SOFT_START_TIME = 2813;
// - TIME_WINDOW_SOFT_START_TIME_AFTER_END_TIME = 2814;
// - TIME_WINDOW_START_TIME_AFTER_SOFT_END_TIME = 2815;
// - TIME_WINDOW_SOFT_END_TIME_AFTER_END_TIME = 2816;
// - TIME_WINDOW_COST_BEFORE_SOFT_START_TIME_SET_AND_MULTIPLE_WINDOWS
// = 2817;
// - TIME_WINDOW_COST_AFTER_SOFT_END_TIME_SET_AND_MULTIPLE_WINDOWS = 2818;
// - TRANSITION_ATTRIBUTES_ERROR = 30;
// - TRANSITION_ATTRIBUTES_INVALID_COST = 3000;
// - TRANSITION_ATTRIBUTES_INVALID_COST_PER_KILOMETER = 3001;
// - TRANSITION_ATTRIBUTES_DUPLICATE_TAG_PAIR = 3002;
// - TRANSITION_ATTRIBUTES_DISTANCE_LIMIT_MAX_METERS_UNSUPPORTED = 3003;
// - TRANSITION_ATTRIBUTES_UNSPECIFIED_SOURCE_TAGS = 3004;
// - TRANSITION_ATTRIBUTES_CONFLICTING_SOURCE_TAGS_FIELDS = 3005;
// - TRANSITION_ATTRIBUTES_UNSPECIFIED_DESTINATION_TAGS = 3006;
// - TRANSITION_ATTRIBUTES_CONFLICTING_DESTINATION_TAGS_FIELDS = 3007;
// - TRANSITION_ATTRIBUTES_DELAY_DURATION_NEGATIVE_OR_NAN = 3008;
// - TRANSITION_ATTRIBUTES_DELAY_DURATION_EXCEEDS_GLOBAL_DURATION = 3009;
//
// * AMOUNT_ERROR = 31;
// - AMOUNT_NEGATIVE_VALUE = 3100;
//
// * LOAD_LIMIT_ERROR = 33;
// - LOAD_LIMIT_INVALID_COST_ABOVE_SOFT_MAX = 3303;
// - LOAD_LIMIT_SOFT_MAX_WITHOUT_COST_ABOVE_SOFT_MAX = 3304;
// - LOAD_LIMIT_COST_ABOVE_SOFT_MAX_WITHOUT_SOFT_MAX = 3305;
// - LOAD_LIMIT_NEGATIVE_SOFT_MAX = 3306;
// - LOAD_LIMIT_MIXED_DEMAND_TYPE = 3307;
// - LOAD_LIMIT_MAX_LOAD_NEGATIVE_VALUE = 3308;
// - LOAD_LIMIT_SOFT_MAX_ABOVE_MAX = 3309;
//
// * INTERVAL_ERROR = 34;
// - INTERVAL_MIN_EXCEEDS_MAX = 3401;
// - INTERVAL_NEGATIVE_MIN = 3402;
// - INTERVAL_NEGATIVE_MAX = 3403;
// - INTERVAL_MIN_EXCEEDS_CAPACITY = 3404;
// - INTERVAL_MAX_EXCEEDS_CAPACITY = 3405;
//
// * DISTANCE_LIMIT_ERROR = 36;
// - DISTANCE_LIMIT_INVALID_COST_AFTER_SOFT_MAX = 3601;
// - DISTANCE_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3602;
// - DISTANCE_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3603;
// - DISTANCE_LIMIT_NEGATIVE_MAX = 3604;
// - DISTANCE_LIMIT_NEGATIVE_SOFT_MAX = 3605;
// - DISTANCE_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3606;
//
// * DURATION_LIMIT_ERROR = 38;
// - DURATION_LIMIT_MAX_DURATION_NEGATIVE_OR_NAN = 3800;
// - DURATION_LIMIT_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3801;
// - DURATION_LIMIT_INVALID_COST_PER_HOUR_AFTER_SOFT_MAX = 3802;
// - DURATION_LIMIT_SOFT_MAX_WITHOUT_COST_AFTER_SOFT_MAX = 3803;
// - DURATION_LIMIT_COST_AFTER_SOFT_MAX_WITHOUT_SOFT_MAX = 3804;
// - DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_NEGATIVE_OR_NAN = 3805;
// - DURATION_LIMIT_INVALID_COST_AFTER_QUADRATIC_SOFT_MAX = 3806;
// - DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_COST_PER_SQUARE_HOUR
// = 3807;
// - DURATION_LIMIT_COST_PER_SQUARE_HOUR_WITHOUT_QUADRATIC_SOFT_MAX
// = 3808;
// - DURATION_LIMIT_QUADRATIC_SOFT_MAX_WITHOUT_MAX = 3809;
// - DURATION_LIMIT_SOFT_MAX_LARGER_THAN_MAX = 3810;
// - DURATION_LIMIT_QUADRATIC_SOFT_MAX_LARGER_THAN_MAX = 3811;
// - DURATION_LIMIT_DIFF_BETWEEN_MAX_AND_QUADRATIC_SOFT_MAX_TOO_LARGE
// = 3812;
// - DURATION_LIMIT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3813;
// - DURATION_LIMIT_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION = 3814;
// - DURATION_LIMIT_QUADRATIC_SOFT_MAX_DURATION_EXCEEDS_GLOBAL_DURATION
// = 3815;
//
// * SHIPMENT_ERROR = 40;
// - SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_NEGATIVE_OR_NAN = 4000;
// - SHIPMENT_PD_ABSOLUTE_DETOUR_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION
// = 4001;
// - SHIPMENT_PD_TIME_LIMIT_DURATION_NEGATIVE_OR_NAN = 4002;
// - SHIPMENT_PD_TIME_LIMIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4003;
// - SHIPMENT_EMPTY_SHIPMENT_TYPE = 4004;
// - SHIPMENT_NO_PICKUP_NO_DELIVERY = 4005;
// - SHIPMENT_INVALID_PENALTY_COST = 4006;
// - SHIPMENT_ALLOWED_VEHICLE_INDEX_OUT_OF_BOUNDS = 4007;
// - SHIPMENT_DUPLICATE_ALLOWED_VEHICLE_INDEX = 4008;
// - SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITHOUT_INDEX = 4009;
// - SHIPMENT_INCONSISTENT_COST_FOR_VEHICLE_SIZE_WITH_INDEX = 4010;
// - SHIPMENT_INVALID_COST_FOR_VEHICLE = 4011;
// - SHIPMENT_COST_FOR_VEHICLE_INDEX_OUT_OF_BOUNDS = 4012;
// - SHIPMENT_DUPLICATE_COST_FOR_VEHICLE_INDEX = 4013;
// - SHIPMENT_DETOUR_WITHOUT_PICKUP_AND_DELIVERY = 4014;
//
// * VEHICLE_ERROR = 42;
// - VEHICLE_EMPTY_REQUIRED_OPERATOR_TYPE = 4200;
// - VEHICLE_DUPLICATE_REQUIRED_OPERATOR_TYPE = 4201;
// - VEHICLE_NO_OPERATOR_WITH_REQUIRED_OPERATOR_TYPE = 4202;
// - VEHICLE_EMPTY_START_TAG = 4203;
// - VEHICLE_DUPLICATE_START_TAG = 4204;
// - VEHICLE_EMPTY_END_TAG = 4205;
// - VEHICLE_DUPLICATE_END_TAG = 4206;
// - VEHICLE_EXTRA_VISIT_DURATION_NEGATIVE_OR_NAN = 4207;
// - VEHICLE_EXTRA_VISIT_DURATION_EXCEEDS_GLOBAL_DURATION = 4208;
// - VEHICLE_EXTRA_VISIT_DURATION_EMPTY_KEY = 4209;
// - VEHICLE_FIRST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4210;
// - VEHICLE_FIRST_SHIPMENT_IGNORED = 4211;
// - VEHICLE_FIRST_SHIPMENT_NOT_BOUND = 4212;
// - VEHICLE_LAST_SHIPMENT_INDEX_OUT_OF_BOUNDS = 4213;
// - VEHICLE_LAST_SHIPMENT_IGNORED = 4214;
// - VEHICLE_LAST_SHIPMENT_NOT_BOUND = 4215;
// - VEHICLE_IGNORED_WITH_USED_IF_ROUTE_IS_EMPTY = 4216;
// - VEHICLE_INVALID_COST_PER_KILOMETER = 4217;
// - VEHICLE_INVALID_COST_PER_HOUR = 4218;
// - VEHICLE_INVALID_COST_PER_TRAVELED_HOUR = 4219;
// - VEHICLE_INVALID_FIXED_COST = 4220;
// - VEHICLE_INVALID_TRAVEL_DURATION_MULTIPLE = 4221;
// - VEHICLE_MINIMUM_DURATION_LONGER_THAN_DURATION_LIMIT = 4222;
//
// * VISIT_REQUEST_ERROR = 44;
// - VISIT_REQUEST_EMPTY_TAG = 4400;
// - VISIT_REQUEST_DUPLICATE_TAG = 4401;
// - VISIT_REQUEST_DURATION_NEGATIVE_OR_NAN = 4404;
// - VISIT_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4405;
//
// * PRECEDENCE_ERROR = 46;
// * BREAK_ERROR = 48;
// - BREAK_RULE_EMPTY = 4800;
// - BREAK_REQUEST_UNSPECIFIED_DURATION = 4801;
// - BREAK_REQUEST_UNSPECIFIED_EARLIEST_START_TIME = 4802;
// - BREAK_REQUEST_UNSPECIFIED_LATEST_START_TIME = 4803;
// - BREAK_REQUEST_DURATION_NEGATIVE_OR_NAN = 4804; = 4804;
// - BREAK_REQUEST_LATEST_START_TIME_BEFORE_EARLIEST_START_TIME = 4805;
// - BREAK_REQUEST_EARLIEST_START_TIME_BEFORE_GLOBAL_START_TIME = 4806;
// - BREAK_REQUEST_LATEST_END_TIME_AFTER_GLOBAL_END_TIME = 4807;
// - BREAK_REQUEST_NON_SCHEDULABLE = 4808;
// - BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_NEGATIVE_OR_NAN = 4809;
// - BREAK_FREQUENCY_MIN_BREAK_DURATION_NEGATIVE_OR_NAN = 4810;
// - BREAK_FREQUENCY_MIN_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION = 4811;
// - BREAK_FREQUENCY_MAX_INTER_BREAK_DURATION_EXCEEDS_GLOBAL_DURATION
// = 4812;
// - BREAK_REQUEST_DURATION_EXCEEDS_GLOBAL_DURATION = 4813;
// - BREAK_FREQUENCY_MISSING_MAX_INTER_BREAK_DURATION = 4814;
// - BREAK_FREQUENCY_MISSING_MIN_BREAK_DURATION = 4815;
//
// * SHIPMENT_TYPE_INCOMPATIBILITY_ERROR = 50;
// - SHIPMENT_TYPE_INCOMPATIBILITY_EMPTY_TYPE = 5001;
// - SHIPMENT_TYPE_INCOMPATIBILITY_LESS_THAN_TWO_TYPES = 5002;
// - SHIPMENT_TYPE_INCOMPATIBILITY_DUPLICATE_TYPE = 5003;
// - SHIPMENT_TYPE_INCOMPATIBILITY_INVALID_INCOMPATIBILITY_MODE = 5004;
// - SHIPMENT_TYPE_INCOMPATIBILITY_TOO_MANY_INCOMPATIBILITIES = 5005;
//
// * SHIPMENT_TYPE_REQUIREMENT_ERROR = 52;
// - SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE = 52001;
// - SHIPMENT_TYPE_REQUIREMENT_NO_DEPENDENT_TYPE = 52002;
// - SHIPMENT_TYPE_REQUIREMENT_INVALID_REQUIREMENT_MODE = 52003;
// - SHIPMENT_TYPE_REQUIREMENT_TOO_MANY_REQUIREMENTS = 52004;
// - SHIPMENT_TYPE_REQUIREMENT_EMPTY_REQUIRED_TYPE = 52005;
// - SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_REQUIRED_TYPE = 52006;
// - SHIPMENT_TYPE_REQUIREMENT_NO_REQUIRED_TYPE_FOUND = 52007;
// - SHIPMENT_TYPE_REQUIREMENT_EMPTY_DEPENDENT_TYPE = 52008;
// - SHIPMENT_TYPE_REQUIREMENT_DUPLICATE_DEPENDENT_TYPE = 52009;
// - SHIPMENT_TYPE_REQUIREMENT_SELF_DEPENDENT_TYPE = 52010;
// - SHIPMENT_TYPE_REQUIREMENT_GRAPH_HAS_CYCLES = 52011;
//
// * VEHICLE_OPERATOR_ERROR = 54;
// - VEHICLE_OPERATOR_EMPTY_TYPE = 5400;
// - VEHICLE_OPERATOR_MULTIPLE_START_TIME_WINDOWS = 5401;
// - VEHICLE_OPERATOR_SOFT_START_TIME_WINDOW = 5402;
// - VEHICLE_OPERATOR_MULTIPLE_END_TIME_WINDOWS = 5403;
// - VEHICLE_OPERATOR_SOFT_END_TIME_WINDOW = 5404;
//
// * DURATION_SECONDS_MATRIX_ERROR = 56;
// - DURATION_SECONDS_MATRIX_DURATION_NEGATIVE_OR_NAN = 5600;
// - DURATION_SECONDS_MATRIX_DURATION_EXCEEDS_GLOBAL_DURATION = 5601;
//
// * GRAPH_ARC_ERROR = 58;
// - GRAPH_ARC_DURATION_NEGATIVE_OR_NAN = 5800;
// - GRAPH_ARC_DURATION_EXCEEDS_GLOBAL_DURATION = 5801;
Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
// The error display name.
DisplayName string `protobuf:"bytes,2,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
// An error context may involve 0, 1 (most of the time) or more fields. For
// example, referring to vehicle #4 and shipment #2's first pickup can be
// done as follows:
// ```
// fields { name: "vehicles" index: 4}
// fields { name: "shipments" index: 2 sub_field {name: "pickups" index: 0} }
// ```
// Note, however, that the cardinality of `fields` should not change for a
// given error code.
Fields []*OptimizeToursValidationError_FieldReference `protobuf:"bytes,3,rep,name=fields,proto3" json:"fields,omitempty"`
// Human-readable string describing the error. There is a 1:1 mapping
// between `code` and `error_message` (when code != "UNSPECIFIED").
//
// *STABILITY*: Not stable: the error message associated to a given `code` may
// change (hopefully to clarify it) over time. Please rely on the
// `display_name` and `code` instead.
ErrorMessage string `protobuf:"bytes,4,opt,name=error_message,json=errorMessage,proto3" json:"error_message,omitempty"`
// May contain the value(s) of the field(s). This is not always available. You
// should absolutely not rely on it and use it only for manual model
// debugging.
OffendingValues string `protobuf:"bytes,5,opt,name=offending_values,json=offendingValues,proto3" json:"offending_values,omitempty"`
}
func (x *OptimizeToursValidationError) Reset() {
*x = OptimizeToursValidationError{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[21]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *OptimizeToursValidationError) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OptimizeToursValidationError) ProtoMessage() {}
func (x *OptimizeToursValidationError) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[21]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use OptimizeToursValidationError.ProtoReflect.Descriptor instead.
func (*OptimizeToursValidationError) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{21}
}
func (x *OptimizeToursValidationError) GetCode() int32 {
if x != nil {
return x.Code
}
return 0
}
func (x *OptimizeToursValidationError) GetDisplayName() string {
if x != nil {
return x.DisplayName
}
return ""
}
func (x *OptimizeToursValidationError) GetFields() []*OptimizeToursValidationError_FieldReference {
if x != nil {
return x.Fields
}
return nil
}
func (x *OptimizeToursValidationError) GetErrorMessage() string {
if x != nil {
return x.ErrorMessage
}
return ""
}
func (x *OptimizeToursValidationError) GetOffendingValues() string {
if x != nil {
return x.OffendingValues
}
return ""
}
// Overall metrics, aggregated over all routes.
type OptimizeToursResponse_Metrics struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Aggregated over the routes. Each metric is the sum (or max, for loads)
// over all [ShipmentRoute.metrics][google.cloud.optimization.v1.ShipmentRoute.metrics] fields of the same name.
AggregatedRouteMetrics *AggregatedMetrics `protobuf:"bytes,1,opt,name=aggregated_route_metrics,json=aggregatedRouteMetrics,proto3" json:"aggregated_route_metrics,omitempty"`
// Number of mandatory shipments skipped.
SkippedMandatoryShipmentCount int32 `protobuf:"varint,2,opt,name=skipped_mandatory_shipment_count,json=skippedMandatoryShipmentCount,proto3" json:"skipped_mandatory_shipment_count,omitempty"`
// Number of vehicles used. Note: if a vehicle route is empty and
// [Vehicle.used_if_route_is_empty][google.cloud.optimization.v1.Vehicle.used_if_route_is_empty] is true, the vehicle is considered
// used.
UsedVehicleCount int32 `protobuf:"varint,3,opt,name=used_vehicle_count,json=usedVehicleCount,proto3" json:"used_vehicle_count,omitempty"`
// The earliest start time for a used vehicle, computed as the minimum over
// all used vehicles of [ShipmentRoute.vehicle_start_time][google.cloud.optimization.v1.ShipmentRoute.vehicle_start_time].
EarliestVehicleStartTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=earliest_vehicle_start_time,json=earliestVehicleStartTime,proto3" json:"earliest_vehicle_start_time,omitempty"`
// The latest end time for a used vehicle, computed as the maximum over all
// used vehicles of [ShipmentRoute.vehicle_end_time][google.cloud.optimization.v1.ShipmentRoute.vehicle_end_time].
LatestVehicleEndTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=latest_vehicle_end_time,json=latestVehicleEndTime,proto3" json:"latest_vehicle_end_time,omitempty"`
// Cost of the solution, broken down by cost-related request fields.
// The keys are proto paths, relative to the input OptimizeToursRequest,
// e.g. "model.shipments.pickups.cost", and the values are the total cost
// generated by the corresponding cost field, aggregated over the whole
// solution. In other words, costs["model.shipments.pickups.cost"] is the
// sum of all pickup costs over the solution. All costs defined in the model
// are reported in detail here with the exception of costs related to
// TransitionAttributes that are only reported in an aggregated way as of
// 2022/01.
Costs map[string]float64 `protobuf:"bytes,10,rep,name=costs,proto3" json:"costs,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"fixed64,2,opt,name=value,proto3"`
// Total cost of the solution. The sum of all values in the costs map.
TotalCost float64 `protobuf:"fixed64,6,opt,name=total_cost,json=totalCost,proto3" json:"total_cost,omitempty"`
}
func (x *OptimizeToursResponse_Metrics) Reset() {
*x = OptimizeToursResponse_Metrics{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[22]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *OptimizeToursResponse_Metrics) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OptimizeToursResponse_Metrics) ProtoMessage() {}
func (x *OptimizeToursResponse_Metrics) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[22]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use OptimizeToursResponse_Metrics.ProtoReflect.Descriptor instead.
func (*OptimizeToursResponse_Metrics) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{1, 0}
}
func (x *OptimizeToursResponse_Metrics) GetAggregatedRouteMetrics() *AggregatedMetrics {
if x != nil {
return x.AggregatedRouteMetrics
}
return nil
}
func (x *OptimizeToursResponse_Metrics) GetSkippedMandatoryShipmentCount() int32 {
if x != nil {
return x.SkippedMandatoryShipmentCount
}
return 0
}
func (x *OptimizeToursResponse_Metrics) GetUsedVehicleCount() int32 {
if x != nil {
return x.UsedVehicleCount
}
return 0
}
func (x *OptimizeToursResponse_Metrics) GetEarliestVehicleStartTime() *timestamp.Timestamp {
if x != nil {
return x.EarliestVehicleStartTime
}
return nil
}
func (x *OptimizeToursResponse_Metrics) GetLatestVehicleEndTime() *timestamp.Timestamp {
if x != nil {
return x.LatestVehicleEndTime
}
return nil
}
func (x *OptimizeToursResponse_Metrics) GetCosts() map[string]float64 {
if x != nil {
return x.Costs
}
return nil
}
func (x *OptimizeToursResponse_Metrics) GetTotalCost() float64 {
if x != nil {
return x.TotalCost
}
return 0
}
// Information for solving one optimization model asynchronously.
type BatchOptimizeToursRequest_AsyncModelConfig struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// User defined model name, can be used as alias by users to keep track of
// models.
DisplayName string `protobuf:"bytes,1,opt,name=display_name,json=displayName,proto3" json:"display_name,omitempty"`
// Required. Information about the input model.
InputConfig *InputConfig `protobuf:"bytes,2,opt,name=input_config,json=inputConfig,proto3" json:"input_config,omitempty"`
// Required. The desired output location information.
OutputConfig *OutputConfig `protobuf:"bytes,3,opt,name=output_config,json=outputConfig,proto3" json:"output_config,omitempty"`
// If this is set, the model will be solved in the checkpoint mode. In this
// mode, the input model can have a deadline longer than 30 mins without the
// risk of interruption. The model will be solved in multiple short-running
// stages. Each stage generates an intermediate checkpoint
// and stores it in the user's Cloud Storage buckets. The checkpoint
// mode should be preferred over
// allow_large_deadline_despite_interruption_risk since it prevents the risk
// of interruption.
EnableCheckpoints bool `protobuf:"varint,4,opt,name=enable_checkpoints,json=enableCheckpoints,proto3" json:"enable_checkpoints,omitempty"`
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) Reset() {
*x = BatchOptimizeToursRequest_AsyncModelConfig{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[24]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BatchOptimizeToursRequest_AsyncModelConfig) ProtoMessage() {}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[24]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use BatchOptimizeToursRequest_AsyncModelConfig.ProtoReflect.Descriptor instead.
func (*BatchOptimizeToursRequest_AsyncModelConfig) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{2, 0}
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) GetDisplayName() string {
if x != nil {
return x.DisplayName
}
return ""
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) GetInputConfig() *InputConfig {
if x != nil {
return x.InputConfig
}
return nil
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) GetOutputConfig() *OutputConfig {
if x != nil {
return x.OutputConfig
}
return nil
}
func (x *BatchOptimizeToursRequest_AsyncModelConfig) GetEnableCheckpoints() bool {
if x != nil {
return x.EnableCheckpoints
}
return false
}
// Specifies a duration and distance matrix from visit and vehicle start
// locations to visit and vehicle end locations.
type ShipmentModel_DurationDistanceMatrix struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Specifies the rows of the duration and distance matrix. It must have as
// many elements as [ShipmentModel.duration_distance_matrix_src_tags][google.cloud.optimization.v1.ShipmentModel.duration_distance_matrix_src_tags].
Rows []*ShipmentModel_DurationDistanceMatrix_Row `protobuf:"bytes,1,rep,name=rows,proto3" json:"rows,omitempty"`
// Tag defining to which vehicles this duration and distance matrix applies.
// If empty, this applies to all vehicles, and there can only be a single
// matrix.
//
// Each vehicle start must match exactly one matrix, i.e. exactly one of
// their `start_tags` field must match the `vehicle_start_tag` of a matrix
// (and of that matrix only).
//
// All matrices must have a different `vehicle_start_tag`.
VehicleStartTag string `protobuf:"bytes,2,opt,name=vehicle_start_tag,json=vehicleStartTag,proto3" json:"vehicle_start_tag,omitempty"`
}
func (x *ShipmentModel_DurationDistanceMatrix) Reset() {
*x = ShipmentModel_DurationDistanceMatrix{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[25]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_DurationDistanceMatrix) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_DurationDistanceMatrix) ProtoMessage() {}
func (x *ShipmentModel_DurationDistanceMatrix) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[25]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ShipmentModel_DurationDistanceMatrix.ProtoReflect.Descriptor instead.
func (*ShipmentModel_DurationDistanceMatrix) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 0}
}
func (x *ShipmentModel_DurationDistanceMatrix) GetRows() []*ShipmentModel_DurationDistanceMatrix_Row {
if x != nil {
return x.Rows
}
return nil
}
func (x *ShipmentModel_DurationDistanceMatrix) GetVehicleStartTag() string {
if x != nil {
return x.VehicleStartTag
}
return ""
}
// A precedence rule between two events (each event is the pickup or the
// delivery of a shipment): the "second" event has to start at least
// `offset_duration` after "first" has started.
//
// Several precedences can refer to the same (or related) events, e.g.,
// "pickup of B happens after delivery of A" and "pickup of C happens after
// pickup of B".
//
// Furthermore, precedences only apply when both shipments are performed and
// are otherwise ignored.
type ShipmentModel_PrecedenceRule struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Shipment index of the "first" event. This field must be specified.
FirstIndex *int32 `protobuf:"varint,1,opt,name=first_index,json=firstIndex,proto3,oneof" json:"first_index,omitempty"`
// Indicates if the "first" event is a delivery.
FirstIsDelivery bool `protobuf:"varint,3,opt,name=first_is_delivery,json=firstIsDelivery,proto3" json:"first_is_delivery,omitempty"`
// Shipment index of the "second" event. This field must be specified.
SecondIndex *int32 `protobuf:"varint,2,opt,name=second_index,json=secondIndex,proto3,oneof" json:"second_index,omitempty"`
// Indicates if the "second" event is a delivery.
SecondIsDelivery bool `protobuf:"varint,4,opt,name=second_is_delivery,json=secondIsDelivery,proto3" json:"second_is_delivery,omitempty"`
// The offset between the "first" and "second" event. It can be negative.
OffsetDuration *duration.Duration `protobuf:"bytes,5,opt,name=offset_duration,json=offsetDuration,proto3" json:"offset_duration,omitempty"`
}
func (x *ShipmentModel_PrecedenceRule) Reset() {
*x = ShipmentModel_PrecedenceRule{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[26]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_PrecedenceRule) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_PrecedenceRule) ProtoMessage() {}
func (x *ShipmentModel_PrecedenceRule) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[26]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ShipmentModel_PrecedenceRule.ProtoReflect.Descriptor instead.
func (*ShipmentModel_PrecedenceRule) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 1}
}
func (x *ShipmentModel_PrecedenceRule) GetFirstIndex() int32 {
if x != nil && x.FirstIndex != nil {
return *x.FirstIndex
}
return 0
}
func (x *ShipmentModel_PrecedenceRule) GetFirstIsDelivery() bool {
if x != nil {
return x.FirstIsDelivery
}
return false
}
func (x *ShipmentModel_PrecedenceRule) GetSecondIndex() int32 {
if x != nil && x.SecondIndex != nil {
return *x.SecondIndex
}
return 0
}
func (x *ShipmentModel_PrecedenceRule) GetSecondIsDelivery() bool {
if x != nil {
return x.SecondIsDelivery
}
return false
}
func (x *ShipmentModel_PrecedenceRule) GetOffsetDuration() *duration.Duration {
if x != nil {
return x.OffsetDuration
}
return nil
}
// Deprecated: Use top level [BreakRule][] instead.
// Rules to generate time breaks for a vehicle (e.g. lunch
// breaks). A break is a contiguous period of time during which the vehicle
// remains idle at its current position and cannot perform any visit. A break
// may occur:
//
// - during the travel between two visits (which includes the time right
// before or right after a visit, but not in the middle of a visit), in
// which case it extends the corresponding transit time between the visits,
// - or before the vehicle start (the vehicle may not start in the middle of
// a break), in which case it does not affect the vehicle start time.
// - or after the vehicle end (ditto, with the vehicle end time).
//
// Deprecated: Do not use.
type ShipmentModel_BreakRule struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Sequence of breaks. See the `BreakRequest` message.
BreakRequests []*ShipmentModel_BreakRule_BreakRequest `protobuf:"bytes,1,rep,name=break_requests,json=breakRequests,proto3" json:"break_requests,omitempty"`
// Several `FrequencyConstraint` may apply. They must all be satisfied by
// the `BreakRequest`s of this `BreakRule`. See `FrequencyConstraint`.
FrequencyConstraints []*ShipmentModel_BreakRule_FrequencyConstraint `protobuf:"bytes,2,rep,name=frequency_constraints,json=frequencyConstraints,proto3" json:"frequency_constraints,omitempty"`
}
func (x *ShipmentModel_BreakRule) Reset() {
*x = ShipmentModel_BreakRule{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[27]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_BreakRule) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_BreakRule) ProtoMessage() {}
func (x *ShipmentModel_BreakRule) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[27]
if protoimpl.UnsafeEnabled && x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use ShipmentModel_BreakRule.ProtoReflect.Descriptor instead.
func (*ShipmentModel_BreakRule) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 2}
}
func (x *ShipmentModel_BreakRule) GetBreakRequests() []*ShipmentModel_BreakRule_BreakRequest {
if x != nil {
return x.BreakRequests
}
return nil
}
func (x *ShipmentModel_BreakRule) GetFrequencyConstraints() []*ShipmentModel_BreakRule_FrequencyConstraint {
if x != nil {
return x.FrequencyConstraints
}
return nil
}
// Specifies a row of the duration and distance matrix.
type ShipmentModel_DurationDistanceMatrix_Row struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Duration values for a given row. It must have as many elements as
// [ShipmentModel.duration_distance_matrix_dst_tags][google.cloud.optimization.v1.ShipmentModel.duration_distance_matrix_dst_tags].
Durations []*duration.Duration `protobuf:"bytes,1,rep,name=durations,proto3" json:"durations,omitempty"`
// Distance values for a given row. If no costs or constraints refer to
// distances in the model, this can be left empty; otherwise it must have
// as many elements as `durations`.
Meters []float64 `protobuf:"fixed64,2,rep,packed,name=meters,proto3" json:"meters,omitempty"`
}
func (x *ShipmentModel_DurationDistanceMatrix_Row) Reset() {
*x = ShipmentModel_DurationDistanceMatrix_Row{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[28]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_DurationDistanceMatrix_Row) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_DurationDistanceMatrix_Row) ProtoMessage() {}
func (x *ShipmentModel_DurationDistanceMatrix_Row) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[28]
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 ShipmentModel_DurationDistanceMatrix_Row.ProtoReflect.Descriptor instead.
func (*ShipmentModel_DurationDistanceMatrix_Row) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 0, 0}
}
func (x *ShipmentModel_DurationDistanceMatrix_Row) GetDurations() []*duration.Duration {
if x != nil {
return x.Durations
}
return nil
}
func (x *ShipmentModel_DurationDistanceMatrix_Row) GetMeters() []float64 {
if x != nil {
return x.Meters
}
return nil
}
// The sequence of breaks (i.e. their number and order) that apply to each
// vehicle must be known beforehand. The repeated `BreakRequest`s define
// that sequence, in the order in which they must occur. Their time windows
// (`earliest_start_time` / `latest_start_time`) may overlap, but they must
// be compatible with the order (this is checked).
type ShipmentModel_BreakRule_BreakRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Lower bound (inclusive) on the start of the break.
EarliestStartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=earliest_start_time,json=earliestStartTime,proto3" json:"earliest_start_time,omitempty"`
// Required. Upper bound (inclusive) on the start of the break.
LatestStartTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=latest_start_time,json=latestStartTime,proto3" json:"latest_start_time,omitempty"`
// Required. Minimum duration of the break. Must be positive.
MinDuration *duration.Duration `protobuf:"bytes,3,opt,name=min_duration,json=minDuration,proto3" json:"min_duration,omitempty"`
}
func (x *ShipmentModel_BreakRule_BreakRequest) Reset() {
*x = ShipmentModel_BreakRule_BreakRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[29]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_BreakRule_BreakRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_BreakRule_BreakRequest) ProtoMessage() {}
func (x *ShipmentModel_BreakRule_BreakRequest) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[29]
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 ShipmentModel_BreakRule_BreakRequest.ProtoReflect.Descriptor instead.
func (*ShipmentModel_BreakRule_BreakRequest) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 2, 0}
}
func (x *ShipmentModel_BreakRule_BreakRequest) GetEarliestStartTime() *timestamp.Timestamp {
if x != nil {
return x.EarliestStartTime
}
return nil
}
func (x *ShipmentModel_BreakRule_BreakRequest) GetLatestStartTime() *timestamp.Timestamp {
if x != nil {
return x.LatestStartTime
}
return nil
}
func (x *ShipmentModel_BreakRule_BreakRequest) GetMinDuration() *duration.Duration {
if x != nil {
return x.MinDuration
}
return nil
}
// One may further constrain the frequency and duration of the breaks
// specified above, by enforcing a minimum break frequency, such as
// "There must be a break of at least 1 hour every 12 hours". Assuming that
// this can be interpreted as "Within any sliding time window of 12h, there
// must be at least one break of at least one hour", that example would
// translate to the following `FrequencyConstraint`:
// ```
//
// {
// min_break_duration { seconds: 3600 } # 1 hour.
// max_inter_break_duration { seconds: 39600 } # 11 hours (12 - 1 = 11).
// }
//
// ```
//
// The timing and duration of the breaks in the solution will respect all
// such constraints, in addition to the time windows and minimum durations
// already specified in the `BreakRequest`.
//
// A `FrequencyConstraint` may in practice apply to non-consecutive breaks.
// For example, the following schedule honors the "1h every 12h" example:
// ```
//
// 04:00 vehicle start
// .. performing travel and visits ..
// 09:00 1 hour break
// 10:00 end of the break
// .. performing travel and visits ..
// 12:00 20-min lunch break
// 12:20 end of the break
// .. performing travel and visits ..
// 21:00 1 hour break
// 22:00 end of the break
// .. performing travel and visits ..
// 23:59 vehicle end
//
// ```
type ShipmentModel_BreakRule_FrequencyConstraint struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Minimum break duration for this constraint. Nonnegative.
// See description of `FrequencyConstraint`.
MinBreakDuration *duration.Duration `protobuf:"bytes,1,opt,name=min_break_duration,json=minBreakDuration,proto3" json:"min_break_duration,omitempty"`
// Required. Maximum allowed span of any interval of time in the route that does not
// include at least partially a break of `duration >=
// min_break_duration`. Must be positive.
MaxInterBreakDuration *duration.Duration `protobuf:"bytes,2,opt,name=max_inter_break_duration,json=maxInterBreakDuration,proto3" json:"max_inter_break_duration,omitempty"`
}
func (x *ShipmentModel_BreakRule_FrequencyConstraint) Reset() {
*x = ShipmentModel_BreakRule_FrequencyConstraint{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[30]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentModel_BreakRule_FrequencyConstraint) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentModel_BreakRule_FrequencyConstraint) ProtoMessage() {}
func (x *ShipmentModel_BreakRule_FrequencyConstraint) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[30]
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 ShipmentModel_BreakRule_FrequencyConstraint.ProtoReflect.Descriptor instead.
func (*ShipmentModel_BreakRule_FrequencyConstraint) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{4, 2, 1}
}
func (x *ShipmentModel_BreakRule_FrequencyConstraint) GetMinBreakDuration() *duration.Duration {
if x != nil {
return x.MinBreakDuration
}
return nil
}
func (x *ShipmentModel_BreakRule_FrequencyConstraint) GetMaxInterBreakDuration() *duration.Duration {
if x != nil {
return x.MaxInterBreakDuration
}
return nil
}
// Request for a visit which can be done by a vehicle: it has a geo-location
// (or two, see below), opening and closing times represented by time windows,
// and a service duration time (time spent by the vehicle once it has arrived
// to pickup or drop off goods).
type Shipment_VisitRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The geo-location where the vehicle arrives when performing this
// `VisitRequest`. If the shipment model has duration distance matrices,
// `arrival_location` must not be specified.
ArrivalLocation *latlng.LatLng `protobuf:"bytes,1,opt,name=arrival_location,json=arrivalLocation,proto3" json:"arrival_location,omitempty"`
// The waypoint where the vehicle arrives when performing this
// `VisitRequest`. If the shipment model has duration distance matrices,
// `arrival_waypoint` must not be specified.
ArrivalWaypoint *Waypoint `protobuf:"bytes,2,opt,name=arrival_waypoint,json=arrivalWaypoint,proto3" json:"arrival_waypoint,omitempty"`
// The geo-location where the vehicle departs after completing this
// `VisitRequest`. Can be omitted if it is the same as `arrival_location`.
// If the shipment model has duration distance matrices,
// `departure_location` must not be specified.
DepartureLocation *latlng.LatLng `protobuf:"bytes,3,opt,name=departure_location,json=departureLocation,proto3" json:"departure_location,omitempty"`
// The waypoint where the vehicle departs after completing this
// `VisitRequest`. Can be omitted if it is the same as `arrival_waypoint`.
// If the shipment model has duration distance matrices,
// `departure_waypoint` must not be specified.
DepartureWaypoint *Waypoint `protobuf:"bytes,4,opt,name=departure_waypoint,json=departureWaypoint,proto3" json:"departure_waypoint,omitempty"`
// Specifies tags attached to the visit request.
// Empty or duplicate strings are not allowed.
Tags []string `protobuf:"bytes,5,rep,name=tags,proto3" json:"tags,omitempty"`
// Time windows which constrain the arrival time at a visit.
// Note that a vehicle may depart outside of the arrival time window, i.e.
// arrival time + duration do not need to be inside a time window. This can
// result in waiting time if the vehicle arrives before
// [TimeWindow.start_time][google.cloud.optimization.v1.TimeWindow.start_time].
//
// The absence of `TimeWindow` means that the vehicle can perform this visit
// at any time.
//
// Time windows must be disjoint, i.e. no time window must overlap with or
// be adjacent to another, and they must be in increasing order.
//
// `cost_per_hour_after_soft_end_time` and `soft_end_time` can only
// be set if there is a single time window.
TimeWindows []*TimeWindow `protobuf:"bytes,6,rep,name=time_windows,json=timeWindows,proto3" json:"time_windows,omitempty"`
// Duration of the visit, i.e. time spent by the vehicle between arrival
// and departure (to be added to the possible waiting time; see
// `time_windows`).
Duration *duration.Duration `protobuf:"bytes,7,opt,name=duration,proto3" json:"duration,omitempty"`
// Cost to service this visit request on a vehicle route. This can be used
// to pay different costs for each alternative pickup or delivery of a
// shipment. This cost must be in the same unit as `Shipment.penalty_cost`
// and must not be negative.
Cost float64 `protobuf:"fixed64,8,opt,name=cost,proto3" json:"cost,omitempty"`
// Load demands of this visit request. This is just like
// [Shipment.load_demands][google.cloud.optimization.v1.Shipment.load_demands] field, except that it only applies to this
// [VisitRequest][google.cloud.optimization.v1.Shipment.VisitRequest] instead of the whole [Shipment][google.cloud.optimization.v1.Shipment].
// The demands listed here are added to the demands listed in
// [Shipment.load_demands][google.cloud.optimization.v1.Shipment.load_demands].
LoadDemands map[string]*Shipment_Load `protobuf:"bytes,12,rep,name=load_demands,json=loadDemands,proto3" json:"load_demands,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Specifies the types of the visit. This may be used to allocate additional
// time required for a vehicle to complete this visit (see
// [Vehicle.extra_visit_duration_for_visit_type][google.cloud.optimization.v1.Vehicle.extra_visit_duration_for_visit_type]).
//
// A type can only appear once.
VisitTypes []string `protobuf:"bytes,10,rep,name=visit_types,json=visitTypes,proto3" json:"visit_types,omitempty"`
// Specifies a label for this `VisitRequest`. This label is reported in the
// response as `visit_label` in the corresponding [ShipmentRoute.Visit][google.cloud.optimization.v1.ShipmentRoute.Visit].
Label string `protobuf:"bytes,11,opt,name=label,proto3" json:"label,omitempty"`
// Deprecated: Use [VisitRequest.load_demands][] instead.
//
// Deprecated: Do not use.
Demands []*CapacityQuantity `protobuf:"bytes,9,rep,name=demands,proto3" json:"demands,omitempty"`
}
func (x *Shipment_VisitRequest) Reset() {
*x = Shipment_VisitRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[31]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Shipment_VisitRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Shipment_VisitRequest) ProtoMessage() {}
func (x *Shipment_VisitRequest) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[31]
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 Shipment_VisitRequest.ProtoReflect.Descriptor instead.
func (*Shipment_VisitRequest) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{5, 0}
}
func (x *Shipment_VisitRequest) GetArrivalLocation() *latlng.LatLng {
if x != nil {
return x.ArrivalLocation
}
return nil
}
func (x *Shipment_VisitRequest) GetArrivalWaypoint() *Waypoint {
if x != nil {
return x.ArrivalWaypoint
}
return nil
}
func (x *Shipment_VisitRequest) GetDepartureLocation() *latlng.LatLng {
if x != nil {
return x.DepartureLocation
}
return nil
}
func (x *Shipment_VisitRequest) GetDepartureWaypoint() *Waypoint {
if x != nil {
return x.DepartureWaypoint
}
return nil
}
func (x *Shipment_VisitRequest) GetTags() []string {
if x != nil {
return x.Tags
}
return nil
}
func (x *Shipment_VisitRequest) GetTimeWindows() []*TimeWindow {
if x != nil {
return x.TimeWindows
}
return nil
}
func (x *Shipment_VisitRequest) GetDuration() *duration.Duration {
if x != nil {
return x.Duration
}
return nil
}
func (x *Shipment_VisitRequest) GetCost() float64 {
if x != nil {
return x.Cost
}
return 0
}
func (x *Shipment_VisitRequest) GetLoadDemands() map[string]*Shipment_Load {
if x != nil {
return x.LoadDemands
}
return nil
}
func (x *Shipment_VisitRequest) GetVisitTypes() []string {
if x != nil {
return x.VisitTypes
}
return nil
}
func (x *Shipment_VisitRequest) GetLabel() string {
if x != nil {
return x.Label
}
return ""
}
// Deprecated: Do not use.
func (x *Shipment_VisitRequest) GetDemands() []*CapacityQuantity {
if x != nil {
return x.Demands
}
return nil
}
// When performing a visit, a predefined amount may be added to the vehicle
// load if it's a pickup, or subtracted if it's a delivery. This message
// defines such amount. See [load_demands][google.cloud.optimization.v1.Shipment.load_demands].
type Shipment_Load struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The amount by which the load of the vehicle performing the corresponding
// visit will vary. Since it is an integer, users are advised to choose an
// appropriate unit to avoid loss of precision. Must be ≥ 0.
Amount int64 `protobuf:"varint,2,opt,name=amount,proto3" json:"amount,omitempty"`
}
func (x *Shipment_Load) Reset() {
*x = Shipment_Load{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[32]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Shipment_Load) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Shipment_Load) ProtoMessage() {}
func (x *Shipment_Load) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[32]
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 Shipment_Load.ProtoReflect.Descriptor instead.
func (*Shipment_Load) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{5, 1}
}
func (x *Shipment_Load) GetAmount() int64 {
if x != nil {
return x.Amount
}
return 0
}
// Defines a load limit applying to a vehicle, e.g. "this truck may only
// carry up to 3500 kg". See [load_limits][google.cloud.optimization.v1.Vehicle.load_limits].
type Vehicle_LoadLimit struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The maximum acceptable amount of load.
MaxLoad *int64 `protobuf:"varint,1,opt,name=max_load,json=maxLoad,proto3,oneof" json:"max_load,omitempty"`
// A soft limit of the load. See [cost_per_unit_above_soft_max][google.cloud.optimization.v1.Vehicle.LoadLimit.cost_per_unit_above_soft_max].
SoftMaxLoad int64 `protobuf:"varint,2,opt,name=soft_max_load,json=softMaxLoad,proto3" json:"soft_max_load,omitempty"`
// If the load ever exceeds [soft_max_load][google.cloud.optimization.v1.Vehicle.LoadLimit.soft_max_load] along this vehicle's route,
// the following cost penalty applies (only once per vehicle):
// (load - [soft_max_load][google.cloud.optimization.v1.Vehicle.LoadLimit.soft_max_load]) * [cost_per_unit_above_soft_max][google.cloud.optimization.v1.Vehicle.LoadLimit.cost_per_unit_above_soft_max]. All costs
// add up and must be in the same unit as [Shipment.penalty_cost][google.cloud.optimization.v1.Shipment.penalty_cost].
CostPerUnitAboveSoftMax float64 `protobuf:"fixed64,3,opt,name=cost_per_unit_above_soft_max,json=costPerUnitAboveSoftMax,proto3" json:"cost_per_unit_above_soft_max,omitempty"`
// The acceptable load interval of the vehicle at the start of the route.
StartLoadInterval *Vehicle_LoadLimit_Interval `protobuf:"bytes,4,opt,name=start_load_interval,json=startLoadInterval,proto3" json:"start_load_interval,omitempty"`
// The acceptable load interval of the vehicle at the end of the route.
EndLoadInterval *Vehicle_LoadLimit_Interval `protobuf:"bytes,5,opt,name=end_load_interval,json=endLoadInterval,proto3" json:"end_load_interval,omitempty"`
}
func (x *Vehicle_LoadLimit) Reset() {
*x = Vehicle_LoadLimit{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[35]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Vehicle_LoadLimit) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Vehicle_LoadLimit) ProtoMessage() {}
func (x *Vehicle_LoadLimit) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[35]
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 Vehicle_LoadLimit.ProtoReflect.Descriptor instead.
func (*Vehicle_LoadLimit) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8, 0}
}
func (x *Vehicle_LoadLimit) GetMaxLoad() int64 {
if x != nil && x.MaxLoad != nil {
return *x.MaxLoad
}
return 0
}
func (x *Vehicle_LoadLimit) GetSoftMaxLoad() int64 {
if x != nil {
return x.SoftMaxLoad
}
return 0
}
func (x *Vehicle_LoadLimit) GetCostPerUnitAboveSoftMax() float64 {
if x != nil {
return x.CostPerUnitAboveSoftMax
}
return 0
}
func (x *Vehicle_LoadLimit) GetStartLoadInterval() *Vehicle_LoadLimit_Interval {
if x != nil {
return x.StartLoadInterval
}
return nil
}
func (x *Vehicle_LoadLimit) GetEndLoadInterval() *Vehicle_LoadLimit_Interval {
if x != nil {
return x.EndLoadInterval
}
return nil
}
// A limit defining a maximum duration of the route of a vehicle. It can be
// either hard or soft.
//
// When a soft limit field is defined, both the soft max threshold and its
// associated cost must be defined together.
type Vehicle_DurationLimit struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// A hard limit constraining the duration to be at most max_duration.
MaxDuration *duration.Duration `protobuf:"bytes,1,opt,name=max_duration,json=maxDuration,proto3" json:"max_duration,omitempty"`
// A soft limit not enforcing a maximum duration limit, but when violated
// makes the route incur a cost. This cost adds up to other costs defined in
// the model, with the same unit.
//
// If defined, `soft_max_duration` must be nonnegative. If max_duration is
// also defined, `soft_max_duration` must be less than max_duration.
SoftMaxDuration *duration.Duration `protobuf:"bytes,2,opt,name=soft_max_duration,json=softMaxDuration,proto3" json:"soft_max_duration,omitempty"`
// Cost per hour incurred if the `soft_max_duration` threshold is violated.
// The additional cost is 0 if the duration is under the threshold,
// otherwise the cost depends on the duration as follows:
// ```
//
// cost_per_hour_after_soft_max * (duration - soft_max_duration)
//
// ```
// The cost must be nonnegative.
CostPerHourAfterSoftMax *float64 `protobuf:"fixed64,3,opt,name=cost_per_hour_after_soft_max,json=costPerHourAfterSoftMax,proto3,oneof" json:"cost_per_hour_after_soft_max,omitempty"`
// A soft limit not enforcing a maximum duration limit, but when violated
// makes the route incur a cost, quadratic in the duration. This cost adds
// up to other costs defined in the model, with the same unit.
//
// If defined, `quadratic_soft_max_duration` must be nonnegative. If
// `max_duration` is also defined, `quadratic_soft_max_duration` must be
// less than `max_duration`, and the difference must be no larger than one
// day:
//
// `max_duration - quadratic_soft_max_duration <= 86400 seconds`
QuadraticSoftMaxDuration *duration.Duration `protobuf:"bytes,4,opt,name=quadratic_soft_max_duration,json=quadraticSoftMaxDuration,proto3" json:"quadratic_soft_max_duration,omitempty"`
// Cost per square hour incurred if the
// `quadratic_soft_max_duration` threshold is violated.
//
// The additional cost is 0 if the duration is under the threshold,
// otherwise the cost depends on the duration as follows:
//
// ```
//
// cost_per_square_hour_after_quadratic_soft_max *
// (duration - quadratic_soft_max_duration)^2
//
// ```
//
// The cost must be nonnegative.
CostPerSquareHourAfterQuadraticSoftMax *float64 `protobuf:"fixed64,5,opt,name=cost_per_square_hour_after_quadratic_soft_max,json=costPerSquareHourAfterQuadraticSoftMax,proto3,oneof" json:"cost_per_square_hour_after_quadratic_soft_max,omitempty"`
}
func (x *Vehicle_DurationLimit) Reset() {
*x = Vehicle_DurationLimit{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[36]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Vehicle_DurationLimit) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Vehicle_DurationLimit) ProtoMessage() {}
func (x *Vehicle_DurationLimit) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[36]
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 Vehicle_DurationLimit.ProtoReflect.Descriptor instead.
func (*Vehicle_DurationLimit) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8, 1}
}
func (x *Vehicle_DurationLimit) GetMaxDuration() *duration.Duration {
if x != nil {
return x.MaxDuration
}
return nil
}
func (x *Vehicle_DurationLimit) GetSoftMaxDuration() *duration.Duration {
if x != nil {
return x.SoftMaxDuration
}
return nil
}
func (x *Vehicle_DurationLimit) GetCostPerHourAfterSoftMax() float64 {
if x != nil && x.CostPerHourAfterSoftMax != nil {
return *x.CostPerHourAfterSoftMax
}
return 0
}
func (x *Vehicle_DurationLimit) GetQuadraticSoftMaxDuration() *duration.Duration {
if x != nil {
return x.QuadraticSoftMaxDuration
}
return nil
}
func (x *Vehicle_DurationLimit) GetCostPerSquareHourAfterQuadraticSoftMax() float64 {
if x != nil && x.CostPerSquareHourAfterQuadraticSoftMax != nil {
return *x.CostPerSquareHourAfterQuadraticSoftMax
}
return 0
}
// Interval of acceptable load amounts.
type Vehicle_LoadLimit_Interval struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// A minimum acceptable load. Must be ≥ 0.
// If they're both specified, [min][google.cloud.optimization.v1.Vehicle.LoadLimit.Interval.min] must be ≤ [max][google.cloud.optimization.v1.Vehicle.LoadLimit.Interval.max].
Min int64 `protobuf:"varint,1,opt,name=min,proto3" json:"min,omitempty"`
// A maximum acceptable load. Must be ≥ 0. If unspecified, the maximum
// load is unrestricted by this message.
// If they're both specified, [min][google.cloud.optimization.v1.Vehicle.LoadLimit.Interval.min] must be ≤ [max][google.cloud.optimization.v1.Vehicle.LoadLimit.Interval.max].
Max *int64 `protobuf:"varint,2,opt,name=max,proto3,oneof" json:"max,omitempty"`
}
func (x *Vehicle_LoadLimit_Interval) Reset() {
*x = Vehicle_LoadLimit_Interval{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[39]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *Vehicle_LoadLimit_Interval) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*Vehicle_LoadLimit_Interval) ProtoMessage() {}
func (x *Vehicle_LoadLimit_Interval) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[39]
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 Vehicle_LoadLimit_Interval.ProtoReflect.Descriptor instead.
func (*Vehicle_LoadLimit_Interval) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{8, 0, 0}
}
func (x *Vehicle_LoadLimit_Interval) GetMin() int64 {
if x != nil {
return x.Min
}
return 0
}
func (x *Vehicle_LoadLimit_Interval) GetMax() int64 {
if x != nil && x.Max != nil {
return *x.Max
}
return 0
}
// The sequence of breaks (i.e. their number and order) that apply to each
// vehicle must be known beforehand. The repeated `BreakRequest`s define
// that sequence, in the order in which they must occur. Their time windows
// (`earliest_start_time` / `latest_start_time`) may overlap, but they must
// be compatible with the order (this is checked).
type BreakRule_BreakRequest struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Lower bound (inclusive) on the start of the break.
EarliestStartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=earliest_start_time,json=earliestStartTime,proto3" json:"earliest_start_time,omitempty"`
// Required. Upper bound (inclusive) on the start of the break.
LatestStartTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=latest_start_time,json=latestStartTime,proto3" json:"latest_start_time,omitempty"`
// Required. Minimum duration of the break. Must be positive.
MinDuration *duration.Duration `protobuf:"bytes,3,opt,name=min_duration,json=minDuration,proto3" json:"min_duration,omitempty"`
}
func (x *BreakRule_BreakRequest) Reset() {
*x = BreakRule_BreakRequest{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[40]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BreakRule_BreakRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BreakRule_BreakRequest) ProtoMessage() {}
func (x *BreakRule_BreakRequest) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[40]
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 BreakRule_BreakRequest.ProtoReflect.Descriptor instead.
func (*BreakRule_BreakRequest) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{16, 0}
}
func (x *BreakRule_BreakRequest) GetEarliestStartTime() *timestamp.Timestamp {
if x != nil {
return x.EarliestStartTime
}
return nil
}
func (x *BreakRule_BreakRequest) GetLatestStartTime() *timestamp.Timestamp {
if x != nil {
return x.LatestStartTime
}
return nil
}
func (x *BreakRule_BreakRequest) GetMinDuration() *duration.Duration {
if x != nil {
return x.MinDuration
}
return nil
}
// One may further constrain the frequency and duration of the breaks
// specified above, by enforcing a minimum break frequency, such as
// "There must be a break of at least 1 hour every 12 hours". Assuming that
// this can be interpreted as "Within any sliding time window of 12h, there
// must be at least one break of at least one hour", that example would
// translate to the following `FrequencyConstraint`:
// ```
//
// {
// min_break_duration { seconds: 3600 } # 1 hour.
// max_inter_break_duration { seconds: 39600 } # 11 hours (12 - 1 = 11).
// }
//
// ```
//
// The timing and duration of the breaks in the solution will respect all
// such constraints, in addition to the time windows and minimum durations
// already specified in the `BreakRequest`.
//
// A `FrequencyConstraint` may in practice apply to non-consecutive breaks.
// For example, the following schedule honors the "1h every 12h" example:
// ```
//
// 04:00 vehicle start
// .. performing travel and visits ..
// 09:00 1 hour break
// 10:00 end of the break
// .. performing travel and visits ..
// 12:00 20-min lunch break
// 12:20 end of the break
// .. performing travel and visits ..
// 21:00 1 hour break
// 22:00 end of the break
// .. performing travel and visits ..
// 23:59 vehicle end
//
// ```
type BreakRule_FrequencyConstraint struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Required. Minimum break duration for this constraint. Nonnegative.
// See description of `FrequencyConstraint`.
MinBreakDuration *duration.Duration `protobuf:"bytes,1,opt,name=min_break_duration,json=minBreakDuration,proto3" json:"min_break_duration,omitempty"`
// Required. Maximum allowed span of any interval of time in the route that does not
// include at least partially a break of `duration >=
// min_break_duration`. Must be positive.
MaxInterBreakDuration *duration.Duration `protobuf:"bytes,2,opt,name=max_inter_break_duration,json=maxInterBreakDuration,proto3" json:"max_inter_break_duration,omitempty"`
}
func (x *BreakRule_FrequencyConstraint) Reset() {
*x = BreakRule_FrequencyConstraint{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[41]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *BreakRule_FrequencyConstraint) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*BreakRule_FrequencyConstraint) ProtoMessage() {}
func (x *BreakRule_FrequencyConstraint) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[41]
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 BreakRule_FrequencyConstraint.ProtoReflect.Descriptor instead.
func (*BreakRule_FrequencyConstraint) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{16, 1}
}
func (x *BreakRule_FrequencyConstraint) GetMinBreakDuration() *duration.Duration {
if x != nil {
return x.MinBreakDuration
}
return nil
}
func (x *BreakRule_FrequencyConstraint) GetMaxInterBreakDuration() *duration.Duration {
if x != nil {
return x.MaxInterBreakDuration
}
return nil
}
// Deprecated: Use [ShipmentRoute.Transition.delay_duration][] instead.
// Time interval spent on the route resulting from a
// [TransitionAttributes.delay][google.cloud.optimization.v1.TransitionAttributes.delay].
//
// Deprecated: Do not use.
type ShipmentRoute_Delay struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Start of the delay.
StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
// Duration of the delay.
Duration *duration.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"`
}
func (x *ShipmentRoute_Delay) Reset() {
*x = ShipmentRoute_Delay{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[42]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_Delay) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_Delay) ProtoMessage() {}
func (x *ShipmentRoute_Delay) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[42]
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 ShipmentRoute_Delay.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_Delay) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 0}
}
func (x *ShipmentRoute_Delay) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *ShipmentRoute_Delay) GetDuration() *duration.Duration {
if x != nil {
return x.Duration
}
return nil
}
// A visit performed during a route. This visit corresponds to a pickup or a
// delivery of a `Shipment`.
type ShipmentRoute_Visit struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Index of the `shipments` field in the source [ShipmentModel][google.cloud.optimization.v1.ShipmentModel].
ShipmentIndex int32 `protobuf:"varint,1,opt,name=shipment_index,json=shipmentIndex,proto3" json:"shipment_index,omitempty"`
// If true the visit corresponds to a pickup of a `Shipment`. Otherwise, it
// corresponds to a delivery.
IsPickup bool `protobuf:"varint,2,opt,name=is_pickup,json=isPickup,proto3" json:"is_pickup,omitempty"`
// Index of `VisitRequest` in either the pickup or delivery field of the
// `Shipment` (see `is_pickup`).
VisitRequestIndex int32 `protobuf:"varint,3,opt,name=visit_request_index,json=visitRequestIndex,proto3" json:"visit_request_index,omitempty"`
// Time at which the visit starts. Note that the vehicle may arrive earlier
// than this at the visit location. Times are consistent with the
// `ShipmentModel`.
StartTime *timestamp.Timestamp `protobuf:"bytes,4,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
// Total visit load demand as the sum of the shipment and the visit request
// `load_demands`. The values are negative if the visit is a delivery.
// Demands are reported for the same types as the
// [Transition.loads][google.cloud.optimization.v1.ShipmentRoute.Transition]
// (see this field).
LoadDemands map[string]*Shipment_Load `protobuf:"bytes,11,rep,name=load_demands,json=loadDemands,proto3" json:"load_demands,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Extra detour time due to the shipments visited on the route before the
// visit and to the potential waiting time induced by time windows.
// If the visit is a delivery, the detour is computed from the corresponding
// pickup visit and is equal to:
// ```
// start_time(delivery) - start_time(pickup)
// - (duration(pickup) + travel duration from the pickup location
// to the delivery location).
// ```
// Otherwise, it is computed from the vehicle `start_location` and is equal
// to:
// ```
// start_time - vehicle_start_time - travel duration from
// the vehicle's `start_location` to the visit.
// ```
Detour *duration.Duration `protobuf:"bytes,6,opt,name=detour,proto3" json:"detour,omitempty"`
// Copy of the corresponding `Shipment.label`, if specified in the
// `Shipment`.
ShipmentLabel string `protobuf:"bytes,7,opt,name=shipment_label,json=shipmentLabel,proto3" json:"shipment_label,omitempty"`
// Copy of the corresponding
// [VisitRequest.label][google.cloud.optimization.v1.Shipment.VisitRequest.label],
// if specified in the `VisitRequest`.
VisitLabel string `protobuf:"bytes,8,opt,name=visit_label,json=visitLabel,proto3" json:"visit_label,omitempty"`
// Deprecated: Use [ShipmentRoute.Transition.loads][] instead.
// Vehicle loads upon arrival at the visit location, for each
// type specified in [Vehicle.capacities][google.cloud.optimization.v1.Vehicle.capacities], `start_load_intervals`,
// `end_load_intervals` or `demands`.
//
// Exception: we omit loads for quantity types unconstrained by intervals
// and that don't have any non-zero demand on the route.
//
// Deprecated: Do not use.
ArrivalLoads []*CapacityQuantity `protobuf:"bytes,9,rep,name=arrival_loads,json=arrivalLoads,proto3" json:"arrival_loads,omitempty"`
// Deprecated: Use [ShipmentRoute.Transition.delay_duration][] instead.
//
// Deprecated: Do not use.
DelayBeforeStart *ShipmentRoute_Delay `protobuf:"bytes,10,opt,name=delay_before_start,json=delayBeforeStart,proto3" json:"delay_before_start,omitempty"`
// Deprecated: Use [Visit.load_demands][] instead.
//
// Deprecated: Do not use.
Demands []*CapacityQuantity `protobuf:"bytes,5,rep,name=demands,proto3" json:"demands,omitempty"`
}
func (x *ShipmentRoute_Visit) Reset() {
*x = ShipmentRoute_Visit{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[43]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_Visit) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_Visit) ProtoMessage() {}
func (x *ShipmentRoute_Visit) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[43]
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 ShipmentRoute_Visit.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_Visit) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 1}
}
func (x *ShipmentRoute_Visit) GetShipmentIndex() int32 {
if x != nil {
return x.ShipmentIndex
}
return 0
}
func (x *ShipmentRoute_Visit) GetIsPickup() bool {
if x != nil {
return x.IsPickup
}
return false
}
func (x *ShipmentRoute_Visit) GetVisitRequestIndex() int32 {
if x != nil {
return x.VisitRequestIndex
}
return 0
}
func (x *ShipmentRoute_Visit) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *ShipmentRoute_Visit) GetLoadDemands() map[string]*Shipment_Load {
if x != nil {
return x.LoadDemands
}
return nil
}
func (x *ShipmentRoute_Visit) GetDetour() *duration.Duration {
if x != nil {
return x.Detour
}
return nil
}
func (x *ShipmentRoute_Visit) GetShipmentLabel() string {
if x != nil {
return x.ShipmentLabel
}
return ""
}
func (x *ShipmentRoute_Visit) GetVisitLabel() string {
if x != nil {
return x.VisitLabel
}
return ""
}
// Deprecated: Do not use.
func (x *ShipmentRoute_Visit) GetArrivalLoads() []*CapacityQuantity {
if x != nil {
return x.ArrivalLoads
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute_Visit) GetDelayBeforeStart() *ShipmentRoute_Delay {
if x != nil {
return x.DelayBeforeStart
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute_Visit) GetDemands() []*CapacityQuantity {
if x != nil {
return x.Demands
}
return nil
}
// Transition between two events on the route. See the description of
// [ShipmentRoute][google.cloud.optimization.v1.ShipmentRoute].
//
// If the vehicle does not have a `start_location` and/or `end_location`, the
// corresponding travel metrics are 0.
type ShipmentRoute_Transition struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Travel duration during this transition.
TravelDuration *duration.Duration `protobuf:"bytes,1,opt,name=travel_duration,json=travelDuration,proto3" json:"travel_duration,omitempty"`
// Distance traveled during the transition.
TravelDistanceMeters float64 `protobuf:"fixed64,2,opt,name=travel_distance_meters,json=travelDistanceMeters,proto3" json:"travel_distance_meters,omitempty"`
// When traffic is requested via
// [OptimizeToursRequest.consider_road_traffic]
// [google.cloud.optimization.v1.OptimizeToursRequest.consider_road_traffic],
// and the traffic info couldn't be retrieved for a `Transition`, this
// boolean is set to true. This may be temporary (rare hiccup in the
// realtime traffic servers) or permanent (no data for this location).
TrafficInfoUnavailable bool `protobuf:"varint,3,opt,name=traffic_info_unavailable,json=trafficInfoUnavailable,proto3" json:"traffic_info_unavailable,omitempty"`
// Sum of the delay durations applied to this transition. If any, the delay
// starts exactly `delay_duration` seconds before the next event (visit or
// vehicle end). See
// [TransitionAttributes.delay][google.cloud.optimization.v1.TransitionAttributes.delay].
DelayDuration *duration.Duration `protobuf:"bytes,4,opt,name=delay_duration,json=delayDuration,proto3" json:"delay_duration,omitempty"`
// Sum of the duration of the breaks occurring during this transition, if
// any. Details about each break's start time and duration are stored in
// [ShipmentRoute.breaks][google.cloud.optimization.v1.ShipmentRoute.breaks].
BreakDuration *duration.Duration `protobuf:"bytes,5,opt,name=break_duration,json=breakDuration,proto3" json:"break_duration,omitempty"`
// Time spent waiting during this transition. Wait duration corresponds to
// idle time and does not include break time. Also note that this wait time
// may be split into several non-contiguous intervals.
WaitDuration *duration.Duration `protobuf:"bytes,6,opt,name=wait_duration,json=waitDuration,proto3" json:"wait_duration,omitempty"`
// Total duration of the transition, provided for convenience. It is equal
// to:
//
// * next visit `start_time` (or `vehicle_end_time` if this is the last
// transition) - this transition's `start_time`;
// * if `ShipmentRoute.has_traffic_infeasibilities` is false, the following
// additionally holds: `total_duration = travel_duration + delay_duration
// + break_duration + wait_duration`.
TotalDuration *duration.Duration `protobuf:"bytes,7,opt,name=total_duration,json=totalDuration,proto3" json:"total_duration,omitempty"`
// Start time of this transition.
StartTime *timestamp.Timestamp `protobuf:"bytes,8,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
// The encoded polyline representation of the route followed during the
// transition.
// This field is only populated if [populate_transition_polylines]
// [google.cloud.optimization.v1.OptimizeToursRequest.populate_transition_polylines]
// is set to true.
RoutePolyline *ShipmentRoute_EncodedPolyline `protobuf:"bytes,9,opt,name=route_polyline,json=routePolyline,proto3" json:"route_polyline,omitempty"`
// Vehicle loads during this transition, for each type that either appears
// in this vehicle's [Vehicle.load_limits][google.cloud.optimization.v1.Vehicle.load_limits], or that have non-zero
// [Shipment.load_demands][google.cloud.optimization.v1.Shipment.load_demands] on some shipment performed on this route.
//
// The loads during the first transition are the starting loads of the
// vehicle route. Then, after each visit, the visit's `load_demands` are
// either added or subtracted to get the next transition's loads, depending
// on whether the visit was a pickup or a delivery.
VehicleLoads map[string]*ShipmentRoute_VehicleLoad `protobuf:"bytes,11,rep,name=vehicle_loads,json=vehicleLoads,proto3" json:"vehicle_loads,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
// Deprecated: Use [Transition.vehicle_loads][] instead.
//
// Deprecated: Do not use.
Loads []*CapacityQuantity `protobuf:"bytes,10,rep,name=loads,proto3" json:"loads,omitempty"`
}
func (x *ShipmentRoute_Transition) Reset() {
*x = ShipmentRoute_Transition{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[44]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_Transition) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_Transition) ProtoMessage() {}
func (x *ShipmentRoute_Transition) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[44]
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 ShipmentRoute_Transition.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_Transition) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 2}
}
func (x *ShipmentRoute_Transition) GetTravelDuration() *duration.Duration {
if x != nil {
return x.TravelDuration
}
return nil
}
func (x *ShipmentRoute_Transition) GetTravelDistanceMeters() float64 {
if x != nil {
return x.TravelDistanceMeters
}
return 0
}
func (x *ShipmentRoute_Transition) GetTrafficInfoUnavailable() bool {
if x != nil {
return x.TrafficInfoUnavailable
}
return false
}
func (x *ShipmentRoute_Transition) GetDelayDuration() *duration.Duration {
if x != nil {
return x.DelayDuration
}
return nil
}
func (x *ShipmentRoute_Transition) GetBreakDuration() *duration.Duration {
if x != nil {
return x.BreakDuration
}
return nil
}
func (x *ShipmentRoute_Transition) GetWaitDuration() *duration.Duration {
if x != nil {
return x.WaitDuration
}
return nil
}
func (x *ShipmentRoute_Transition) GetTotalDuration() *duration.Duration {
if x != nil {
return x.TotalDuration
}
return nil
}
func (x *ShipmentRoute_Transition) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *ShipmentRoute_Transition) GetRoutePolyline() *ShipmentRoute_EncodedPolyline {
if x != nil {
return x.RoutePolyline
}
return nil
}
func (x *ShipmentRoute_Transition) GetVehicleLoads() map[string]*ShipmentRoute_VehicleLoad {
if x != nil {
return x.VehicleLoads
}
return nil
}
// Deprecated: Do not use.
func (x *ShipmentRoute_Transition) GetLoads() []*CapacityQuantity {
if x != nil {
return x.Loads
}
return nil
}
// Reports the actual load of the vehicle at some point along the route,
// for a given type (see [Transition.vehicle_loads][google.cloud.optimization.v1.ShipmentRoute.Transition.vehicle_loads]).
type ShipmentRoute_VehicleLoad struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The amount of load on the vehicle, for the given type. The unit of load
// is usually indicated by the type. See [Transition.vehicle_loads][google.cloud.optimization.v1.ShipmentRoute.Transition.vehicle_loads].
Amount int64 `protobuf:"varint,1,opt,name=amount,proto3" json:"amount,omitempty"`
}
func (x *ShipmentRoute_VehicleLoad) Reset() {
*x = ShipmentRoute_VehicleLoad{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[45]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_VehicleLoad) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_VehicleLoad) ProtoMessage() {}
func (x *ShipmentRoute_VehicleLoad) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[45]
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 ShipmentRoute_VehicleLoad.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_VehicleLoad) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 3}
}
func (x *ShipmentRoute_VehicleLoad) GetAmount() int64 {
if x != nil {
return x.Amount
}
return 0
}
// The encoded representation of a polyline. More information on polyline
// encoding can be found here:
// https://developers.google.com/maps/documentation/utilities/polylinealgorithm
// https://developers.google.com/maps/documentation/javascript/reference/geometry#encoding.
type ShipmentRoute_EncodedPolyline struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// String representing encoded points of the polyline.
Points string `protobuf:"bytes,1,opt,name=points,proto3" json:"points,omitempty"`
}
func (x *ShipmentRoute_EncodedPolyline) Reset() {
*x = ShipmentRoute_EncodedPolyline{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[46]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_EncodedPolyline) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_EncodedPolyline) ProtoMessage() {}
func (x *ShipmentRoute_EncodedPolyline) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[46]
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 ShipmentRoute_EncodedPolyline.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_EncodedPolyline) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 4}
}
func (x *ShipmentRoute_EncodedPolyline) GetPoints() string {
if x != nil {
return x.Points
}
return ""
}
// Data representing the execution of a break.
type ShipmentRoute_Break struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Start time of a break.
StartTime *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
// Duration of a break.
Duration *duration.Duration `protobuf:"bytes,2,opt,name=duration,proto3" json:"duration,omitempty"`
}
func (x *ShipmentRoute_Break) Reset() {
*x = ShipmentRoute_Break{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[47]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_Break) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_Break) ProtoMessage() {}
func (x *ShipmentRoute_Break) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[47]
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 ShipmentRoute_Break.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_Break) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 5}
}
func (x *ShipmentRoute_Break) GetStartTime() *timestamp.Timestamp {
if x != nil {
return x.StartTime
}
return nil
}
func (x *ShipmentRoute_Break) GetDuration() *duration.Duration {
if x != nil {
return x.Duration
}
return nil
}
// Deprecated: Use [ShipmentRoute.transitions][] instead.
// Travel between each visit, along the route: from the
// vehicle's `start_location` to the first visit's `arrival_location`, then
// from the first visit's `departure_location` to the second visit's
// `arrival_location`, and so on until the vehicle's `end_location`. This
// accounts only for the actual travel between visits, not counting the
// waiting time, the time spent performing a visit, nor the distance covered
// during a visit.
//
// Invariant: `travel_steps_size() == visits_size() + 1`.
//
// If the vehicle does not have a start_ and/or end_location, the
// corresponding travel metrics are 0 and/or empty.
//
// Deprecated: Do not use.
type ShipmentRoute_TravelStep struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Duration of the travel step.
Duration *duration.Duration `protobuf:"bytes,1,opt,name=duration,proto3" json:"duration,omitempty"`
// Distance traveled during the step.
DistanceMeters float64 `protobuf:"fixed64,2,opt,name=distance_meters,json=distanceMeters,proto3" json:"distance_meters,omitempty"`
// When traffic is requested via
// [OptimizeToursRequest.consider_road_traffic][google.cloud.optimization.v1.OptimizeToursRequest.consider_road_traffic],
// and the traffic info couldn't be retrieved for a TravelStep, this boolean
// is set to true. This may be temporary (rare hiccup in the realtime
// traffic servers) or permanent (no data for this location).
TrafficInfoUnavailable bool `protobuf:"varint,3,opt,name=traffic_info_unavailable,json=trafficInfoUnavailable,proto3" json:"traffic_info_unavailable,omitempty"`
// The encoded polyline representation of the route followed during the
// step.
//
// This field is only populated if
// [OptimizeToursRequest.populate_travel_step_polylines][google.cloud.optimization.v1.OptimizeToursRequest.populate_travel_step_polylines]
// is set to true.
RoutePolyline *ShipmentRoute_EncodedPolyline `protobuf:"bytes,4,opt,name=route_polyline,json=routePolyline,proto3" json:"route_polyline,omitempty"`
}
func (x *ShipmentRoute_TravelStep) Reset() {
*x = ShipmentRoute_TravelStep{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[48]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *ShipmentRoute_TravelStep) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*ShipmentRoute_TravelStep) ProtoMessage() {}
func (x *ShipmentRoute_TravelStep) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[48]
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 ShipmentRoute_TravelStep.ProtoReflect.Descriptor instead.
func (*ShipmentRoute_TravelStep) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{17, 6}
}
func (x *ShipmentRoute_TravelStep) GetDuration() *duration.Duration {
if x != nil {
return x.Duration
}
return nil
}
func (x *ShipmentRoute_TravelStep) GetDistanceMeters() float64 {
if x != nil {
return x.DistanceMeters
}
return 0
}
func (x *ShipmentRoute_TravelStep) GetTrafficInfoUnavailable() bool {
if x != nil {
return x.TrafficInfoUnavailable
}
return false
}
func (x *ShipmentRoute_TravelStep) GetRoutePolyline() *ShipmentRoute_EncodedPolyline {
if x != nil {
return x.RoutePolyline
}
return nil
}
// If we can explain why the shipment was skipped, reasons will be listed
// here. If the reason is not the same for all vehicles, `reason` will have
// more than 1 element. A skipped shipment cannot have duplicate reasons,
// i.e. where all fields are the same except for `example_vehicle_index`.
// Example:
// ```
//
// reasons {
// code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
// example_vehicle_index: 1
// example_exceeded_capacity_type: "Apples"
// }
//
// reasons {
// code: DEMAND_EXCEEDS_VEHICLE_CAPACITY
// example_vehicle_index: 3
// example_exceeded_capacity_type: "Pears"
// }
//
// reasons {
// code: CANNOT_BE_PERFORMED_WITHIN_VEHICLE_DISTANCE_LIMIT
// example_vehicle_index: 1
// }
//
// ```
// The skipped shipment is incompatible with all vehicles. The reasons may
// be different for all vehicles but at least one vehicle's "Apples"
// capacity would be exceeded (including vehicle 1), at least one vehicle's
// "Pears" capacity would be exceeded (including vehicle 3) and at least one
// vehicle's distance limit would be exceeded (including vehicle 1).
type SkippedShipment_Reason struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Refer to the comments of Code.
Code SkippedShipment_Reason_Code `protobuf:"varint,1,opt,name=code,proto3,enum=google.cloud.optimization.v1.SkippedShipment_Reason_Code" json:"code,omitempty"`
// If the reason is related to a shipment-vehicle incompatibility, this
// field provides the index of one relevant vehicle.
ExampleVehicleIndex *int32 `protobuf:"varint,2,opt,name=example_vehicle_index,json=exampleVehicleIndex,proto3,oneof" json:"example_vehicle_index,omitempty"`
// If the reason code is `DEMAND_EXCEEDS_VEHICLE_CAPACITY`, documents one
// capacity type that is exceeded.
ExampleExceededCapacityType string `protobuf:"bytes,3,opt,name=example_exceeded_capacity_type,json=exampleExceededCapacityType,proto3" json:"example_exceeded_capacity_type,omitempty"`
}
func (x *SkippedShipment_Reason) Reset() {
*x = SkippedShipment_Reason{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[52]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *SkippedShipment_Reason) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*SkippedShipment_Reason) ProtoMessage() {}
func (x *SkippedShipment_Reason) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[52]
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 SkippedShipment_Reason.ProtoReflect.Descriptor instead.
func (*SkippedShipment_Reason) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{18, 0}
}
func (x *SkippedShipment_Reason) GetCode() SkippedShipment_Reason_Code {
if x != nil {
return x.Code
}
return SkippedShipment_Reason_CODE_UNSPECIFIED
}
func (x *SkippedShipment_Reason) GetExampleVehicleIndex() int32 {
if x != nil && x.ExampleVehicleIndex != nil {
return *x.ExampleVehicleIndex
}
return 0
}
func (x *SkippedShipment_Reason) GetExampleExceededCapacityType() string {
if x != nil {
return x.ExampleExceededCapacityType
}
return ""
}
// For a group of vehicles, specifies at what threshold(s) constraints on
// visits will be relaxed and to which level. Shipments listed in
// the `skipped_shipment` field are constrained to be skipped; i.e., they
// cannot be performed.
type InjectedSolutionConstraint_ConstraintRelaxation struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// All the visit constraint relaxations that will apply to visits on
// routes with vehicles in `vehicle_indices`.
Relaxations []*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation `protobuf:"bytes,1,rep,name=relaxations,proto3" json:"relaxations,omitempty"`
// Specifies the vehicle indices to which the visit constraint
// `relaxations` apply. If empty, this is considered the default and the
// `relaxations` apply to all vehicles that are not specified in other
// `constraint_relaxations`. There can be at most one default, i.e., at
// most one constraint relaxation field is allowed empty
// `vehicle_indices`. A vehicle index can only be listed once, even within
// several `constraint_relaxations`.
//
// A vehicle index is mapped the same as [ShipmentRoute.vehicle_index][google.cloud.optimization.v1.ShipmentRoute.vehicle_index], if
// `interpret_injected_solutions_using_labels` is true (see `fields`
// comment).
VehicleIndices []int32 `protobuf:"varint,2,rep,packed,name=vehicle_indices,json=vehicleIndices,proto3" json:"vehicle_indices,omitempty"`
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation) Reset() {
*x = InjectedSolutionConstraint_ConstraintRelaxation{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[55]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*InjectedSolutionConstraint_ConstraintRelaxation) ProtoMessage() {}
func (x *InjectedSolutionConstraint_ConstraintRelaxation) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[55]
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 InjectedSolutionConstraint_ConstraintRelaxation.ProtoReflect.Descriptor instead.
func (*InjectedSolutionConstraint_ConstraintRelaxation) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{20, 0}
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation) GetRelaxations() []*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation {
if x != nil {
return x.Relaxations
}
return nil
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation) GetVehicleIndices() []int32 {
if x != nil {
return x.VehicleIndices
}
return nil
}
// If `relaxations` is empty, the start time and sequence of all visits
// on `routes` are fully constrained and no new visits may be inserted or
// added to those routes. Also, a vehicle's start and end time in
// `routes` is fully constrained, unless the vehicle is empty (i.e., has no
// visits and has `used_if_route_is_empty` set to false in the model).
//
// `relaxations(i).level` specifies the constraint relaxation level applied
// to a visit #j that satisfies:
//
// - `route.visits(j).start_time >= relaxations(i).threshold_time` AND
// - `j + 1 >= relaxations(i).threshold_visit_count`
//
// Similarly, the vehicle start is relaxed to `relaxations(i).level` if it
// satisfies:
//
// - `vehicle_start_time >= relaxations(i).threshold_time` AND
// - `relaxations(i).threshold_visit_count == 0`
//
// and the vehicle end is relaxed to `relaxations(i).level` if it satisfies:
// - `vehicle_end_time >= relaxations(i).threshold_time` AND
// - `route.visits_size() + 1 >= relaxations(i).threshold_visit_count`
//
// To apply a relaxation level if a visit meets the `threshold_visit_count`
// OR the `threshold_time` add two `relaxations` with the same `level`:
// one with only `threshold_visit_count` set and the other with only
// `threshold_time` set. If a visit satisfies the conditions of multiple
// `relaxations`, the most relaxed level applies. As a result, from the
// vehicle start through the route visits in order to the vehicle end, the
// relaxation level becomes more relaxed: i.e., the relaxation level is
// non-decreasing as the route progresses.
//
// The timing and sequence of route visits that do not satisfy the
// threshold conditions of any `relaxations` are fully constrained
// and no visits may be inserted into these sequences. Also, if a
// vehicle start or end does not satisfy the conditions of any
// relaxation the time is fixed, unless the vehicle is empty.
type InjectedSolutionConstraint_ConstraintRelaxation_Relaxation struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// The constraint relaxation level that applies when the conditions
// at or after `threshold_time` AND at least `threshold_visit_count` are
// satified.
Level InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level `protobuf:"varint,1,opt,name=level,proto3,enum=google.cloud.optimization.v1.InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level" json:"level,omitempty"`
// The time at or after which the relaxation `level` may be applied.
ThresholdTime *timestamp.Timestamp `protobuf:"bytes,2,opt,name=threshold_time,json=thresholdTime,proto3" json:"threshold_time,omitempty"`
// The number of visits at or after which the relaxation `level` may be
// applied. If `threshold_visit_count` is 0 (or unset), the `level` may be
// applied directly at the vehicle start.
//
// If it is `route.visits_size() + 1`, the `level` may only be applied to
// the vehicle end. If it is more than `route.visits_size() + 1`,
// `level` is not applied at all for that route.
ThresholdVisitCount int32 `protobuf:"varint,3,opt,name=threshold_visit_count,json=thresholdVisitCount,proto3" json:"threshold_visit_count,omitempty"`
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) Reset() {
*x = InjectedSolutionConstraint_ConstraintRelaxation_Relaxation{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[56]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) ProtoMessage() {}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[56]
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 InjectedSolutionConstraint_ConstraintRelaxation_Relaxation.ProtoReflect.Descriptor instead.
func (*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{20, 0, 0}
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) GetLevel() InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level {
if x != nil {
return x.Level
}
return InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_LEVEL_UNSPECIFIED
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) GetThresholdTime() *timestamp.Timestamp {
if x != nil {
return x.ThresholdTime
}
return nil
}
func (x *InjectedSolutionConstraint_ConstraintRelaxation_Relaxation) GetThresholdVisitCount() int32 {
if x != nil {
return x.ThresholdVisitCount
}
return 0
}
// Specifies a context for the validation error. A `FieldReference` always
// refers to a given field in this file and follows the same hierarchical
// structure. For example, we may specify element #2 of `start_time_windows`
// of vehicle #5 using:
// ```
// name: "vehicles" index: 5 sub_field { name: "end_time_windows" index: 2 }
// ```
// We however omit top-level entities such as `OptimizeToursRequest` or
// `ShipmentModel` to avoid crowding the message.
type OptimizeToursValidationError_FieldReference struct {
state protoimpl.MessageState
sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields
// Name of the field, e.g., "vehicles".
Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
// Types that are assignable to IndexOrKey:
//
// *OptimizeToursValidationError_FieldReference_Index
// *OptimizeToursValidationError_FieldReference_Key
IndexOrKey isOptimizeToursValidationError_FieldReference_IndexOrKey `protobuf_oneof:"index_or_key"`
// Recursively nested sub-field, if needed.
SubField *OptimizeToursValidationError_FieldReference `protobuf:"bytes,3,opt,name=sub_field,json=subField,proto3" json:"sub_field,omitempty"`
}
func (x *OptimizeToursValidationError_FieldReference) Reset() {
*x = OptimizeToursValidationError_FieldReference{}
if protoimpl.UnsafeEnabled {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[57]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
}
func (x *OptimizeToursValidationError_FieldReference) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*OptimizeToursValidationError_FieldReference) ProtoMessage() {}
func (x *OptimizeToursValidationError_FieldReference) ProtoReflect() protoreflect.Message {
mi := &file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[57]
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 OptimizeToursValidationError_FieldReference.ProtoReflect.Descriptor instead.
func (*OptimizeToursValidationError_FieldReference) Descriptor() ([]byte, []int) {
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP(), []int{21, 0}
}
func (x *OptimizeToursValidationError_FieldReference) GetName() string {
if x != nil {
return x.Name
}
return ""
}
func (m *OptimizeToursValidationError_FieldReference) GetIndexOrKey() isOptimizeToursValidationError_FieldReference_IndexOrKey {
if m != nil {
return m.IndexOrKey
}
return nil
}
func (x *OptimizeToursValidationError_FieldReference) GetIndex() int32 {
if x, ok := x.GetIndexOrKey().(*OptimizeToursValidationError_FieldReference_Index); ok {
return x.Index
}
return 0
}
func (x *OptimizeToursValidationError_FieldReference) GetKey() string {
if x, ok := x.GetIndexOrKey().(*OptimizeToursValidationError_FieldReference_Key); ok {
return x.Key
}
return ""
}
func (x *OptimizeToursValidationError_FieldReference) GetSubField() *OptimizeToursValidationError_FieldReference {
if x != nil {
return x.SubField
}
return nil
}
type isOptimizeToursValidationError_FieldReference_IndexOrKey interface {
isOptimizeToursValidationError_FieldReference_IndexOrKey()
}
type OptimizeToursValidationError_FieldReference_Index struct {
// Index of the field if repeated.
Index int32 `protobuf:"varint,2,opt,name=index,proto3,oneof"`
}
type OptimizeToursValidationError_FieldReference_Key struct {
// Key if the field is a map.
Key string `protobuf:"bytes,4,opt,name=key,proto3,oneof"`
}
func (*OptimizeToursValidationError_FieldReference_Index) isOptimizeToursValidationError_FieldReference_IndexOrKey() {
}
func (*OptimizeToursValidationError_FieldReference_Key) isOptimizeToursValidationError_FieldReference_IndexOrKey() {
}
var File_google_cloud_optimization_v1_fleet_routing_proto protoreflect.FileDescriptor
var file_google_cloud_optimization_v1_fleet_routing_proto_rawDesc = []byte{
0x0a, 0x30, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x66,
0x6c, 0x65, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x12, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x61, 0x6e, 0x6e,
0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e,
0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f,
0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69,
0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64,
0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x23, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2f, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x6f, 0x70, 0x65,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x64,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74,
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x6c, 0x61, 0x74, 0x6c,
0x6e, 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa3, 0x0c, 0x0a, 0x14, 0x4f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28,
0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12, 0x33,
0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x74, 0x69, 0x6d, 0x65,
0x6f, 0x75, 0x74, 0x12, 0x41, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52,
0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x61, 0x0a, 0x0c, 0x73, 0x6f, 0x6c, 0x76, 0x69, 0x6e,
0x67, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3e, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x2e, 0x53, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x73, 0x6f,
0x6c, 0x76, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x6d, 0x61, 0x78,
0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f,
0x72, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x13, 0x6d, 0x61, 0x78, 0x56,
0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x88,
0x01, 0x01, 0x12, 0x5e, 0x0a, 0x0b, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x5f, 0x6d, 0x6f, 0x64,
0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54,
0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x65, 0x61, 0x72,
0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x73, 0x65, 0x61, 0x72, 0x63, 0x68, 0x4d, 0x6f,
0x64, 0x65, 0x12, 0x70, 0x0a, 0x1e, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x66,
0x69, 0x72, 0x73, 0x74, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x6f,
0x75, 0x74, 0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65,
0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x1b, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65,
0x64, 0x46, 0x69, 0x72, 0x73, 0x74, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f,
0x75, 0x74, 0x65, 0x73, 0x12, 0x7a, 0x0a, 0x1c, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64,
0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72,
0x61, 0x69, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74,
0x65, 0x64, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72,
0x61, 0x69, 0x6e, 0x74, 0x52, 0x1a, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f,
0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
0x12, 0x61, 0x0a, 0x16, 0x72, 0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x5f, 0x64, 0x65, 0x74, 0x61,
0x69, 0x6c, 0x73, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x14, 0x72,
0x65, 0x66, 0x72, 0x65, 0x73, 0x68, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x6f, 0x75,
0x74, 0x65, 0x73, 0x12, 0x58, 0x0a, 0x29, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65, 0x74,
0x5f, 0x69, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x5f, 0x75, 0x73, 0x69, 0x6e, 0x67, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x73,
0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x25, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x70, 0x72, 0x65,
0x74, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x55, 0x73, 0x69, 0x6e, 0x67, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x73, 0x12, 0x32, 0x0a,
0x15, 0x63, 0x6f, 0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x61, 0x64, 0x5f, 0x74,
0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x63, 0x6f,
0x6e, 0x73, 0x69, 0x64, 0x65, 0x72, 0x52, 0x6f, 0x61, 0x64, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69,
0x63, 0x12, 0x2d, 0x0a, 0x12, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x6f,
0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x70,
0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x73,
0x12, 0x42, 0x0a, 0x1d, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x72, 0x61,
0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65,
0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x1b, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74,
0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x6c, 0x79, 0x6c,
0x69, 0x6e, 0x65, 0x73, 0x12, 0x61, 0x0a, 0x2e, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x61,
0x72, 0x67, 0x65, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x5f, 0x64, 0x65, 0x73,
0x70, 0x69, 0x74, 0x65, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74, 0x69, 0x6f,
0x6e, 0x5f, 0x72, 0x69, 0x73, 0x6b, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x08, 0x52, 0x29, 0x61, 0x6c,
0x6c, 0x6f, 0x77, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65,
0x44, 0x65, 0x73, 0x70, 0x69, 0x74, 0x65, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x72, 0x75, 0x70, 0x74,
0x69, 0x6f, 0x6e, 0x52, 0x69, 0x73, 0x6b, 0x12, 0x34, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x5f, 0x67,
0x65, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x63, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x75, 0x73, 0x65, 0x47, 0x65, 0x6f, 0x64,
0x65, 0x73, 0x69, 0x63, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x40, 0x0a,
0x1a, 0x67, 0x65, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28,
0x01, 0x48, 0x01, 0x52, 0x17, 0x67, 0x65, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x63, 0x4d, 0x65, 0x74,
0x65, 0x72, 0x73, 0x50, 0x65, 0x72, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x88, 0x01, 0x01, 0x12,
0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x1e, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74,
0x65, 0x5f, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x5f, 0x70, 0x6f,
0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x42, 0x02, 0x18,
0x01, 0x52, 0x1b, 0x70, 0x6f, 0x70, 0x75, 0x6c, 0x61, 0x74, 0x65, 0x54, 0x72, 0x61, 0x76, 0x65,
0x6c, 0x53, 0x74, 0x65, 0x70, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x73, 0x22, 0x59,
0x0a, 0x0b, 0x53, 0x6f, 0x6c, 0x76, 0x69, 0x6e, 0x67, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x11, 0x0a,
0x0d, 0x44, 0x45, 0x46, 0x41, 0x55, 0x4c, 0x54, 0x5f, 0x53, 0x4f, 0x4c, 0x56, 0x45, 0x10, 0x00,
0x12, 0x11, 0x0a, 0x0d, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x4f, 0x4e, 0x4c,
0x59, 0x10, 0x01, 0x12, 0x24, 0x0a, 0x20, 0x44, 0x45, 0x54, 0x45, 0x43, 0x54, 0x5f, 0x53, 0x4f,
0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x46, 0x45, 0x41, 0x53, 0x49, 0x42, 0x4c, 0x45, 0x5f, 0x53, 0x48,
0x49, 0x50, 0x4d, 0x45, 0x4e, 0x54, 0x53, 0x10, 0x02, 0x22, 0x5a, 0x0a, 0x0a, 0x53, 0x65, 0x61,
0x72, 0x63, 0x68, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x53, 0x45, 0x41, 0x52, 0x43,
0x48, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
0x45, 0x44, 0x10, 0x00, 0x12, 0x0f, 0x0a, 0x0b, 0x52, 0x45, 0x54, 0x55, 0x52, 0x4e, 0x5f, 0x46,
0x41, 0x53, 0x54, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x43, 0x4f, 0x4e, 0x53, 0x55, 0x4d, 0x45,
0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x41, 0x56, 0x41, 0x49, 0x4c, 0x41, 0x42, 0x4c, 0x45, 0x5f, 0x54,
0x49, 0x4d, 0x45, 0x10, 0x02, 0x42, 0x18, 0x0a, 0x16, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61,
0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x42,
0x1d, 0x0a, 0x1b, 0x5f, 0x67, 0x65, 0x6f, 0x64, 0x65, 0x73, 0x69, 0x63, 0x5f, 0x6d, 0x65, 0x74,
0x65, 0x72, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x22, 0x93,
0x08, 0x0a, 0x15, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73,
0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74,
0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74,
0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x23, 0x0a,
0x0d, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x03,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x4c, 0x61, 0x62,
0x65, 0x6c, 0x12, 0x5a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x73, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6b, 0x69,
0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x10, 0x73, 0x6b,
0x69, 0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x67,
0x0a, 0x11, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x72, 0x72,
0x6f, 0x72, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x45, 0x72, 0x72, 0x6f, 0x72, 0x52, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x73, 0x12, 0x55, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69,
0x63, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65,
0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x4d, 0x65,
0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x21,
0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x02, 0x20, 0x01,
0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73,
0x74, 0x1a, 0xd0, 0x04, 0x0a, 0x07, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x69, 0x0a,
0x18, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x75, 0x74,
0x65, 0x5f, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41,
0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
0x52, 0x16, 0x61, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x52, 0x6f, 0x75, 0x74,
0x65, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x73, 0x6b, 0x69, 0x70,
0x70, 0x65, 0x64, 0x5f, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x5f, 0x73, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01,
0x28, 0x05, 0x52, 0x1d, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x4d, 0x61, 0x6e, 0x64, 0x61,
0x74, 0x6f, 0x72, 0x79, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e,
0x74, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x73, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c,
0x65, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x75,
0x73, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12,
0x59, 0x0a, 0x1b, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x68, 0x69,
0x63, 0x6c, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70,
0x52, 0x18, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,
0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x17, 0x6c, 0x61,
0x74, 0x65, 0x73, 0x74, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64,
0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69,
0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x14, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x56,
0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x5c, 0x0a,
0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45,
0x6e, 0x74, 0x72, 0x79, 0x52, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x74,
0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52,
0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x6f,
0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61,
0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x3a, 0x02, 0x38, 0x01, 0x22, 0xbc, 0x03, 0x0a, 0x19, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x12, 0x1b, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x06, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x12,
0x72, 0x0a, 0x0d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73,
0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6d,
0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e,
0x41, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67,
0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66,
0x69, 0x67, 0x73, 0x1a, 0x8d, 0x02, 0x0a, 0x10, 0x41, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64,
0x65, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70,
0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b,
0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x0c, 0x69,
0x6e, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x29, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x42, 0x03, 0xe0, 0x41,
0x02, 0x52, 0x0b, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x54,
0x0a, 0x0d, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69,
0x67, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0c, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x43, 0x6f,
0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x0a, 0x12, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x5f, 0x63,
0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08,
0x52, 0x11, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x70, 0x6f, 0x69,
0x6e, 0x74, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73,
0x65, 0x22, 0xb8, 0x13, 0x0a, 0x0d, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f,
0x64, 0x65, 0x6c, 0x12, 0x44, 0x0a, 0x09, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73,
0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x09,
0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x41, 0x0a, 0x08, 0x76, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d,
0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63,
0x6c, 0x65, 0x52, 0x08, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x12, 0x33, 0x0a, 0x13,
0x6d, 0x61, 0x78, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63,
0x6c, 0x65, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x11, 0x6d, 0x61, 0x78,
0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x88, 0x01,
0x01, 0x12, 0x46, 0x0a, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x72,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c,
0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x67, 0x6c, 0x6f,
0x62, 0x61, 0x6c, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d,
0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x40, 0x0a,
0x1d, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x07,
0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x12,
0x80, 0x01, 0x0a, 0x1a, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73,
0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x08,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65,
0x6c, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e,
0x63, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x52, 0x18, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x63,
0x65, 0x73, 0x12, 0x48, 0x0a, 0x21, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64,
0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x73,
0x72, 0x63, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1d, 0x64,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d,
0x61, 0x74, 0x72, 0x69, 0x78, 0x53, 0x72, 0x63, 0x54, 0x61, 0x67, 0x73, 0x12, 0x48, 0x0a, 0x21,
0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63,
0x65, 0x5f, 0x6d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x5f, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x61, 0x67,
0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1d, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x44,
0x73, 0x74, 0x54, 0x61, 0x67, 0x73, 0x12, 0x67, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69,
0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18,
0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41,
0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x52, 0x14, 0x74, 0x72, 0x61, 0x6e, 0x73,
0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x12,
0x81, 0x01, 0x0a, 0x1f, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70,
0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
0x69, 0x65, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e,
0x74, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69,
0x6c, 0x69, 0x74, 0x79, 0x52, 0x1d, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79,
0x70, 0x65, 0x49, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74,
0x69, 0x65, 0x73, 0x12, 0x73, 0x0a, 0x1a, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f,
0x74, 0x79, 0x70, 0x65, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74,
0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54,
0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x18,
0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75,
0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x65, 0x0a, 0x10, 0x70, 0x72, 0x65, 0x63,
0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e,
0x50, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x0f,
0x70, 0x72, 0x65, 0x63, 0x65, 0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x12,
0x5a, 0x0a, 0x0b, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x0f,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65,
0x6c, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x42, 0x02, 0x18, 0x01, 0x52,
0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0xf8, 0x01, 0x0a, 0x16,
0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65,
0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x12, 0x5a, 0x0a, 0x04, 0x72, 0x6f, 0x77, 0x73, 0x18, 0x01,
0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65,
0x6c, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e,
0x63, 0x65, 0x4d, 0x61, 0x74, 0x72, 0x69, 0x78, 0x2e, 0x52, 0x6f, 0x77, 0x52, 0x04, 0x72, 0x6f,
0x77, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x74,
0x61, 0x72, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x76,
0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x67, 0x1a, 0x56,
0x0a, 0x03, 0x52, 0x6f, 0x77, 0x12, 0x37, 0x0a, 0x09, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x16,
0x0a, 0x06, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x01, 0x52, 0x06,
0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x9d, 0x02, 0x0a, 0x0e, 0x50, 0x72, 0x65, 0x63, 0x65,
0x64, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x24, 0x0a, 0x0b, 0x66, 0x69, 0x72,
0x73, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00,
0x52, 0x0a, 0x66, 0x69, 0x72, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x88, 0x01, 0x01, 0x12,
0x2a, 0x0a, 0x11, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f, 0x69, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x69,
0x76, 0x65, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x66, 0x69, 0x72, 0x73,
0x74, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x12, 0x26, 0x0a, 0x0c, 0x73,
0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28,
0x05, 0x48, 0x01, 0x52, 0x0b, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x49, 0x6e, 0x64, 0x65, 0x78,
0x88, 0x01, 0x01, 0x12, 0x2c, 0x0a, 0x12, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x5f, 0x69, 0x73,
0x5f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52,
0x10, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x49, 0x73, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72,
0x79, 0x12, 0x42, 0x0a, 0x0f, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x0e, 0x0a, 0x0c, 0x5f, 0x66, 0x69, 0x72, 0x73, 0x74, 0x5f,
0x69, 0x6e, 0x64, 0x65, 0x78, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64,
0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x1a, 0xab, 0x05, 0x0a, 0x09, 0x42, 0x72, 0x65, 0x61, 0x6b,
0x52, 0x75, 0x6c, 0x65, 0x12, 0x69, 0x0a, 0x0e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x72, 0x65,
0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70,
0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52,
0x75, 0x6c, 0x65, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x52, 0x0d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x12,
0x7e, 0x0a, 0x15, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x5f, 0x63, 0x6f, 0x6e,
0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x42, 0x72, 0x65, 0x61,
0x6b, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x43,
0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x14, 0x66, 0x72, 0x65, 0x71, 0x75,
0x65, 0x6e, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a,
0xef, 0x01, 0x0a, 0x0c, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74,
0x12, 0x4f, 0x0a, 0x13, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61,
0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x11,
0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d,
0x65, 0x12, 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0f, 0x6c,
0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x41,
0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03,
0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72,
0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42,
0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x1a, 0xbc, 0x01, 0x0a, 0x13, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x43,
0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12, 0x4c, 0x0a, 0x12, 0x6d, 0x69, 0x6e,
0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x69,
0x6e, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x49, 0x6e,
0x74, 0x65, 0x72, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x3a, 0x02, 0x18, 0x01, 0x42, 0x16, 0x0a, 0x14, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x61, 0x63, 0x74,
0x69, 0x76, 0x65, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x73, 0x22, 0xae, 0x0f, 0x0a,
0x08, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x07, 0x70, 0x69, 0x63,
0x6b, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52,
0x07, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x73, 0x12, 0x53, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x69,
0x76, 0x65, 0x72, 0x69, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70,
0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73,
0x74, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x5a, 0x0a,
0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0e, 0x20,
0x03, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x4c, 0x6f, 0x61, 0x64,
0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0b, 0x6c, 0x6f,
0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x26, 0x0a, 0x0c, 0x70, 0x65, 0x6e,
0x61, 0x6c, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x01, 0x48,
0x00, 0x52, 0x0b, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x43, 0x6f, 0x73, 0x74, 0x88, 0x01,
0x01, 0x12, 0x36, 0x0a, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x76, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03,
0x28, 0x05, 0x52, 0x15, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x56, 0x65, 0x68, 0x69, 0x63,
0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x11, 0x63, 0x6f, 0x73,
0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x18, 0x06,
0x20, 0x03, 0x28, 0x01, 0x52, 0x0f, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x50, 0x65, 0x72, 0x56, 0x65,
0x68, 0x69, 0x63, 0x6c, 0x65, 0x12, 0x39, 0x0a, 0x19, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x5f, 0x70,
0x65, 0x72, 0x5f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63,
0x65, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x05, 0x52, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x50,
0x65, 0x72, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73,
0x12, 0x5a, 0x0a, 0x28, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65,
0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x5f,
0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x08, 0x20, 0x01,
0x28, 0x01, 0x48, 0x01, 0x52, 0x23, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x6f, 0x44, 0x65,
0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65, 0x44, 0x65,
0x74, 0x6f, 0x75, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x88, 0x01, 0x01, 0x12, 0x70, 0x0a, 0x28,
0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x69, 0x76, 0x65,
0x72, 0x79, 0x5f, 0x61, 0x62, 0x73, 0x6f, 0x6c, 0x75, 0x74, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x6f,
0x75, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x23, 0x70, 0x69, 0x63, 0x6b, 0x75,
0x70, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x41, 0x62, 0x73, 0x6f, 0x6c,
0x75, 0x74, 0x65, 0x44, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5b,
0x0a, 0x1d, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64, 0x65, 0x6c, 0x69,
0x76, 0x65, 0x72, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18,
0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x19, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x54, 0x6f, 0x44, 0x65, 0x6c, 0x69, 0x76, 0x65,
0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x73,
0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x0b, 0x20, 0x01,
0x28, 0x09, 0x52, 0x0c, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65,
0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52,
0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65,
0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12, 0x4c,
0x0a, 0x07, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43,
0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42,
0x02, 0x18, 0x01, 0x52, 0x07, 0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x1a, 0xc3, 0x06, 0x0a,
0x0c, 0x56, 0x69, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a,
0x10, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x52, 0x0f, 0x61, 0x72,
0x72, 0x69, 0x76, 0x61, 0x6c, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a,
0x10, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x5f, 0x77, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e,
0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52,
0x0f, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74,
0x12, 0x42, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x5f, 0x6c, 0x6f,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e,
0x67, 0x52, 0x11, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72, 0x65, 0x4c, 0x6f, 0x63, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x12, 0x55, 0x0a, 0x12, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74, 0x75, 0x72,
0x65, 0x5f, 0x77, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x11, 0x64, 0x65, 0x70, 0x61, 0x72, 0x74,
0x75, 0x72, 0x65, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x74,
0x61, 0x67, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x74, 0x61, 0x67, 0x73, 0x12,
0x4b, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x18,
0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52,
0x0b, 0x74, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x35, 0x0a, 0x08,
0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28,
0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x67, 0x0a, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x44, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69,
0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x52, 0x0b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73,
0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18,
0x0a, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0a, 0x76, 0x69, 0x73, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65,
0x73, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x09,
0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x4c, 0x0a, 0x07, 0x64, 0x65, 0x6d, 0x61, 0x6e,
0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x64, 0x65,
0x6d, 0x61, 0x6e, 0x64, 0x73, 0x1a, 0x6b, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d,
0x61, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
0x38, 0x01, 0x1a, 0x1e, 0x0a, 0x04, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x61, 0x6d,
0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x6f, 0x75,
0x6e, 0x74, 0x1a, 0x6b, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64,
0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20,
0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75,
0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2e,
0x4c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42,
0x0f, 0x0a, 0x0d, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x5f, 0x63, 0x6f, 0x73, 0x74,
0x42, 0x2b, 0x0a, 0x29, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x5f, 0x74, 0x6f, 0x5f, 0x64,
0x65, 0x6c, 0x69, 0x76, 0x65, 0x72, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x76, 0x65,
0x5f, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x22, 0xbf, 0x02,
0x0a, 0x1b, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e,
0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a,
0x05, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x74, 0x79,
0x70, 0x65, 0x73, 0x12, 0x80, 0x01, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74,
0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01,
0x28, 0x0e, 0x32, 0x4d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e,
0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x49, 0x6e,
0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64,
0x65, 0x52, 0x13, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69,
0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x86, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x63, 0x6f, 0x6d,
0x70, 0x61, 0x74, 0x69, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x24,
0x0a, 0x20, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x41, 0x54, 0x49, 0x42, 0x49, 0x4c, 0x49, 0x54,
0x59, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49,
0x45, 0x44, 0x10, 0x00, 0x12, 0x21, 0x0a, 0x1d, 0x4e, 0x4f, 0x54, 0x5f, 0x50, 0x45, 0x52, 0x46,
0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x45,
0x48, 0x49, 0x43, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x4e, 0x4f, 0x54, 0x5f, 0x49,
0x4e, 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x53,
0x49, 0x4d, 0x55, 0x4c, 0x54, 0x41, 0x4e, 0x45, 0x4f, 0x55, 0x53, 0x4c, 0x59, 0x10, 0x02, 0x22,
0xb3, 0x03, 0x0a, 0x17, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65,
0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x4d, 0x0a, 0x23, 0x72,
0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x5f, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74,
0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x61, 0x6c, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76,
0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72,
0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x41, 0x6c,
0x74, 0x65, 0x72, 0x6e, 0x61, 0x74, 0x69, 0x76, 0x65, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x64, 0x65,
0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74,
0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x16, 0x64, 0x65,
0x70, 0x65, 0x6e, 0x64, 0x65, 0x6e, 0x74, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54,
0x79, 0x70, 0x65, 0x73, 0x12, 0x70, 0x0a, 0x10, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d,
0x65, 0x6e, 0x74, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x45,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72,
0x65, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65, 0x6e,
0x74, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0f, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x6d, 0x65,
0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x22, 0x9c, 0x01, 0x0a, 0x0f, 0x52, 0x65, 0x71, 0x75, 0x69,
0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x20, 0x0a, 0x1c, 0x52, 0x45,
0x51, 0x55, 0x49, 0x52, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55,
0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1d, 0x0a, 0x19,
0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x42, 0x59, 0x5f, 0x53, 0x41, 0x4d,
0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x49,
0x4e, 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x41,
0x54, 0x5f, 0x50, 0x49, 0x43, 0x4b, 0x55, 0x50, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x10, 0x02, 0x12,
0x24, 0x0a, 0x20, 0x49, 0x4e, 0x5f, 0x53, 0x41, 0x4d, 0x45, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43,
0x4c, 0x45, 0x5f, 0x41, 0x54, 0x5f, 0x44, 0x45, 0x4c, 0x49, 0x56, 0x45, 0x52, 0x59, 0x5f, 0x54,
0x49, 0x4d, 0x45, 0x10, 0x03, 0x22, 0xed, 0x19, 0x0a, 0x07, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,
0x65, 0x12, 0x51, 0x0a, 0x0b, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x30, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x54, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x0a, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c,
0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x6f,
0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e,
0x67, 0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x4d, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x77, 0x61, 0x79, 0x70, 0x6f, 0x69,
0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74,
0x52, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12,
0x36, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74,
0x79, 0x70, 0x65, 0x2e, 0x4c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x4c,
0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x49, 0x0a, 0x0c, 0x65, 0x6e, 0x64, 0x5f, 0x77,
0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x61, 0x79,
0x70, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0b, 0x65, 0x6e, 0x64, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69,
0x6e, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x61, 0x67, 0x73,
0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x61, 0x67,
0x73, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x61, 0x67, 0x73, 0x18, 0x08, 0x20,
0x03, 0x28, 0x09, 0x52, 0x07, 0x65, 0x6e, 0x64, 0x54, 0x61, 0x67, 0x73, 0x12, 0x56, 0x0a, 0x12,
0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f,
0x77, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64,
0x6f, 0x77, 0x52, 0x10, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x69, 0x6e,
0x64, 0x6f, 0x77, 0x73, 0x12, 0x52, 0x0a, 0x10, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,
0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69,
0x6d, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x52, 0x0e, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d,
0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x73, 0x12, 0x3d, 0x0a, 0x18, 0x74, 0x72, 0x61, 0x76,
0x65, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74,
0x69, 0x70, 0x6c, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x16, 0x74, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x75, 0x6c, 0x74,
0x69, 0x70, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x60, 0x0a, 0x10, 0x75, 0x6e, 0x6c, 0x6f, 0x61,
0x64, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28,
0x0e, 0x32, 0x35, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69,
0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x52, 0x0f, 0x75, 0x6e, 0x6c, 0x6f, 0x61, 0x64,
0x69, 0x6e, 0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x56, 0x0a, 0x0b, 0x6c, 0x6f, 0x61,
0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x1e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65,
0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73,
0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0a, 0x6c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74,
0x73, 0x12, 0x22, 0x0a, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f,
0x75, 0x72, 0x18, 0x10, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65,
0x72, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x33, 0x0a, 0x16, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65,
0x72, 0x5f, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x65, 0x64, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18,
0x11, 0x20, 0x01, 0x28, 0x01, 0x52, 0x13, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x54, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x65, 0x64, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x2c, 0x0a, 0x12, 0x63, 0x6f,
0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72,
0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4b,
0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x1d, 0x0a, 0x0a, 0x66, 0x69, 0x78, 0x65,
0x64, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x09, 0x66, 0x69,
0x78, 0x65, 0x64, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x16, 0x75, 0x73, 0x65, 0x64, 0x5f,
0x69, 0x66, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x69, 0x73, 0x5f, 0x65, 0x6d, 0x70, 0x74,
0x79, 0x18, 0x14, 0x20, 0x01, 0x28, 0x08, 0x52, 0x12, 0x75, 0x73, 0x65, 0x64, 0x49, 0x66, 0x52,
0x6f, 0x75, 0x74, 0x65, 0x49, 0x73, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x65, 0x0a, 0x14, 0x72,
0x6f, 0x75, 0x74, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69,
0x6d, 0x69, 0x74, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65,
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x12,
0x72, 0x6f, 0x75, 0x74, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d,
0x69, 0x74, 0x12, 0x67, 0x0a, 0x15, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f, 0x64, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x16, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x33, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x13, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x44, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x5d, 0x0a, 0x14, 0x72,
0x6f, 0x75, 0x74, 0x65, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x69,
0x6d, 0x69, 0x74, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63,
0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x52, 0x12, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x44, 0x69, 0x73,
0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x96, 0x01, 0x0a, 0x23, 0x65,
0x78, 0x74, 0x72, 0x61, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x74, 0x79,
0x70, 0x65, 0x18, 0x18, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e,
0x45, 0x78, 0x74, 0x72, 0x61, 0x56, 0x69, 0x73, 0x69, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x56, 0x69, 0x73, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x52, 0x1e, 0x65, 0x78, 0x74, 0x72, 0x61, 0x56, 0x69, 0x73, 0x69, 0x74, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x56, 0x69, 0x73, 0x69, 0x74, 0x54,
0x79, 0x70, 0x65, 0x12, 0x46, 0x0a, 0x0a, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x72, 0x75, 0x6c,
0x65, 0x18, 0x19, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65,
0x52, 0x09, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x6c,
0x61, 0x62, 0x65, 0x6c, 0x18, 0x1b, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65,
0x6c, 0x12, 0x16, 0x0a, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x18, 0x1c, 0x20, 0x01, 0x28,
0x08, 0x52, 0x06, 0x69, 0x67, 0x6e, 0x6f, 0x72, 0x65, 0x12, 0x30, 0x0a, 0x12, 0x62, 0x72, 0x65,
0x61, 0x6b, 0x5f, 0x72, 0x75, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x18,
0x1d, 0x20, 0x03, 0x28, 0x05, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x62, 0x72, 0x65, 0x61, 0x6b,
0x52, 0x75, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x12, 0x52, 0x0a, 0x0a, 0x63,
0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43,
0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42,
0x02, 0x18, 0x01, 0x52, 0x0a, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12,
0x6c, 0x0a, 0x14, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6e,
0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70,
0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x74,
0x65, 0x72, 0x76, 0x61, 0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x12, 0x73, 0x74, 0x61, 0x72, 0x74,
0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x12, 0x68, 0x0a,
0x12, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76,
0x61, 0x6c, 0x73, 0x18, 0x0f, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74,
0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61,
0x6c, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x65, 0x6e, 0x64, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e,
0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x73, 0x1a, 0xa8, 0x03, 0x0a, 0x09, 0x4c, 0x6f, 0x61, 0x64,
0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1e, 0x0a, 0x08, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x61,
0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x07, 0x6d, 0x61, 0x78, 0x4c, 0x6f,
0x61, 0x64, 0x88, 0x01, 0x01, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61,
0x78, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x6f,
0x66, 0x74, 0x4d, 0x61, 0x78, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x3d, 0x0a, 0x1c, 0x63, 0x6f, 0x73,
0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x61, 0x62, 0x6f, 0x76, 0x65,
0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x52,
0x17, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x55, 0x6e, 0x69, 0x74, 0x41, 0x62, 0x6f, 0x76,
0x65, 0x53, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x12, 0x68, 0x0a, 0x13, 0x73, 0x74, 0x61, 0x72,
0x74, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18,
0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x61,
0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52,
0x11, 0x73, 0x74, 0x61, 0x72, 0x74, 0x4c, 0x6f, 0x61, 0x64, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76,
0x61, 0x6c, 0x12, 0x64, 0x0a, 0x11, 0x65, 0x6e, 0x64, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x5f, 0x69,
0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x38, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x56, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x2e, 0x49,
0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x52, 0x0f, 0x65, 0x6e, 0x64, 0x4c, 0x6f, 0x61, 0x64,
0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x1a, 0x3b, 0x0a, 0x08, 0x49, 0x6e, 0x74, 0x65,
0x72, 0x76, 0x61, 0x6c, 0x12, 0x10, 0x0a, 0x03, 0x6d, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28,
0x03, 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x15, 0x0a, 0x03, 0x6d, 0x61, 0x78, 0x18, 0x02, 0x20,
0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x42, 0x06, 0x0a,
0x04, 0x5f, 0x6d, 0x61, 0x78, 0x42, 0x0b, 0x0a, 0x09, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f,
0x61, 0x64, 0x1a, 0xe9, 0x03, 0x0a, 0x0d, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c,
0x69, 0x6d, 0x69, 0x74, 0x12, 0x3c, 0x0a, 0x0c, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x6d, 0x61, 0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x12, 0x45, 0x0a, 0x11, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x73, 0x6f, 0x66, 0x74, 0x4d, 0x61,
0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x0a, 0x1c, 0x63, 0x6f, 0x73,
0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72,
0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48,
0x00, 0x52, 0x17, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x41, 0x66,
0x74, 0x65, 0x72, 0x53, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x12, 0x58, 0x0a,
0x1b, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f,
0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x18, 0x71,
0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x53, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x62, 0x0a, 0x2d, 0x63, 0x6f, 0x73, 0x74, 0x5f,
0x70, 0x65, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f,
0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x71, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69, 0x63, 0x5f,
0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01,
0x52, 0x26, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x53, 0x71, 0x75, 0x61, 0x72, 0x65, 0x48,
0x6f, 0x75, 0x72, 0x41, 0x66, 0x74, 0x65, 0x72, 0x51, 0x75, 0x61, 0x64, 0x72, 0x61, 0x74, 0x69,
0x63, 0x53, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x88, 0x01, 0x01, 0x42, 0x1f, 0x0a, 0x1d, 0x5f,
0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x66,
0x74, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x42, 0x30, 0x0a, 0x2e,
0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x73, 0x71, 0x75, 0x61, 0x72, 0x65,
0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x71, 0x75, 0x61, 0x64,
0x72, 0x61, 0x74, 0x69, 0x63, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x1a, 0x6e,
0x0a, 0x0f, 0x4c, 0x6f, 0x61, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72,
0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03,
0x6b, 0x65, 0x79, 0x12, 0x45, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x4c, 0x69,
0x6d, 0x69, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x6c,
0x0a, 0x23, 0x45, 0x78, 0x74, 0x72, 0x61, 0x56, 0x69, 0x73, 0x69, 0x74, 0x44, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x46, 0x6f, 0x72, 0x56, 0x69, 0x73, 0x69, 0x74, 0x54, 0x79, 0x70, 0x65,
0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x36, 0x0a, 0x0a,
0x54, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x17, 0x54, 0x52,
0x41, 0x56, 0x45, 0x4c, 0x5f, 0x4d, 0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43,
0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x52, 0x49, 0x56, 0x49,
0x4e, 0x47, 0x10, 0x01, 0x22, 0x62, 0x0a, 0x0f, 0x55, 0x6e, 0x6c, 0x6f, 0x61, 0x64, 0x69, 0x6e,
0x67, 0x50, 0x6f, 0x6c, 0x69, 0x63, 0x79, 0x12, 0x20, 0x0a, 0x1c, 0x55, 0x4e, 0x4c, 0x4f, 0x41,
0x44, 0x49, 0x4e, 0x47, 0x5f, 0x50, 0x4f, 0x4c, 0x49, 0x43, 0x59, 0x5f, 0x55, 0x4e, 0x53, 0x50,
0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x41, 0x53,
0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x01,
0x12, 0x16, 0x0a, 0x12, 0x46, 0x49, 0x52, 0x53, 0x54, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x49, 0x52,
0x53, 0x54, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x74, 0x72, 0x61,
0x76, 0x65, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x75, 0x6c,
0x74, 0x69, 0x70, 0x6c, 0x65, 0x22, 0xf1, 0x03, 0x0a, 0x0a, 0x54, 0x69, 0x6d, 0x65, 0x57, 0x69,
0x6e, 0x64, 0x6f, 0x77, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12,
0x35, 0x0a, 0x08, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x07, 0x65,
0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x42, 0x0a, 0x0f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x73,
0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0d, 0x73, 0x6f, 0x66,
0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x73, 0x6f,
0x66, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0b, 0x73,
0x6f, 0x66, 0x74, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x51, 0x0a, 0x24, 0x63, 0x6f,
0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x62, 0x65, 0x66, 0x6f,
0x72, 0x65, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x48, 0x00, 0x52, 0x1e, 0x63, 0x6f, 0x73, 0x74,
0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x42, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x53, 0x6f, 0x66,
0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4b, 0x0a,
0x21, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x61,
0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69,
0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x48, 0x01, 0x52, 0x1b, 0x63, 0x6f, 0x73, 0x74,
0x50, 0x65, 0x72, 0x48, 0x6f, 0x75, 0x72, 0x41, 0x66, 0x74, 0x65, 0x72, 0x53, 0x6f, 0x66, 0x74,
0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x27, 0x0a, 0x25, 0x5f, 0x63,
0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x62, 0x65, 0x66,
0x6f, 0x72, 0x65, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74,
0x69, 0x6d, 0x65, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72,
0x5f, 0x68, 0x6f, 0x75, 0x72, 0x5f, 0x61, 0x66, 0x74, 0x65, 0x72, 0x5f, 0x73, 0x6f, 0x66, 0x74,
0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x22, 0x40, 0x0a, 0x10, 0x43, 0x61, 0x70,
0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x12, 0x0a,
0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70,
0x65, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03,
0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x22, 0x92, 0x01, 0x0a, 0x18,
0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79,
0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x20, 0x0a, 0x09,
0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48,
0x00, 0x52, 0x08, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01, 0x12, 0x20,
0x0a, 0x09, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28,
0x03, 0x48, 0x01, 0x52, 0x08, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x88, 0x01, 0x01,
0x3a, 0x02, 0x18, 0x01, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c,
0x75, 0x65, 0x42, 0x0c, 0x0a, 0x0a, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x22, 0xf7, 0x01, 0x0a, 0x0d, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x6d,
0x69, 0x74, 0x12, 0x22, 0x0a, 0x0a, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x48, 0x00, 0x52, 0x09, 0x6d, 0x61, 0x78, 0x4d, 0x65, 0x74,
0x65, 0x72, 0x73, 0x88, 0x01, 0x01, 0x12, 0x2b, 0x0a, 0x0f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d,
0x61, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x48,
0x01, 0x52, 0x0d, 0x73, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x4d, 0x65, 0x74, 0x65, 0x72, 0x73,
0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x21, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f,
0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x5f,
0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x01, 0x48, 0x02,
0x52, 0x1c, 0x63, 0x6f, 0x73, 0x74, 0x50, 0x65, 0x72, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74,
0x65, 0x72, 0x41, 0x62, 0x6f, 0x76, 0x65, 0x53, 0x6f, 0x66, 0x74, 0x4d, 0x61, 0x78, 0x88, 0x01,
0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
0x42, 0x12, 0x0a, 0x10, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x65,
0x74, 0x65, 0x72, 0x73, 0x42, 0x24, 0x0a, 0x22, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65,
0x72, 0x5f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x62, 0x6f, 0x76,
0x65, 0x5f, 0x73, 0x6f, 0x66, 0x74, 0x5f, 0x6d, 0x61, 0x78, 0x22, 0xe3, 0x02, 0x0a, 0x14, 0x54,
0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75,
0x74, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x61, 0x67, 0x18, 0x01,
0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x72, 0x63, 0x54, 0x61, 0x67, 0x12, 0x28, 0x0a, 0x10,
0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x73, 0x72, 0x63, 0x5f, 0x74, 0x61, 0x67,
0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64,
0x53, 0x72, 0x63, 0x54, 0x61, 0x67, 0x12, 0x17, 0x0a, 0x07, 0x64, 0x73, 0x74, 0x5f, 0x74, 0x61,
0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x64, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12,
0x28, 0x0a, 0x10, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x64, 0x73, 0x74, 0x5f,
0x74, 0x61, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x65, 0x78, 0x63, 0x6c, 0x75,
0x64, 0x65, 0x64, 0x44, 0x73, 0x74, 0x54, 0x61, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x63, 0x6f, 0x73,
0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x01, 0x52, 0x04, 0x63, 0x6f, 0x73, 0x74, 0x12, 0x2c, 0x0a,
0x12, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6b, 0x69, 0x6c, 0x6f, 0x6d, 0x65,
0x74, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x01, 0x52, 0x10, 0x63, 0x6f, 0x73, 0x74, 0x50,
0x65, 0x72, 0x4b, 0x69, 0x6c, 0x6f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x12, 0x52, 0x0a, 0x0e, 0x64,
0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x07, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x76, 0x31, 0x2e, 0x44, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74,
0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12,
0x2f, 0x0a, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x64, 0x65, 0x6c, 0x61, 0x79,
0x22, 0xa0, 0x01, 0x0a, 0x08, 0x57, 0x61, 0x79, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x44, 0x0a,
0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x26, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4c,
0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x12, 0x1b, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x64, 0x18,
0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x49, 0x64,
0x12, 0x20, 0x0a, 0x0c, 0x73, 0x69, 0x64, 0x65, 0x5f, 0x6f, 0x66, 0x5f, 0x72, 0x6f, 0x61, 0x64,
0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0a, 0x73, 0x69, 0x64, 0x65, 0x4f, 0x66, 0x52, 0x6f,
0x61, 0x64, 0x42, 0x0f, 0x0a, 0x0d, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74,
0x79, 0x70, 0x65, 0x22, 0x63, 0x0a, 0x08, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12,
0x2c, 0x0a, 0x07, 0x6c, 0x61, 0x74, 0x5f, 0x6c, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x13, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x74, 0x79, 0x70, 0x65, 0x2e, 0x4c,
0x61, 0x74, 0x4c, 0x6e, 0x67, 0x52, 0x06, 0x6c, 0x61, 0x74, 0x4c, 0x6e, 0x67, 0x12, 0x1d, 0x0a,
0x07, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00,
0x52, 0x07, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x88, 0x01, 0x01, 0x42, 0x0a, 0x0a, 0x08,
0x5f, 0x68, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x22, 0x8b, 0x05, 0x0a, 0x09, 0x42, 0x72, 0x65,
0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x5b, 0x0a, 0x0e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f,
0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x42, 0x72,
0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71,
0x75, 0x65, 0x73, 0x74, 0x52, 0x0d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65,
0x73, 0x74, 0x73, 0x12, 0x70, 0x0a, 0x15, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79,
0x5f, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x75, 0x6c, 0x65, 0x2e, 0x46, 0x72, 0x65, 0x71,
0x75, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52,
0x14, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72,
0x61, 0x69, 0x6e, 0x74, 0x73, 0x1a, 0xef, 0x01, 0x0a, 0x0c, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52,
0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x13, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65,
0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42,
0x03, 0xe0, 0x41, 0x02, 0x52, 0x11, 0x65, 0x61, 0x72, 0x6c, 0x69, 0x65, 0x73, 0x74, 0x53, 0x74,
0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x4b, 0x0a, 0x11, 0x6c, 0x61, 0x74, 0x65, 0x73,
0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01,
0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x03,
0xe0, 0x41, 0x02, 0x52, 0x0f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74,
0x54, 0x69, 0x6d, 0x65, 0x12, 0x41, 0x0a, 0x0c, 0x6d, 0x69, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x6d, 0x69, 0x6e, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0xbc, 0x01, 0x0a, 0x13, 0x46, 0x72, 0x65, 0x71,
0x75, 0x65, 0x6e, 0x63, 0x79, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x12,
0x4c, 0x0a, 0x12, 0x6d, 0x69, 0x6e, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x10, 0x6d, 0x69, 0x6e,
0x42, 0x72, 0x65, 0x61, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x57, 0x0a,
0x18, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x62, 0x72, 0x65, 0x61, 0x6b,
0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52,
0x15, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x44, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x81, 0x1c, 0x0a, 0x0d, 0x53, 0x68, 0x69, 0x70, 0x6d,
0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x76, 0x65, 0x68, 0x69,
0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52,
0x0c, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x23, 0x0a,
0x0d, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02,
0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x61, 0x62,
0x65, 0x6c, 0x12, 0x48, 0x0a, 0x12, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x73, 0x74,
0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x10, 0x76, 0x65, 0x68, 0x69,
0x63, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x44, 0x0a, 0x10,
0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65,
0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61,
0x6d, 0x70, 0x52, 0x0e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x6e, 0x64, 0x54, 0x69,
0x6d, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x76, 0x69, 0x73, 0x69, 0x74, 0x73, 0x18, 0x07, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e,
0x56, 0x69, 0x73, 0x69, 0x74, 0x52, 0x06, 0x76, 0x69, 0x73, 0x69, 0x74, 0x73, 0x12, 0x58, 0x0a,
0x0b, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e,
0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x74, 0x72, 0x61, 0x6e,
0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3e, 0x0a, 0x1b, 0x68, 0x61, 0x73, 0x5f, 0x74,
0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x61, 0x73, 0x69, 0x62, 0x69,
0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x19, 0x68, 0x61,
0x73, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x65, 0x61, 0x73, 0x69, 0x62,
0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x62, 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65,
0x5f, 0x70, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53,
0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x63,
0x6f, 0x64, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x0d, 0x72, 0x6f,
0x75, 0x74, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x49, 0x0a, 0x06, 0x62,
0x72, 0x65, 0x61, 0x6b, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d,
0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d,
0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x52, 0x06,
0x62, 0x72, 0x65, 0x61, 0x6b, 0x73, 0x12, 0x49, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65,
0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63,
0x73, 0x12, 0x5c, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x73,
0x18, 0x11, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f,
0x75, 0x74, 0x65, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x52, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x12,
0x28, 0x0a, 0x10, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63,
0x6f, 0x73, 0x74, 0x18, 0x12, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65,
0x54, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73, 0x74, 0x12, 0x4f, 0x0a, 0x09, 0x65, 0x6e, 0x64,
0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61,
0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x02, 0x18, 0x01,
0x52, 0x08, 0x65, 0x6e, 0x64, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x5d, 0x0a, 0x0c, 0x74, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x65, 0x70, 0x73, 0x18, 0x0e, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x36, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x74, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x73, 0x12, 0x44, 0x0a, 0x0e, 0x76, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x02, 0x18, 0x01,
0x52, 0x0d, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x44, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x12,
0x6e, 0x0a, 0x18, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x5f,
0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x18, 0x10, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x31, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44,
0x65, 0x6c, 0x61, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x15, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x42,
0x65, 0x66, 0x6f, 0x72, 0x65, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x45, 0x6e, 0x64, 0x1a,
0x7d, 0x0a, 0x05, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54,
0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x02, 0x18, 0x01, 0x1a, 0x91,
0x06, 0x0a, 0x05, 0x56, 0x69, 0x73, 0x69, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x69, 0x70,
0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05,
0x52, 0x0d, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12,
0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x70, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x18, 0x02, 0x20, 0x01,
0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x50, 0x69, 0x63, 0x6b, 0x75, 0x70, 0x12, 0x2e, 0x0a, 0x13,
0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x5f, 0x69, 0x6e,
0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x76, 0x69, 0x73, 0x69, 0x74,
0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x39, 0x0a, 0x0a,
0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74,
0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0c, 0x6c, 0x6f, 0x61, 0x64, 0x5f,
0x64, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x42, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69,
0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x69, 0x73, 0x69, 0x74,
0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72,
0x79, 0x52, 0x0b, 0x6c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x31,
0x0a, 0x06, 0x64, 0x65, 0x74, 0x6f, 0x75, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66,
0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x64, 0x65, 0x74, 0x6f, 0x75,
0x72, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x6c, 0x61,
0x62, 0x65, 0x6c, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x68, 0x69, 0x70, 0x6d,
0x65, 0x6e, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x1f, 0x0a, 0x0b, 0x76, 0x69, 0x73, 0x69,
0x74, 0x5f, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x76,
0x69, 0x73, 0x69, 0x74, 0x4c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x57, 0x0a, 0x0d, 0x61, 0x72, 0x72,
0x69, 0x76, 0x61, 0x6c, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79,
0x42, 0x02, 0x18, 0x01, 0x52, 0x0c, 0x61, 0x72, 0x72, 0x69, 0x76, 0x61, 0x6c, 0x4c, 0x6f, 0x61,
0x64, 0x73, 0x12, 0x63, 0x0a, 0x12, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x62, 0x65, 0x66, 0x6f,
0x72, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x44, 0x65, 0x6c, 0x61,
0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x10, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x42, 0x65, 0x66, 0x6f,
0x72, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x4c, 0x0a, 0x07, 0x64, 0x65, 0x6d, 0x61, 0x6e,
0x64, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x07, 0x64, 0x65,
0x6d, 0x61, 0x6e, 0x64, 0x73, 0x1a, 0x6b, 0x0a, 0x10, 0x4c, 0x6f, 0x61, 0x64, 0x44, 0x65, 0x6d,
0x61, 0x6e, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79,
0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x41, 0x0a, 0x05, 0x76,
0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02,
0x38, 0x01, 0x1a, 0x98, 0x07, 0x0a, 0x0a, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f,
0x6e, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x5f,
0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18,
0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x44, 0x69, 0x73,
0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x74,
0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x6e, 0x61, 0x76,
0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x74,
0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69,
0x6c, 0x61, 0x62, 0x6c, 0x65, 0x12, 0x40, 0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e,
0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x62, 0x72, 0x65, 0x61, 0x6b,
0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x62, 0x72, 0x65, 0x61,
0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x0d, 0x77, 0x61, 0x69,
0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b,
0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x77, 0x61, 0x69,
0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x74, 0x6f, 0x74,
0x61, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28,
0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f,
0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x74, 0x6f,
0x74, 0x61, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x0a, 0x0a, 0x73,
0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32,
0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61,
0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f,
0x70, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x6f,
0x64, 0x65, 0x64, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x0d, 0x72, 0x6f, 0x75,
0x74, 0x65, 0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x6d, 0x0a, 0x0d, 0x76, 0x65,
0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x0b, 0x20, 0x03, 0x28,
0x0b, 0x32, 0x48, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64,
0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31,
0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x54,
0x72, 0x61, 0x6e, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c,
0x65, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0c, 0x76, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x48, 0x0a, 0x05, 0x6c, 0x6f, 0x61,
0x64, 0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79,
0x51, 0x75, 0x61, 0x6e, 0x74, 0x69, 0x74, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x6c, 0x6f,
0x61, 0x64, 0x73, 0x1a, 0x78, 0x0a, 0x11, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f,
0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18,
0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x05, 0x76, 0x61,
0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e,
0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f,
0x61, 0x64, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x25, 0x0a,
0x0b, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x12, 0x16, 0x0a, 0x06,
0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d,
0x6f, 0x75, 0x6e, 0x74, 0x1a, 0x29, 0x0a, 0x0f, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x50,
0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74,
0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x1a,
0x79, 0x0a, 0x05, 0x42, 0x72, 0x65, 0x61, 0x6b, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72,
0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54,
0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54,
0x69, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x1a, 0x8e, 0x02, 0x0a, 0x0a, 0x54,
0x72, 0x61, 0x76, 0x65, 0x6c, 0x53, 0x74, 0x65, 0x70, 0x12, 0x35, 0x0a, 0x08, 0x64, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x27, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74,
0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x61,
0x6e, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x38, 0x0a, 0x18, 0x74, 0x72, 0x61,
0x66, 0x66, 0x69, 0x63, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x5f, 0x75, 0x6e, 0x61, 0x76, 0x61, 0x69,
0x6c, 0x61, 0x62, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x74, 0x72, 0x61,
0x66, 0x66, 0x69, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61,
0x62, 0x6c, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x6f, 0x6c,
0x79, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x3b, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d,
0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d,
0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x2e, 0x45, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64,
0x50, 0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x52, 0x0d, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x50,
0x6f, 0x6c, 0x79, 0x6c, 0x69, 0x6e, 0x65, 0x3a, 0x02, 0x18, 0x01, 0x1a, 0x3d, 0x0a, 0x0f, 0x52,
0x6f, 0x75, 0x74, 0x65, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10,
0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79,
0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52,
0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xcd, 0x05, 0x0a, 0x0f, 0x53,
0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x14,
0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69,
0x6e, 0x64, 0x65, 0x78, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x02, 0x20,
0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x12, 0x4e, 0x0a, 0x07, 0x72, 0x65,
0x61, 0x73, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x67, 0x6f,
0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d,
0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x70,
0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f,
0x6e, 0x52, 0x07, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0xbd, 0x04, 0x0a, 0x06, 0x52,
0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x4d, 0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20,
0x01, 0x28, 0x0e, 0x32, 0x39, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x76, 0x31, 0x2e, 0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65,
0x6e, 0x74, 0x2e, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2e, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x04,
0x63, 0x6f, 0x64, 0x65, 0x12, 0x37, 0x0a, 0x15, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f,
0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20,
0x01, 0x28, 0x05, 0x48, 0x00, 0x52, 0x13, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x56, 0x65,
0x68, 0x69, 0x63, 0x6c, 0x65, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x88, 0x01, 0x01, 0x12, 0x43, 0x0a,
0x1e, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x65, 0x78, 0x63, 0x65, 0x65, 0x64, 0x65,
0x64, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18,
0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1b, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x45, 0x78,
0x63, 0x65, 0x65, 0x64, 0x65, 0x64, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x54, 0x79,
0x70, 0x65, 0x22, 0xcb, 0x02, 0x0a, 0x04, 0x43, 0x6f, 0x64, 0x65, 0x12, 0x14, 0x0a, 0x10, 0x43,
0x4f, 0x44, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10,
0x00, 0x12, 0x0e, 0x0a, 0x0a, 0x4e, 0x4f, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x10,
0x01, 0x12, 0x23, 0x0a, 0x1f, 0x44, 0x45, 0x4d, 0x41, 0x4e, 0x44, 0x5f, 0x45, 0x58, 0x43, 0x45,
0x45, 0x44, 0x53, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x43, 0x41, 0x50, 0x41,
0x43, 0x49, 0x54, 0x59, 0x10, 0x02, 0x12, 0x35, 0x0a, 0x31, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54,
0x5f, 0x42, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x57, 0x49,
0x54, 0x48, 0x49, 0x4e, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x44, 0x49, 0x53,
0x54, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x10, 0x03, 0x12, 0x35, 0x0a,
0x31, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x42, 0x45, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f,
0x52, 0x4d, 0x45, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e, 0x5f, 0x56, 0x45, 0x48, 0x49,
0x43, 0x4c, 0x45, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x4d,
0x49, 0x54, 0x10, 0x04, 0x12, 0x3c, 0x0a, 0x38, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x42,
0x45, 0x5f, 0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48,
0x49, 0x4e, 0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x56, 0x45,
0x4c, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54,
0x10, 0x05, 0x12, 0x33, 0x0a, 0x2f, 0x43, 0x41, 0x4e, 0x4e, 0x4f, 0x54, 0x5f, 0x42, 0x45, 0x5f,
0x50, 0x45, 0x52, 0x46, 0x4f, 0x52, 0x4d, 0x45, 0x44, 0x5f, 0x57, 0x49, 0x54, 0x48, 0x49, 0x4e,
0x5f, 0x56, 0x45, 0x48, 0x49, 0x43, 0x4c, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x5f, 0x57, 0x49,
0x4e, 0x44, 0x4f, 0x57, 0x53, 0x10, 0x06, 0x12, 0x17, 0x0a, 0x13, 0x56, 0x45, 0x48, 0x49, 0x43,
0x4c, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x41, 0x4c, 0x4c, 0x4f, 0x57, 0x45, 0x44, 0x10, 0x07,
0x42, 0x18, 0x0a, 0x16, 0x5f, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x76, 0x65, 0x68,
0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x94, 0x07, 0x0a, 0x11, 0x41,
0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
0x12, 0x38, 0x0a, 0x18, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x73, 0x68,
0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01,
0x28, 0x05, 0x52, 0x16, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x65, 0x64, 0x53, 0x68, 0x69,
0x70, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x74, 0x72,
0x61, 0x76, 0x65, 0x6c, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0e,
0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e,
0x0a, 0x0d, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18,
0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70,
0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x0c, 0x77, 0x61, 0x69, 0x74, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40,
0x0a, 0x0e, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x52, 0x0d, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x12, 0x40, 0x0a, 0x0e, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x62, 0x72, 0x65, 0x61, 0x6b, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x76, 0x69, 0x73, 0x69, 0x74, 0x5f, 0x64, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x76, 0x69, 0x73, 0x69, 0x74, 0x44, 0x75, 0x72, 0x61,
0x74, 0x69, 0x6f, 0x6e, 0x12, 0x40, 0x0a, 0x0e, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x64, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44,
0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x44, 0x75,
0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x34, 0x0a, 0x16, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c,
0x5f, 0x64, 0x69, 0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73,
0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x14, 0x74, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x44, 0x69,
0x73, 0x74, 0x61, 0x6e, 0x63, 0x65, 0x4d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5a, 0x0a, 0x09,
0x6d, 0x61, 0x78, 0x5f, 0x6c, 0x6f, 0x61, 0x64, 0x73, 0x18, 0x09, 0x20, 0x03, 0x28, 0x0b, 0x32,
0x3d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f,
0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41,
0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65, 0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73,
0x2e, 0x4d, 0x61, 0x78, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x08,
0x6d, 0x61, 0x78, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x12, 0x54, 0x0a, 0x05, 0x63, 0x6f, 0x73, 0x74,
0x73, 0x18, 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65,
0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x67, 0x72, 0x65, 0x67, 0x61, 0x74, 0x65,
0x64, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x2e, 0x43, 0x6f, 0x73, 0x74, 0x73, 0x45, 0x6e,
0x74, 0x72, 0x79, 0x42, 0x02, 0x18, 0x01, 0x52, 0x05, 0x63, 0x6f, 0x73, 0x74, 0x73, 0x12, 0x21,
0x0a, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x0b, 0x20, 0x01,
0x28, 0x01, 0x42, 0x02, 0x18, 0x01, 0x52, 0x09, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x43, 0x6f, 0x73,
0x74, 0x1a, 0x74, 0x0a, 0x0d, 0x4d, 0x61, 0x78, 0x4c, 0x6f, 0x61, 0x64, 0x73, 0x45, 0x6e, 0x74,
0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
0x03, 0x6b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f,
0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e,
0x76, 0x31, 0x2e, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65,
0x2e, 0x56, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x4c, 0x6f, 0x61, 0x64, 0x52, 0x05, 0x76, 0x61,
0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x38, 0x0a, 0x0a, 0x43, 0x6f, 0x73, 0x74, 0x73,
0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01,
0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x18, 0x02, 0x20, 0x01, 0x28, 0x01, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38,
0x01, 0x22, 0x99, 0x07, 0x0a, 0x1a, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f,
0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
0x12, 0x43, 0x0a, 0x06, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x06, 0x72,
0x6f, 0x75, 0x74, 0x65, 0x73, 0x12, 0x5a, 0x0a, 0x11, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64,
0x5f, 0x73, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b,
0x32, 0x2d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x53, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74, 0x52,
0x10, 0x73, 0x6b, 0x69, 0x70, 0x70, 0x65, 0x64, 0x53, 0x68, 0x69, 0x70, 0x6d, 0x65, 0x6e, 0x74,
0x73, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
0x5f, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03,
0x28, 0x0b, 0x32, 0x4d, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75,
0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76,
0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f, 0x6c, 0x75, 0x74, 0x69,
0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x2e, 0x43, 0x6f, 0x6e,
0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x52, 0x15, 0x63, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x6c,
0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0xd2, 0x04, 0x0a, 0x14, 0x43, 0x6f, 0x6e,
0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x12, 0x7a, 0x0a, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73,
0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x58, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f,
0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74,
0x2e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x78,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x52, 0x0b, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x27, 0x0a,
0x0f, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x63, 0x65, 0x73,
0x18, 0x02, 0x20, 0x03, 0x28, 0x05, 0x52, 0x0e, 0x76, 0x65, 0x68, 0x69, 0x63, 0x6c, 0x65, 0x49,
0x6e, 0x64, 0x69, 0x63, 0x65, 0x73, 0x1a, 0x94, 0x03, 0x0a, 0x0a, 0x52, 0x65, 0x6c, 0x61, 0x78,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x74, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01,
0x20, 0x01, 0x28, 0x0e, 0x32, 0x5e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c,
0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e,
0x2e, 0x76, 0x31, 0x2e, 0x49, 0x6e, 0x6a, 0x65, 0x63, 0x74, 0x65, 0x64, 0x53, 0x6f, 0x6c, 0x75,
0x74, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x2e, 0x43,
0x6f, 0x6e, 0x73, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74,
0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x4c,
0x65, 0x76, 0x65, 0x6c, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x41, 0x0a, 0x0e, 0x74,
0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20,
0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f,
0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52,
0x0d, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x32,
0x0a, 0x15, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x5f, 0x76, 0x69, 0x73, 0x69,
0x74, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x74,
0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x56, 0x69, 0x73, 0x69, 0x74, 0x43, 0x6f, 0x75,
0x6e, 0x74, 0x22, 0x98, 0x01, 0x0a, 0x05, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x15, 0x0a, 0x11,
0x4c, 0x45, 0x56, 0x45, 0x4c, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45,
0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x52, 0x45, 0x4c, 0x41, 0x58, 0x5f, 0x56, 0x49, 0x53,
0x49, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x5f, 0x41, 0x46, 0x54, 0x45, 0x52, 0x5f, 0x54,
0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x01, 0x12, 0x32, 0x0a, 0x2e, 0x52, 0x45,
0x4c, 0x41, 0x58, 0x5f, 0x56, 0x49, 0x53, 0x49, 0x54, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x53, 0x5f,
0x41, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x51, 0x55, 0x45, 0x4e, 0x43, 0x45, 0x5f, 0x41, 0x46, 0x54,
0x45, 0x52, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x02, 0x12, 0x1d,
0x0a, 0x19, 0x52, 0x45, 0x4c, 0x41, 0x58, 0x5f, 0x41, 0x4c, 0x4c, 0x5f, 0x41, 0x46, 0x54, 0x45,
0x52, 0x5f, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x03, 0x22, 0xd3, 0x03,
0x0a, 0x1c, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x56,
0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x12,
0x0a, 0x04, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x63, 0x6f,
0x64, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x5f, 0x6e, 0x61,
0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61,
0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x61, 0x0a, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x18,
0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x49, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63,
0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f,
0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75,
0x72, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f,
0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65,
0x52, 0x06, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x72, 0x72, 0x6f,
0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52,
0x0c, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x29, 0x0a,
0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65,
0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x69,
0x6e, 0x67, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x73, 0x1a, 0xc8, 0x01, 0x0a, 0x0e, 0x46, 0x69, 0x65,
0x6c, 0x64, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e,
0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12,
0x16, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x48, 0x00,
0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x12, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x04,
0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x66, 0x0a, 0x09, 0x73,
0x75, 0x62, 0x5f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x49,
0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64,
0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x46, 0x69, 0x65, 0x6c, 0x64,
0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x73, 0x75, 0x62, 0x46, 0x69,
0x65, 0x6c, 0x64, 0x42, 0x0e, 0x0a, 0x0c, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x5f, 0x6f, 0x72, 0x5f,
0x6b, 0x65, 0x79, 0x32, 0xe0, 0x04, 0x0a, 0x0c, 0x46, 0x6c, 0x65, 0x65, 0x74, 0x52, 0x6f, 0x75,
0x74, 0x69, 0x6e, 0x67, 0x12, 0xe2, 0x01, 0x0a, 0x0d, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x12, 0x32, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e,
0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f,
0x75, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22,
0x68, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x62, 0x22, 0x31, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61,
0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f,
0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x6f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x2a, 0x22,
0x25, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f,
0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a,
0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x12, 0x94, 0x02, 0x0a, 0x12, 0x42, 0x61,
0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73,
0x12, 0x37, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e,
0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x2e,
0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75,
0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x67, 0x6f, 0x6f, 0x67,
0x6c, 0x65, 0x2e, 0x6c, 0x6f, 0x6e, 0x67, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x2e, 0x4f,
0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x82, 0xd3, 0xe4, 0x93, 0x02,
0x6c, 0x22, 0x36, 0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70,
0x72, 0x6f, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x2f, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69,
0x6f, 0x6e, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0x5a, 0x2f, 0x22, 0x2a,
0x2f, 0x76, 0x31, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x65, 0x6e, 0x74, 0x3d, 0x70, 0x72, 0x6f, 0x6a,
0x65, 0x63, 0x74, 0x73, 0x2f, 0x2a, 0x7d, 0x3a, 0x62, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74,
0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54, 0x6f, 0x75, 0x72, 0x73, 0x3a, 0x01, 0x2a, 0xca, 0x41, 0x30,
0x0a, 0x1a, 0x42, 0x61, 0x74, 0x63, 0x68, 0x4f, 0x70, 0x74, 0x69, 0x6d, 0x69, 0x7a, 0x65, 0x54,
0x6f, 0x75, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x41, 0x73,
0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
0x1a, 0x54, 0xca, 0x41, 0x20, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x6f, 0x70, 0x74, 0x69, 0x6d, 0x69,
0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69,
0x73, 0x2e, 0x63, 0x6f, 0x6d, 0xd2, 0x41, 0x2e, 0x68, 0x74, 0x74, 0x70, 0x73, 0x3a, 0x2f, 0x2f,
0x77, 0x77, 0x77, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2e, 0x63,
0x6f, 0x6d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2d, 0x70, 0x6c,
0x61, 0x74, 0x66, 0x6f, 0x72, 0x6d, 0x42, 0x81, 0x01, 0x0a, 0x20, 0x63, 0x6f, 0x6d, 0x2e, 0x67,
0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2e, 0x6f, 0x70, 0x74, 0x69,
0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x76, 0x31, 0x42, 0x11, 0x46, 0x6c, 0x65,
0x65, 0x74, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01,
0x5a, 0x48, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x67, 0x6f, 0x6c, 0x61, 0x6e, 0x67, 0x2e,
0x6f, 0x72, 0x67, 0x2f, 0x67, 0x65, 0x6e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x6f,
0x67, 0x6c, 0x65, 0x61, 0x70, 0x69, 0x73, 0x2f, 0x63, 0x6c, 0x6f, 0x75, 0x64, 0x2f, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x70,
0x74, 0x69, 0x6d, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
}
var (
file_google_cloud_optimization_v1_fleet_routing_proto_rawDescOnce sync.Once
file_google_cloud_optimization_v1_fleet_routing_proto_rawDescData = file_google_cloud_optimization_v1_fleet_routing_proto_rawDesc
)
func file_google_cloud_optimization_v1_fleet_routing_proto_rawDescGZIP() []byte {
file_google_cloud_optimization_v1_fleet_routing_proto_rawDescOnce.Do(func() {
file_google_cloud_optimization_v1_fleet_routing_proto_rawDescData = protoimpl.X.CompressGZIP(file_google_cloud_optimization_v1_fleet_routing_proto_rawDescData)
})
return file_google_cloud_optimization_v1_fleet_routing_proto_rawDescData
}
var file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes = make([]protoimpl.EnumInfo, 8)
var file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes = make([]protoimpl.MessageInfo, 58)
var file_google_cloud_optimization_v1_fleet_routing_proto_goTypes = []interface{}{
(OptimizeToursRequest_SolvingMode)(0), // 0: google.cloud.optimization.v1.OptimizeToursRequest.SolvingMode
(OptimizeToursRequest_SearchMode)(0), // 1: google.cloud.optimization.v1.OptimizeToursRequest.SearchMode
(ShipmentTypeIncompatibility_IncompatibilityMode)(0), // 2: google.cloud.optimization.v1.ShipmentTypeIncompatibility.IncompatibilityMode
(ShipmentTypeRequirement_RequirementMode)(0), // 3: google.cloud.optimization.v1.ShipmentTypeRequirement.RequirementMode
(Vehicle_TravelMode)(0), // 4: google.cloud.optimization.v1.Vehicle.TravelMode
(Vehicle_UnloadingPolicy)(0), // 5: google.cloud.optimization.v1.Vehicle.UnloadingPolicy
(SkippedShipment_Reason_Code)(0), // 6: google.cloud.optimization.v1.SkippedShipment.Reason.Code
(InjectedSolutionConstraint_ConstraintRelaxation_Relaxation_Level)(0), // 7: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level
(*OptimizeToursRequest)(nil), // 8: google.cloud.optimization.v1.OptimizeToursRequest
(*OptimizeToursResponse)(nil), // 9: google.cloud.optimization.v1.OptimizeToursResponse
(*BatchOptimizeToursRequest)(nil), // 10: google.cloud.optimization.v1.BatchOptimizeToursRequest
(*BatchOptimizeToursResponse)(nil), // 11: google.cloud.optimization.v1.BatchOptimizeToursResponse
(*ShipmentModel)(nil), // 12: google.cloud.optimization.v1.ShipmentModel
(*Shipment)(nil), // 13: google.cloud.optimization.v1.Shipment
(*ShipmentTypeIncompatibility)(nil), // 14: google.cloud.optimization.v1.ShipmentTypeIncompatibility
(*ShipmentTypeRequirement)(nil), // 15: google.cloud.optimization.v1.ShipmentTypeRequirement
(*Vehicle)(nil), // 16: google.cloud.optimization.v1.Vehicle
(*TimeWindow)(nil), // 17: google.cloud.optimization.v1.TimeWindow
(*CapacityQuantity)(nil), // 18: google.cloud.optimization.v1.CapacityQuantity
(*CapacityQuantityInterval)(nil), // 19: google.cloud.optimization.v1.CapacityQuantityInterval
(*DistanceLimit)(nil), // 20: google.cloud.optimization.v1.DistanceLimit
(*TransitionAttributes)(nil), // 21: google.cloud.optimization.v1.TransitionAttributes
(*Waypoint)(nil), // 22: google.cloud.optimization.v1.Waypoint
(*Location)(nil), // 23: google.cloud.optimization.v1.Location
(*BreakRule)(nil), // 24: google.cloud.optimization.v1.BreakRule
(*ShipmentRoute)(nil), // 25: google.cloud.optimization.v1.ShipmentRoute
(*SkippedShipment)(nil), // 26: google.cloud.optimization.v1.SkippedShipment
(*AggregatedMetrics)(nil), // 27: google.cloud.optimization.v1.AggregatedMetrics
(*InjectedSolutionConstraint)(nil), // 28: google.cloud.optimization.v1.InjectedSolutionConstraint
(*OptimizeToursValidationError)(nil), // 29: google.cloud.optimization.v1.OptimizeToursValidationError
(*OptimizeToursResponse_Metrics)(nil), // 30: google.cloud.optimization.v1.OptimizeToursResponse.Metrics
nil, // 31: google.cloud.optimization.v1.OptimizeToursResponse.Metrics.CostsEntry
(*BatchOptimizeToursRequest_AsyncModelConfig)(nil), // 32: google.cloud.optimization.v1.BatchOptimizeToursRequest.AsyncModelConfig
(*ShipmentModel_DurationDistanceMatrix)(nil), // 33: google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix
(*ShipmentModel_PrecedenceRule)(nil), // 34: google.cloud.optimization.v1.ShipmentModel.PrecedenceRule
(*ShipmentModel_BreakRule)(nil), // 35: google.cloud.optimization.v1.ShipmentModel.BreakRule
(*ShipmentModel_DurationDistanceMatrix_Row)(nil), // 36: google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix.Row
(*ShipmentModel_BreakRule_BreakRequest)(nil), // 37: google.cloud.optimization.v1.ShipmentModel.BreakRule.BreakRequest
(*ShipmentModel_BreakRule_FrequencyConstraint)(nil), // 38: google.cloud.optimization.v1.ShipmentModel.BreakRule.FrequencyConstraint
(*Shipment_VisitRequest)(nil), // 39: google.cloud.optimization.v1.Shipment.VisitRequest
(*Shipment_Load)(nil), // 40: google.cloud.optimization.v1.Shipment.Load
nil, // 41: google.cloud.optimization.v1.Shipment.LoadDemandsEntry
nil, // 42: google.cloud.optimization.v1.Shipment.VisitRequest.LoadDemandsEntry
(*Vehicle_LoadLimit)(nil), // 43: google.cloud.optimization.v1.Vehicle.LoadLimit
(*Vehicle_DurationLimit)(nil), // 44: google.cloud.optimization.v1.Vehicle.DurationLimit
nil, // 45: google.cloud.optimization.v1.Vehicle.LoadLimitsEntry
nil, // 46: google.cloud.optimization.v1.Vehicle.ExtraVisitDurationForVisitTypeEntry
(*Vehicle_LoadLimit_Interval)(nil), // 47: google.cloud.optimization.v1.Vehicle.LoadLimit.Interval
(*BreakRule_BreakRequest)(nil), // 48: google.cloud.optimization.v1.BreakRule.BreakRequest
(*BreakRule_FrequencyConstraint)(nil), // 49: google.cloud.optimization.v1.BreakRule.FrequencyConstraint
(*ShipmentRoute_Delay)(nil), // 50: google.cloud.optimization.v1.ShipmentRoute.Delay
(*ShipmentRoute_Visit)(nil), // 51: google.cloud.optimization.v1.ShipmentRoute.Visit
(*ShipmentRoute_Transition)(nil), // 52: google.cloud.optimization.v1.ShipmentRoute.Transition
(*ShipmentRoute_VehicleLoad)(nil), // 53: google.cloud.optimization.v1.ShipmentRoute.VehicleLoad
(*ShipmentRoute_EncodedPolyline)(nil), // 54: google.cloud.optimization.v1.ShipmentRoute.EncodedPolyline
(*ShipmentRoute_Break)(nil), // 55: google.cloud.optimization.v1.ShipmentRoute.Break
(*ShipmentRoute_TravelStep)(nil), // 56: google.cloud.optimization.v1.ShipmentRoute.TravelStep
nil, // 57: google.cloud.optimization.v1.ShipmentRoute.RouteCostsEntry
nil, // 58: google.cloud.optimization.v1.ShipmentRoute.Visit.LoadDemandsEntry
nil, // 59: google.cloud.optimization.v1.ShipmentRoute.Transition.VehicleLoadsEntry
(*SkippedShipment_Reason)(nil), // 60: google.cloud.optimization.v1.SkippedShipment.Reason
nil, // 61: google.cloud.optimization.v1.AggregatedMetrics.MaxLoadsEntry
nil, // 62: google.cloud.optimization.v1.AggregatedMetrics.CostsEntry
(*InjectedSolutionConstraint_ConstraintRelaxation)(nil), // 63: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation
(*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation)(nil), // 64: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation
(*OptimizeToursValidationError_FieldReference)(nil), // 65: google.cloud.optimization.v1.OptimizeToursValidationError.FieldReference
(*duration.Duration)(nil), // 66: google.protobuf.Duration
(*timestamp.Timestamp)(nil), // 67: google.protobuf.Timestamp
(*latlng.LatLng)(nil), // 68: google.type.LatLng
(*InputConfig)(nil), // 69: google.cloud.optimization.v1.InputConfig
(*OutputConfig)(nil), // 70: google.cloud.optimization.v1.OutputConfig
(*longrunning.Operation)(nil), // 71: google.longrunning.Operation
}
var file_google_cloud_optimization_v1_fleet_routing_proto_depIdxs = []int32{
66, // 0: google.cloud.optimization.v1.OptimizeToursRequest.timeout:type_name -> google.protobuf.Duration
12, // 1: google.cloud.optimization.v1.OptimizeToursRequest.model:type_name -> google.cloud.optimization.v1.ShipmentModel
0, // 2: google.cloud.optimization.v1.OptimizeToursRequest.solving_mode:type_name -> google.cloud.optimization.v1.OptimizeToursRequest.SolvingMode
1, // 3: google.cloud.optimization.v1.OptimizeToursRequest.search_mode:type_name -> google.cloud.optimization.v1.OptimizeToursRequest.SearchMode
25, // 4: google.cloud.optimization.v1.OptimizeToursRequest.injected_first_solution_routes:type_name -> google.cloud.optimization.v1.ShipmentRoute
28, // 5: google.cloud.optimization.v1.OptimizeToursRequest.injected_solution_constraint:type_name -> google.cloud.optimization.v1.InjectedSolutionConstraint
25, // 6: google.cloud.optimization.v1.OptimizeToursRequest.refresh_details_routes:type_name -> google.cloud.optimization.v1.ShipmentRoute
25, // 7: google.cloud.optimization.v1.OptimizeToursResponse.routes:type_name -> google.cloud.optimization.v1.ShipmentRoute
26, // 8: google.cloud.optimization.v1.OptimizeToursResponse.skipped_shipments:type_name -> google.cloud.optimization.v1.SkippedShipment
29, // 9: google.cloud.optimization.v1.OptimizeToursResponse.validation_errors:type_name -> google.cloud.optimization.v1.OptimizeToursValidationError
30, // 10: google.cloud.optimization.v1.OptimizeToursResponse.metrics:type_name -> google.cloud.optimization.v1.OptimizeToursResponse.Metrics
32, // 11: google.cloud.optimization.v1.BatchOptimizeToursRequest.model_configs:type_name -> google.cloud.optimization.v1.BatchOptimizeToursRequest.AsyncModelConfig
13, // 12: google.cloud.optimization.v1.ShipmentModel.shipments:type_name -> google.cloud.optimization.v1.Shipment
16, // 13: google.cloud.optimization.v1.ShipmentModel.vehicles:type_name -> google.cloud.optimization.v1.Vehicle
67, // 14: google.cloud.optimization.v1.ShipmentModel.global_start_time:type_name -> google.protobuf.Timestamp
67, // 15: google.cloud.optimization.v1.ShipmentModel.global_end_time:type_name -> google.protobuf.Timestamp
33, // 16: google.cloud.optimization.v1.ShipmentModel.duration_distance_matrices:type_name -> google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix
21, // 17: google.cloud.optimization.v1.ShipmentModel.transition_attributes:type_name -> google.cloud.optimization.v1.TransitionAttributes
14, // 18: google.cloud.optimization.v1.ShipmentModel.shipment_type_incompatibilities:type_name -> google.cloud.optimization.v1.ShipmentTypeIncompatibility
15, // 19: google.cloud.optimization.v1.ShipmentModel.shipment_type_requirements:type_name -> google.cloud.optimization.v1.ShipmentTypeRequirement
34, // 20: google.cloud.optimization.v1.ShipmentModel.precedence_rules:type_name -> google.cloud.optimization.v1.ShipmentModel.PrecedenceRule
35, // 21: google.cloud.optimization.v1.ShipmentModel.break_rules:type_name -> google.cloud.optimization.v1.ShipmentModel.BreakRule
39, // 22: google.cloud.optimization.v1.Shipment.pickups:type_name -> google.cloud.optimization.v1.Shipment.VisitRequest
39, // 23: google.cloud.optimization.v1.Shipment.deliveries:type_name -> google.cloud.optimization.v1.Shipment.VisitRequest
41, // 24: google.cloud.optimization.v1.Shipment.load_demands:type_name -> google.cloud.optimization.v1.Shipment.LoadDemandsEntry
66, // 25: google.cloud.optimization.v1.Shipment.pickup_to_delivery_absolute_detour_limit:type_name -> google.protobuf.Duration
66, // 26: google.cloud.optimization.v1.Shipment.pickup_to_delivery_time_limit:type_name -> google.protobuf.Duration
18, // 27: google.cloud.optimization.v1.Shipment.demands:type_name -> google.cloud.optimization.v1.CapacityQuantity
2, // 28: google.cloud.optimization.v1.ShipmentTypeIncompatibility.incompatibility_mode:type_name -> google.cloud.optimization.v1.ShipmentTypeIncompatibility.IncompatibilityMode
3, // 29: google.cloud.optimization.v1.ShipmentTypeRequirement.requirement_mode:type_name -> google.cloud.optimization.v1.ShipmentTypeRequirement.RequirementMode
4, // 30: google.cloud.optimization.v1.Vehicle.travel_mode:type_name -> google.cloud.optimization.v1.Vehicle.TravelMode
68, // 31: google.cloud.optimization.v1.Vehicle.start_location:type_name -> google.type.LatLng
22, // 32: google.cloud.optimization.v1.Vehicle.start_waypoint:type_name -> google.cloud.optimization.v1.Waypoint
68, // 33: google.cloud.optimization.v1.Vehicle.end_location:type_name -> google.type.LatLng
22, // 34: google.cloud.optimization.v1.Vehicle.end_waypoint:type_name -> google.cloud.optimization.v1.Waypoint
17, // 35: google.cloud.optimization.v1.Vehicle.start_time_windows:type_name -> google.cloud.optimization.v1.TimeWindow
17, // 36: google.cloud.optimization.v1.Vehicle.end_time_windows:type_name -> google.cloud.optimization.v1.TimeWindow
5, // 37: google.cloud.optimization.v1.Vehicle.unloading_policy:type_name -> google.cloud.optimization.v1.Vehicle.UnloadingPolicy
45, // 38: google.cloud.optimization.v1.Vehicle.load_limits:type_name -> google.cloud.optimization.v1.Vehicle.LoadLimitsEntry
44, // 39: google.cloud.optimization.v1.Vehicle.route_duration_limit:type_name -> google.cloud.optimization.v1.Vehicle.DurationLimit
44, // 40: google.cloud.optimization.v1.Vehicle.travel_duration_limit:type_name -> google.cloud.optimization.v1.Vehicle.DurationLimit
20, // 41: google.cloud.optimization.v1.Vehicle.route_distance_limit:type_name -> google.cloud.optimization.v1.DistanceLimit
46, // 42: google.cloud.optimization.v1.Vehicle.extra_visit_duration_for_visit_type:type_name -> google.cloud.optimization.v1.Vehicle.ExtraVisitDurationForVisitTypeEntry
24, // 43: google.cloud.optimization.v1.Vehicle.break_rule:type_name -> google.cloud.optimization.v1.BreakRule
18, // 44: google.cloud.optimization.v1.Vehicle.capacities:type_name -> google.cloud.optimization.v1.CapacityQuantity
19, // 45: google.cloud.optimization.v1.Vehicle.start_load_intervals:type_name -> google.cloud.optimization.v1.CapacityQuantityInterval
19, // 46: google.cloud.optimization.v1.Vehicle.end_load_intervals:type_name -> google.cloud.optimization.v1.CapacityQuantityInterval
67, // 47: google.cloud.optimization.v1.TimeWindow.start_time:type_name -> google.protobuf.Timestamp
67, // 48: google.cloud.optimization.v1.TimeWindow.end_time:type_name -> google.protobuf.Timestamp
67, // 49: google.cloud.optimization.v1.TimeWindow.soft_start_time:type_name -> google.protobuf.Timestamp
67, // 50: google.cloud.optimization.v1.TimeWindow.soft_end_time:type_name -> google.protobuf.Timestamp
20, // 51: google.cloud.optimization.v1.TransitionAttributes.distance_limit:type_name -> google.cloud.optimization.v1.DistanceLimit
66, // 52: google.cloud.optimization.v1.TransitionAttributes.delay:type_name -> google.protobuf.Duration
23, // 53: google.cloud.optimization.v1.Waypoint.location:type_name -> google.cloud.optimization.v1.Location
68, // 54: google.cloud.optimization.v1.Location.lat_lng:type_name -> google.type.LatLng
48, // 55: google.cloud.optimization.v1.BreakRule.break_requests:type_name -> google.cloud.optimization.v1.BreakRule.BreakRequest
49, // 56: google.cloud.optimization.v1.BreakRule.frequency_constraints:type_name -> google.cloud.optimization.v1.BreakRule.FrequencyConstraint
67, // 57: google.cloud.optimization.v1.ShipmentRoute.vehicle_start_time:type_name -> google.protobuf.Timestamp
67, // 58: google.cloud.optimization.v1.ShipmentRoute.vehicle_end_time:type_name -> google.protobuf.Timestamp
51, // 59: google.cloud.optimization.v1.ShipmentRoute.visits:type_name -> google.cloud.optimization.v1.ShipmentRoute.Visit
52, // 60: google.cloud.optimization.v1.ShipmentRoute.transitions:type_name -> google.cloud.optimization.v1.ShipmentRoute.Transition
54, // 61: google.cloud.optimization.v1.ShipmentRoute.route_polyline:type_name -> google.cloud.optimization.v1.ShipmentRoute.EncodedPolyline
55, // 62: google.cloud.optimization.v1.ShipmentRoute.breaks:type_name -> google.cloud.optimization.v1.ShipmentRoute.Break
27, // 63: google.cloud.optimization.v1.ShipmentRoute.metrics:type_name -> google.cloud.optimization.v1.AggregatedMetrics
57, // 64: google.cloud.optimization.v1.ShipmentRoute.route_costs:type_name -> google.cloud.optimization.v1.ShipmentRoute.RouteCostsEntry
18, // 65: google.cloud.optimization.v1.ShipmentRoute.end_loads:type_name -> google.cloud.optimization.v1.CapacityQuantity
56, // 66: google.cloud.optimization.v1.ShipmentRoute.travel_steps:type_name -> google.cloud.optimization.v1.ShipmentRoute.TravelStep
66, // 67: google.cloud.optimization.v1.ShipmentRoute.vehicle_detour:type_name -> google.protobuf.Duration
50, // 68: google.cloud.optimization.v1.ShipmentRoute.delay_before_vehicle_end:type_name -> google.cloud.optimization.v1.ShipmentRoute.Delay
60, // 69: google.cloud.optimization.v1.SkippedShipment.reasons:type_name -> google.cloud.optimization.v1.SkippedShipment.Reason
66, // 70: google.cloud.optimization.v1.AggregatedMetrics.travel_duration:type_name -> google.protobuf.Duration
66, // 71: google.cloud.optimization.v1.AggregatedMetrics.wait_duration:type_name -> google.protobuf.Duration
66, // 72: google.cloud.optimization.v1.AggregatedMetrics.delay_duration:type_name -> google.protobuf.Duration
66, // 73: google.cloud.optimization.v1.AggregatedMetrics.break_duration:type_name -> google.protobuf.Duration
66, // 74: google.cloud.optimization.v1.AggregatedMetrics.visit_duration:type_name -> google.protobuf.Duration
66, // 75: google.cloud.optimization.v1.AggregatedMetrics.total_duration:type_name -> google.protobuf.Duration
61, // 76: google.cloud.optimization.v1.AggregatedMetrics.max_loads:type_name -> google.cloud.optimization.v1.AggregatedMetrics.MaxLoadsEntry
62, // 77: google.cloud.optimization.v1.AggregatedMetrics.costs:type_name -> google.cloud.optimization.v1.AggregatedMetrics.CostsEntry
25, // 78: google.cloud.optimization.v1.InjectedSolutionConstraint.routes:type_name -> google.cloud.optimization.v1.ShipmentRoute
26, // 79: google.cloud.optimization.v1.InjectedSolutionConstraint.skipped_shipments:type_name -> google.cloud.optimization.v1.SkippedShipment
63, // 80: google.cloud.optimization.v1.InjectedSolutionConstraint.constraint_relaxations:type_name -> google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation
65, // 81: google.cloud.optimization.v1.OptimizeToursValidationError.fields:type_name -> google.cloud.optimization.v1.OptimizeToursValidationError.FieldReference
27, // 82: google.cloud.optimization.v1.OptimizeToursResponse.Metrics.aggregated_route_metrics:type_name -> google.cloud.optimization.v1.AggregatedMetrics
67, // 83: google.cloud.optimization.v1.OptimizeToursResponse.Metrics.earliest_vehicle_start_time:type_name -> google.protobuf.Timestamp
67, // 84: google.cloud.optimization.v1.OptimizeToursResponse.Metrics.latest_vehicle_end_time:type_name -> google.protobuf.Timestamp
31, // 85: google.cloud.optimization.v1.OptimizeToursResponse.Metrics.costs:type_name -> google.cloud.optimization.v1.OptimizeToursResponse.Metrics.CostsEntry
69, // 86: google.cloud.optimization.v1.BatchOptimizeToursRequest.AsyncModelConfig.input_config:type_name -> google.cloud.optimization.v1.InputConfig
70, // 87: google.cloud.optimization.v1.BatchOptimizeToursRequest.AsyncModelConfig.output_config:type_name -> google.cloud.optimization.v1.OutputConfig
36, // 88: google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix.rows:type_name -> google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix.Row
66, // 89: google.cloud.optimization.v1.ShipmentModel.PrecedenceRule.offset_duration:type_name -> google.protobuf.Duration
37, // 90: google.cloud.optimization.v1.ShipmentModel.BreakRule.break_requests:type_name -> google.cloud.optimization.v1.ShipmentModel.BreakRule.BreakRequest
38, // 91: google.cloud.optimization.v1.ShipmentModel.BreakRule.frequency_constraints:type_name -> google.cloud.optimization.v1.ShipmentModel.BreakRule.FrequencyConstraint
66, // 92: google.cloud.optimization.v1.ShipmentModel.DurationDistanceMatrix.Row.durations:type_name -> google.protobuf.Duration
67, // 93: google.cloud.optimization.v1.ShipmentModel.BreakRule.BreakRequest.earliest_start_time:type_name -> google.protobuf.Timestamp
67, // 94: google.cloud.optimization.v1.ShipmentModel.BreakRule.BreakRequest.latest_start_time:type_name -> google.protobuf.Timestamp
66, // 95: google.cloud.optimization.v1.ShipmentModel.BreakRule.BreakRequest.min_duration:type_name -> google.protobuf.Duration
66, // 96: google.cloud.optimization.v1.ShipmentModel.BreakRule.FrequencyConstraint.min_break_duration:type_name -> google.protobuf.Duration
66, // 97: google.cloud.optimization.v1.ShipmentModel.BreakRule.FrequencyConstraint.max_inter_break_duration:type_name -> google.protobuf.Duration
68, // 98: google.cloud.optimization.v1.Shipment.VisitRequest.arrival_location:type_name -> google.type.LatLng
22, // 99: google.cloud.optimization.v1.Shipment.VisitRequest.arrival_waypoint:type_name -> google.cloud.optimization.v1.Waypoint
68, // 100: google.cloud.optimization.v1.Shipment.VisitRequest.departure_location:type_name -> google.type.LatLng
22, // 101: google.cloud.optimization.v1.Shipment.VisitRequest.departure_waypoint:type_name -> google.cloud.optimization.v1.Waypoint
17, // 102: google.cloud.optimization.v1.Shipment.VisitRequest.time_windows:type_name -> google.cloud.optimization.v1.TimeWindow
66, // 103: google.cloud.optimization.v1.Shipment.VisitRequest.duration:type_name -> google.protobuf.Duration
42, // 104: google.cloud.optimization.v1.Shipment.VisitRequest.load_demands:type_name -> google.cloud.optimization.v1.Shipment.VisitRequest.LoadDemandsEntry
18, // 105: google.cloud.optimization.v1.Shipment.VisitRequest.demands:type_name -> google.cloud.optimization.v1.CapacityQuantity
40, // 106: google.cloud.optimization.v1.Shipment.LoadDemandsEntry.value:type_name -> google.cloud.optimization.v1.Shipment.Load
40, // 107: google.cloud.optimization.v1.Shipment.VisitRequest.LoadDemandsEntry.value:type_name -> google.cloud.optimization.v1.Shipment.Load
47, // 108: google.cloud.optimization.v1.Vehicle.LoadLimit.start_load_interval:type_name -> google.cloud.optimization.v1.Vehicle.LoadLimit.Interval
47, // 109: google.cloud.optimization.v1.Vehicle.LoadLimit.end_load_interval:type_name -> google.cloud.optimization.v1.Vehicle.LoadLimit.Interval
66, // 110: google.cloud.optimization.v1.Vehicle.DurationLimit.max_duration:type_name -> google.protobuf.Duration
66, // 111: google.cloud.optimization.v1.Vehicle.DurationLimit.soft_max_duration:type_name -> google.protobuf.Duration
66, // 112: google.cloud.optimization.v1.Vehicle.DurationLimit.quadratic_soft_max_duration:type_name -> google.protobuf.Duration
43, // 113: google.cloud.optimization.v1.Vehicle.LoadLimitsEntry.value:type_name -> google.cloud.optimization.v1.Vehicle.LoadLimit
66, // 114: google.cloud.optimization.v1.Vehicle.ExtraVisitDurationForVisitTypeEntry.value:type_name -> google.protobuf.Duration
67, // 115: google.cloud.optimization.v1.BreakRule.BreakRequest.earliest_start_time:type_name -> google.protobuf.Timestamp
67, // 116: google.cloud.optimization.v1.BreakRule.BreakRequest.latest_start_time:type_name -> google.protobuf.Timestamp
66, // 117: google.cloud.optimization.v1.BreakRule.BreakRequest.min_duration:type_name -> google.protobuf.Duration
66, // 118: google.cloud.optimization.v1.BreakRule.FrequencyConstraint.min_break_duration:type_name -> google.protobuf.Duration
66, // 119: google.cloud.optimization.v1.BreakRule.FrequencyConstraint.max_inter_break_duration:type_name -> google.protobuf.Duration
67, // 120: google.cloud.optimization.v1.ShipmentRoute.Delay.start_time:type_name -> google.protobuf.Timestamp
66, // 121: google.cloud.optimization.v1.ShipmentRoute.Delay.duration:type_name -> google.protobuf.Duration
67, // 122: google.cloud.optimization.v1.ShipmentRoute.Visit.start_time:type_name -> google.protobuf.Timestamp
58, // 123: google.cloud.optimization.v1.ShipmentRoute.Visit.load_demands:type_name -> google.cloud.optimization.v1.ShipmentRoute.Visit.LoadDemandsEntry
66, // 124: google.cloud.optimization.v1.ShipmentRoute.Visit.detour:type_name -> google.protobuf.Duration
18, // 125: google.cloud.optimization.v1.ShipmentRoute.Visit.arrival_loads:type_name -> google.cloud.optimization.v1.CapacityQuantity
50, // 126: google.cloud.optimization.v1.ShipmentRoute.Visit.delay_before_start:type_name -> google.cloud.optimization.v1.ShipmentRoute.Delay
18, // 127: google.cloud.optimization.v1.ShipmentRoute.Visit.demands:type_name -> google.cloud.optimization.v1.CapacityQuantity
66, // 128: google.cloud.optimization.v1.ShipmentRoute.Transition.travel_duration:type_name -> google.protobuf.Duration
66, // 129: google.cloud.optimization.v1.ShipmentRoute.Transition.delay_duration:type_name -> google.protobuf.Duration
66, // 130: google.cloud.optimization.v1.ShipmentRoute.Transition.break_duration:type_name -> google.protobuf.Duration
66, // 131: google.cloud.optimization.v1.ShipmentRoute.Transition.wait_duration:type_name -> google.protobuf.Duration
66, // 132: google.cloud.optimization.v1.ShipmentRoute.Transition.total_duration:type_name -> google.protobuf.Duration
67, // 133: google.cloud.optimization.v1.ShipmentRoute.Transition.start_time:type_name -> google.protobuf.Timestamp
54, // 134: google.cloud.optimization.v1.ShipmentRoute.Transition.route_polyline:type_name -> google.cloud.optimization.v1.ShipmentRoute.EncodedPolyline
59, // 135: google.cloud.optimization.v1.ShipmentRoute.Transition.vehicle_loads:type_name -> google.cloud.optimization.v1.ShipmentRoute.Transition.VehicleLoadsEntry
18, // 136: google.cloud.optimization.v1.ShipmentRoute.Transition.loads:type_name -> google.cloud.optimization.v1.CapacityQuantity
67, // 137: google.cloud.optimization.v1.ShipmentRoute.Break.start_time:type_name -> google.protobuf.Timestamp
66, // 138: google.cloud.optimization.v1.ShipmentRoute.Break.duration:type_name -> google.protobuf.Duration
66, // 139: google.cloud.optimization.v1.ShipmentRoute.TravelStep.duration:type_name -> google.protobuf.Duration
54, // 140: google.cloud.optimization.v1.ShipmentRoute.TravelStep.route_polyline:type_name -> google.cloud.optimization.v1.ShipmentRoute.EncodedPolyline
40, // 141: google.cloud.optimization.v1.ShipmentRoute.Visit.LoadDemandsEntry.value:type_name -> google.cloud.optimization.v1.Shipment.Load
53, // 142: google.cloud.optimization.v1.ShipmentRoute.Transition.VehicleLoadsEntry.value:type_name -> google.cloud.optimization.v1.ShipmentRoute.VehicleLoad
6, // 143: google.cloud.optimization.v1.SkippedShipment.Reason.code:type_name -> google.cloud.optimization.v1.SkippedShipment.Reason.Code
53, // 144: google.cloud.optimization.v1.AggregatedMetrics.MaxLoadsEntry.value:type_name -> google.cloud.optimization.v1.ShipmentRoute.VehicleLoad
64, // 145: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.relaxations:type_name -> google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation
7, // 146: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.level:type_name -> google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.Level
67, // 147: google.cloud.optimization.v1.InjectedSolutionConstraint.ConstraintRelaxation.Relaxation.threshold_time:type_name -> google.protobuf.Timestamp
65, // 148: google.cloud.optimization.v1.OptimizeToursValidationError.FieldReference.sub_field:type_name -> google.cloud.optimization.v1.OptimizeToursValidationError.FieldReference
8, // 149: google.cloud.optimization.v1.FleetRouting.OptimizeTours:input_type -> google.cloud.optimization.v1.OptimizeToursRequest
10, // 150: google.cloud.optimization.v1.FleetRouting.BatchOptimizeTours:input_type -> google.cloud.optimization.v1.BatchOptimizeToursRequest
9, // 151: google.cloud.optimization.v1.FleetRouting.OptimizeTours:output_type -> google.cloud.optimization.v1.OptimizeToursResponse
71, // 152: google.cloud.optimization.v1.FleetRouting.BatchOptimizeTours:output_type -> google.longrunning.Operation
151, // [151:153] is the sub-list for method output_type
149, // [149:151] is the sub-list for method input_type
149, // [149:149] is the sub-list for extension type_name
149, // [149:149] is the sub-list for extension extendee
0, // [0:149] is the sub-list for field type_name
}
func init() { file_google_cloud_optimization_v1_fleet_routing_proto_init() }
func file_google_cloud_optimization_v1_fleet_routing_proto_init() {
if File_google_cloud_optimization_v1_fleet_routing_proto != nil {
return
}
file_google_cloud_optimization_v1_async_model_proto_init()
if !protoimpl.UnsafeEnabled {
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OptimizeToursRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OptimizeToursResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BatchOptimizeToursRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BatchOptimizeToursResponse); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Shipment); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentTypeIncompatibility); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentTypeRequirement); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vehicle); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TimeWindow); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CapacityQuantity); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*CapacityQuantityInterval); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*DistanceLimit); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*TransitionAttributes); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Waypoint); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Location); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BreakRule); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SkippedShipment); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*AggregatedMetrics); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*InjectedSolutionConstraint); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OptimizeToursValidationError); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OptimizeToursResponse_Metrics); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BatchOptimizeToursRequest_AsyncModelConfig); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_DurationDistanceMatrix); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_PrecedenceRule); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_BreakRule); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_DurationDistanceMatrix_Row); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_BreakRule_BreakRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentModel_BreakRule_FrequencyConstraint); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Shipment_VisitRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Shipment_Load); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vehicle_LoadLimit); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vehicle_DurationLimit); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*Vehicle_LoadLimit_Interval); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BreakRule_BreakRequest); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*BreakRule_FrequencyConstraint); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_Delay); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_Visit); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_Transition); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_VehicleLoad); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[46].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_EncodedPolyline); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[47].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_Break); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*ShipmentRoute_TravelStep); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[52].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*SkippedShipment_Reason); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[55].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*InjectedSolutionConstraint_ConstraintRelaxation); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[56].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*InjectedSolutionConstraint_ConstraintRelaxation_Relaxation); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[57].Exporter = func(v interface{}, i int) interface{} {
switch v := v.(*OptimizeToursValidationError_FieldReference); i {
case 0:
return &v.state
case 1:
return &v.sizeCache
case 2:
return &v.unknownFields
default:
return nil
}
}
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[0].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[4].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[5].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[8].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[9].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[11].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[12].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[14].OneofWrappers = []interface{}{
(*Waypoint_Location)(nil),
(*Waypoint_PlaceId)(nil),
}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[15].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[26].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[35].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[36].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[39].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[52].OneofWrappers = []interface{}{}
file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes[57].OneofWrappers = []interface{}{
(*OptimizeToursValidationError_FieldReference_Index)(nil),
(*OptimizeToursValidationError_FieldReference_Key)(nil),
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: file_google_cloud_optimization_v1_fleet_routing_proto_rawDesc,
NumEnums: 8,
NumMessages: 58,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_google_cloud_optimization_v1_fleet_routing_proto_goTypes,
DependencyIndexes: file_google_cloud_optimization_v1_fleet_routing_proto_depIdxs,
EnumInfos: file_google_cloud_optimization_v1_fleet_routing_proto_enumTypes,
MessageInfos: file_google_cloud_optimization_v1_fleet_routing_proto_msgTypes,
}.Build()
File_google_cloud_optimization_v1_fleet_routing_proto = out.File
file_google_cloud_optimization_v1_fleet_routing_proto_rawDesc = nil
file_google_cloud_optimization_v1_fleet_routing_proto_goTypes = nil
file_google_cloud_optimization_v1_fleet_routing_proto_depIdxs = nil
}
// Reference imports to suppress errors if they are not otherwise used.
var _ context.Context
var _ grpc.ClientConnInterface
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
const _ = grpc.SupportPackageIsVersion6
// FleetRoutingClient is the client API for FleetRouting service.
//
// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
type FleetRoutingClient interface {
// Sends an `OptimizeToursRequest` containing a `ShipmentModel` and returns an
// `OptimizeToursResponse` containing `ShipmentRoute`s, which are a set of
// routes to be performed by vehicles minimizing the overall cost.
//
// A `ShipmentModel` model consists mainly of `Shipment`s that need to be
// carried out and `Vehicle`s that can be used to transport the `Shipment`s.
// The `ShipmentRoute`s assign `Shipment`s to `Vehicle`s. More specifically,
// they assign a series of `Visit`s to each vehicle, where a `Visit`
// corresponds to a `VisitRequest`, which is a pickup or delivery for a
// `Shipment`.
//
// The goal is to provide an assignment of `ShipmentRoute`s to `Vehicle`s that
// minimizes the total cost where cost has many components defined in the
// `ShipmentModel`.
OptimizeTours(ctx context.Context, in *OptimizeToursRequest, opts ...grpc.CallOption) (*OptimizeToursResponse, error)
// Optimizes vehicle tours for one or more `OptimizeToursRequest`
// messages as a batch.
//
// This method is a Long Running Operation (LRO). The inputs for optimization
// (`OptimizeToursRequest` messages) and outputs (`OptimizeToursResponse`
// messages) are read/written from/to Cloud Storage in user-specified
// format. Like the `OptimizeTours` method, each `OptimizeToursRequest`
// contains a `ShipmentModel` and returns an `OptimizeToursResponse`
// containing `ShipmentRoute`s, which are a set of routes to be performed by
// vehicles minimizing the overall cost.
BatchOptimizeTours(ctx context.Context, in *BatchOptimizeToursRequest, opts ...grpc.CallOption) (*longrunning.Operation, error)
}
type fleetRoutingClient struct {
cc grpc.ClientConnInterface
}
func NewFleetRoutingClient(cc grpc.ClientConnInterface) FleetRoutingClient {
return &fleetRoutingClient{cc}
}
func (c *fleetRoutingClient) OptimizeTours(ctx context.Context, in *OptimizeToursRequest, opts ...grpc.CallOption) (*OptimizeToursResponse, error) {
out := new(OptimizeToursResponse)
err := c.cc.Invoke(ctx, "/google.cloud.optimization.v1.FleetRouting/OptimizeTours", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *fleetRoutingClient) BatchOptimizeTours(ctx context.Context, in *BatchOptimizeToursRequest, opts ...grpc.CallOption) (*longrunning.Operation, error) {
out := new(longrunning.Operation)
err := c.cc.Invoke(ctx, "/google.cloud.optimization.v1.FleetRouting/BatchOptimizeTours", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// FleetRoutingServer is the server API for FleetRouting service.
type FleetRoutingServer interface {
// Sends an `OptimizeToursRequest` containing a `ShipmentModel` and returns an
// `OptimizeToursResponse` containing `ShipmentRoute`s, which are a set of
// routes to be performed by vehicles minimizing the overall cost.
//
// A `ShipmentModel` model consists mainly of `Shipment`s that need to be
// carried out and `Vehicle`s that can be used to transport the `Shipment`s.
// The `ShipmentRoute`s assign `Shipment`s to `Vehicle`s. More specifically,
// they assign a series of `Visit`s to each vehicle, where a `Visit`
// corresponds to a `VisitRequest`, which is a pickup or delivery for a
// `Shipment`.
//
// The goal is to provide an assignment of `ShipmentRoute`s to `Vehicle`s that
// minimizes the total cost where cost has many components defined in the
// `ShipmentModel`.
OptimizeTours(context.Context, *OptimizeToursRequest) (*OptimizeToursResponse, error)
// Optimizes vehicle tours for one or more `OptimizeToursRequest`
// messages as a batch.
//
// This method is a Long Running Operation (LRO). The inputs for optimization
// (`OptimizeToursRequest` messages) and outputs (`OptimizeToursResponse`
// messages) are read/written from/to Cloud Storage in user-specified
// format. Like the `OptimizeTours` method, each `OptimizeToursRequest`
// contains a `ShipmentModel` and returns an `OptimizeToursResponse`
// containing `ShipmentRoute`s, which are a set of routes to be performed by
// vehicles minimizing the overall cost.
BatchOptimizeTours(context.Context, *BatchOptimizeToursRequest) (*longrunning.Operation, error)
}
// UnimplementedFleetRoutingServer can be embedded to have forward compatible implementations.
type UnimplementedFleetRoutingServer struct {
}
func (*UnimplementedFleetRoutingServer) OptimizeTours(context.Context, *OptimizeToursRequest) (*OptimizeToursResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method OptimizeTours not implemented")
}
func (*UnimplementedFleetRoutingServer) BatchOptimizeTours(context.Context, *BatchOptimizeToursRequest) (*longrunning.Operation, error) {
return nil, status.Errorf(codes.Unimplemented, "method BatchOptimizeTours not implemented")
}
func RegisterFleetRoutingServer(s *grpc.Server, srv FleetRoutingServer) {
s.RegisterService(&_FleetRouting_serviceDesc, srv)
}
func _FleetRouting_OptimizeTours_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(OptimizeToursRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(FleetRoutingServer).OptimizeTours(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/google.cloud.optimization.v1.FleetRouting/OptimizeTours",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetRoutingServer).OptimizeTours(ctx, req.(*OptimizeToursRequest))
}
return interceptor(ctx, in, info, handler)
}
func _FleetRouting_BatchOptimizeTours_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(BatchOptimizeToursRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(FleetRoutingServer).BatchOptimizeTours(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/google.cloud.optimization.v1.FleetRouting/BatchOptimizeTours",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(FleetRoutingServer).BatchOptimizeTours(ctx, req.(*BatchOptimizeToursRequest))
}
return interceptor(ctx, in, info, handler)
}
var _FleetRouting_serviceDesc = grpc.ServiceDesc{
ServiceName: "google.cloud.optimization.v1.FleetRouting",
HandlerType: (*FleetRoutingServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "OptimizeTours",
Handler: _FleetRouting_OptimizeTours_Handler,
},
{
MethodName: "BatchOptimizeTours",
Handler: _FleetRouting_BatchOptimizeTours_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "google/cloud/optimization/v1/fleet_routing.proto",
}