From e2d872ee84dc651be463c227d6b6835357a000d4 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Mon, 9 Dec 2024 14:55:18 +0100 Subject: [PATCH 1/8] all: Fix squash usage --- pkg/config/tlsconfig/config.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/pkg/config/tlsconfig/config.go b/pkg/config/tlsconfig/config.go index 1499161d11..0db0e8f0fd 100644 --- a/pkg/config/tlsconfig/config.go +++ b/pkg/config/tlsconfig/config.go @@ -90,9 +90,9 @@ type ServerKeyVault struct { // Config represents TLS configuration. type Config struct { - Client Client `name:",squash"` - ServerAuth ServerAuth `name:",squash"` - ACME ACME `name:"acme"` + Client `name:",squash"` + ServerAuth `name:",squash"` + ACME ACME `name:"acme"` } // FileReader is the interface used to read TLS certificates and keys. From 48d4a3d5005ad4815d18a91de7b1700e8c3cc747 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:21:29 +0100 Subject: [PATCH 2/8] dev: Remove version --- docker-compose.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index 15e5db8b92..5d3412c893 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,4 +1,3 @@ -version: "3.7" services: postgres: image: postgres:14 From 25d8e21f18d39c6061f174da97153660a27f663f Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:23:00 +0100 Subject: [PATCH 3/8] api: Add managed gateway capabilities --- api/ttn/lorawan/v3/api.md | 15 + api/ttn/lorawan/v3/api.swagger.json | 35 + api/ttn/lorawan/v3/gateway.proto | 16 + pkg/ttnpb/gateway.pb.go | 1722 +++++++++-------- pkg/ttnpb/gateway.pb.paths.fm.go | 40 + pkg/ttnpb/gateway.pb.setters.fm.go | 116 ++ pkg/ttnpb/gateway.pb.validate.go | 110 ++ .../gateway_configuration.pb.paths.fm.go | 9 + pkg/ttnpb/gateway_flags.pb.go | 145 ++ pkg/ttnpb/gateway_json.pb.go | 16 + sdk/js/generated/api-definition.json | 9 + sdk/js/generated/api.json | 120 ++ 12 files changed, 1567 insertions(+), 786 deletions(-) diff --git a/api/ttn/lorawan/v3/api.md b/api/ttn/lorawan/v3/api.md index 196bc6e43a..4979f07254 100644 --- a/api/ttn/lorawan/v3/api.md +++ b/api/ttn/lorawan/v3/api.md @@ -347,6 +347,7 @@ - [Message `ListGatewaysRequest`](#ttn.lorawan.v3.ListGatewaysRequest) - [Message `ListGatewaysRequest.Filter`](#ttn.lorawan.v3.ListGatewaysRequest.Filter) - [Message `ManagedGateway`](#ttn.lorawan.v3.ManagedGateway) + - [Message `ManagedGateway.Capabilities`](#ttn.lorawan.v3.ManagedGateway.Capabilities) - [Message `ManagedGatewayCellularBackhaul`](#ttn.lorawan.v3.ManagedGatewayCellularBackhaul) - [Message `ManagedGatewayControllerConnection`](#ttn.lorawan.v3.ManagedGatewayControllerConnection) - [Message `ManagedGatewayEthernetBackhaul`](#ttn.lorawan.v3.ManagedGatewayEthernetBackhaul) @@ -5441,6 +5442,7 @@ Filter gateways by fields. | ----- | ---- | ----- | ----------- | | `ids` | [`GatewayIdentifiers`](#ttn.lorawan.v3.GatewayIdentifiers) | | | | `version_ids` | [`GatewayVersionIdentifiers`](#ttn.lorawan.v3.GatewayVersionIdentifiers) | | | +| `capabilities` | [`ManagedGateway.Capabilities`](#ttn.lorawan.v3.ManagedGateway.Capabilities) | | | | `cellular_imei` | [`string`](#string) | | | | `cellular_imsi` | [`string`](#string) | | | | `wifi_mac_address` | [`bytes`](#bytes) | | | @@ -5460,6 +5462,19 @@ Filter gateways by fields. | `wifi_profile_id` |

`string.uuid`: `true`

| | `ethernet_profile_id` |

`string.uuid`: `true`

| +### Message `ManagedGateway.Capabilities` + +| Field | Type | Label | Description | +| ----- | ---- | ----- | ----------- | +| `wifi_2_4_ghz` | [`bool`](#bool) | | | +| `wifi_5_ghz` | [`bool`](#bool) | | | +| `scan_wifi_access_points` | [`bool`](#bool) | | | +| `ethernet` | [`bool`](#bool) | | | +| `cellular` | [`bool`](#bool) | | | +| `battery` | [`bool`](#bool) | | | +| `lora_8ch_concentrator` | [`bool`](#bool) | | | +| `firmware_update` | [`bool`](#bool) | | | + ### Message `ManagedGatewayCellularBackhaul` | Field | Type | Label | Description | diff --git a/api/ttn/lorawan/v3/api.swagger.json b/api/ttn/lorawan/v3/api.swagger.json index d9eb432aee..3350107fb4 100644 --- a/api/ttn/lorawan/v3/api.swagger.json +++ b/api/ttn/lorawan/v3/api.swagger.json @@ -18790,6 +18790,35 @@ ], "default": "AT_MOST_ONCE" }, + "ManagedGatewayCapabilities": { + "type": "object", + "properties": { + "wifi_2_4_ghz": { + "type": "boolean" + }, + "wifi_5_ghz": { + "type": "boolean" + }, + "scan_wifi_access_points": { + "type": "boolean" + }, + "ethernet": { + "type": "boolean" + }, + "cellular": { + "type": "boolean" + }, + "battery": { + "type": "boolean" + }, + "lora_8ch_concentrator": { + "type": "boolean" + }, + "firmware_update": { + "type": "boolean" + } + } + }, "ManagedGatewayConfigurationServiceScanWiFiAccessPointsBody": { "type": "object", "properties": { @@ -26744,6 +26773,9 @@ "version_ids": { "$ref": "#/definitions/v3GatewayVersionIdentifiers" }, + "capabilities": { + "$ref": "#/definitions/ManagedGatewayCapabilities" + }, "cellular_imei": { "type": "string" }, @@ -26803,6 +26835,9 @@ "version_ids": { "$ref": "#/definitions/v3GatewayVersionIdentifiers" }, + "capabilities": { + "$ref": "#/definitions/ManagedGatewayCapabilities" + }, "cellular_imei": { "type": "string" }, diff --git a/api/ttn/lorawan/v3/gateway.proto b/api/ttn/lorawan/v3/gateway.proto index a996af7006..9a9e5bb301 100644 --- a/api/ttn/lorawan/v3/gateway.proto +++ b/api/ttn/lorawan/v3/gateway.proto @@ -265,6 +265,22 @@ message ManagedGateway { ]; GatewayVersionIdentifiers version_ids = 2; + message Capabilities { + option (thethings.flags.message) = { + select: true + set: true + }; + bool wifi_2_4_ghz = 1; + bool wifi_5_ghz = 2; + bool scan_wifi_access_points = 3; + bool ethernet = 4; + bool cellular = 5; + bool battery = 6; + bool lora_8ch_concentrator = 7; + bool firmware_update = 8; + } + Capabilities capabilities = 9; + string cellular_imei = 3 [(validate.rules).string = { pattern: "^[0-9]{15}$" ignore_empty: true diff --git a/pkg/ttnpb/gateway.pb.go b/pkg/ttnpb/gateway.pb.go index 3131973d2e..f441b59c0b 100644 --- a/pkg/ttnpb/gateway.pb.go +++ b/pkg/ttnpb/gateway.pb.go @@ -943,14 +943,15 @@ type ManagedGateway struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Ids *GatewayIdentifiers `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` - VersionIds *GatewayVersionIdentifiers `protobuf:"bytes,2,opt,name=version_ids,json=versionIds,proto3" json:"version_ids,omitempty"` - CellularImei string `protobuf:"bytes,3,opt,name=cellular_imei,json=cellularImei,proto3" json:"cellular_imei,omitempty"` - CellularImsi string `protobuf:"bytes,4,opt,name=cellular_imsi,json=cellularImsi,proto3" json:"cellular_imsi,omitempty"` - WifiMacAddress []byte `protobuf:"bytes,5,opt,name=wifi_mac_address,json=wifiMacAddress,proto3" json:"wifi_mac_address,omitempty"` - EthernetMacAddress []byte `protobuf:"bytes,6,opt,name=ethernet_mac_address,json=ethernetMacAddress,proto3" json:"ethernet_mac_address,omitempty"` - WifiProfileId string `protobuf:"bytes,7,opt,name=wifi_profile_id,json=wifiProfileId,proto3" json:"wifi_profile_id,omitempty"` - EthernetProfileId string `protobuf:"bytes,8,opt,name=ethernet_profile_id,json=ethernetProfileId,proto3" json:"ethernet_profile_id,omitempty"` + Ids *GatewayIdentifiers `protobuf:"bytes,1,opt,name=ids,proto3" json:"ids,omitempty"` + VersionIds *GatewayVersionIdentifiers `protobuf:"bytes,2,opt,name=version_ids,json=versionIds,proto3" json:"version_ids,omitempty"` + Capabilities *ManagedGateway_Capabilities `protobuf:"bytes,9,opt,name=capabilities,proto3" json:"capabilities,omitempty"` + CellularImei string `protobuf:"bytes,3,opt,name=cellular_imei,json=cellularImei,proto3" json:"cellular_imei,omitempty"` + CellularImsi string `protobuf:"bytes,4,opt,name=cellular_imsi,json=cellularImsi,proto3" json:"cellular_imsi,omitempty"` + WifiMacAddress []byte `protobuf:"bytes,5,opt,name=wifi_mac_address,json=wifiMacAddress,proto3" json:"wifi_mac_address,omitempty"` + EthernetMacAddress []byte `protobuf:"bytes,6,opt,name=ethernet_mac_address,json=ethernetMacAddress,proto3" json:"ethernet_mac_address,omitempty"` + WifiProfileId string `protobuf:"bytes,7,opt,name=wifi_profile_id,json=wifiProfileId,proto3" json:"wifi_profile_id,omitempty"` + EthernetProfileId string `protobuf:"bytes,8,opt,name=ethernet_profile_id,json=ethernetProfileId,proto3" json:"ethernet_profile_id,omitempty"` } func (x *ManagedGateway) Reset() { @@ -999,6 +1000,13 @@ func (x *ManagedGateway) GetVersionIds() *GatewayVersionIdentifiers { return nil } +func (x *ManagedGateway) GetCapabilities() *ManagedGateway_Capabilities { + if x != nil { + return x.Capabilities + } + return nil +} + func (x *ManagedGateway) GetCellularImei() string { if x != nil { return x.CellularImei @@ -3451,6 +3459,109 @@ func (x *Gateway_LRFHSS) GetSupported() bool { return false } +type ManagedGateway_Capabilities struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Wifi_2_4Ghz bool `protobuf:"varint,1,opt,name=wifi_2_4_ghz,json=wifi24Ghz,proto3" json:"wifi_2_4_ghz,omitempty"` + Wifi_5Ghz bool `protobuf:"varint,2,opt,name=wifi_5_ghz,json=wifi5Ghz,proto3" json:"wifi_5_ghz,omitempty"` + ScanWifiAccessPoints bool `protobuf:"varint,3,opt,name=scan_wifi_access_points,json=scanWifiAccessPoints,proto3" json:"scan_wifi_access_points,omitempty"` + Ethernet bool `protobuf:"varint,4,opt,name=ethernet,proto3" json:"ethernet,omitempty"` + Cellular bool `protobuf:"varint,5,opt,name=cellular,proto3" json:"cellular,omitempty"` + Battery bool `protobuf:"varint,6,opt,name=battery,proto3" json:"battery,omitempty"` + Lora_8ChConcentrator bool `protobuf:"varint,7,opt,name=lora_8ch_concentrator,json=lora8chConcentrator,proto3" json:"lora_8ch_concentrator,omitempty"` + FirmwareUpdate bool `protobuf:"varint,8,opt,name=firmware_update,json=firmwareUpdate,proto3" json:"firmware_update,omitempty"` +} + +func (x *ManagedGateway_Capabilities) Reset() { + *x = ManagedGateway_Capabilities{} + if protoimpl.UnsafeEnabled { + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[44] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ManagedGateway_Capabilities) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ManagedGateway_Capabilities) ProtoMessage() {} + +func (x *ManagedGateway_Capabilities) ProtoReflect() protoreflect.Message { + mi := &file_ttn_lorawan_v3_gateway_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 ManagedGateway_Capabilities.ProtoReflect.Descriptor instead. +func (*ManagedGateway_Capabilities) Descriptor() ([]byte, []int) { + return file_ttn_lorawan_v3_gateway_proto_rawDescGZIP(), []int{7, 0} +} + +func (x *ManagedGateway_Capabilities) GetWifi_2_4Ghz() bool { + if x != nil { + return x.Wifi_2_4Ghz + } + return false +} + +func (x *ManagedGateway_Capabilities) GetWifi_5Ghz() bool { + if x != nil { + return x.Wifi_5Ghz + } + return false +} + +func (x *ManagedGateway_Capabilities) GetScanWifiAccessPoints() bool { + if x != nil { + return x.ScanWifiAccessPoints + } + return false +} + +func (x *ManagedGateway_Capabilities) GetEthernet() bool { + if x != nil { + return x.Ethernet + } + return false +} + +func (x *ManagedGateway_Capabilities) GetCellular() bool { + if x != nil { + return x.Cellular + } + return false +} + +func (x *ManagedGateway_Capabilities) GetBattery() bool { + if x != nil { + return x.Battery + } + return false +} + +func (x *ManagedGateway_Capabilities) GetLora_8ChConcentrator() bool { + if x != nil { + return x.Lora_8ChConcentrator + } + return false +} + +func (x *ManagedGateway_Capabilities) GetFirmwareUpdate() bool { + if x != nil { + return x.FirmwareUpdate + } + return false +} + // Filter gateways by fields. type ListGatewaysRequest_Filter struct { state protoimpl.MessageState @@ -3465,7 +3576,7 @@ type ListGatewaysRequest_Filter struct { func (x *ListGatewaysRequest_Filter) Reset() { *x = ListGatewaysRequest_Filter{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3478,7 +3589,7 @@ func (x *ListGatewaysRequest_Filter) String() string { func (*ListGatewaysRequest_Filter) ProtoMessage() {} func (x *ListGatewaysRequest_Filter) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[44] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3532,7 +3643,7 @@ type GatewayConnectionStats_RoundTripTimes struct { func (x *GatewayConnectionStats_RoundTripTimes) Reset() { *x = GatewayConnectionStats_RoundTripTimes{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[49] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3545,7 +3656,7 @@ func (x *GatewayConnectionStats_RoundTripTimes) String() string { func (*GatewayConnectionStats_RoundTripTimes) ProtoMessage() {} func (x *GatewayConnectionStats_RoundTripTimes) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[48] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[49] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3605,7 +3716,7 @@ type GatewayConnectionStats_SubBand struct { func (x *GatewayConnectionStats_SubBand) Reset() { *x = GatewayConnectionStats_SubBand{} if protoimpl.UnsafeEnabled { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[50] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -3618,7 +3729,7 @@ func (x *GatewayConnectionStats_SubBand) String() string { func (*GatewayConnectionStats_SubBand) ProtoMessage() {} func (x *GatewayConnectionStats_SubBand) ProtoReflect() protoreflect.Message { - mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[49] + mi := &file_ttn_lorawan_v3_gateway_proto_msgTypes[50] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -3922,7 +4033,7 @@ var file_ttn_lorawan_v3_gateway_proto_rawDesc = []byte{ 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x52, 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, 0xdc, 0x06, + 0x77, 0x61, 0x79, 0x52, 0x08, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x22, 0xed, 0x09, 0x0a, 0x0e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x46, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, @@ -3933,697 +4044,722 @@ var file_ttn_lorawan_v3_gateway_proto_rawDesc = []byte{ 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x49, 0x64, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, - 0x5f, 0x69, 0x6d, 0x65, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xfa, 0x42, 0x12, - 0x72, 0x10, 0x32, 0x0b, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x35, 0x7d, 0x24, 0xd0, - 0x01, 0x01, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x49, 0x6d, 0x65, 0x69, - 0x12, 0x3a, 0x0a, 0x0d, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x69, 0x6d, 0x73, - 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xfa, 0x42, 0x12, 0x72, 0x10, 0x32, 0x0b, - 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x35, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x0c, - 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x49, 0x6d, 0x73, 0x69, 0x12, 0xdb, 0x01, 0x0a, - 0x10, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x1d, 0x4a, 0x0e, 0x22, - 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x22, 0x9a, 0x02, 0x01, - 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, 0x68, - 0x06, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, - 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, - 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, 0x61, - 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, + 0x6e, 0x49, 0x64, 0x73, 0x12, 0x4f, 0x0a, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2e, 0x43, 0x61, 0x70, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, + 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x0d, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, + 0x72, 0x5f, 0x69, 0x6d, 0x65, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xfa, 0x42, + 0x12, 0x72, 0x10, 0x32, 0x0b, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x35, 0x7d, 0x24, + 0xd0, 0x01, 0x01, 0x52, 0x0c, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x49, 0x6d, 0x65, + 0x69, 0x12, 0x3a, 0x0a, 0x0d, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x69, 0x6d, + 0x73, 0x69, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x15, 0xfa, 0x42, 0x12, 0x72, 0x10, 0x32, + 0x0b, 0x5e, 0x5b, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x31, 0x35, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, + 0x0c, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x49, 0x6d, 0x73, 0x69, 0x12, 0xdb, 0x01, + 0x0a, 0x10, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x1d, 0x4a, 0x0e, + 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x22, 0x9a, 0x02, + 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, 0x04, + 0x68, 0x06, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, 0x33, - 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, 0x72, - 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0e, 0x77, 0x69, 0x66, 0x69, - 0x4d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x14, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x1d, 0x4a, - 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x22, 0x9a, - 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, 0x7a, - 0x04, 0x68, 0x06, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, + 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, 0x68, + 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, - 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, - 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, + 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, 0x61, + 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x0e, 0x77, 0x69, 0x66, + 0x69, 0x4d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0xe3, 0x01, 0x0a, 0x14, + 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x63, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb0, 0x01, 0x92, 0x41, 0x1d, + 0x4a, 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, 0x22, + 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x06, + 0x7a, 0x04, 0x68, 0x06, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, - 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, - 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x12, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x33, 0x0a, 0x0f, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, - 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, 0x52, 0x0d, 0x77, 0x69, 0x66, 0x69, 0x50, 0x72, 0x6f, 0x66, - 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x13, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, 0x52, - 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x49, 0x64, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xec, 0x02, 0x0a, - 0x1d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, - 0x69, 0x46, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x1b, - 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, 0x73, 0x73, 0x69, 0x64, 0x12, 0xc5, 0x01, 0x0a, 0x05, - 0x62, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xae, 0x01, 0x92, 0x41, - 0x1d, 0x4a, 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, 0x30, - 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, - 0x04, 0x7a, 0x02, 0x68, 0x06, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, - 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, - 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, 0x76, - 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, 0x73, - 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, + 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, + 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, + 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, + 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, + 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x12, 0x65, + 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x4d, 0x61, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x33, 0x0a, 0x0f, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, + 0x06, 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, 0x52, 0x0d, 0x77, 0x69, 0x66, 0x69, 0x50, 0x72, 0x6f, + 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x3b, 0x0a, 0x13, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x5f, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, + 0x52, 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x1a, 0xbd, 0x02, 0x0a, 0x0c, 0x43, 0x61, 0x70, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x12, 0x1f, 0x0a, 0x0c, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x32, 0x5f, 0x34, + 0x5f, 0x67, 0x68, 0x7a, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x77, 0x69, 0x66, 0x69, + 0x32, 0x34, 0x47, 0x68, 0x7a, 0x12, 0x1c, 0x0a, 0x0a, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x35, 0x5f, + 0x67, 0x68, 0x7a, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x77, 0x69, 0x66, 0x69, 0x35, + 0x47, 0x68, 0x7a, 0x12, 0x35, 0x0a, 0x17, 0x73, 0x63, 0x61, 0x6e, 0x5f, 0x77, 0x69, 0x66, 0x69, + 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x08, 0x52, 0x14, 0x73, 0x63, 0x61, 0x6e, 0x57, 0x69, 0x66, 0x69, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x65, 0x74, + 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, + 0x61, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, + 0x61, 0x72, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x62, 0x61, 0x74, 0x74, 0x65, 0x72, 0x79, 0x12, 0x32, 0x0a, 0x15, + 0x6c, 0x6f, 0x72, 0x61, 0x5f, 0x38, 0x63, 0x68, 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, + 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x13, 0x6c, 0x6f, 0x72, + 0x61, 0x38, 0x63, 0x68, 0x43, 0x6f, 0x6e, 0x63, 0x65, 0x6e, 0x74, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x69, 0x72, 0x6d, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0e, 0x66, 0x69, 0x72, 0x6d, 0x77, + 0x61, 0x72, 0x65, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, + 0x01, 0x10, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0xec, 0x02, + 0x0a, 0x1d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x57, 0x69, 0x46, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, 0x73, 0x73, 0x69, 0x64, 0x12, 0xc5, 0x01, 0x0a, + 0x05, 0x62, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xae, 0x01, 0x92, + 0x41, 0x1d, 0x4a, 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, 0x30, + 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, + 0x42, 0x04, 0x7a, 0x02, 0x68, 0x06, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, 0x2f, - 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, 0x6d, - 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x05, 0x62, 0x73, - 0x73, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x22, 0x74, 0x0a, 0x1e, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, - 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x52, 0x0a, - 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, - 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, - 0x73, 0x22, 0xf2, 0x02, 0x0a, 0x27, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x5e, 0x0a, - 0x0c, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x42, 0x3b, 0x92, 0x41, 0x2a, 0x4a, 0x1b, 0x5b, 0x22, 0x31, 0x39, 0x32, 0x2e, - 0x30, 0x2e, 0x32, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x32, 0x30, 0x30, 0x31, 0x3a, 0x64, 0x62, 0x38, - 0x3a, 0x3a, 0x31, 0x22, 0x5d, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, - 0x6e, 0x67, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x02, 0x22, 0x04, 0x72, 0x02, 0x70, 0x01, - 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x48, 0x0a, - 0x0b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x1a, 0x4a, 0x0b, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, - 0x32, 0x2e, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, - 0x67, 0xfa, 0x42, 0x07, 0x72, 0x05, 0xd0, 0x01, 0x01, 0x78, 0x01, 0x52, 0x0a, 0x73, 0x75, 0x62, - 0x6e, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x41, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x1a, 0x4a, 0x0b, 0x22, - 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x2e, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, - 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x07, 0x72, 0x05, 0xd0, 0x01, 0x01, 0x78, - 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x64, 0x6e, - 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, 0x42, - 0x39, 0x92, 0x41, 0x28, 0x4a, 0x19, 0x5b, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x2e, - 0x30, 0x22, 0x2c, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x2e, 0x31, 0x22, 0x5d, 0x9a, - 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x0b, 0x92, - 0x01, 0x08, 0x10, 0x02, 0x22, 0x04, 0x72, 0x02, 0x78, 0x01, 0x52, 0x0a, 0x64, 0x6e, 0x73, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, 0x1a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x65, 0x6d, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x70, 0x75, 0x54, - 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x22, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x72, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, - 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x25, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x72, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x14, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xf6, 0x01, - 0x0a, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x64, 0x68, 0x63, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0b, 0x64, 0x68, 0x63, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x55, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x09, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x1e, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, - 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, 0x5f, 0x0a, 0x11, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, - 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, - 0x2f, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, - 0x22, 0xe7, 0x03, 0x0a, 0x1a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, - 0x5f, 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x66, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, - 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, - 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, - 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, 0x73, 0x73, 0x69, 0x64, 0x12, 0xc5, 0x01, - 0x0a, 0x05, 0x62, 0x73, 0x73, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xae, 0x01, - 0x92, 0x41, 0x1d, 0x4a, 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, 0x31, - 0x30, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, - 0xfa, 0x42, 0x04, 0x7a, 0x02, 0x68, 0x06, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, + 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, 0x72, + 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, - 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x05, - 0x62, 0x73, 0x73, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, - 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, - 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x73, 0x73, - 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x22, 0x81, 0x01, 0x0a, 0x1e, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, - 0x65, 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, 0x5f, 0x0a, - 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, - 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, 0xd7, - 0x05, 0x0a, 0x17, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, - 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x06, 0x65, 0x6e, - 0x74, 0x69, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, 0x0d, - 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x48, - 0x00, 0x52, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x69, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, 0x6e, + 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x05, 0x62, + 0x73, 0x73, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, 0x52, 0x07, + 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x65, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x22, 0x74, 0x0a, 0x1e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, + 0x46, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x52, + 0x0a, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x0c, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x6f, 0x69, 0x6e, + 0x74, 0x73, 0x22, 0xf2, 0x02, 0x0a, 0x27, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x5e, + 0x0a, 0x0c, 0x69, 0x70, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x09, 0x42, 0x3b, 0x92, 0x41, 0x2a, 0x4a, 0x1b, 0x5b, 0x22, 0x31, 0x39, 0x32, + 0x2e, 0x30, 0x2e, 0x32, 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x32, 0x30, 0x30, 0x31, 0x3a, 0x64, 0x62, + 0x38, 0x3a, 0x3a, 0x31, 0x22, 0x5d, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, + 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x02, 0x22, 0x04, 0x72, 0x02, 0x70, + 0x01, 0x52, 0x0b, 0x69, 0x70, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x48, + 0x0a, 0x0b, 0x73, 0x75, 0x62, 0x6e, 0x65, 0x74, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x1a, 0x4a, 0x0b, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, + 0x2e, 0x32, 0x2e, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, + 0x6e, 0x67, 0xfa, 0x42, 0x07, 0x72, 0x05, 0xd0, 0x01, 0x01, 0x78, 0x01, 0x52, 0x0a, 0x73, 0x75, + 0x62, 0x6e, 0x65, 0x74, 0x4d, 0x61, 0x73, 0x6b, 0x12, 0x41, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x1a, 0x4a, 0x0b, + 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x2e, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, + 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x07, 0x72, 0x05, 0xd0, 0x01, 0x01, + 0x78, 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x5a, 0x0a, 0x0b, 0x64, + 0x6e, 0x73, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x09, + 0x42, 0x39, 0x92, 0x41, 0x28, 0x4a, 0x19, 0x5b, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, + 0x2e, 0x30, 0x22, 0x2c, 0x22, 0x31, 0x39, 0x32, 0x2e, 0x30, 0x2e, 0x32, 0x2e, 0x31, 0x22, 0x5d, + 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, 0x0b, + 0x92, 0x01, 0x08, 0x10, 0x02, 0x22, 0x04, 0x72, 0x02, 0x78, 0x01, 0x52, 0x0a, 0x64, 0x6e, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x62, 0x0a, 0x1a, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x44, 0x0a, 0x0f, 0x63, 0x70, 0x75, 0x5f, 0x74, 0x65, 0x6d, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x0e, 0x63, 0x70, 0x75, + 0x54, 0x65, 0x6d, 0x70, 0x65, 0x72, 0x61, 0x74, 0x75, 0x72, 0x65, 0x22, 0x98, 0x01, 0x0a, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, - 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x19, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x5d, 0x0a, 0x11, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x62, 0x61, 0x63, 0x6b, - 0x68, 0x61, 0x75, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x6f, 0x6e, 0x12, 0x72, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x14, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, + 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x25, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x72, 0x0a, 0x16, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x14, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, + 0x54, 0x79, 0x70, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0xf6, + 0x01, 0x0a, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x56, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x34, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x64, 0x68, 0x63, 0x70, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x0b, 0x64, 0x68, 0x63, 0x70, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x55, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x09, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xd7, 0x01, 0x0a, 0x1e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x75, 0x6c, - 0x61, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x48, 0x00, 0x52, 0x10, 0x63, 0x65, - 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, 0x51, - 0x0a, 0x0d, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x61, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, 0x5f, 0x0a, 0x11, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, - 0x6c, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x69, 0x66, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, - 0x6c, 0x12, 0x5d, 0x0a, 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x5f, 0x62, 0x61, - 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, - 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, - 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, - 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x48, 0x00, 0x52, 0x10, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, - 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x02, 0x0a, 0x19, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, - 0x06, 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, - 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, - 0x20, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, - 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, 0x73, - 0x73, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, 0x08, - 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x77, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x19, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x63, 0x0a, 0x1a, 0x4d, - 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, - 0x69, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x70, 0x72, 0x6f, - 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, 0x74, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x12, 0x23, 0x0a, 0x08, 0x6f, + 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, + 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x08, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, + 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x73, 0x73, 0x69, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x72, 0x73, 0x73, + 0x69, 0x22, 0xe7, 0x03, 0x0a, 0x1a, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, + 0x12, 0x5f, 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x66, 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, - 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, - 0x22, 0x92, 0x02, 0x0a, 0x1d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xd0, 0x01, 0x01, - 0xb0, 0x01, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, 0x2a, - 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x0b, 0x70, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x68, - 0x61, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x68, 0x61, 0x72, - 0x65, 0x64, 0x12, 0x77, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, - 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x52, 0x19, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, - 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x6b, 0x0a, 0x1e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, - 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, - 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, - 0x65, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, - 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, - 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, - 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, - 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, - 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, - 0x73, 0x6b, 0x22, 0xee, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x46, 0x6f, 0x72, 0x45, - 0x55, 0x49, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x03, 0x65, 0x75, - 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, 0x4a, 0x12, 0x22, - 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, 0x42, 0x43, 0x44, - 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, 0x42, - 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, - 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, 0x6b, - 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, 0x61, - 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, 0x67, + 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, + 0x10, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, + 0x65, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, 0x73, 0x73, 0x69, 0x64, 0x12, 0xc5, + 0x01, 0x0a, 0x05, 0x62, 0x73, 0x73, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xae, + 0x01, 0x92, 0x41, 0x1d, 0x4a, 0x0e, 0x22, 0x45, 0x43, 0x36, 0x35, 0x36, 0x45, 0x30, 0x30, 0x30, + 0x31, 0x30, 0x30, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, + 0x67, 0xfa, 0x42, 0x04, 0x7a, 0x02, 0x68, 0x06, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x55, - 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, 0x03, - 0x65, 0x75, 0x69, 0x22, 0xa2, 0x04, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x42, 0x06, 0xf2, 0xaa, 0x19, 0x02, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, - 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, - 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, 0x65, - 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, - 0x6b, 0x12, 0x77, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x61, 0xfa, 0x42, 0x5e, 0x72, 0x5c, 0x52, 0x00, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x0b, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x69, 0x64, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x75, 0x69, 0x52, - 0x0c, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x05, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, - 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, - 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x07, 0x66, 0x69, 0x6c, 0x74, - 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x47, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x46, - 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x1a, 0x5e, - 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0d, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x63, 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, 0x08, 0xfa, 0x42, 0x05, - 0xb2, 0x01, 0x02, 0x38, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, - 0x53, 0x69, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, 0x08, - 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x01, 0x22, 0xb0, 0x01, 0x0a, 0x14, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, - 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, 0x5b, - 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x8e, 0x01, 0x0a, 0x14, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x08, - 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, - 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x9f, 0x02, 0x0a, - 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, - 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x75, 0x0a, 0x05, 0x6f, 0x72, 0x64, - 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5f, 0xfa, 0x42, 0x5c, 0x72, 0x5a, 0x52, - 0x00, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x0b, 0x2d, - 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, - 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, - 0x12, 0x1e, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, - 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, - 0x70, 0x61, 0x67, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x01, 0x22, 0x7f, - 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, - 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, + 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, + 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, + 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x36, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, + 0x05, 0x62, 0x73, 0x73, 0x69, 0x64, 0x12, 0x21, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, + 0x6c, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x2a, 0x02, 0x28, 0x01, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x12, 0x2f, 0x0a, 0x13, 0x61, 0x75, 0x74, + 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x2f, 0x0a, 0x04, 0x72, 0x73, + 0x73, 0x69, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x46, 0x6c, 0x6f, 0x61, 0x74, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x52, 0x04, 0x72, 0x73, 0x73, 0x69, 0x22, 0x81, 0x01, 0x0a, 0x1e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, + 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, 0x5f, + 0x0a, 0x11, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, + 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x10, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x22, + 0xd7, 0x05, 0x0a, 0x17, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x44, 0x61, 0x74, 0x61, 0x12, 0x38, 0x0a, 0x06, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x48, 0x00, 0x52, 0x06, 0x65, + 0x6e, 0x74, 0x69, 0x74, 0x79, 0x12, 0x36, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x00, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x51, 0x0a, + 0x0d, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x53, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x48, 0x00, 0x52, 0x0c, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x69, 0x0a, 0x15, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x5f, 0x63, + 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x32, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x14, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x6c, 0x65, + 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x73, 0x0a, 0x19, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x47, 0x61, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x17, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x5d, 0x0a, 0x11, 0x63, 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, + 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x65, 0x6c, 0x6c, 0x75, + 0x6c, 0x61, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x48, 0x00, 0x52, 0x10, 0x63, + 0x65, 0x6c, 0x6c, 0x75, 0x6c, 0x61, 0x72, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x12, + 0x51, 0x0a, 0x0d, 0x77, 0x69, 0x66, 0x69, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, + 0x75, 0x6c, 0x48, 0x00, 0x52, 0x0c, 0x77, 0x69, 0x66, 0x69, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, + 0x75, 0x6c, 0x12, 0x5d, 0x0a, 0x11, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x5f, 0x62, + 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, + 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, + 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, + 0x65, 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, 0x6c, 0x48, 0x00, 0x52, + 0x10, 0x65, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x42, 0x61, 0x63, 0x6b, 0x68, 0x61, 0x75, + 0x6c, 0x42, 0x06, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x22, 0xd0, 0x02, 0x0a, 0x19, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, + 0x72, 0x06, 0xd0, 0x01, 0x01, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, + 0x65, 0x49, 0x64, 0x12, 0x2a, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x18, 0x20, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, + 0x16, 0x0a, 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x06, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x12, 0x1b, 0x0a, 0x04, 0x73, 0x73, 0x69, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x04, + 0x73, 0x73, 0x69, 0x64, 0x12, 0x23, 0x0a, 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x40, 0x52, + 0x08, 0x70, 0x61, 0x73, 0x73, 0x77, 0x6f, 0x72, 0x64, 0x12, 0x77, 0x0a, 0x1b, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, + 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x52, 0x19, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x63, 0x0a, 0x1a, + 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, + 0x46, 0x69, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x08, 0x70, 0x72, + 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, + 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x57, 0x69, 0x46, 0x69, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, + 0x73, 0x22, 0x92, 0x02, 0x0a, 0x1d, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x12, 0x2a, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x0b, 0xfa, 0x42, 0x08, 0x72, 0x06, 0xd0, 0x01, + 0x01, 0xb0, 0x01, 0x01, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x49, 0x64, 0x12, + 0x2a, 0x0a, 0x0c, 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x20, 0x52, 0x0b, + 0x70, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x06, 0x73, 0x68, 0x61, + 0x72, 0x65, 0x64, 0x12, 0x77, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x69, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x37, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, + 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x52, 0x19, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x08, 0xf2, 0xaa, + 0x19, 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x6b, 0x0a, 0x1e, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, + 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x49, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x66, + 0x69, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4d, 0x61, 0x6e, 0x61, + 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x45, 0x74, 0x68, 0x65, 0x72, 0x6e, + 0x65, 0x74, 0x50, 0x72, 0x6f, 0x66, 0x69, 0x6c, 0x65, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x66, 0x69, + 0x6c, 0x65, 0x73, 0x22, 0x9d, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x22, - 0x8f, 0x02, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, - 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x1b, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, - 0x72, 0x02, 0x18, 0x32, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x72, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x69, 0x67, 0x68, - 0x74, 0x42, 0x11, 0xfa, 0x42, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, 0x05, 0x82, - 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x0a, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, + 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, + 0x61, 0x73, 0x6b, 0x22, 0xee, 0x01, 0x0a, 0x22, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x46, 0x6f, 0x72, + 0x45, 0x55, 0x49, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0xc7, 0x01, 0x0a, 0x03, 0x65, + 0x75, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x42, 0xb4, 0x01, 0x92, 0x41, 0x21, 0x4a, 0x12, + 0x22, 0x37, 0x30, 0x42, 0x33, 0x44, 0x35, 0x37, 0x45, 0x44, 0x30, 0x30, 0x30, 0x41, 0x42, 0x43, + 0x44, 0x22, 0x9a, 0x02, 0x01, 0x07, 0xa2, 0x02, 0x06, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0xfa, + 0x42, 0x06, 0x7a, 0x04, 0x68, 0x08, 0x70, 0x01, 0xea, 0xaa, 0x19, 0x82, 0x01, 0x0a, 0x3f, 0x67, + 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, + 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, + 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, 0x4d, + 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x48, 0x45, 0x58, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x3f, + 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x2e, + 0x55, 0x6e, 0x6d, 0x61, 0x72, 0x73, 0x68, 0x61, 0x6c, 0x38, 0x42, 0x79, 0x74, 0x65, 0x73, 0x52, + 0x03, 0x65, 0x75, 0x69, 0x22, 0xa2, 0x04, 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x59, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x42, 0x06, 0xf2, 0xaa, 0x19, 0x02, 0x28, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, + 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, + 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, + 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, + 0x73, 0x6b, 0x12, 0x77, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x61, 0xfa, 0x42, 0x5e, 0x72, 0x5c, 0x52, 0x00, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x0b, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x69, 0x64, 0x52, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x75, 0x69, + 0x52, 0x0c, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x65, 0x75, 0x69, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, 0x72, 0x65, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x12, 0x1e, 0x0a, 0x05, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, + 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, + 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, 0x65, 0x12, + 0x18, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x12, 0x44, 0x0a, 0x07, 0x66, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x69, 0x73, 0x74, + 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, + 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x07, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x73, 0x1a, + 0x5e, 0x0a, 0x06, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x4b, 0x0a, 0x0d, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x73, 0x69, 0x6e, 0x63, 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, 0x08, 0xfa, 0x42, - 0x05, 0xb2, 0x01, 0x02, 0x40, 0x01, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x41, - 0x74, 0x22, 0xe1, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, - 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, - 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, - 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, - 0x39, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, - 0x33, 0x2e, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, - 0x10, 0x01, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, - 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, - 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x82, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, - 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, - 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x49, 0x64, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1f, 0x4c, - 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, - 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, - 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, - 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, - 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x1e, 0x0a, - 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, 0x42, - 0x05, 0x2a, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, 0x0a, - 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, 0x67, - 0x65, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x21, 0xfa, 0x42, 0x1e, 0x72, 0x1c, 0x52, 0x00, 0x52, 0x02, 0x69, 0x64, 0x52, 0x03, 0x2d, - 0x69, 0x64, 0x52, 0x07, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x06, 0x72, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xcb, 0x01, 0x0a, 0x1d, 0x47, - 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, - 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, - 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, - 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x0c, 0x63, - 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4f, - 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, - 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, - 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x53, 0x65, 0x74, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, + 0x05, 0xb2, 0x01, 0x02, 0x38, 0x01, 0x48, 0x00, 0x52, 0x0c, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x64, 0x53, 0x69, 0x6e, 0x63, 0x65, 0x42, 0x07, 0x0a, 0x05, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x3a, + 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x01, 0x22, 0xb0, 0x01, 0x0a, 0x14, 0x43, 0x72, + 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x12, + 0x5b, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0x8e, 0x01, 0x0a, + 0x14, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x42, + 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x67, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, + 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, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, + 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x9f, 0x02, + 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, + 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x75, 0x0a, 0x05, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x5f, 0xfa, 0x42, 0x5c, 0x72, 0x5a, + 0x52, 0x00, 0x52, 0x0a, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x0b, + 0x2d, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x52, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x52, 0x05, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x52, 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x52, 0x0b, 0x2d, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, + 0x72, 0x12, 0x1e, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, + 0x42, 0x08, 0xfa, 0x42, 0x05, 0x2a, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x12, 0x12, 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x04, 0x70, 0x61, 0x67, 0x65, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, 0x08, 0x00, 0x10, 0x01, 0x22, + 0x7f, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, + 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x63, 0x6f, 0x6c, - 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, - 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xd5, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, - 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, - 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, - 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x62, 0x0a, 0x10, 0x63, 0x6f, 0x6c, - 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, - 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x73, 0x22, 0xf4, 0x02, - 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, - 0x12, 0x12, 0x0a, 0x04, 0x67, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, 0x04, - 0x67, 0x61, 0x69, 0x6e, 0x12, 0x34, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, - 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x87, 0x01, 0x0a, 0x0a, 0x61, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, - 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x2e, - 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, - 0x37, 0xfa, 0x42, 0x32, 0x9a, 0x01, 0x2f, 0x10, 0x0a, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, 0x32, - 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, 0x5d, - 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x2a, - 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, - 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, 0x41, - 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 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, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, 0x04, - 0x08, 0x01, 0x10, 0x01, 0x22, 0x8f, 0x05, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x04, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 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, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, - 0x7f, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x36, - 0xfa, 0x42, 0x33, 0x9a, 0x01, 0x30, 0x10, 0x0a, 0x22, 0x25, 0x72, 0x23, 0x18, 0x24, 0x32, 0x1f, - 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x5f, 0x2d, 0x5d, - 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x2a, - 0x05, 0x72, 0x03, 0x18, 0x80, 0x01, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x4f, 0x0a, 0x11, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x5f, 0x6c, 0x6f, 0x63, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, - 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x08, 0x52, - 0x10, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x1e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, 0xfa, - 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x0a, 0x22, 0x04, 0x72, 0x02, 0x70, 0x01, 0x52, 0x02, 0x69, - 0x70, 0x12, 0x75, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, - 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x2f, - 0xfa, 0x42, 0x2c, 0x9a, 0x01, 0x29, 0x10, 0x20, 0x22, 0x25, 0x72, 0x23, 0x18, 0x24, 0x32, 0x1f, - 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x5f, 0x2d, 0x5d, - 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, 0x52, - 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x61, 0x64, 0x76, 0x61, - 0x6e, 0x63, 0x65, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, - 0x75, 0x63, 0x74, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x1a, 0x3b, 0x0a, - 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x09, 0x52, - 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, 0x65, - 0x74, 0x72, 0x69, 0x63, 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, 0x02, 0x52, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x26, 0x0a, 0x14, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, - 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x0e, - 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, 0x84, - 0x0b, 0x0a, 0x16, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x0b, 0x63, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x69, 0x73, 0x63, - 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, + 0x22, 0x8f, 0x02, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x1b, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, + 0x04, 0x72, 0x02, 0x18, 0x32, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x40, 0x0a, 0x06, 0x72, + 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x52, 0x69, 0x67, + 0x68, 0x74, 0x42, 0x11, 0xfa, 0x42, 0x0e, 0x92, 0x01, 0x0b, 0x08, 0x01, 0x18, 0x01, 0x22, 0x05, + 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x06, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x43, 0x0a, + 0x0a, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, 0x5f, 0x61, 0x74, 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, 0x0e, 0x64, - 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, 0x0a, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x17, 0x6c, 0x61, 0x73, - 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0xb2, 0x01, 0x02, 0x40, 0x01, 0x52, 0x09, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x73, + 0x41, 0x74, 0x22, 0xe1, 0x01, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, + 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, + 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, + 0x12, 0x39, 0x0a, 0x07, 0x61, 0x70, 0x69, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, + 0x76, 0x33, 0x2e, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x06, 0x61, 0x70, 0x69, 0x4b, 0x65, 0x79, 0x12, 0x39, 0x0a, 0x0a, 0x66, + 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 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, 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x09, 0x66, 0x69, 0x65, + 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x82, 0x01, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x50, 0x49, 0x4b, 0x65, 0x79, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, + 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, + 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x49, 0x64, 0x73, 0x12, 0x15, 0x0a, 0x06, 0x6b, 0x65, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6b, 0x65, 0x79, 0x49, 0x64, 0x22, 0xdd, 0x01, 0x0a, 0x1f, + 0x4c, 0x69, 0x73, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, + 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x4d, 0x0a, 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, + 0x10, 0x01, 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x1e, + 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x42, 0x08, 0xfa, + 0x42, 0x05, 0x2a, 0x03, 0x18, 0xe8, 0x07, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x70, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x04, 0x70, 0x61, + 0x67, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x21, 0xfa, 0x42, 0x1e, 0x72, 0x1c, 0x52, 0x00, 0x52, 0x02, 0x69, 0x64, 0x52, 0x03, + 0x2d, 0x69, 0x64, 0x52, 0x07, 0x2d, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x52, 0x06, 0x72, 0x69, + 0x67, 0x68, 0x74, 0x73, 0x52, 0x05, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x22, 0xcb, 0x01, 0x0a, 0x1d, + 0x47, 0x65, 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, + 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, + 0x0b, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, + 0x69, 0x66, 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, + 0x52, 0x0a, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x5b, 0x0a, 0x0c, + 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, + 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, + 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xba, 0x01, 0x0a, 0x1d, 0x53, 0x65, + 0x74, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x4a, 0x0a, 0x0c, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x42, 0x08, + 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0c, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x62, + 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x22, 0xd5, 0x01, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, + 0x61, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x4d, 0x0a, 0x0b, 0x67, + 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, + 0x69, 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0a, + 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x49, 0x64, 0x73, 0x12, 0x62, 0x0a, 0x10, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x69, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, + 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4f, 0x72, 0x55, 0x73, 0x65, 0x72, 0x49, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, + 0x65, 0x72, 0x73, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x0f, 0x63, + 0x6f, 0x6c, 0x6c, 0x61, 0x62, 0x6f, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x49, 0x64, 0x73, 0x22, 0xf4, + 0x02, 0x0a, 0x0e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, + 0x61, 0x12, 0x12, 0x0a, 0x04, 0x67, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x02, 0x52, + 0x04, 0x67, 0x61, 0x69, 0x6e, 0x12, 0x34, 0x0a, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, + 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x08, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x87, 0x01, 0x0a, 0x0a, + 0x61, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, + 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, + 0x2e, 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x42, 0x37, 0xfa, 0x42, 0x32, 0x9a, 0x01, 0x2f, 0x10, 0x0a, 0x22, 0x24, 0x72, 0x22, 0x18, 0x24, + 0x32, 0x1e, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x2d, + 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, + 0x2a, 0x05, 0x72, 0x03, 0x18, 0xc8, 0x01, 0x18, 0x01, 0x52, 0x0a, 0x61, 0x74, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x65, 0x73, 0x12, 0x45, 0x0a, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x27, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, + 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x09, 0x70, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x1a, 0x3d, 0x0a, 0x0f, + 0x41, 0x74, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x65, 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, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x3a, 0x08, 0xf2, 0xaa, 0x19, + 0x04, 0x08, 0x01, 0x10, 0x01, 0x22, 0x8f, 0x05, 0x0a, 0x0d, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, + 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2e, 0x0a, 0x04, 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, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x37, 0x0a, 0x09, 0x62, 0x6f, 0x6f, 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, 0x52, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, 0x0b, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, - 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, 0x17, - 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, - 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x08, 0x62, 0x6f, 0x6f, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x12, 0x7f, 0x0a, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x2e, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, + 0x36, 0xfa, 0x42, 0x33, 0x9a, 0x01, 0x30, 0x10, 0x0a, 0x22, 0x25, 0x72, 0x23, 0x18, 0x24, 0x32, + 0x1f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x5f, 0x2d, + 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, + 0x2a, 0x05, 0x72, 0x03, 0x18, 0x80, 0x01, 0x52, 0x08, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x4f, 0x0a, 0x11, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x5f, 0x6c, 0x6f, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x74, + 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x4c, 0x6f, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x08, + 0x52, 0x10, 0x61, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x4c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x42, 0x0e, + 0xfa, 0x42, 0x0b, 0x92, 0x01, 0x08, 0x10, 0x0a, 0x22, 0x04, 0x72, 0x02, 0x70, 0x01, 0x52, 0x02, + 0x69, 0x70, 0x12, 0x75, 0x0a, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x18, 0x06, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, + 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x2e, 0x4d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, + 0x2f, 0xfa, 0x42, 0x2c, 0x9a, 0x01, 0x29, 0x10, 0x20, 0x22, 0x25, 0x72, 0x23, 0x18, 0x24, 0x32, + 0x1f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x28, 0x3f, 0x3a, 0x5b, 0x5f, 0x2d, + 0x5d, 0x3f, 0x5b, 0x61, 0x2d, 0x7a, 0x30, 0x2d, 0x39, 0x5d, 0x29, 0x7b, 0x32, 0x2c, 0x7d, 0x24, + 0x52, 0x07, 0x6d, 0x65, 0x74, 0x72, 0x69, 0x63, 0x73, 0x12, 0x33, 0x0a, 0x08, 0x61, 0x64, 0x76, + 0x61, 0x6e, 0x63, 0x65, 0x64, 0x18, 0x63, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, + 0x72, 0x75, 0x63, 0x74, 0x52, 0x08, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x64, 0x1a, 0x3b, + 0x0a, 0x0d, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 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, 0x09, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x3a, 0x0a, 0x0c, 0x4d, + 0x65, 0x74, 0x72, 0x69, 0x63, 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, 0x02, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x26, 0x0a, 0x14, 0x47, 0x61, 0x74, 0x65, 0x77, + 0x61, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x0e, 0x0a, 0x02, 0x69, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x70, 0x22, + 0x84, 0x0b, 0x0a, 0x16, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3d, 0x0a, 0x0c, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x0b, 0x63, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x43, 0x0a, 0x0f, 0x64, 0x69, 0x73, + 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0b, 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, + 0x64, 0x69, 0x73, 0x63, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x65, 0x64, 0x41, 0x74, 0x12, 0x1a, + 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x6f, 0x6c, 0x12, 0x51, 0x0a, 0x17, 0x6c, 0x61, + 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, + 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x14, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x3e, 0x0a, + 0x0b, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, + 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x0a, 0x6c, 0x61, 0x73, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, + 0x17, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 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, 0x73, 0x74, + 0x55, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, + 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x07, 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, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, + 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x6f, + 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x66, 0x0a, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x78, 0x5f, 0x61, 0x63, 0x6b, + 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 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, 0x73, 0x74, 0x55, - 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x52, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, - 0x21, 0x0a, 0x0c, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x75, 0x70, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x55, 0x0a, 0x19, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x6c, - 0x69, 0x6e, 0x6b, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x07, 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, 0x16, 0x6c, 0x61, 0x73, 0x74, 0x44, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x52, - 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x64, 0x6f, 0x77, - 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0d, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x66, 0x0a, 0x22, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x74, 0x78, 0x5f, 0x61, 0x63, 0x6b, 0x6e, - 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x63, 0x65, 0x69, - 0x76, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x0d, 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, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x54, 0x78, - 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x78, 0x5f, 0x61, - 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x74, 0x78, 0x41, 0x63, 0x6b, - 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x5f, 0x0a, 0x10, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, 0x6e, - 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, - 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x52, 0x0e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x5f, 0x62, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x0a, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, - 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, - 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x53, 0x75, 0x62, - 0x42, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x73, 0x75, 0x62, 0x42, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x5a, - 0x0a, 0x16, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x24, - 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, - 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x52, 0x14, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x6d, - 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xd1, 0x01, 0x0a, 0x0e, 0x52, - 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x35, 0x0a, - 0x03, 0x6d, 0x69, 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, 0x08, 0xfa, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x01, 0x52, - 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x35, 0x0a, 0x03, 0x6d, 0x61, 0x78, 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, 0x08, 0xfa, 0x42, - 0x05, 0xaa, 0x01, 0x02, 0x08, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x3b, 0x0a, 0x06, 0x6d, - 0x65, 0x64, 0x69, 0x61, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, + 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x1e, 0x6c, 0x61, 0x73, 0x74, 0x54, + 0x78, 0x41, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x63, 0x65, 0x69, 0x76, 0x65, 0x64, 0x41, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x74, 0x78, 0x5f, + 0x61, 0x63, 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x74, 0x78, 0x41, 0x63, + 0x6b, 0x6e, 0x6f, 0x77, 0x6c, 0x65, 0x64, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x5f, 0x0a, 0x10, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x5f, 0x74, 0x72, 0x69, 0x70, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x74, 0x74, + 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, + 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x2e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x52, 0x0e, 0x72, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x12, 0x4b, 0x0a, 0x09, 0x73, 0x75, 0x62, 0x5f, 0x62, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x0a, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, + 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x43, 0x6f, + 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x2e, 0x53, 0x75, + 0x62, 0x42, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x73, 0x75, 0x62, 0x42, 0x61, 0x6e, 0x64, 0x73, 0x12, + 0x5a, 0x0a, 0x16, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x5f, 0x72, 0x65, 0x6d, 0x6f, 0x74, + 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x24, 0x2e, 0x74, 0x74, 0x6e, 0x2e, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2e, 0x76, 0x33, + 0x2e, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x14, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x52, 0x65, + 0x6d, 0x6f, 0x74, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x1a, 0xd1, 0x01, 0x0a, 0x0e, + 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x54, 0x72, 0x69, 0x70, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x12, 0x35, + 0x0a, 0x03, 0x6d, 0x69, 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, 0x08, 0xfa, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x01, - 0x52, 0x06, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, 0xc4, - 0x01, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x42, 0x61, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x69, - 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, - 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x65, 0x71, 0x75, - 0x65, 0x6e, 0x63, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, - 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, - 0x6e, 0x6b, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, 0x6d, - 0x69, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x75, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x02, - 0x52, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0xa7, 0x02, 0x0a, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, - 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, 0x32, - 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, - 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, - 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, - 0x45, 0x44, 0x10, 0x00, 0x12, 0x33, 0x0a, 0x2f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, - 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, - 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x43, - 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x01, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x41, 0x4e, - 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, - 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4d, 0x41, + 0x52, 0x03, 0x6d, 0x69, 0x6e, 0x12, 0x35, 0x0a, 0x03, 0x6d, 0x61, 0x78, 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, 0x08, 0xfa, + 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, 0x01, 0x52, 0x03, 0x6d, 0x61, 0x78, 0x12, 0x3b, 0x0a, 0x06, + 0x6d, 0x65, 0x64, 0x69, 0x61, 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, 0x08, 0xfa, 0x42, 0x05, 0xaa, 0x01, 0x02, 0x08, + 0x01, 0x52, 0x06, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x6e, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x1a, + 0xc4, 0x01, 0x0a, 0x07, 0x53, 0x75, 0x62, 0x42, 0x61, 0x6e, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x6d, + 0x69, 0x6e, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x46, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, 0x79, + 0x12, 0x23, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x5f, 0x66, 0x72, 0x65, 0x71, 0x75, 0x65, 0x6e, 0x63, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x46, 0x72, 0x65, 0x71, + 0x75, 0x65, 0x6e, 0x63, 0x79, 0x12, 0x3c, 0x0a, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, + 0x6b, 0x5f, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x6c, + 0x69, 0x6e, 0x6b, 0x55, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4c, 0x69, + 0x6d, 0x69, 0x74, 0x12, 0x31, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, + 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x02, 0x52, 0x13, 0x64, 0x6f, 0x77, 0x6e, 0x6c, 0x69, 0x6e, 0x6b, 0x55, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2a, 0xa7, 0x02, 0x0a, 0x22, 0x4d, 0x61, 0x6e, 0x61, 0x67, + 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, 0x63, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x0a, + 0x32, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, + 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, + 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x33, 0x0a, 0x2f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, + 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, + 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x43, 0x45, 0x4c, 0x4c, 0x55, 0x4c, 0x41, 0x52, 0x10, 0x01, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, - 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x10, 0x03, 0x1a, - 0x2e, 0xea, 0xaa, 0x19, 0x2a, 0x18, 0x01, 0x2a, 0x26, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, - 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x2a, - 0xab, 0x02, 0x0a, 0x24, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, 0x77, - 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, 0x61, - 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x34, 0x4d, 0x41, 0x4e, 0x41, - 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, - 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, - 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, - 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, - 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, - 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, - 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, - 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, - 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x57, 0x49, 0x46, 0x49, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4d, + 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, + 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, + 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x45, 0x54, 0x48, 0x45, 0x52, 0x4e, 0x45, 0x54, 0x10, 0x03, + 0x1a, 0x2e, 0xea, 0xaa, 0x19, 0x2a, 0x18, 0x01, 0x2a, 0x26, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, + 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, + 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x2a, 0xab, 0x02, 0x0a, 0x24, 0x4d, 0x61, 0x6e, 0x61, 0x67, 0x65, 0x64, 0x47, 0x61, 0x74, 0x65, + 0x77, 0x61, 0x79, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x66, + 0x61, 0x63, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x38, 0x0a, 0x34, 0x4d, 0x41, 0x4e, + 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, + 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2d, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, + 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, + 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x44, 0x4f, 0x57, 0x4e, 0x10, 0x01, 0x12, 0x2f, 0x0a, 0x2b, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x30, 0xea, 0xaa, 0x19, - 0x2c, 0x18, 0x01, 0x2a, 0x28, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, - 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, - 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x2a, 0x5c, 0x0a, - 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, 0x50, - 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x4c, 0x41, 0x43, - 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, - 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x44, 0x4f, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x4f, - 0x55, 0x54, 0x44, 0x4f, 0x4f, 0x52, 0x10, 0x02, 0x1a, 0x11, 0xea, 0xaa, 0x19, 0x0d, 0x18, 0x01, - 0x2a, 0x09, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x42, 0x31, 0x5a, 0x2f, 0x67, - 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, 0x63, - 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x55, 0x53, 0x5f, 0x55, 0x50, 0x10, 0x02, 0x12, 0x33, 0x0a, 0x2f, 0x4d, 0x41, 0x4e, 0x41, 0x47, + 0x45, 0x44, 0x5f, 0x47, 0x41, 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, + 0x52, 0x4b, 0x5f, 0x49, 0x4e, 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x55, 0x53, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x03, 0x1a, 0x30, 0xea, 0xaa, + 0x19, 0x2c, 0x18, 0x01, 0x2a, 0x28, 0x4d, 0x41, 0x4e, 0x41, 0x47, 0x45, 0x44, 0x5f, 0x47, 0x41, + 0x54, 0x45, 0x57, 0x41, 0x59, 0x5f, 0x4e, 0x45, 0x54, 0x57, 0x4f, 0x52, 0x4b, 0x5f, 0x49, 0x4e, + 0x54, 0x45, 0x52, 0x46, 0x41, 0x43, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x2a, 0x5c, + 0x0a, 0x17, 0x47, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x41, 0x6e, 0x74, 0x65, 0x6e, 0x6e, 0x61, + 0x50, 0x6c, 0x61, 0x63, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x4c, 0x41, + 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, + 0x12, 0x0a, 0x0a, 0x06, 0x49, 0x4e, 0x44, 0x4f, 0x4f, 0x52, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, + 0x4f, 0x55, 0x54, 0x44, 0x4f, 0x4f, 0x52, 0x10, 0x02, 0x1a, 0x11, 0xea, 0xaa, 0x19, 0x0d, 0x18, + 0x01, 0x2a, 0x09, 0x50, 0x4c, 0x41, 0x43, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x42, 0x31, 0x5a, 0x2f, + 0x67, 0x6f, 0x2e, 0x74, 0x68, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x73, 0x2e, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6f, 0x72, 0x61, 0x77, 0x61, 0x6e, 0x2d, 0x73, 0x74, 0x61, + 0x63, 0x6b, 0x2f, 0x76, 0x33, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x74, 0x74, 0x6e, 0x70, 0x62, 0x62, + 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -4639,7 +4775,7 @@ func file_ttn_lorawan_v3_gateway_proto_rawDescGZIP() []byte { } var file_ttn_lorawan_v3_gateway_proto_enumTypes = make([]protoimpl.EnumInfo, 3) -var file_ttn_lorawan_v3_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 50) +var file_ttn_lorawan_v3_gateway_proto_msgTypes = make([]protoimpl.MessageInfo, 51) var file_ttn_lorawan_v3_gateway_proto_goTypes = []interface{}{ (ManagedGatewayNetworkInterfaceType)(0), // 0: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceType (ManagedGatewayNetworkInterfaceStatus)(0), // 1: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceStatus @@ -4688,127 +4824,129 @@ var file_ttn_lorawan_v3_gateway_proto_goTypes = []interface{}{ (*GatewayRadio_TxConfiguration)(nil), // 44: ttn.lorawan.v3.GatewayRadio.TxConfiguration nil, // 45: ttn.lorawan.v3.Gateway.AttributesEntry (*Gateway_LRFHSS)(nil), // 46: ttn.lorawan.v3.Gateway.LRFHSS - (*ListGatewaysRequest_Filter)(nil), // 47: ttn.lorawan.v3.ListGatewaysRequest.Filter - nil, // 48: ttn.lorawan.v3.GatewayAntenna.AttributesEntry - nil, // 49: ttn.lorawan.v3.GatewayStatus.VersionsEntry - nil, // 50: ttn.lorawan.v3.GatewayStatus.MetricsEntry - (*GatewayConnectionStats_RoundTripTimes)(nil), // 51: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes - (*GatewayConnectionStats_SubBand)(nil), // 52: ttn.lorawan.v3.GatewayConnectionStats.SubBand - (*Secret)(nil), // 53: ttn.lorawan.v3.Secret - (*timestamppb.Timestamp)(nil), // 54: google.protobuf.Timestamp - (*GatewayIdentifiers)(nil), // 55: ttn.lorawan.v3.GatewayIdentifiers - (*ContactInfo)(nil), // 56: ttn.lorawan.v3.ContactInfo - (*OrganizationOrUserIdentifiers)(nil), // 57: ttn.lorawan.v3.OrganizationOrUserIdentifiers - (DownlinkPathConstraint)(0), // 58: ttn.lorawan.v3.DownlinkPathConstraint - (*durationpb.Duration)(nil), // 59: google.protobuf.Duration - (*wrapperspb.FloatValue)(nil), // 60: google.protobuf.FloatValue - (*Location)(nil), // 61: ttn.lorawan.v3.Location - (*fieldmaskpb.FieldMask)(nil), // 62: google.protobuf.FieldMask - (Right)(0), // 63: ttn.lorawan.v3.Right - (*APIKey)(nil), // 64: ttn.lorawan.v3.APIKey - (*Collaborator)(nil), // 65: ttn.lorawan.v3.Collaborator - (*structpb.Struct)(nil), // 66: google.protobuf.Struct + (*ManagedGateway_Capabilities)(nil), // 47: ttn.lorawan.v3.ManagedGateway.Capabilities + (*ListGatewaysRequest_Filter)(nil), // 48: ttn.lorawan.v3.ListGatewaysRequest.Filter + nil, // 49: ttn.lorawan.v3.GatewayAntenna.AttributesEntry + nil, // 50: ttn.lorawan.v3.GatewayStatus.VersionsEntry + nil, // 51: ttn.lorawan.v3.GatewayStatus.MetricsEntry + (*GatewayConnectionStats_RoundTripTimes)(nil), // 52: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes + (*GatewayConnectionStats_SubBand)(nil), // 53: ttn.lorawan.v3.GatewayConnectionStats.SubBand + (*Secret)(nil), // 54: ttn.lorawan.v3.Secret + (*timestamppb.Timestamp)(nil), // 55: google.protobuf.Timestamp + (*GatewayIdentifiers)(nil), // 56: ttn.lorawan.v3.GatewayIdentifiers + (*ContactInfo)(nil), // 57: ttn.lorawan.v3.ContactInfo + (*OrganizationOrUserIdentifiers)(nil), // 58: ttn.lorawan.v3.OrganizationOrUserIdentifiers + (DownlinkPathConstraint)(0), // 59: ttn.lorawan.v3.DownlinkPathConstraint + (*durationpb.Duration)(nil), // 60: google.protobuf.Duration + (*wrapperspb.FloatValue)(nil), // 61: google.protobuf.FloatValue + (*Location)(nil), // 62: ttn.lorawan.v3.Location + (*fieldmaskpb.FieldMask)(nil), // 63: google.protobuf.FieldMask + (Right)(0), // 64: ttn.lorawan.v3.Right + (*APIKey)(nil), // 65: ttn.lorawan.v3.APIKey + (*Collaborator)(nil), // 66: ttn.lorawan.v3.Collaborator + (*structpb.Struct)(nil), // 67: google.protobuf.Struct } var file_ttn_lorawan_v3_gateway_proto_depIdxs = []int32{ 44, // 0: ttn.lorawan.v3.GatewayRadio.tx_configuration:type_name -> ttn.lorawan.v3.GatewayRadio.TxConfiguration - 53, // 1: ttn.lorawan.v3.GatewayClaimAuthenticationCode.secret:type_name -> ttn.lorawan.v3.Secret - 54, // 2: ttn.lorawan.v3.GatewayClaimAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp - 54, // 3: ttn.lorawan.v3.GatewayClaimAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp - 55, // 4: ttn.lorawan.v3.Gateway.ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 54, // 5: ttn.lorawan.v3.Gateway.created_at:type_name -> google.protobuf.Timestamp - 54, // 6: ttn.lorawan.v3.Gateway.updated_at:type_name -> google.protobuf.Timestamp - 54, // 7: ttn.lorawan.v3.Gateway.deleted_at:type_name -> google.protobuf.Timestamp + 54, // 1: ttn.lorawan.v3.GatewayClaimAuthenticationCode.secret:type_name -> ttn.lorawan.v3.Secret + 55, // 2: ttn.lorawan.v3.GatewayClaimAuthenticationCode.valid_from:type_name -> google.protobuf.Timestamp + 55, // 3: ttn.lorawan.v3.GatewayClaimAuthenticationCode.valid_to:type_name -> google.protobuf.Timestamp + 56, // 4: ttn.lorawan.v3.Gateway.ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 55, // 5: ttn.lorawan.v3.Gateway.created_at:type_name -> google.protobuf.Timestamp + 55, // 6: ttn.lorawan.v3.Gateway.updated_at:type_name -> google.protobuf.Timestamp + 55, // 7: ttn.lorawan.v3.Gateway.deleted_at:type_name -> google.protobuf.Timestamp 45, // 8: ttn.lorawan.v3.Gateway.attributes:type_name -> ttn.lorawan.v3.Gateway.AttributesEntry - 56, // 9: ttn.lorawan.v3.Gateway.contact_info:type_name -> ttn.lorawan.v3.ContactInfo - 57, // 10: ttn.lorawan.v3.Gateway.administrative_contact:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers - 57, // 11: ttn.lorawan.v3.Gateway.technical_contact:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 57, // 9: ttn.lorawan.v3.Gateway.contact_info:type_name -> ttn.lorawan.v3.ContactInfo + 58, // 10: ttn.lorawan.v3.Gateway.administrative_contact:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 58, // 11: ttn.lorawan.v3.Gateway.technical_contact:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers 5, // 12: ttn.lorawan.v3.Gateway.version_ids:type_name -> ttn.lorawan.v3.GatewayVersionIdentifiers 40, // 13: ttn.lorawan.v3.Gateway.antennas:type_name -> ttn.lorawan.v3.GatewayAntenna - 58, // 14: ttn.lorawan.v3.Gateway.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint - 59, // 15: ttn.lorawan.v3.Gateway.schedule_anytime_delay:type_name -> google.protobuf.Duration - 53, // 16: ttn.lorawan.v3.Gateway.lbs_lns_secret:type_name -> ttn.lorawan.v3.Secret + 59, // 14: ttn.lorawan.v3.Gateway.downlink_path_constraint:type_name -> ttn.lorawan.v3.DownlinkPathConstraint + 60, // 15: ttn.lorawan.v3.Gateway.schedule_anytime_delay:type_name -> google.protobuf.Duration + 54, // 16: ttn.lorawan.v3.Gateway.lbs_lns_secret:type_name -> ttn.lorawan.v3.Secret 7, // 17: ttn.lorawan.v3.Gateway.claim_authentication_code:type_name -> ttn.lorawan.v3.GatewayClaimAuthenticationCode - 53, // 18: ttn.lorawan.v3.Gateway.target_cups_key:type_name -> ttn.lorawan.v3.Secret + 54, // 18: ttn.lorawan.v3.Gateway.target_cups_key:type_name -> ttn.lorawan.v3.Secret 46, // 19: ttn.lorawan.v3.Gateway.lrfhss:type_name -> ttn.lorawan.v3.Gateway.LRFHSS 8, // 20: ttn.lorawan.v3.Gateways.gateways:type_name -> ttn.lorawan.v3.Gateway - 55, // 21: ttn.lorawan.v3.ManagedGateway.ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 56, // 21: ttn.lorawan.v3.ManagedGateway.ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers 5, // 22: ttn.lorawan.v3.ManagedGateway.version_ids:type_name -> ttn.lorawan.v3.GatewayVersionIdentifiers - 11, // 23: ttn.lorawan.v3.ManagedGatewayWiFiAccessPoints.access_points:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiAccessPoint - 60, // 24: ttn.lorawan.v3.ManagedGatewaySystemStatus.cpu_temperature:type_name -> google.protobuf.FloatValue - 0, // 25: ttn.lorawan.v3.ManagedGatewayControllerConnection.network_interface_type:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceType - 0, // 26: ttn.lorawan.v3.ManagedGatewayGatewayServerConnection.network_interface_type:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceType - 1, // 27: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo.status:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceStatus - 13, // 28: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo.addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses - 17, // 29: ttn.lorawan.v3.ManagedGatewayCellularBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo - 60, // 30: ttn.lorawan.v3.ManagedGatewayCellularBackhaul.rssi:type_name -> google.protobuf.FloatValue - 17, // 31: ttn.lorawan.v3.ManagedGatewayWiFiBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo - 60, // 32: ttn.lorawan.v3.ManagedGatewayWiFiBackhaul.rssi:type_name -> google.protobuf.FloatValue - 17, // 33: ttn.lorawan.v3.ManagedGatewayEthernetBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo - 10, // 34: ttn.lorawan.v3.ManagedGatewayEventData.entity:type_name -> ttn.lorawan.v3.ManagedGateway - 61, // 35: ttn.lorawan.v3.ManagedGatewayEventData.location:type_name -> ttn.lorawan.v3.Location - 14, // 36: ttn.lorawan.v3.ManagedGatewayEventData.system_status:type_name -> ttn.lorawan.v3.ManagedGatewaySystemStatus - 15, // 37: ttn.lorawan.v3.ManagedGatewayEventData.controller_connection:type_name -> ttn.lorawan.v3.ManagedGatewayControllerConnection - 16, // 38: ttn.lorawan.v3.ManagedGatewayEventData.gateway_server_connection:type_name -> ttn.lorawan.v3.ManagedGatewayGatewayServerConnection - 18, // 39: ttn.lorawan.v3.ManagedGatewayEventData.cellular_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayCellularBackhaul - 19, // 40: ttn.lorawan.v3.ManagedGatewayEventData.wifi_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiBackhaul - 20, // 41: ttn.lorawan.v3.ManagedGatewayEventData.ethernet_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayEthernetBackhaul - 13, // 42: ttn.lorawan.v3.ManagedGatewayWiFiProfile.network_interface_addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses - 22, // 43: ttn.lorawan.v3.ManagedGatewayWiFiProfiles.profiles:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiProfile - 13, // 44: ttn.lorawan.v3.ManagedGatewayEthernetProfile.network_interface_addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses - 24, // 45: ttn.lorawan.v3.ManagedGatewayEthernetProfiles.profiles:type_name -> ttn.lorawan.v3.ManagedGatewayEthernetProfile - 55, // 46: ttn.lorawan.v3.GetGatewayRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 62, // 47: ttn.lorawan.v3.GetGatewayRequest.field_mask:type_name -> google.protobuf.FieldMask - 57, // 48: ttn.lorawan.v3.ListGatewaysRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers - 62, // 49: ttn.lorawan.v3.ListGatewaysRequest.field_mask:type_name -> google.protobuf.FieldMask - 47, // 50: ttn.lorawan.v3.ListGatewaysRequest.filters:type_name -> ttn.lorawan.v3.ListGatewaysRequest.Filter - 8, // 51: ttn.lorawan.v3.CreateGatewayRequest.gateway:type_name -> ttn.lorawan.v3.Gateway - 57, // 52: ttn.lorawan.v3.CreateGatewayRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers - 8, // 53: ttn.lorawan.v3.UpdateGatewayRequest.gateway:type_name -> ttn.lorawan.v3.Gateway - 62, // 54: ttn.lorawan.v3.UpdateGatewayRequest.field_mask:type_name -> google.protobuf.FieldMask - 55, // 55: ttn.lorawan.v3.ListGatewayAPIKeysRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 55, // 56: ttn.lorawan.v3.GetGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 55, // 57: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 63, // 58: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.rights:type_name -> ttn.lorawan.v3.Right - 54, // 59: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.expires_at:type_name -> google.protobuf.Timestamp - 55, // 60: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 64, // 61: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.api_key:type_name -> ttn.lorawan.v3.APIKey - 62, // 62: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.field_mask:type_name -> google.protobuf.FieldMask - 55, // 63: ttn.lorawan.v3.DeleteGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 55, // 64: ttn.lorawan.v3.ListGatewayCollaboratorsRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 55, // 65: ttn.lorawan.v3.GetGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 57, // 66: ttn.lorawan.v3.GetGatewayCollaboratorRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers - 55, // 67: ttn.lorawan.v3.SetGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 65, // 68: ttn.lorawan.v3.SetGatewayCollaboratorRequest.collaborator:type_name -> ttn.lorawan.v3.Collaborator - 55, // 69: ttn.lorawan.v3.DeleteGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers - 57, // 70: ttn.lorawan.v3.DeleteGatewayCollaboratorRequest.collaborator_ids:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers - 61, // 71: ttn.lorawan.v3.GatewayAntenna.location:type_name -> ttn.lorawan.v3.Location - 48, // 72: ttn.lorawan.v3.GatewayAntenna.attributes:type_name -> ttn.lorawan.v3.GatewayAntenna.AttributesEntry - 2, // 73: ttn.lorawan.v3.GatewayAntenna.placement:type_name -> ttn.lorawan.v3.GatewayAntennaPlacement - 54, // 74: ttn.lorawan.v3.GatewayStatus.time:type_name -> google.protobuf.Timestamp - 54, // 75: ttn.lorawan.v3.GatewayStatus.boot_time:type_name -> google.protobuf.Timestamp - 49, // 76: ttn.lorawan.v3.GatewayStatus.versions:type_name -> ttn.lorawan.v3.GatewayStatus.VersionsEntry - 61, // 77: ttn.lorawan.v3.GatewayStatus.antenna_locations:type_name -> ttn.lorawan.v3.Location - 50, // 78: ttn.lorawan.v3.GatewayStatus.metrics:type_name -> ttn.lorawan.v3.GatewayStatus.MetricsEntry - 66, // 79: ttn.lorawan.v3.GatewayStatus.advanced:type_name -> google.protobuf.Struct - 54, // 80: ttn.lorawan.v3.GatewayConnectionStats.connected_at:type_name -> google.protobuf.Timestamp - 54, // 81: ttn.lorawan.v3.GatewayConnectionStats.disconnected_at:type_name -> google.protobuf.Timestamp - 54, // 82: ttn.lorawan.v3.GatewayConnectionStats.last_status_received_at:type_name -> google.protobuf.Timestamp - 41, // 83: ttn.lorawan.v3.GatewayConnectionStats.last_status:type_name -> ttn.lorawan.v3.GatewayStatus - 54, // 84: ttn.lorawan.v3.GatewayConnectionStats.last_uplink_received_at:type_name -> google.protobuf.Timestamp - 54, // 85: ttn.lorawan.v3.GatewayConnectionStats.last_downlink_received_at:type_name -> google.protobuf.Timestamp - 54, // 86: ttn.lorawan.v3.GatewayConnectionStats.last_tx_acknowledgment_received_at:type_name -> google.protobuf.Timestamp - 51, // 87: ttn.lorawan.v3.GatewayConnectionStats.round_trip_times:type_name -> ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes - 52, // 88: ttn.lorawan.v3.GatewayConnectionStats.sub_bands:type_name -> ttn.lorawan.v3.GatewayConnectionStats.SubBand - 42, // 89: ttn.lorawan.v3.GatewayConnectionStats.gateway_remote_address:type_name -> ttn.lorawan.v3.GatewayRemoteAddress - 54, // 90: ttn.lorawan.v3.ListGatewaysRequest.Filter.updated_since:type_name -> google.protobuf.Timestamp - 59, // 91: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.min:type_name -> google.protobuf.Duration - 59, // 92: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.max:type_name -> google.protobuf.Duration - 59, // 93: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.median:type_name -> google.protobuf.Duration - 94, // [94:94] is the sub-list for method output_type - 94, // [94:94] is the sub-list for method input_type - 94, // [94:94] is the sub-list for extension type_name - 94, // [94:94] is the sub-list for extension extendee - 0, // [0:94] is the sub-list for field type_name + 47, // 23: ttn.lorawan.v3.ManagedGateway.capabilities:type_name -> ttn.lorawan.v3.ManagedGateway.Capabilities + 11, // 24: ttn.lorawan.v3.ManagedGatewayWiFiAccessPoints.access_points:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiAccessPoint + 61, // 25: ttn.lorawan.v3.ManagedGatewaySystemStatus.cpu_temperature:type_name -> google.protobuf.FloatValue + 0, // 26: ttn.lorawan.v3.ManagedGatewayControllerConnection.network_interface_type:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceType + 0, // 27: ttn.lorawan.v3.ManagedGatewayGatewayServerConnection.network_interface_type:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceType + 1, // 28: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo.status:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceStatus + 13, // 29: ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo.addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses + 17, // 30: ttn.lorawan.v3.ManagedGatewayCellularBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo + 61, // 31: ttn.lorawan.v3.ManagedGatewayCellularBackhaul.rssi:type_name -> google.protobuf.FloatValue + 17, // 32: ttn.lorawan.v3.ManagedGatewayWiFiBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo + 61, // 33: ttn.lorawan.v3.ManagedGatewayWiFiBackhaul.rssi:type_name -> google.protobuf.FloatValue + 17, // 34: ttn.lorawan.v3.ManagedGatewayEthernetBackhaul.network_interface:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceInfo + 10, // 35: ttn.lorawan.v3.ManagedGatewayEventData.entity:type_name -> ttn.lorawan.v3.ManagedGateway + 62, // 36: ttn.lorawan.v3.ManagedGatewayEventData.location:type_name -> ttn.lorawan.v3.Location + 14, // 37: ttn.lorawan.v3.ManagedGatewayEventData.system_status:type_name -> ttn.lorawan.v3.ManagedGatewaySystemStatus + 15, // 38: ttn.lorawan.v3.ManagedGatewayEventData.controller_connection:type_name -> ttn.lorawan.v3.ManagedGatewayControllerConnection + 16, // 39: ttn.lorawan.v3.ManagedGatewayEventData.gateway_server_connection:type_name -> ttn.lorawan.v3.ManagedGatewayGatewayServerConnection + 18, // 40: ttn.lorawan.v3.ManagedGatewayEventData.cellular_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayCellularBackhaul + 19, // 41: ttn.lorawan.v3.ManagedGatewayEventData.wifi_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiBackhaul + 20, // 42: ttn.lorawan.v3.ManagedGatewayEventData.ethernet_backhaul:type_name -> ttn.lorawan.v3.ManagedGatewayEthernetBackhaul + 13, // 43: ttn.lorawan.v3.ManagedGatewayWiFiProfile.network_interface_addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses + 22, // 44: ttn.lorawan.v3.ManagedGatewayWiFiProfiles.profiles:type_name -> ttn.lorawan.v3.ManagedGatewayWiFiProfile + 13, // 45: ttn.lorawan.v3.ManagedGatewayEthernetProfile.network_interface_addresses:type_name -> ttn.lorawan.v3.ManagedGatewayNetworkInterfaceAddresses + 24, // 46: ttn.lorawan.v3.ManagedGatewayEthernetProfiles.profiles:type_name -> ttn.lorawan.v3.ManagedGatewayEthernetProfile + 56, // 47: ttn.lorawan.v3.GetGatewayRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 63, // 48: ttn.lorawan.v3.GetGatewayRequest.field_mask:type_name -> google.protobuf.FieldMask + 58, // 49: ttn.lorawan.v3.ListGatewaysRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 63, // 50: ttn.lorawan.v3.ListGatewaysRequest.field_mask:type_name -> google.protobuf.FieldMask + 48, // 51: ttn.lorawan.v3.ListGatewaysRequest.filters:type_name -> ttn.lorawan.v3.ListGatewaysRequest.Filter + 8, // 52: ttn.lorawan.v3.CreateGatewayRequest.gateway:type_name -> ttn.lorawan.v3.Gateway + 58, // 53: ttn.lorawan.v3.CreateGatewayRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 8, // 54: ttn.lorawan.v3.UpdateGatewayRequest.gateway:type_name -> ttn.lorawan.v3.Gateway + 63, // 55: ttn.lorawan.v3.UpdateGatewayRequest.field_mask:type_name -> google.protobuf.FieldMask + 56, // 56: ttn.lorawan.v3.ListGatewayAPIKeysRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 56, // 57: ttn.lorawan.v3.GetGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 56, // 58: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 64, // 59: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.rights:type_name -> ttn.lorawan.v3.Right + 55, // 60: ttn.lorawan.v3.CreateGatewayAPIKeyRequest.expires_at:type_name -> google.protobuf.Timestamp + 56, // 61: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 65, // 62: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.api_key:type_name -> ttn.lorawan.v3.APIKey + 63, // 63: ttn.lorawan.v3.UpdateGatewayAPIKeyRequest.field_mask:type_name -> google.protobuf.FieldMask + 56, // 64: ttn.lorawan.v3.DeleteGatewayAPIKeyRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 56, // 65: ttn.lorawan.v3.ListGatewayCollaboratorsRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 56, // 66: ttn.lorawan.v3.GetGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 58, // 67: ttn.lorawan.v3.GetGatewayCollaboratorRequest.collaborator:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 56, // 68: ttn.lorawan.v3.SetGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 66, // 69: ttn.lorawan.v3.SetGatewayCollaboratorRequest.collaborator:type_name -> ttn.lorawan.v3.Collaborator + 56, // 70: ttn.lorawan.v3.DeleteGatewayCollaboratorRequest.gateway_ids:type_name -> ttn.lorawan.v3.GatewayIdentifiers + 58, // 71: ttn.lorawan.v3.DeleteGatewayCollaboratorRequest.collaborator_ids:type_name -> ttn.lorawan.v3.OrganizationOrUserIdentifiers + 62, // 72: ttn.lorawan.v3.GatewayAntenna.location:type_name -> ttn.lorawan.v3.Location + 49, // 73: ttn.lorawan.v3.GatewayAntenna.attributes:type_name -> ttn.lorawan.v3.GatewayAntenna.AttributesEntry + 2, // 74: ttn.lorawan.v3.GatewayAntenna.placement:type_name -> ttn.lorawan.v3.GatewayAntennaPlacement + 55, // 75: ttn.lorawan.v3.GatewayStatus.time:type_name -> google.protobuf.Timestamp + 55, // 76: ttn.lorawan.v3.GatewayStatus.boot_time:type_name -> google.protobuf.Timestamp + 50, // 77: ttn.lorawan.v3.GatewayStatus.versions:type_name -> ttn.lorawan.v3.GatewayStatus.VersionsEntry + 62, // 78: ttn.lorawan.v3.GatewayStatus.antenna_locations:type_name -> ttn.lorawan.v3.Location + 51, // 79: ttn.lorawan.v3.GatewayStatus.metrics:type_name -> ttn.lorawan.v3.GatewayStatus.MetricsEntry + 67, // 80: ttn.lorawan.v3.GatewayStatus.advanced:type_name -> google.protobuf.Struct + 55, // 81: ttn.lorawan.v3.GatewayConnectionStats.connected_at:type_name -> google.protobuf.Timestamp + 55, // 82: ttn.lorawan.v3.GatewayConnectionStats.disconnected_at:type_name -> google.protobuf.Timestamp + 55, // 83: ttn.lorawan.v3.GatewayConnectionStats.last_status_received_at:type_name -> google.protobuf.Timestamp + 41, // 84: ttn.lorawan.v3.GatewayConnectionStats.last_status:type_name -> ttn.lorawan.v3.GatewayStatus + 55, // 85: ttn.lorawan.v3.GatewayConnectionStats.last_uplink_received_at:type_name -> google.protobuf.Timestamp + 55, // 86: ttn.lorawan.v3.GatewayConnectionStats.last_downlink_received_at:type_name -> google.protobuf.Timestamp + 55, // 87: ttn.lorawan.v3.GatewayConnectionStats.last_tx_acknowledgment_received_at:type_name -> google.protobuf.Timestamp + 52, // 88: ttn.lorawan.v3.GatewayConnectionStats.round_trip_times:type_name -> ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes + 53, // 89: ttn.lorawan.v3.GatewayConnectionStats.sub_bands:type_name -> ttn.lorawan.v3.GatewayConnectionStats.SubBand + 42, // 90: ttn.lorawan.v3.GatewayConnectionStats.gateway_remote_address:type_name -> ttn.lorawan.v3.GatewayRemoteAddress + 55, // 91: ttn.lorawan.v3.ListGatewaysRequest.Filter.updated_since:type_name -> google.protobuf.Timestamp + 60, // 92: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.min:type_name -> google.protobuf.Duration + 60, // 93: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.max:type_name -> google.protobuf.Duration + 60, // 94: ttn.lorawan.v3.GatewayConnectionStats.RoundTripTimes.median:type_name -> google.protobuf.Duration + 95, // [95:95] is the sub-list for method output_type + 95, // [95:95] is the sub-list for method input_type + 95, // [95:95] is the sub-list for extension type_name + 95, // [95:95] is the sub-list for extension extendee + 0, // [0:95] is the sub-list for field type_name } func init() { file_ttn_lorawan_v3_gateway_proto_init() } @@ -5340,6 +5478,18 @@ func file_ttn_lorawan_v3_gateway_proto_init() { } } file_ttn_lorawan_v3_gateway_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ManagedGateway_Capabilities); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_ttn_lorawan_v3_gateway_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListGatewaysRequest_Filter); i { case 0: return &v.state @@ -5351,7 +5501,7 @@ func file_ttn_lorawan_v3_gateway_proto_init() { return nil } } - file_ttn_lorawan_v3_gateway_proto_msgTypes[48].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayConnectionStats_RoundTripTimes); i { case 0: return &v.state @@ -5363,7 +5513,7 @@ func file_ttn_lorawan_v3_gateway_proto_init() { return nil } } - file_ttn_lorawan_v3_gateway_proto_msgTypes[49].Exporter = func(v interface{}, i int) interface{} { + file_ttn_lorawan_v3_gateway_proto_msgTypes[50].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*GatewayConnectionStats_SubBand); i { case 0: return &v.state @@ -5386,7 +5536,7 @@ func file_ttn_lorawan_v3_gateway_proto_init() { (*ManagedGatewayEventData_WifiBackhaul)(nil), (*ManagedGatewayEventData_EthernetBackhaul)(nil), } - file_ttn_lorawan_v3_gateway_proto_msgTypes[44].OneofWrappers = []interface{}{ + file_ttn_lorawan_v3_gateway_proto_msgTypes[45].OneofWrappers = []interface{}{ (*ListGatewaysRequest_Filter_UpdatedSince)(nil), } type x struct{} @@ -5395,7 +5545,7 @@ func file_ttn_lorawan_v3_gateway_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_ttn_lorawan_v3_gateway_proto_rawDesc, NumEnums: 3, - NumMessages: 50, + NumMessages: 51, NumExtensions: 0, NumServices: 0, }, diff --git a/pkg/ttnpb/gateway.pb.paths.fm.go b/pkg/ttnpb/gateway.pb.paths.fm.go index db2ff2f07b..b3ee1c4569 100644 --- a/pkg/ttnpb/gateway.pb.paths.fm.go +++ b/pkg/ttnpb/gateway.pb.paths.fm.go @@ -176,6 +176,15 @@ var GatewaysFieldPathsTopLevel = []string{ "gateways", } var ManagedGatewayFieldPathsNested = []string{ + "capabilities", + "capabilities.battery", + "capabilities.cellular", + "capabilities.ethernet", + "capabilities.firmware_update", + "capabilities.lora_8ch_concentrator", + "capabilities.scan_wifi_access_points", + "capabilities.wifi_2_4_ghz", + "capabilities.wifi_5_ghz", "cellular_imei", "cellular_imsi", "ethernet_mac_address", @@ -194,6 +203,7 @@ var ManagedGatewayFieldPathsNested = []string{ } var ManagedGatewayFieldPathsTopLevel = []string{ + "capabilities", "cellular_imei", "cellular_imsi", "ethernet_mac_address", @@ -348,6 +358,15 @@ var ManagedGatewayEventDataFieldPathsNested = []string{ "data.controller_connection", "data.controller_connection.network_interface_type", "data.entity", + "data.entity.capabilities", + "data.entity.capabilities.battery", + "data.entity.capabilities.cellular", + "data.entity.capabilities.ethernet", + "data.entity.capabilities.firmware_update", + "data.entity.capabilities.lora_8ch_concentrator", + "data.entity.capabilities.scan_wifi_access_points", + "data.entity.capabilities.wifi_2_4_ghz", + "data.entity.capabilities.wifi_5_ghz", "data.entity.cellular_imei", "data.entity.cellular_imsi", "data.entity.ethernet_mac_address", @@ -888,6 +907,27 @@ var Gateway_LRFHSSFieldPathsNested = []string{ var Gateway_LRFHSSFieldPathsTopLevel = []string{ "supported", } +var ManagedGateway_CapabilitiesFieldPathsNested = []string{ + "battery", + "cellular", + "ethernet", + "firmware_update", + "lora_8ch_concentrator", + "scan_wifi_access_points", + "wifi_2_4_ghz", + "wifi_5_ghz", +} + +var ManagedGateway_CapabilitiesFieldPathsTopLevel = []string{ + "battery", + "cellular", + "ethernet", + "firmware_update", + "lora_8ch_concentrator", + "scan_wifi_access_points", + "wifi_2_4_ghz", + "wifi_5_ghz", +} var ListGatewaysRequest_FilterFieldPathsNested = []string{ "field", "field.updated_since", diff --git a/pkg/ttnpb/gateway.pb.setters.fm.go b/pkg/ttnpb/gateway.pb.setters.fm.go index b09ed342a6..c4bf21e585 100644 --- a/pkg/ttnpb/gateway.pb.setters.fm.go +++ b/pkg/ttnpb/gateway.pb.setters.fm.go @@ -791,6 +791,31 @@ func (dst *ManagedGateway) SetFields(src *ManagedGateway, paths ...string) error dst.VersionIds = nil } } + case "capabilities": + if len(subs) > 0 { + var newDst, newSrc *ManagedGateway_Capabilities + if (src == nil || src.Capabilities == nil) && dst.Capabilities == nil { + continue + } + if src != nil { + newSrc = src.Capabilities + } + if dst.Capabilities != nil { + newDst = dst.Capabilities + } else { + newDst = &ManagedGateway_Capabilities{} + dst.Capabilities = newDst + } + if err := newDst.SetFields(newSrc, subs...); err != nil { + return err + } + } else { + if src != nil { + dst.Capabilities = src.Capabilities + } else { + dst.Capabilities = nil + } + } case "cellular_imei": if len(subs) > 0 { return fmt.Errorf("'cellular_imei' has no subfields, but %s were specified", subs) @@ -3014,6 +3039,97 @@ func (dst *Gateway_LRFHSS) SetFields(src *Gateway_LRFHSS, paths ...string) error return nil } +func (dst *ManagedGateway_Capabilities) SetFields(src *ManagedGateway_Capabilities, paths ...string) error { + for name, subs := range _processPaths(paths) { + switch name { + case "wifi_2_4_ghz": + if len(subs) > 0 { + return fmt.Errorf("'wifi_2_4_ghz' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Wifi_2_4Ghz = src.Wifi_2_4Ghz + } else { + var zero bool + dst.Wifi_2_4Ghz = zero + } + case "wifi_5_ghz": + if len(subs) > 0 { + return fmt.Errorf("'wifi_5_ghz' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Wifi_5Ghz = src.Wifi_5Ghz + } else { + var zero bool + dst.Wifi_5Ghz = zero + } + case "scan_wifi_access_points": + if len(subs) > 0 { + return fmt.Errorf("'scan_wifi_access_points' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.ScanWifiAccessPoints = src.ScanWifiAccessPoints + } else { + var zero bool + dst.ScanWifiAccessPoints = zero + } + case "ethernet": + if len(subs) > 0 { + return fmt.Errorf("'ethernet' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Ethernet = src.Ethernet + } else { + var zero bool + dst.Ethernet = zero + } + case "cellular": + if len(subs) > 0 { + return fmt.Errorf("'cellular' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Cellular = src.Cellular + } else { + var zero bool + dst.Cellular = zero + } + case "battery": + if len(subs) > 0 { + return fmt.Errorf("'battery' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Battery = src.Battery + } else { + var zero bool + dst.Battery = zero + } + case "lora_8ch_concentrator": + if len(subs) > 0 { + return fmt.Errorf("'lora_8ch_concentrator' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.Lora_8ChConcentrator = src.Lora_8ChConcentrator + } else { + var zero bool + dst.Lora_8ChConcentrator = zero + } + case "firmware_update": + if len(subs) > 0 { + return fmt.Errorf("'firmware_update' has no subfields, but %s were specified", subs) + } + if src != nil { + dst.FirmwareUpdate = src.FirmwareUpdate + } else { + var zero bool + dst.FirmwareUpdate = zero + } + + default: + return fmt.Errorf("invalid field: '%s'", name) + } + } + return nil +} + func (dst *ListGatewaysRequest_Filter) SetFields(src *ListGatewaysRequest_Filter, paths ...string) error { for name, subs := range _processPaths(paths) { switch name { diff --git a/pkg/ttnpb/gateway.pb.validate.go b/pkg/ttnpb/gateway.pb.validate.go index c3b0f584de..89856e736a 100644 --- a/pkg/ttnpb/gateway.pb.validate.go +++ b/pkg/ttnpb/gateway.pb.validate.go @@ -1186,6 +1186,18 @@ func (m *ManagedGateway) ValidateFields(paths ...string) error { } } + case "capabilities": + + if v, ok := interface{}(m.GetCapabilities()).(interface{ ValidateFields(...string) error }); ok { + if err := v.ValidateFields(subs...); err != nil { + return ManagedGatewayValidationError{ + field: "capabilities", + reason: "embedded message failed validation", + cause: err, + } + } + } + case "cellular_imei": if m.GetCellularImei() != "" { @@ -5665,6 +5677,104 @@ var _ interface { ErrorName() string } = Gateway_LRFHSSValidationError{} +// ValidateFields checks the field values on ManagedGateway_Capabilities with +// the rules defined in the proto definition for this message. If any rules +// are violated, an error is returned. +func (m *ManagedGateway_Capabilities) ValidateFields(paths ...string) error { + if m == nil { + return nil + } + + if len(paths) == 0 { + paths = ManagedGateway_CapabilitiesFieldPathsNested + } + + for name, subs := range _processPaths(append(paths[:0:0], paths...)) { + _ = subs + switch name { + case "wifi_2_4_ghz": + // no validation rules for Wifi_2_4Ghz + case "wifi_5_ghz": + // no validation rules for Wifi_5Ghz + case "scan_wifi_access_points": + // no validation rules for ScanWifiAccessPoints + case "ethernet": + // no validation rules for Ethernet + case "cellular": + // no validation rules for Cellular + case "battery": + // no validation rules for Battery + case "lora_8ch_concentrator": + // no validation rules for Lora_8ChConcentrator + case "firmware_update": + // no validation rules for FirmwareUpdate + default: + return ManagedGateway_CapabilitiesValidationError{ + field: name, + reason: "invalid field path", + } + } + } + return nil +} + +// ManagedGateway_CapabilitiesValidationError is the validation error returned +// by ManagedGateway_Capabilities.ValidateFields if the designated constraints +// aren't met. +type ManagedGateway_CapabilitiesValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ManagedGateway_CapabilitiesValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ManagedGateway_CapabilitiesValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ManagedGateway_CapabilitiesValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ManagedGateway_CapabilitiesValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ManagedGateway_CapabilitiesValidationError) ErrorName() string { + return "ManagedGateway_CapabilitiesValidationError" +} + +// Error satisfies the builtin error interface +func (e ManagedGateway_CapabilitiesValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sManagedGateway_Capabilities.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ManagedGateway_CapabilitiesValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ManagedGateway_CapabilitiesValidationError{} + // ValidateFields checks the field values on ListGatewaysRequest_Filter with // the rules defined in the proto definition for this message. If any rules // are violated, an error is returned. diff --git a/pkg/ttnpb/gateway_configuration.pb.paths.fm.go b/pkg/ttnpb/gateway_configuration.pb.paths.fm.go index efe7264439..10ce867538 100644 --- a/pkg/ttnpb/gateway_configuration.pb.paths.fm.go +++ b/pkg/ttnpb/gateway_configuration.pb.paths.fm.go @@ -27,6 +27,15 @@ var GetGatewayConfigurationResponseFieldPathsTopLevel = []string{ var UpdateManagedGatewayRequestFieldPathsNested = []string{ "field_mask", "gateway", + "gateway.capabilities", + "gateway.capabilities.battery", + "gateway.capabilities.cellular", + "gateway.capabilities.ethernet", + "gateway.capabilities.firmware_update", + "gateway.capabilities.lora_8ch_concentrator", + "gateway.capabilities.scan_wifi_access_points", + "gateway.capabilities.wifi_2_4_ghz", + "gateway.capabilities.wifi_5_ghz", "gateway.cellular_imei", "gateway.cellular_imsi", "gateway.ethernet_mac_address", diff --git a/pkg/ttnpb/gateway_flags.pb.go b/pkg/ttnpb/gateway_flags.pb.go index d640d9a6fa..b7ca81e040 100644 --- a/pkg/ttnpb/gateway_flags.pb.go +++ b/pkg/ttnpb/gateway_flags.pb.go @@ -643,10 +643,134 @@ func (m *Gateway) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []str return paths, nil } +// AddSelectFlagsForManagedGateway_Capabilities adds flags to select fields in ManagedGateway_Capabilities. +func AddSelectFlagsForManagedGateway_Capabilities(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wifi-2-4-ghz", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("wifi-2-4-ghz", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wifi-5-ghz", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("wifi-5-ghz", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("scan-wifi-access-points", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("scan-wifi-access-points", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("ethernet", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("ethernet", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("cellular", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("cellular", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("battery", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("battery", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("lora-8ch-concentrator", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("lora-8ch-concentrator", prefix), false), flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("firmware-update", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("firmware-update", prefix), false), flagsplugin.WithHidden(hidden))) +} + +// SelectFromFlags outputs the fieldmask paths forManagedGateway_Capabilities message from select flags. +func PathsFromSelectFlagsForManagedGateway_Capabilities(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("wifi_2_4_ghz", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("wifi_2_4_ghz", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("wifi_5_ghz", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("wifi_5_ghz", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("scan_wifi_access_points", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("scan_wifi_access_points", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("ethernet", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("ethernet", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("cellular", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("cellular", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("battery", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("battery", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("lora_8ch_concentrator", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("lora_8ch_concentrator", prefix)) + } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("firmware_update", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("firmware_update", prefix)) + } + return paths, nil +} + +// AddSetFlagsForManagedGateway_Capabilities adds flags to select fields in ManagedGateway_Capabilities. +func AddSetFlagsForManagedGateway_Capabilities(flags *pflag.FlagSet, prefix string, hidden bool) { + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wifi-2-4-ghz", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wifi-5-ghz", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("scan-wifi-access-points", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("ethernet", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("cellular", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("battery", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("lora-8ch-concentrator", prefix), "", flagsplugin.WithHidden(hidden))) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("firmware-update", prefix), "", flagsplugin.WithHidden(hidden))) +} + +// SetFromFlags sets the ManagedGateway_Capabilities message from flags. +func (m *ManagedGateway_Capabilities) SetFromFlags(flags *pflag.FlagSet, prefix string) (paths []string, err error) { + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("wifi_2_4_ghz", prefix)); err != nil { + return nil, err + } else if changed { + m.Wifi_2_4Ghz = val + paths = append(paths, flagsplugin.Prefix("wifi_2_4_ghz", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("wifi_5_ghz", prefix)); err != nil { + return nil, err + } else if changed { + m.Wifi_5Ghz = val + paths = append(paths, flagsplugin.Prefix("wifi_5_ghz", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("scan_wifi_access_points", prefix)); err != nil { + return nil, err + } else if changed { + m.ScanWifiAccessPoints = val + paths = append(paths, flagsplugin.Prefix("scan_wifi_access_points", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("ethernet", prefix)); err != nil { + return nil, err + } else if changed { + m.Ethernet = val + paths = append(paths, flagsplugin.Prefix("ethernet", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("cellular", prefix)); err != nil { + return nil, err + } else if changed { + m.Cellular = val + paths = append(paths, flagsplugin.Prefix("cellular", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("battery", prefix)); err != nil { + return nil, err + } else if changed { + m.Battery = val + paths = append(paths, flagsplugin.Prefix("battery", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("lora_8ch_concentrator", prefix)); err != nil { + return nil, err + } else if changed { + m.Lora_8ChConcentrator = val + paths = append(paths, flagsplugin.Prefix("lora_8ch_concentrator", prefix)) + } + if val, changed, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("firmware_update", prefix)); err != nil { + return nil, err + } else if changed { + m.FirmwareUpdate = val + paths = append(paths, flagsplugin.Prefix("firmware_update", prefix)) + } + return paths, nil +} + // AddSelectFlagsForManagedGateway adds flags to select fields in ManagedGateway. func AddSelectFlagsForManagedGateway(flags *pflag.FlagSet, prefix string, hidden bool) { flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("version-ids", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("version-ids", prefix), true), flagsplugin.WithHidden(hidden))) AddSelectFlagsForGatewayVersionIdentifiers(flags, flagsplugin.Prefix("version-ids", prefix), hidden) + flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("capabilities", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("capabilities", prefix), true), flagsplugin.WithHidden(hidden))) + AddSelectFlagsForManagedGateway_Capabilities(flags, flagsplugin.Prefix("capabilities", prefix), hidden) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("cellular-imei", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("cellular-imei", prefix), false), flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("cellular-imsi", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("cellular-imsi", prefix), false), flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewBoolFlag(flagsplugin.Prefix("wifi-mac-address", prefix), flagsplugin.SelectDesc(flagsplugin.Prefix("wifi-mac-address", prefix), false), flagsplugin.WithHidden(hidden))) @@ -667,6 +791,16 @@ func PathsFromSelectFlagsForManagedGateway(flags *pflag.FlagSet, prefix string) } else { paths = append(paths, selectPaths...) } + if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("capabilities", prefix)); err != nil { + return nil, err + } else if selected && val { + paths = append(paths, flagsplugin.Prefix("capabilities", prefix)) + } + if selectPaths, err := PathsFromSelectFlagsForManagedGateway_Capabilities(flags, flagsplugin.Prefix("capabilities", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, selectPaths...) + } if val, selected, err := flagsplugin.GetBool(flags, flagsplugin.Prefix("cellular_imei", prefix)); err != nil { return nil, err } else if selected && val { @@ -704,6 +838,7 @@ func PathsFromSelectFlagsForManagedGateway(flags *pflag.FlagSet, prefix string) func AddSetFlagsForManagedGateway(flags *pflag.FlagSet, prefix string, hidden bool) { AddSetFlagsForGatewayIdentifiers(flags, flagsplugin.Prefix("ids", prefix), true) AddSetFlagsForGatewayVersionIdentifiers(flags, flagsplugin.Prefix("version-ids", prefix), hidden) + AddSetFlagsForManagedGateway_Capabilities(flags, flagsplugin.Prefix("capabilities", prefix), hidden) flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("cellular-imei", prefix), "", flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewStringFlag(flagsplugin.Prefix("cellular-imsi", prefix), "", flagsplugin.WithHidden(hidden))) flags.AddFlag(flagsplugin.NewBytesFlag(flagsplugin.Prefix("wifi-mac-address", prefix), "", flagsplugin.WithHidden(hidden))) @@ -734,6 +869,16 @@ func (m *ManagedGateway) SetFromFlags(flags *pflag.FlagSet, prefix string) (path paths = append(paths, setPaths...) } } + if changed := flagsplugin.IsAnyPrefixSet(flags, flagsplugin.Prefix("capabilities", prefix)); changed { + if m.Capabilities == nil { + m.Capabilities = &ManagedGateway_Capabilities{} + } + if setPaths, err := m.Capabilities.SetFromFlags(flags, flagsplugin.Prefix("capabilities", prefix)); err != nil { + return nil, err + } else { + paths = append(paths, setPaths...) + } + } if val, changed, err := flagsplugin.GetString(flags, flagsplugin.Prefix("cellular_imei", prefix)); err != nil { return nil, err } else if changed { diff --git a/pkg/ttnpb/gateway_json.pb.go b/pkg/ttnpb/gateway_json.pb.go index e4ebc448db..863044b778 100644 --- a/pkg/ttnpb/gateway_json.pb.go +++ b/pkg/ttnpb/gateway_json.pb.go @@ -686,6 +686,12 @@ func (x *ManagedGateway) MarshalProtoJSON(s *jsonplugin.MarshalState) { // NOTE: GatewayVersionIdentifiers does not seem to implement MarshalProtoJSON. golang.MarshalMessage(s, x.VersionIds) } + if x.Capabilities != nil || s.HasField("capabilities") { + s.WriteMoreIf(&wroteField) + s.WriteObjectField("capabilities") + // NOTE: ManagedGateway_Capabilities does not seem to implement MarshalProtoJSON. + golang.MarshalMessage(s, x.Capabilities) + } if x.CellularImei != "" || s.HasField("cellular_imei") { s.WriteMoreIf(&wroteField) s.WriteObjectField("cellular_imei") @@ -750,6 +756,16 @@ func (x *ManagedGateway) UnmarshalProtoJSON(s *jsonplugin.UnmarshalState) { var v GatewayVersionIdentifiers golang.UnmarshalMessage(s, &v) x.VersionIds = &v + case "capabilities": + s.AddField("capabilities") + if s.ReadNil() { + x.Capabilities = nil + return + } + // NOTE: ManagedGateway_Capabilities does not seem to implement UnmarshalProtoJSON. + var v ManagedGateway_Capabilities + golang.UnmarshalMessage(s, &v) + x.Capabilities = &v case "cellular_imei", "cellularImei": s.AddField("cellular_imei") x.CellularImei = s.ReadString() diff --git a/sdk/js/generated/api-definition.json b/sdk/js/generated/api-definition.json index 27bf4962ff..44b9f4f680 100644 --- a/sdk/js/generated/api-definition.json +++ b/sdk/js/generated/api-definition.json @@ -3023,6 +3023,15 @@ } ], "allowedFieldMaskPaths": [ + "capabilities", + "capabilities.battery", + "capabilities.cellular", + "capabilities.ethernet", + "capabilities.firmware_update", + "capabilities.lora_8ch_concentrator", + "capabilities.scan_wifi_access_points", + "capabilities.wifi_2_4_ghz", + "capabilities.wifi_5_ghz", "cellular_imei", "cellular_imsi", "ethernet_mac_address", diff --git a/sdk/js/generated/api.json b/sdk/js/generated/api.json index 5ceb4fcecf..20e4937a1b 100644 --- a/sdk/js/generated/api.json +++ b/sdk/js/generated/api.json @@ -24226,6 +24226,18 @@ "oneofdecl": "", "defaultValue": "" }, + { + "name": "capabilities", + "description": "", + "label": "", + "type": "Capabilities", + "longType": "ManagedGateway.Capabilities", + "fullType": "ttn.lorawan.v3.ManagedGateway.Capabilities", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, { "name": "cellular_imei", "description": "", @@ -24348,6 +24360,114 @@ } ] }, + { + "name": "Capabilities", + "longName": "ManagedGateway.Capabilities", + "fullName": "ttn.lorawan.v3.ManagedGateway.Capabilities", + "description": "", + "hasExtensions": false, + "hasFields": true, + "hasOneofs": false, + "extensions": [], + "fields": [ + { + "name": "wifi_2_4_ghz", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "wifi_5_ghz", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "scan_wifi_access_points", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "ethernet", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "cellular", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "battery", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "lora_8ch_concentrator", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + }, + { + "name": "firmware_update", + "description": "", + "label": "", + "type": "bool", + "longType": "bool", + "fullType": "bool", + "ismap": false, + "isoneof": false, + "oneofdecl": "", + "defaultValue": "" + } + ] + }, { "name": "ManagedGatewayCellularBackhaul", "longName": "ManagedGatewayCellularBackhaul", From e676f78062ca638c185647512281df34a68a99e0 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:24:03 +0100 Subject: [PATCH 4/8] dev: Force IPv4 to connect to Postgres --- cypress/plugins/tasks.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cypress/plugins/tasks.js b/cypress/plugins/tasks.js index a9cf17199c..1250d48090 100644 --- a/cypress/plugins/tasks.js +++ b/cypress/plugins/tasks.js @@ -25,7 +25,7 @@ const isCI = process.env.CI === 'true' || process.env.CI === '1' const pgConfig = { user: 'root', password: 'root', - host: 'localhost', + host: '127.0.0.1', database: 'ttn_lorawan_dev', port: 5432, } From 7d8a6c7c5d641e4307b26aa7e694f4f8fd571669 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:24:25 +0100 Subject: [PATCH 5/8] gcs: Remove lint warning --- pkg/gatewayconfigurationserver/managed/client/client.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/gatewayconfigurationserver/managed/client/client.go b/pkg/gatewayconfigurationserver/managed/client/client.go index 02814e9ba4..b925ffce74 100644 --- a/pkg/gatewayconfigurationserver/managed/client/client.go +++ b/pkg/gatewayconfigurationserver/managed/client/client.go @@ -67,7 +67,6 @@ func (c *client) subscribeEventData( ctx, cancel := context.WithCancel(ctx) wg, ctx := errgroup.WithContext(ctx) for _, gtwID := range ids { - gtwID := gtwID stream, err := client.StreamEvents(ctx, gtwID, callOpt) if err != nil { cancel() From 5f1b9004604f30984188b2d271a8496b77615e14 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:25:52 +0100 Subject: [PATCH 6/8] gcs: Return gateway capabilities --- pkg/gatewayconfigurationserver/managed/mapping.go | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/pkg/gatewayconfigurationserver/managed/mapping.go b/pkg/gatewayconfigurationserver/managed/mapping.go index fc8b97c4f6..51aa5c80f3 100644 --- a/pkg/gatewayconfigurationserver/managed/mapping.go +++ b/pkg/gatewayconfigurationserver/managed/mapping.go @@ -36,6 +36,16 @@ func toManagedGateway( FirmwareVersion: gtw.FirmwareVersion, RuntimeVersion: gtw.RuntimeVersion, }, + Capabilities: &ttnpb.ManagedGateway_Capabilities{ + Wifi_2_4Ghz: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_WIFI_2_4_GHZ != 0, + Wifi_5Ghz: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_WIFI_5_GHZ != 0, + ScanWifiAccessPoints: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_SCAN_WIFI_ACCESS_POINTS != 0, //nolint:lll + Ethernet: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_ETHERNET != 0, + Cellular: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_CELLULAR != 0, + Battery: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_BATTERY != 0, + Lora_8ChConcentrator: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_LORA_8CH_CONCENTRATOR != 0, //nolint:lll + FirmwareUpdate: gtw.Capabilities&northboundv1.FirmwareCapabilities_FIRMWARE_CAPABILITY_FIRMWARE_UPDATE != 0, + }, CellularImei: gtw.CellularImei, CellularImsi: gtw.CellularImsi, WifiMacAddress: gtw.WifiMacAddress, From e92938b4236f1988e8ee50fc0b2807b22457c65c Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Tue, 10 Dec 2024 15:26:14 +0100 Subject: [PATCH 7/8] console: Conditionally show WiFi and ethernet config and connections --- .../managed/connection-settings.spec.js | 636 ++++++++++-------- .../connection-settings/connections/index.js | 54 +- .../connection-settings/index.js | 195 +++--- .../connection-settings/validation-schema.js | 4 +- .../store/middleware/logics/gateways.js | 1 + pkg/webui/console/store/selectors/gateways.js | 10 + pkg/webui/locales/en.json | 3 +- pkg/webui/locales/ja.json | 1 + 8 files changed, 519 insertions(+), 385 deletions(-) diff --git a/cypress/e2e/console/gateways/managed/connection-settings.spec.js b/cypress/e2e/console/gateways/managed/connection-settings.spec.js index 3101b9fc35..921b19418a 100644 --- a/cypress/e2e/console/gateways/managed/connection-settings.spec.js +++ b/cypress/e2e/console/gateways/managed/connection-settings.spec.js @@ -30,314 +30,384 @@ describe('Managed Gateway connection settings', () => { model_id: 'Managed gateway', } - const wifiProfileId = 'test-profile1' - const ethernetProfileId = 'ethernet-profile' - - const organizationId = 'test-organization' - - beforeEach(() => { - cy.dropAndSeedDatabase() - cy.createUser(user) - cy.createGateway(gateway, userId) - - // Interceptors - cy.intercept('GET', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { - statusCode: 200, - body: { - ids: { - gateway_id: `eui-${gateway.eui}`, - eui: gateway.eui, - }, - version_ids: gatewayVersionIds, - }, - }).as('get-is-gtw-managed') - - cy.intercept('GET', `/api/v3/gcs/gateways/profiles/wifi/users/${userId}`, { - statusCode: 200, - body: { - profiles: [ - { - profile_id: 'test-profile1', - profile_name: 'Test profile1', - shared: true, - ssid: 'profile1', + describe('With WiFi and Ethernet', () => { + const wifiProfileId = 'test-profile1' + const ethernetProfileId = 'ethernet-profile' + + const organizationId = 'test-organization' + + beforeEach(() => { + cy.dropAndSeedDatabase() + cy.createUser(user) + cy.createGateway(gateway, userId) + + // Interceptors + cy.intercept('GET', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { + statusCode: 200, + body: { + ids: { + gateway_id: `eui-${gateway.eui}`, + eui: gateway.eui, }, - { - profile_id: 'test-profile2', - profile_name: 'Test profile2', - shared: true, - ssid: 'profile2', + version_ids: gatewayVersionIds, + capabilities: { + wifi_2_4_ghz: true, + scan_wifi_access_points: true, + ethernet: true, + cellular: true, + lora_8ch_concentrator: true, + firmware_update: true, }, - ], - }, - }) + }, + }).as('get-is-gtw-managed') - cy.intercept('PUT', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { - statusCode: 200, - body: { - ids: { - gateway_id: gatewayId, + cy.intercept('GET', `/api/v3/gcs/gateways/profiles/wifi/users/${userId}`, { + statusCode: 200, + body: { + profiles: [ + { + profile_id: 'test-profile1', + profile_name: 'Test profile1', + shared: true, + ssid: 'profile1', + }, + { + profile_id: 'test-profile2', + profile_name: 'Test profile2', + shared: true, + ssid: 'profile2', + }, + ], }, - }, - }).as('update-connection-settings') - - cy.intercept('POST', `/api/v3/gcs/gateways/managed/${gatewayId}/wifi/scan`, { - statusCode: 200, - body: { - access_points: [ - { - ssid: 'AccessPoint1', - bssid: 'EC656E000100', - channel: 0, - authentication_mode: 'open', - rssi: -70, + }) + + cy.intercept('PUT', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { + statusCode: 200, + body: { + ids: { + gateway_id: gatewayId, }, - ], - }, - }).as('scan-access-points') - - cy.intercept('POST', `/api/v3/gcs/gateways/profiles/wifi/users/${userId}`, { - statusCode: 200, - body: { - profile_id: wifiProfileId, - }, + }, + }).as('update-connection-settings') + + cy.intercept('POST', `/api/v3/gcs/gateways/managed/${gatewayId}/wifi/scan`, { + statusCode: 200, + body: { + access_points: [ + { + ssid: 'AccessPoint1', + bssid: 'EC656E000100', + channel: 0, + authentication_mode: 'open', + rssi: -70, + }, + ], + }, + }).as('scan-access-points') + + cy.intercept('POST', `/api/v3/gcs/gateways/profiles/wifi/users/${userId}`, { + statusCode: 200, + body: { + profile_id: wifiProfileId, + }, + }) + + cy.intercept('POST', `/api/v3/gcs/gateways/profiles/ethernet/users/${userId}`, { + statusCode: 200, + body: { + profile_id: ethernetProfileId, + }, + }) + + cy.intercept('GET', `/api/v3/gcs/gateways/profiles/wifi/organizations/${organizationId}`, { + statusCode: 200, + body: { + profiles: [ + { + profile_id: 'test-profile1', + profile_name: 'Test profile1', + shared: true, + ssid: 'profile1', + }, + { + profile_id: 'test-profile2', + profile_name: 'Test profile2', + shared: true, + ssid: 'profile2', + }, + ], + }, + }) + // End interceptors. + + cy.loginConsole({ user_id: user.ids.user_id, password: user.password }) + cy.visit(`${Cypress.config('consoleRootPath')}/gateways/${gatewayId}`) + cy.wait('@get-is-gtw-managed') + cy.findByRole('heading', { name: 'test-managed-gateway' }) + cy.get('button').contains('Managed gateway').click() + cy.get('a').contains('Connection settings').click() + cy.location('pathname').should( + 'eq', + `${Cypress.config('consoleRootPath')}/gateways/${gatewayId}/managed-gateway/connection-settings`, + ) + cy.findByTestId('error-notification').should('not.exist') }) - cy.intercept('POST', `/api/v3/gcs/gateways/profiles/ethernet/users/${userId}`, { - statusCode: 200, - body: { - profile_id: ethernetProfileId, - }, + it('succeeds to display UI elements in place', () => { + cy.findByText('WiFi connection', { selector: 'h3' }).should('be.visible') + cy.findByText('Ethernet connection', { selector: 'h3' }).should('be.visible') + cy.findByText('Enable WiFi connection').should('be.visible') + cy.findByRole('button', { name: 'Save changes' }).should('be.visible') + + cy.findByText(gatewayVersionIds.model_id, { selector: 'h3' }).should('be.visible') }) - cy.intercept('GET', `/api/v3/gcs/gateways/profiles/wifi/organizations/${organizationId}`, { - statusCode: 200, - body: { - profiles: [ - { - profile_id: 'test-profile1', - profile_name: 'Test profile1', - shared: true, - ssid: 'profile1', - }, - { - profile_id: 'test-profile2', - profile_name: 'Test profile2', - shared: true, - ssid: 'profile2', - }, - ], - }, + it('succeeds to set WiFi connection with already created profile', () => { + cy.findByLabelText(/Enable WiFi connection/).check() + cy.findByLabelText('Settings profile').selectOption(wifiProfileId) + cy.findByText( + 'Please click "Save changes" to start using this WiFi profile for the gateway', + ).should('be.visible') + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) + }) + cy.findByText( + 'The gateway WiFi is currently attempting to connect using this profile', + ).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') }) - // End interceptors. - - cy.loginConsole({ user_id: user.ids.user_id, password: user.password }) - cy.visit(`${Cypress.config('consoleRootPath')}/gateways/${gatewayId}`) - cy.wait('@get-is-gtw-managed') - cy.findByRole('heading', { name: 'test-managed-gateway' }) - cy.get('button').contains('Managed gateway').click() - cy.get('a').contains('Connection settings').click() - cy.location('pathname').should( - 'eq', - `${Cypress.config('consoleRootPath')}/gateways/${gatewayId}/managed-gateway/connection-settings`, - ) - cy.findByTestId('error-notification').should('not.exist') - }) - it('succeeds to display UI elements in place', () => { - cy.findByText('WiFi connection', { selector: 'h3' }).should('be.visible') - cy.findByText('Ethernet connection', { selector: 'h3' }).should('be.visible') - cy.findByText('Enable WiFi connection').should('be.visible') - cy.findByRole('button', { name: 'Save changes' }).should('be.visible') + it('succeeds to update connection settings with disabled WiFi connection', () => { + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.wifi_profile_id', null) + }) + cy.findByText( + 'The gateway WiFi is currently attempting to connect using this profile', + ).should('not.exist') + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) - cy.findByText(gatewayVersionIds.model_id, { selector: 'h3' }).should('be.visible') - }) + it('succeeds to validate new WiFi profile fields', () => { + cy.findByLabelText(/Enable WiFi connection/).check() + cy.findByRole('button', { name: 'Save changes' }).click() + cy.get('#wifi_profile\\.profile_id-field-error').should('be.visible') + cy.findByLabelText('Settings profile').selectOption('shared') + cy.wait('@scan-access-points') + cy.findByLabelText(/Use default network interface settings/).uncheck() - it('succeeds to set WiFi connection with already created profile', () => { - cy.findByLabelText(/Enable WiFi connection/).check() - cy.findByLabelText('Settings profile').selectOption(wifiProfileId) - cy.findByText( - 'Please click "Save changes" to start using this WiFi profile for the gateway', - ).should('be.visible') - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) - }) - cy.findByText('The gateway WiFi is currently attempting to connect using this profile').should( - 'be.visible', - ) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') - }) + cy.findByRole('button', { name: 'Save changes' }).click() + cy.get('#wifi_profile\\.profile_name-field-error').should('be.visible') + cy.get('#wifi_profile\\._access_point-field-error').should('be.visible') + cy.get('#wifi_profile\\.network_interface_addresses\\.ip_addresses-field-error').should( + 'be.visible', + ) + cy.get('#wifi_profile\\.network_interface_addresses\\.subnet_mask-field-error').should( + 'be.visible', + ) + cy.get('#wifi_profile\\.network_interface_addresses\\.gateway-field-error').should( + 'be.visible', + ) + }) - it('succeeds to update connection settings with disabled WiFi connection', () => { - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.wifi_profile_id', null) - }) - cy.findByText('The gateway WiFi is currently attempting to connect using this profile').should( - 'not.exist', - ) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') - }) + it('succeeds to set WiFi connection with new shared profile', () => { + cy.findByLabelText(/Enable WiFi connection/).check() + cy.findByLabelText('Settings profile').selectOption('shared') + cy.wait('@scan-access-points') + cy.findByLabelText('Profile name').type('New WiFi profile') + cy.findByText('AccessPoint1').click() + cy.findByText( + 'Please click "Save changes" to start using this WiFi profile for the gateway', + ).should('be.visible') + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) + }) + cy.findByText( + 'The gateway WiFi is currently attempting to connect using this profile', + ).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) - it('succeeds to validate new WiFi profile fields', () => { - cy.findByLabelText(/Enable WiFi connection/).check() - cy.findByRole('button', { name: 'Save changes' }).click() - cy.get('#wifi_profile\\.profile_id-field-error').should('be.visible') - cy.findByLabelText('Settings profile').selectOption('shared') - cy.wait('@scan-access-points') - cy.findByLabelText(/Use default network interface settings/).uncheck() - - cy.findByRole('button', { name: 'Save changes' }).click() - cy.get('#wifi_profile\\.profile_name-field-error').should('be.visible') - cy.get('#wifi_profile\\._access_point-field-error').should('be.visible') - cy.get('#wifi_profile\\.network_interface_addresses\\.ip_addresses-field-error').should( - 'be.visible', - ) - cy.get('#wifi_profile\\.network_interface_addresses\\.subnet_mask-field-error').should( - 'be.visible', - ) - cy.get('#wifi_profile\\.network_interface_addresses\\.gateway-field-error').should('be.visible') - }) + it('succeeds to set WiFi connection with new non-shared profile', () => { + cy.findByLabelText(/Enable WiFi connection/).check() + cy.findByLabelText('Settings profile').selectOption('non-shared') + cy.wait('@scan-access-points') + cy.findByText('AccessPoint1').click() + cy.findByText( + 'Please click "Save changes" to start using this WiFi profile for the gateway', + ).should('be.visible') + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) + }) + cy.findByText( + 'The gateway WiFi is currently attempting to connect using this profile', + ).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) - it('succeeds to set WiFi connection with new shared profile', () => { - cy.findByLabelText(/Enable WiFi connection/).check() - cy.findByLabelText('Settings profile').selectOption('shared') - cy.wait('@scan-access-points') - cy.findByLabelText('Profile name').type('New WiFi profile') - cy.findByText('AccessPoint1').click() - cy.findByText( - 'Please click "Save changes" to start using this WiFi profile for the gateway', - ).should('be.visible') - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) - }) - cy.findByText('The gateway WiFi is currently attempting to connect using this profile').should( - 'be.visible', - ) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') - }) + it('succeeds to set Ethernet connection with default network settings', () => { + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.ethernet_profile_id', ethernetProfileId) + }) + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) - it('succeeds to set WiFi connection with new non-shared profile', () => { - cy.findByLabelText(/Enable WiFi connection/).check() - cy.findByLabelText('Settings profile').selectOption('non-shared') - cy.wait('@scan-access-points') - cy.findByText('AccessPoint1').click() - cy.findByText( - 'Please click "Save changes" to start using this WiFi profile for the gateway', - ).should('be.visible') - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) - }) - cy.findByText('The gateway WiFi is currently attempting to connect using this profile').should( - 'be.visible', - ) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') - }) + it('succeeds to validate custom ethernet network settings fields', () => { + cy.findByLabelText(/Use a static IP address/).check() + cy.findByRole('button', { name: 'Save changes' }).click() + cy.get('#ethernet_profile\\.network_interface_addresses\\.ip_addresses-field-error').should( + 'be.visible', + ) + cy.get('#ethernet_profile\\.network_interface_addresses\\.subnet_mask-field-error').should( + 'be.visible', + ) + cy.get('#ethernet_profile\\.network_interface_addresses\\.gateway-field-error').should( + 'be.visible', + ) + }) + + it('succeeds to set Ethernet connection with custom network settings', () => { + cy.findByLabelText(/Use a static IP address/).check() + cy.findByText('IP addresses') + .parents('div[data-test-id="form-field"]') + .find('input') + .first() + .type('198.168.100.5') + cy.findByLabelText('Subnet mask').type('255.255.255.0') + cy.findByLabelText('Gateway').type('198.168.255.10') + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.ethernet_profile_id', ethernetProfileId) + }) + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) - it('succeeds to set Ethernet connection with default network settings', () => { - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.ethernet_profile_id', ethernetProfileId) + it("succeeds to set organization's WiFi profile", () => { + const organization = { ids: { organization_id: organizationId }, name: 'Test organization' } + cy.createOrganization(organization, userId) + cy.createCollaborator('gateways', gatewayId, { + collaborator: { + ids: { + organization_ids: { + organization_id: organizationId, + }, + }, + rights: ['RIGHT_GATEWAY_ALL'], + }, }) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') + cy.reload() + cy.findByLabelText(/Enable WiFi connection/).check() + cy.findByLabelText('Show profiles of').should('not.have.attr', 'disabled') + cy.findByLabelText('Show profiles of').selectOption(organizationId) + cy.findByLabelText('Settings profile').selectOption(wifiProfileId) + cy.findByText( + 'Please click "Save changes" to start using this WiFi profile for the gateway', + ).should('be.visible') + cy.findByRole('button', { name: 'Save changes' }).click() + cy.wait('@update-connection-settings') + .its('request.body') + .should(body => { + expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) + }) + cy.findByText( + 'The gateway WiFi is currently attempting to connect using this profile', + ).should('be.visible') + cy.findByTestId('error-notification').should('not.exist') + cy.findByTestId('toast-notification-success') + .should('be.visible') + .and('contain', 'Connection settings updated') + }) }) - it('succeeds to validate custom ethernet network settings fields', () => { - cy.findByLabelText(/Use a static IP address/).check() - cy.findByRole('button', { name: 'Save changes' }).click() - cy.get('#ethernet_profile\\.network_interface_addresses\\.ip_addresses-field-error').should( - 'be.visible', - ) - cy.get('#ethernet_profile\\.network_interface_addresses\\.subnet_mask-field-error').should( - 'be.visible', - ) - cy.get('#ethernet_profile\\.network_interface_addresses\\.gateway-field-error').should( - 'be.visible', - ) - }) + describe('Without WiFi and Ethernet', () => { + beforeEach(() => { + cy.dropAndSeedDatabase() + cy.createUser(user) + cy.createGateway(gateway, userId) - it('succeeds to set Ethernet connection with custom network settings', () => { - cy.findByLabelText(/Use a static IP address/).check() - cy.findByText('IP addresses') - .parents('div[data-test-id="form-field"]') - .find('input') - .first() - .type('198.168.100.5') - cy.findByLabelText('Subnet mask').type('255.255.255.0') - cy.findByLabelText('Gateway').type('198.168.255.10') - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.ethernet_profile_id', ethernetProfileId) - }) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') - }) + // Interceptors + cy.intercept('GET', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { + statusCode: 200, + body: { + ids: { + gateway_id: `eui-${gateway.eui}`, + eui: gateway.eui, + }, + version_ids: gatewayVersionIds, + capabilities: { + cellular: true, + lora_8ch_concentrator: true, + firmware_update: true, + }, + }, + }).as('get-is-gtw-managed') - it("succeeds to set organization's WiFi profile", () => { - const organization = { ids: { organization_id: organizationId }, name: 'Test organization' } - cy.createOrganization(organization, userId) - cy.createCollaborator('gateways', gatewayId, { - collaborator: { - ids: { - organization_ids: { - organization_id: organizationId, + cy.intercept('PUT', `/api/v3/gcs/gateways/managed/${gatewayId}*`, { + statusCode: 200, + body: { + ids: { + gateway_id: gatewayId, }, }, - rights: ['RIGHT_GATEWAY_ALL'], - }, + }).as('update-connection-settings') + // End interceptors. + + cy.loginConsole({ user_id: user.ids.user_id, password: user.password }) + cy.visit(`${Cypress.config('consoleRootPath')}/gateways/${gatewayId}`) + cy.wait('@get-is-gtw-managed') + cy.findByRole('heading', { name: 'test-managed-gateway' }) + cy.get('button').contains('Managed gateway').click() + cy.get('a').contains('Connection settings').click() + cy.location('pathname').should( + 'eq', + `${Cypress.config('consoleRootPath')}/gateways/${gatewayId}/managed-gateway/connection-settings`, + ) + cy.findByTestId('error-notification').should('not.exist') + }) + + it('succeeds to display UI elements in place', () => { + cy.findByTestId('notification') + .should('be.visible') + .and('contain', 'This gateway does not have any connection settings to configure.') + cy.findByText('WiFi connection', { selector: 'h3' }).should('not.exist') + cy.findByText('Ethernet connection', { selector: 'h3' }).should('not.exist') + cy.findByRole('button', { name: 'Save changes' }).should('not.exist') + + cy.findByText(gatewayVersionIds.model_id, { selector: 'h3' }).should('be.visible') }) - cy.reload() - cy.findByLabelText(/Enable WiFi connection/).check() - cy.findByLabelText('Show profiles of').should('not.have.attr', 'disabled') - cy.findByLabelText('Show profiles of').selectOption(organizationId) - cy.findByLabelText('Settings profile').selectOption(wifiProfileId) - cy.findByText( - 'Please click "Save changes" to start using this WiFi profile for the gateway', - ).should('be.visible') - cy.findByRole('button', { name: 'Save changes' }).click() - cy.wait('@update-connection-settings') - .its('request.body') - .should(body => { - expect(body).to.have.nested.property('gateway.wifi_profile_id', wifiProfileId) - }) - cy.findByText('The gateway WiFi is currently attempting to connect using this profile').should( - 'be.visible', - ) - cy.findByTestId('error-notification').should('not.exist') - cy.findByTestId('toast-notification-success') - .should('be.visible') - .and('contain', 'Connection settings updated') }) }) diff --git a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/connections/index.js b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/connections/index.js index 2705511186..8d15841971 100644 --- a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/connections/index.js +++ b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/connections/index.js @@ -42,7 +42,12 @@ import { CONNECTION_TYPES } from '@console/containers/gateway-managed-gateway/sh import sharedMessages from '@ttn-lw/lib/shared-messages' import PropTypes from '@ttn-lw/lib/prop-types' -import { selectSelectedManagedGateway } from '@console/store/selectors/gateways' +import { + selectSelectedManagedGateway, + selectSelectedManagedGatewayHasCellular, + selectSelectedManagedGatewayHasWifi, + selectSelectedManagedGatewayHasEthernet, +} from '@console/store/selectors/gateways' import m from './messages' @@ -119,6 +124,9 @@ ConnectionByType.defaultProps = { const ManagedGatewayConnections = ({ connectionsData }) => { const selectedManagedGateway = useSelector(selectSelectedManagedGateway) + const hasCellular = useSelector(selectSelectedManagedGatewayHasCellular) + const hasWifi = useSelector(selectSelectedManagedGatewayHasWifi) + const hasEthernet = useSelector(selectSelectedManagedGatewayHasEthernet) const { systemStatus, controllerConnection, @@ -253,25 +261,31 @@ const ManagedGatewayConnections = ({ connectionsData }) => {
- - - + {hasCellular && ( + + )} + {hasWifi && ( + + )} + {hasEthernet && ( + + )}
) diff --git a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/index.js b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/index.js index a65a5ac453..dce7ba4d32 100644 --- a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/index.js +++ b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/index.js @@ -63,12 +63,15 @@ import { updateManagedGateway } from '@console/store/actions/gateways' import { selectSelectedGateway, selectSelectedManagedGateway, + selectSelectedManagedGatewayHasWifi, + selectSelectedManagedGatewayHasEthernet, } from '@console/store/selectors/gateways' import { selectUserId } from '@account/store/selectors/user' const m = defineMessages({ firstNotification: - 'You have just claimed a managed gateway. To connect it to WiFi or ethernet you can configure those connections here. The preprovisioned cellular backhaul typically connects automatically.', + 'You have just claimed a managed gateway. You can configure its connection settings here.', + noConnectionSettings: 'This gateway does not have any connection settings to configure.', updateSuccess: 'Connection settings updated', updateFailure: 'There was an error updating these connection settings', }) @@ -91,14 +94,16 @@ const GatewayConnectionSettings = () => { const connectionsData = useConnectionsData() + const hasWifi = useSelector(selectSelectedManagedGatewayHasWifi) + const hasWifiProfileSet = hasWifi && Boolean(selectedManagedGateway.wifi_profile_id) + const hasEthernet = useSelector(selectSelectedManagedGatewayHasEthernet) + const hasEthernetProfileSet = hasEthernet && Boolean(selectedManagedGateway.ethernet_profile_id) + const [initialValues, setInitialValues] = useState({ - wifi_profile: { ...initialWifiProfile }, - ethernet_profile: { ...initialEthernetProfile }, + ...(hasWifi && { wifi_profile: { ...initialWifiProfile } }), + ...(hasEthernet && { ethernet_profile: { ...initialEthernetProfile } }), }) - const hasWifiProfileSet = Boolean(selectedManagedGateway.wifi_profile_id) - const hasEthernetProfileSet = Boolean(selectedManagedGateway.ethernet_profile_id) - useBreadcrumbs( 'gtws.single.managed-gateway.connection-settings', { const fetchWifiProfile = useCallback( async collaborators => { let wifiProfile - let entityId + let wifiProfileEntityId if (hasWifiProfileSet) { setError(undefined) @@ -125,7 +130,7 @@ const GatewayConnectionSettings = () => { ), ), ) - entityId = userId + wifiProfileEntityId = userId } catch (e) { if (!isNotFoundError(e)) { setError(e) @@ -150,7 +155,7 @@ const GatewayConnectionSettings = () => { ), ), ) - entityId = orgId + wifiProfileEntityId = orgId break } catch (e) { if (!isNotFoundError(e)) { @@ -161,7 +166,7 @@ const GatewayConnectionSettings = () => { } } } - return { wifiProfile, entityId } + return { wifiProfile, wifiProfileEntityId } }, [dispatch, hasWifiProfileSet, selectedManagedGateway.wifi_profile_id, userId], ) @@ -190,8 +195,8 @@ const GatewayConnectionSettings = () => { }, [dispatch, hasEthernetProfileSet, selectedManagedGateway.ethernet_profile_id]) const updateInitialWifiProfile = useCallback( - (values, profile, entityId, isNonSharedProfile) => ({ - ...values.wifi_profile, + (profile, entityId, isNonSharedProfile) => ({ + ...initialWifiProfile, ...(isNonSharedProfile && { ...profile.data }), profile_id: isNonSharedProfile ? 'non-shared' @@ -204,8 +209,8 @@ const GatewayConnectionSettings = () => { ) const updateInitialEthernetProfile = useCallback( - (values, profile) => ({ - ...values.ethernet_profile, + profile => ({ + ...initialEthernetProfile, ...revertEthernetProfile(profile?.data ?? {}), profile_id: selectedManagedGateway.ethernet_profile_id ?? '', }), @@ -214,32 +219,45 @@ const GatewayConnectionSettings = () => { const loadData = useCallback( async dispatch => { - let collaborators = [] - if (mayViewCollaborators) { - const { entities } = await dispatch(attachPromise(getCollaboratorsList('gateway', gtwId))) - collaborators = entities - } - const { wifiProfile, entityId } = await fetchWifiProfile(collaborators) - const { ethernetProfile } = await fetchEthernetProfile() - const isNonSharedProfile = Boolean(wifiProfile) && !Boolean(wifiProfile.data.shared) - if (isNonSharedProfile) { - setNonSharedWifiProfileId(selectedManagedGateway.wifi_profile_id) + const fetchCollaborators = async () => { + if (mayViewCollaborators) { + const { entities } = await dispatch(attachPromise(getCollaboratorsList('gateway', gtwId))) + return entities + } + return [] } - setInitialValues(oldValues => ({ - ...oldValues, - wifi_profile: updateInitialWifiProfile( - oldValues, + + const newValues = {} + + if (hasWifi) { + const collaborators = await fetchCollaborators() + const { wifiProfile, wifiProfileEntityId } = await fetchWifiProfile(collaborators) + const isNonSharedWifiProfile = Boolean(wifiProfile) && !Boolean(wifiProfile.data.shared) + + if (isNonSharedWifiProfile) { + setNonSharedWifiProfileId(selectedManagedGateway.wifi_profile_id) + } + + newValues.wifi_profile = updateInitialWifiProfile( wifiProfile, - entityId, - isNonSharedProfile, - ), - ethernet_profile: updateInitialEthernetProfile(oldValues, ethernetProfile), - })) + wifiProfileEntityId, + isNonSharedWifiProfile, + ) + } + + if (hasEthernet) { + const { ethernetProfile } = await fetchEthernetProfile() + newValues.ethernet_profile = updateInitialEthernetProfile(ethernetProfile) + } + + setInitialValues(oldValues => ({ ...oldValues, ...newValues })) }, [ fetchEthernetProfile, fetchWifiProfile, gtwId, + hasEthernet, + hasWifi, mayViewCollaborators, selectedManagedGateway.wifi_profile_id, updateInitialEthernetProfile, @@ -312,38 +330,45 @@ const GatewayConnectionSettings = () => { setError(undefined) try { + const body = {} const { wifi_profile, ethernet_profile } = values - const shouldUpdateNonSharedWifiProfile = - wifi_profile.profile_id === 'non-shared' && - Boolean(nonSharedWifiProfileId) && - wifi_profile._enable_wifi_connection + if (hasWifi) { + const shouldUpdateNonSharedWifiProfile = + wifi_profile.profile_id === 'non-shared' && + Boolean(nonSharedWifiProfileId) && + wifi_profile._enable_wifi_connection - const wifiProfileId = await getWifiProfileId(wifi_profile, shouldUpdateNonSharedWifiProfile) - const ethernetProfileId = await getEthernetProfileId( - ethernet_profile, - cleanValues.ethernet_profile, - ) - const body = { - wifi_profile_id: - !wifi_profile._enable_wifi_connection && !wifi_profile._override ? null : wifiProfileId, - ethernet_profile_id: ethernetProfileId, + if (!wifi_profile._enable_wifi_connection && !wifi_profile._override) { + body.wifi_profile_id = null + } else { + body.wifi_profile_id = await getWifiProfileId( + wifi_profile, + shouldUpdateNonSharedWifiProfile, + ) + } + } + if (hasEthernet) { + body.ethernet_profile_id = await getEthernetProfileId( + ethernet_profile, + cleanValues.ethernet_profile, + ) } await dispatch(attachPromise(updateManagedGateway(gtwId, body))) // Reset the form and the initial values - let resetValues = { ...values } - if (wifi_profile.profile_id !== 'non-shared') { - resetValues = { - ...values, - wifi_profile: { - ...values.wifi_profile, - ...initialWifiProfile, - profile_id: wifiProfileId, - _profile_of: wifi_profile._profile_of, - }, - } + const resetValues = { + ...values, + ...(hasWifi && + wifi_profile.profile_id !== 'non-shared' && { + wifi_profile: { + ...wifi_profile, + ...initialWifiProfile, + profile_id: body.wifi_profile_id, + _profile_of: wifi_profile._profile_of, + }, + }), } setInitialValues(resetValues) @@ -351,7 +376,7 @@ const GatewayConnectionSettings = () => { values: resetValues, }) - if (resetValues.wifi_profile._enable_wifi_connection) { + if (hasWifi && resetValues.wifi_profile._enable_wifi_connection) { setSaveFormClicked(true) } @@ -373,6 +398,8 @@ const GatewayConnectionSettings = () => { [ dispatch, gtwId, + hasEthernet, + hasWifi, hasEthernetProfileSet, initialValues.ethernet_profile, initialValues.wifi_profile, @@ -386,31 +413,39 @@ const GatewayConnectionSettings = () => {
- {isFirstClaim && } -
+ {hasWifi || hasEthernet ? ( <> - } + -
- - - - - + validationSchema={validationSchema} + > + <> + {hasWifi && ( + + )} + {hasWifi && hasEthernet &&
} + {hasEthernet && } + + + + + + - + ) : ( + + )}
diff --git a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/validation-schema.js b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/validation-schema.js index a1ab7be595..3bdd9bcc18 100644 --- a/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/validation-schema.js +++ b/pkg/webui/console/containers/gateway-managed-gateway/connection-settings/validation-schema.js @@ -22,6 +22,8 @@ import sharedMessages from '@ttn-lw/lib/shared-messages' export const validationSchema = Yup.object().shape({ wifi_profile: Yup.object() + .nullable() + .default(undefined) .shape({ _override: Yup.boolean().default(false), _enable_wifi_connection: Yup.boolean().default(false), @@ -34,7 +36,7 @@ export const validationSchema = Yup.object().shape({ is: profileId => profileId && profileId.includes('shared'), then: schema => schema.concat(wifiValidationSchema), }), - ethernet_profile: ethernetValidationSchema, + ethernet_profile: ethernetValidationSchema.nullable().default(undefined), }) export default validationSchema diff --git a/pkg/webui/console/store/middleware/logics/gateways.js b/pkg/webui/console/store/middleware/logics/gateways.js index b545b3cbea..4d15d345c3 100644 --- a/pkg/webui/console/store/middleware/logics/gateways.js +++ b/pkg/webui/console/store/middleware/logics/gateways.js @@ -54,6 +54,7 @@ const getGatewayLogic = createRequestLogic({ let managed = undefined try { managed = await tts.Gateways.getManagedGateway(id, [ + 'capabilities', 'wifi_profile_id', 'ethernet_profile_id', 'version_ids', diff --git a/pkg/webui/console/store/selectors/gateways.js b/pkg/webui/console/store/selectors/gateways.js index f1638c07dd..1ca5e69251 100644 --- a/pkg/webui/console/store/selectors/gateways.js +++ b/pkg/webui/console/store/selectors/gateways.js @@ -54,6 +54,16 @@ export const selectIsSelectedGatewayManaged = state => export const selectSelectedGatewayClaimable = state => selectGatewayStore(state).selectedGatewayClaimable export const selectSelectedManagedGateway = state => selectSelectedGateway(state)?.managed +export const selectSelectedManagedGatewayHasCellular = state => + Boolean(selectSelectedManagedGateway(state)?.capabilities?.cellular) +export const selectSelectedManagedGatewayHasWifi = state => { + const capabilities = selectSelectedManagedGateway(state)?.capabilities + return Boolean(capabilities?.wifi_2_4_ghz) || Boolean(capabilities?.wifi_5_ghz) +} +export const selectSelectedManagedGatewayHasEthernet = state => + Boolean(selectSelectedManagedGateway(state)?.capabilities?.ethernet) +export const selectSelectedManagedGatewayHasBattery = state => + Boolean(selectSelectedManagedGateway(state)?.capabilities?.battery) // Gateways. const selectGtwsIds = createPaginationIdsSelectorByEntity(ENTITY) diff --git a/pkg/webui/locales/en.json b/pkg/webui/locales/en.json index 213db09db9..8891c68944 100644 --- a/pkg/webui/locales/en.json +++ b/pkg/webui/locales/en.json @@ -593,7 +593,8 @@ "console.containers.gateway-managed-gateway.connection-settings.connections.messages.cpuTemperature": "CPU temperature: {temperature}", "console.containers.gateway-managed-gateway.connection-settings.ethernet-settings-form-fields.ethernetConnection": "Ethernet connection", "console.containers.gateway-managed-gateway.connection-settings.ethernet-settings-form-fields.useStaticIp": "Use a static IP address", - "console.containers.gateway-managed-gateway.connection-settings.index.firstNotification": "You have just claimed a managed gateway. To connect it to WiFi or ethernet you can configure those connections here. The preprovisioned cellular backhaul typically connects automatically.", + "console.containers.gateway-managed-gateway.connection-settings.index.firstNotification": "You have just claimed a managed gateway. You can configure its connection settings here.", + "console.containers.gateway-managed-gateway.connection-settings.index.noConnectionSettings": "This gateway does not have any connection settings to configure.", "console.containers.gateway-managed-gateway.connection-settings.index.updateSuccess": "Connection settings updated", "console.containers.gateway-managed-gateway.connection-settings.index.updateFailure": "There was an error updating these connection settings", "console.containers.gateway-managed-gateway.connection-settings.wifi-settings-form-fields.settingsProfile": "Settings profile", diff --git a/pkg/webui/locales/ja.json b/pkg/webui/locales/ja.json index 9ddfabb8ab..ae676f45db 100644 --- a/pkg/webui/locales/ja.json +++ b/pkg/webui/locales/ja.json @@ -594,6 +594,7 @@ "console.containers.gateway-managed-gateway.connection-settings.ethernet-settings-form-fields.ethernetConnection": "", "console.containers.gateway-managed-gateway.connection-settings.ethernet-settings-form-fields.useStaticIp": "", "console.containers.gateway-managed-gateway.connection-settings.index.firstNotification": "", + "console.containers.gateway-managed-gateway.connection-settings.index.noConnectionSettings": "", "console.containers.gateway-managed-gateway.connection-settings.index.updateSuccess": "", "console.containers.gateway-managed-gateway.connection-settings.index.updateFailure": "", "console.containers.gateway-managed-gateway.connection-settings.wifi-settings-form-fields.settingsProfile": "", From 7327564e87705a31b6de35a5679bf446b00d8444 Mon Sep 17 00:00:00 2001 From: Johan Stokking Date: Wed, 11 Dec 2024 14:27:06 +0100 Subject: [PATCH 8/8] util: Update The Things Industries CA --- go.mod | 4 ++-- go.sum | 8 ++++---- tools/go.mod | 4 ++-- tools/go.sum | 12 ++++++------ 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/go.mod b/go.mod index 8a33ff386e..ad5c7da342 100644 --- a/go.mod +++ b/go.mod @@ -89,8 +89,8 @@ require ( go.packetbroker.org/api/mapping/v2 v2.3.2 go.packetbroker.org/api/routing v1.9.2 go.packetbroker.org/api/v3 v3.17.1 - go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834 - go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834 + go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08 + go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37 go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 go.uber.org/automaxprocs v1.6.0 diff --git a/go.sum b/go.sum index 6056a95754..8c2a21f0d0 100644 --- a/go.sum +++ b/go.sum @@ -717,10 +717,10 @@ go.packetbroker.org/api/routing v1.9.2 h1:J4+4vYZxa60UWC70Y9yy7sktU7DXaAp9Q13Bfq go.packetbroker.org/api/routing v1.9.2/go.mod h1:kd2K7gieDI35YfPA8/zDmLX3qiKPuXia/MA77BEAeUA= go.packetbroker.org/api/v3 v3.17.1 h1:LcyFPUGqVubGWMvQ16tZlQIKd+noGx7urzEYhSLiEQA= go.packetbroker.org/api/v3 v3.17.1/go.mod h1:6bVbdWAYLnvZ5kgXxA7GBQvZTN7vxI0DoF1Di1NoAT4= -go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834 h1:ANhGlIwofZn/HfA6bNkAD5Oh6n3wCcEjXjhT1LmpMv0= -go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834/go.mod h1:2+WsMwIunNLh22oauBzGL56JazE3UY34W1fstqEbacw= -go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834 h1:I7oylW49wLHcUZOrxk9CmCzKAk0wyBCMIvxeiYUWXt4= -go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834/go.mod h1:89OU623VYKW9i3W4CZgIGFmtgb/jsN8JV2PAuCsj+7w= +go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08 h1:s+bICoNXKaPwjZTRG1QUGNYoQM/iypYjCzt3RXSWFH0= +go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08/go.mod h1:j7/Mx4U9xAMR8tQysnuDtYWJLpSmOOj9Ljpp/2zjnbs= +go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37 h1:YAVZqCKGfrD1PKyX+512sZM6fTNJeodQU62btJcHv/Q= +go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37/go.mod h1:r258GXhMCjAhBVvJxd5AVmxuoiHZ/fSxY76WQpDwSB0= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e h1:TWGQ3lh7gI2W5hnb6qPdpoAa0d7s/XPwvgf2VVCMJaY= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e/go.mod h1:/smENFuESiJCyWRsHRLBjbZGMN889BORQXIPP6NlpZE= go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 h1:xP1fElQiH8/6GWXg6JG8UqRD0uluhmicIRS4e/BzcAw= diff --git a/tools/go.mod b/tools/go.mod index 40ce83ad12..3576b3a74d 100644 --- a/tools/go.mod +++ b/tools/go.mod @@ -239,8 +239,8 @@ require ( go.packetbroker.org/api/mapping/v2 v2.3.2 // indirect go.packetbroker.org/api/routing v1.9.2 // indirect go.packetbroker.org/api/v3 v3.17.1 // indirect - go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834 // indirect - go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834 // indirect + go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08 // indirect + go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37 // indirect go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e // indirect go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 // indirect go.uber.org/automaxprocs v1.6.0 // indirect diff --git a/tools/go.sum b/tools/go.sum index 8645f3a127..761317595d 100644 --- a/tools/go.sum +++ b/tools/go.sum @@ -255,8 +255,8 @@ github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4 github.com/fsnotify/fsnotify v1.8.0 h1:dAwr6QBTBZIkG8roQaJjGof0pp0EeF+tNV7YBP3F/8M= github.com/fsnotify/fsnotify v1.8.0/go.mod h1:8jBTzvmWwFyi3Pb8djgCCO5IBqzKJ/Jwo8TRcHyHii0= github.com/garyburd/redigo v1.1.1-0.20170914051019-70e1b1943d4f/go.mod h1:NR3MbYisc3/PwhQ00EMzDiPmrwpPxAn5GI05/YaO1SY= -github.com/getsentry/sentry-go v0.30.0 h1:lWUwDnY7sKHaVIoZ9wYqRHJ5iEmoc0pqcRqFkosKzBo= -github.com/getsentry/sentry-go v0.30.0/go.mod h1:WU9B9/1/sHDqeV8T+3VwwbjeR5MSXs/6aqG3mqZrezA= +github.com/getsentry/sentry-go v0.29.1 h1:DyZuChN8Hz3ARxGVV8ePaNXh1dQ7d76AiB117xcREwA= +github.com/getsentry/sentry-go v0.29.1/go.mod h1:x3AtIzN01d6SiWkderzaH28Tm0lgkafpJ5Bm3li39O0= github.com/glycerine/go-unsnap-stream v0.0.0-20181221182339-f9677308dec2/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxIA= @@ -759,10 +759,10 @@ go.packetbroker.org/api/routing v1.9.2 h1:J4+4vYZxa60UWC70Y9yy7sktU7DXaAp9Q13Bfq go.packetbroker.org/api/routing v1.9.2/go.mod h1:kd2K7gieDI35YfPA8/zDmLX3qiKPuXia/MA77BEAeUA= go.packetbroker.org/api/v3 v3.17.1 h1:LcyFPUGqVubGWMvQ16tZlQIKd+noGx7urzEYhSLiEQA= go.packetbroker.org/api/v3 v3.17.1/go.mod h1:6bVbdWAYLnvZ5kgXxA7GBQvZTN7vxI0DoF1Di1NoAT4= -go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834 h1:ANhGlIwofZn/HfA6bNkAD5Oh6n3wCcEjXjhT1LmpMv0= -go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241023114011-31c9c9f86834/go.mod h1:2+WsMwIunNLh22oauBzGL56JazE3UY34W1fstqEbacw= -go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834 h1:I7oylW49wLHcUZOrxk9CmCzKAk0wyBCMIvxeiYUWXt4= -go.thethings.industries/pkg/ca v0.0.0-20241023114011-31c9c9f86834/go.mod h1:89OU623VYKW9i3W4CZgIGFmtgb/jsN8JV2PAuCsj+7w= +go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08 h1:s+bICoNXKaPwjZTRG1QUGNYoQM/iypYjCzt3RXSWFH0= +go.thethings.industries/pkg/api/gen/tti/gateway v0.0.0-20241210141851-578880da9b08/go.mod h1:j7/Mx4U9xAMR8tQysnuDtYWJLpSmOOj9Ljpp/2zjnbs= +go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37 h1:YAVZqCKGfrD1PKyX+512sZM6fTNJeodQU62btJcHv/Q= +go.thethings.industries/pkg/ca v0.0.0-20241210150448-19d8b0315f37/go.mod h1:r258GXhMCjAhBVvJxd5AVmxuoiHZ/fSxY76WQpDwSB0= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e h1:TWGQ3lh7gI2W5hnb6qPdpoAa0d7s/XPwvgf2VVCMJaY= go.thethings.network/lorawan-application-payload v0.0.0-20220125153912-1198ff1e403e/go.mod h1:/smENFuESiJCyWRsHRLBjbZGMN889BORQXIPP6NlpZE= go.thethings.network/lorawan-stack-legacy/v2 v2.1.0 h1:xP1fElQiH8/6GWXg6JG8UqRD0uluhmicIRS4e/BzcAw=