Compare commits

..

31 Commits

Author SHA1 Message Date
08d69502de Bump version to 4.3.2 2023-04-26 13:02:10 +01:00
683f59c063 Update Rust API dependencies. 2023-04-26 12:36:10 +01:00
0ef9f16f40 Re-enable v4_migrate option for now. 2023-04-26 12:27:12 +01:00
a5dd650510 Update dependencies. 2023-04-26 12:04:54 +01:00
de90b7d284 Enable redis tls-rustls feature.
Fixes #170.
2023-04-26 11:58:59 +01:00
fe0ef398ec Format Cargo.toml 2023-04-26 11:56:27 +01:00
58bd8eb5b4 Fix Rust fmt error. 2023-04-26 11:52:50 +01:00
0a294e41b5 Fix clippy feedback. 2023-04-13 22:06:44 +01:00
f71d30ca83 Re-implement frame and event download option. 2023-04-12 14:50:33 +01:00
ef0a97ab3d Log .send() error, rather than returning.
Closes https://github.com/chirpstack/chirpstack-docker/issues/80.
2023-04-11 15:10:08 +01:00
e93d3bc534 Update AWS SNS SDK crate. 2023-04-11 14:57:03 +01:00
31e359b314 Disable v3-v4 GW<>NS message migration and make config option.
By making this opt-in, we can reduce the overhead of supporting both v3
and v4 gateway messages. In case of v3 to v4 migration, one would
upgrade all ChirpStack Gateway Bridge instances to the latest v3
version, migrate ChirpStack as described here + enable this config flag:
https://www.chirpstack.io/docs/v3-v4-migration.html

Then upgrade ChirpStack Gateway Bridge to the latest v4 version followed
by disabling / removing this config flag (`v4_migrate`) again.
2023-04-11 14:19:07 +01:00
0a3fcaeb2d Bump version to 4.3.1 2023-04-10 12:24:52 +01:00
77051e8956 Update Rust API Cargo.lock. 2023-04-10 12:08:12 +01:00
3a9cb20c03 Update Dockerfiles. 2023-04-10 11:32:18 +01:00
1b96b4f91f Update caniuse-lite (ui). 2023-04-10 11:31:44 +01:00
101b155d91 Update dependencies. 2023-04-10 11:10:52 +01:00
3f4c262267 Bump webpack from 5.72.0 to 5.76.3 in /ui (#150)
Bumps [webpack](https://github.com/webpack/webpack) from 5.72.0 to 5.76.3.
- [Release notes](https://github.com/webpack/webpack/releases)
- [Commits](https://github.com/webpack/webpack/compare/v5.72.0...v5.76.3)

---
updated-dependencies:
- dependency-name: webpack
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-04-10 10:14:19 +01:00
88939d4396 Update LoRa Cloud integration logo. 2023-04-06 16:27:43 +01:00
269b7f4d9d Fix gnss_assist_position enable toggle for gnss msg. 2023-04-06 16:26:45 +01:00
0ce60b789f Remove unused dependencies. 2023-03-28 22:11:06 +01:00
8fe0c7c6c2 Improve Rust SDK build flags / reduce dependencies.
This reduces the amount of dependencies in case not all features are
being used. E.g. tonic is only needed if using gRPC and pbjson,
pbjson-types and serde are only needed if using the JSON serialization.
2023-03-28 21:11:54 +01:00
4917de2b32 Earlier db initialization + change unwrap for error.
Closes #147.
2023-03-28 14:05:39 +01:00
d81af6b607 Bump dns-packet from 5.3.1 to 5.4.0 in /ui (#136)
Bumps [dns-packet](https://github.com/mafintosh/dns-packet) from 5.3.1 to 5.4.0.
- [Release notes](https://github.com/mafintosh/dns-packet/releases)
- [Changelog](https://github.com/mafintosh/dns-packet/blob/master/CHANGELOG.md)
- [Commits](https://github.com/mafintosh/dns-packet/compare/v5.3.1...5.4.0)

---
updated-dependencies:
- dependency-name: dns-packet
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-03-28 13:43:18 +01:00
cb6ac27ba4 Update dependencies. 2023-03-28 13:41:20 +01:00
1430c30ab3 Make using gateway location optional (LoRa Cloud). 2023-03-28 13:11:49 +01:00
cb49afeb01 Update LoRa Cloud form label. 2023-03-23 11:38:34 +00:00
9ba826963c Let serde use defaults for LoraCloudModemGeolocationServices.
This lets serde use default values in case a field is missing.
Specifically, this fixes the 'missing field `forward_f_ports`'
if migrating from an older LoRa Cloud configuration where the
`forward_f_ports` field was not yet present.
2023-03-23 11:01:35 +00:00
1f7fcc139d Update application.proto (#143) 2023-03-16 14:58:27 +00:00
8a496d9019 Fix Python README.
Closes #141.
2023-03-09 09:32:11 +00:00
ef97eccf62 Update LoRa Cloud integration. 2023-03-08 17:01:11 +00:00
62 changed files with 2879 additions and 2604 deletions

1440
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,5 +1,5 @@
# UI build stage
FROM --platform=$BUILDPLATFORM alpine:3.17.0 AS ui-build
FROM --platform=$BUILDPLATFORM alpine:3.17.3 AS ui-build
ENV PROJECT_PATH=/chirpstack
@ -15,7 +15,7 @@ RUN cd $PROJECT_PATH/ui && \
# ChirpStack build stage
FROM --platform=$BUILDPLATFORM rust:1.65.0-buster AS rust-build
FROM --platform=$BUILDPLATFORM rust:1.68.2-buster AS rust-build
ENV PROJECT_PATH=/chirpstack
RUN mkdir -p $PROJECT_PATH

View File

@ -1,4 +1,4 @@
FROM rust:1.65.0-buster
FROM rust:1.68.2-buster
ENV PROJECT_PATH=/chirpstack
RUN mkdir -p $PROJECT_PATH

View File

@ -99,267 +99,268 @@ namespace Chirpstack.Api {
"c3QSFgoOYXBwbGljYXRpb25faWQYASABKAkiegoUTG9yYUNsb3VkSW50ZWdy",
"YXRpb24SFgoOYXBwbGljYXRpb25faWQYASABKAkSSgoabW9kZW1fZ2VvbG9j",
"YXRpb25fc2VydmljZXMYAiABKAsyJi5hcGkuTG9yYUNsb3VkTW9kZW1HZW9s",
"b2NhdGlvblNlcnZpY2VzIsADCiFMb3JhQ2xvdWRNb2RlbUdlb2xvY2F0aW9u",
"b2NhdGlvblNlcnZpY2VzItUDCiFMb3JhQ2xvdWRNb2RlbUdlb2xvY2F0aW9u",
"U2VydmljZXMSDQoFdG9rZW4YASABKAkSFQoNbW9kZW1fZW5hYmxlZBgCIAEo",
"CBISCgptb2RlbV9wb3J0GAMgASgNEhEKCWduc3NfcG9ydBgEIAEoDRIYChBn",
"bnNzX3VzZV9yeF90aW1lGAUgASgIEhEKCXBhcnNlX3RsdhgGIAEoCBIeChZn",
"ZW9sb2NhdGlvbl9idWZmZXJfdHRsGAcgASgNEiMKG2dlb2xvY2F0aW9uX21p",
"bl9idWZmZXJfc2l6ZRgIIAEoDRIYChBnZW9sb2NhdGlvbl90ZG9hGAkgASgI",
"EhgKEGdlb2xvY2F0aW9uX3Jzc2kYCiABKAgSGAoQZ2VvbG9jYXRpb25fZ25z",
"cxgLIAEoCBImCh5nZW9sb2NhdGlvbl9nbnNzX3BheWxvYWRfZmllbGQYDCAB",
"KAkSJAocZ2VvbG9jYXRpb25fZ25zc191c2VfcnhfdGltZRgNIAEoCBIYChBn",
"ZW9sb2NhdGlvbl93aWZpGA4gASgIEiYKHmdlb2xvY2F0aW9uX3dpZmlfcGF5",
"bG9hZF9maWVsZBgPIAEoCSJTCiFDcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlv",
"blJlcXVlc3QSLgoLaW50ZWdyYXRpb24YASABKAsyGS5hcGkuTG9yYUNsb3Vk",
"SW50ZWdyYXRpb24iOAoeR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXF1ZXN0",
"EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIlEKH0dldExvcmFDbG91ZEludGVn",
"cmF0aW9uUmVzcG9uc2USLgoLaW50ZWdyYXRpb24YASABKAsyGS5hcGkuTG9y",
"YUNsb3VkSW50ZWdyYXRpb24iUwohVXBkYXRlTG9yYUNsb3VkSW50ZWdyYXRp",
"b25SZXF1ZXN0Ei4KC2ludGVncmF0aW9uGAEgASgLMhkuYXBpLkxvcmFDbG91",
"ZEludGVncmF0aW9uIjsKIURlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVx",
"dWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKRAQoUR2NwUHViU3ViSW50",
"ZWdyYXRpb24SFgoOYXBwbGljYXRpb25faWQYASABKAkSHwoIZW5jb2RpbmcY",
"AiABKA4yDS5hcGkuRW5jb2RpbmcSGAoQY3JlZGVudGlhbHNfZmlsZRgDIAEo",
"CRISCgpwcm9qZWN0X2lkGAQgASgJEhIKCnRvcGljX25hbWUYBSABKAkiUwoh",
"Q3JlYXRlR2NwUHViU3ViSW50ZWdyYXRpb25SZXF1ZXN0Ei4KC2ludGVncmF0",
"aW9uGAEgASgLMhkuYXBpLkdjcFB1YlN1YkludGVncmF0aW9uIjgKHkdldEdj",
"cFB1YlN1YkludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgB",
"IAEoCSJRCh9HZXRHY3BQdWJTdWJJbnRlZ3JhdGlvblJlc3BvbnNlEi4KC2lu",
"dGVncmF0aW9uGAEgASgLMhkuYXBpLkdjcFB1YlN1YkludGVncmF0aW9uIlMK",
"IVVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9uUmVxdWVzdBIuCgtpbnRlZ3Jh",
"dGlvbhgBIAEoCzIZLmFwaS5HY3BQdWJTdWJJbnRlZ3JhdGlvbiI7CiFEZWxl",
"dGVHY3BQdWJTdWJJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25f",
"aWQYASABKAkioQEKEUF3c1Nuc0ludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9u",
"X2lkGAEgASgJEh8KCGVuY29kaW5nGAIgASgOMg0uYXBpLkVuY29kaW5nEg4K",
"BnJlZ2lvbhgDIAEoCRIVCg1hY2Nlc3Nfa2V5X2lkGAQgASgJEhkKEXNlY3Jl",
"dF9hY2Nlc3Nfa2V5GAUgASgJEhEKCXRvcGljX2FybhgGIAEoCSJNCh5DcmVh",
"dGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QSKwoLaW50ZWdyYXRpb24YASAB",
"KAsyFi5hcGkuQXdzU25zSW50ZWdyYXRpb24iNQobR2V0QXdzU25zSW50ZWdy",
"YXRpb25SZXF1ZXN0EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIksKHEdldEF3",
"c1Nuc0ludGVncmF0aW9uUmVzcG9uc2USKwoLaW50ZWdyYXRpb24YASABKAsy",
"Fi5hcGkuQXdzU25zSW50ZWdyYXRpb24iTQoeVXBkYXRlQXdzU25zSW50ZWdy",
"YXRpb25SZXF1ZXN0EisKC2ludGVncmF0aW9uGAEgASgLMhYuYXBpLkF3c1Nu",
"c0ludGVncmF0aW9uIjgKHkRlbGV0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVz",
"dBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKGAQoaQXp1cmVTZXJ2aWNlQnVz",
"SW50ZWdyYXRpb24SFgoOYXBwbGljYXRpb25faWQYASABKAkSHwoIZW5jb2Rp",
"bmcYAiABKA4yDS5hcGkuRW5jb2RpbmcSGQoRY29ubmVjdGlvbl9zdHJpbmcY",
"AyABKAkSFAoMcHVibGlzaF9uYW1lGAQgASgJIl8KJ0NyZWF0ZUF6dXJlU2Vy",
"dmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBI0CgtpbnRlZ3JhdGlvbhgBIAEo",
"CzIfLmFwaS5BenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbiI+CiRHZXRBenVy",
"ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25f",
"aWQYASABKAkiXQolR2V0QXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb25SZXNw",
"b25zZRI0CgtpbnRlZ3JhdGlvbhgBIAEoCzIfLmFwaS5BenVyZVNlcnZpY2VC",
"dXNJbnRlZ3JhdGlvbiJfCidVcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh",
"dGlvblJlcXVlc3QSNAoLaW50ZWdyYXRpb24YASABKAsyHy5hcGkuQXp1cmVT",
"ZXJ2aWNlQnVzSW50ZWdyYXRpb24iQQonRGVsZXRlQXp1cmVTZXJ2aWNlQnVz",
"SW50ZWdyYXRpb25SZXF1ZXN0EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJIk8K",
"FlBpbG90VGhpbmdzSW50ZWdyYXRpb24SFgoOYXBwbGljYXRpb25faWQYASAB",
"KAkSDgoGc2VydmVyGAIgASgJEg0KBXRva2VuGAMgASgJIlcKI0NyZWF0ZVBp",
"bG90VGhpbmdzSW50ZWdyYXRpb25SZXF1ZXN0EjAKC2ludGVncmF0aW9uGAEg",
"ASgLMhsuYXBpLlBpbG90VGhpbmdzSW50ZWdyYXRpb24iOgogR2V0UGlsb3RU",
"aGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25faWQYASAB",
"KAkiVQohR2V0UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlc3BvbnNlEjAKC2lu",
"dGVncmF0aW9uGAEgASgLMhsuYXBpLlBpbG90VGhpbmdzSW50ZWdyYXRpb24i",
"VwojVXBkYXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QSMAoLaW50",
"ZWdyYXRpb24YASABKAsyGy5hcGkuUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbiI9",
"CiNEZWxldGVQaWxvdFRoaW5nc0ludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBs",
"aWNhdGlvbl9pZBgBIAEoCSJOChBJZnR0dEludGVncmF0aW9uEhYKDmFwcGxp",
"Y2F0aW9uX2lkGAEgASgJEgsKA2tleRgCIAEoCRIVCg11cGxpbmtfdmFsdWVz",
"GAMgAygJIksKHUNyZWF0ZUlmdHR0SW50ZWdyYXRpb25SZXF1ZXN0EioKC2lu",
"dGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50ZWdyYXRpb24iNAoaR2V0",
"SWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSFgoOYXBwbGljYXRpb25faWQYASAB",
"KAkiSQobR2V0SWZ0dHRJbnRlZ3JhdGlvblJlc3BvbnNlEioKC2ludGVncmF0",
"aW9uGAEgASgLMhUuYXBpLklmdHR0SW50ZWdyYXRpb24iSwodVXBkYXRlSWZ0",
"dHRJbnRlZ3JhdGlvblJlcXVlc3QSKgoLaW50ZWdyYXRpb24YASABKAsyFS5h",
"cGkuSWZ0dHRJbnRlZ3JhdGlvbiI3Ch1EZWxldGVJZnR0dEludGVncmF0aW9u",
"UmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJJCi9HZW5lcmF0ZU1x",
"dHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVxdWVzdBIWCg5hcHBs",
"aWNhdGlvbl9pZBgBIAEoCSKWAQowR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25D",
"bGllbnRDZXJ0aWZpY2F0ZVJlc3BvbnNlEhAKCHRsc19jZXJ0GAEgASgJEg8K",
"B3Rsc19rZXkYAiABKAkSDwoHY2FfY2VydBgDIAEoCRIuCgpleHBpcmVzX2F0",
"GAQgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCoiCghFbmNvZGlu",
"ZxIICgRKU09OEAASDAoIUFJPVE9CVUYQASq/AQoPSW50ZWdyYXRpb25LaW5k",
"EggKBEhUVFAQABINCglJTkZMVVhfREIQARIQCgxUSElOR1NfQk9BUkQQAhIO",
"CgpNWV9ERVZJQ0VTEAMSDgoKTE9SQV9DTE9VRBAEEg8KC0dDUF9QVUJfU1VC",
"EAUSCwoHQVdTX1NOUxAGEhUKEUFaVVJFX1NFUlZJQ0VfQlVTEAcSEAoMUElM",
"T1RfVEhJTkdTEAgSDwoLTVFUVF9HTE9CQUwQCRIJCgVJRlRUVBAKKj8KEUlu",
"Zmx1eERiUHJlY2lzaW9uEgYKAk5TEAASBQoBVRABEgYKAk1TEAISBQoBUxAD",
"EgUKAU0QBBIFCgFIEAUqMQoPSW5mbHV4RGJWZXJzaW9uEg4KCklORkxVWERC",
"XzEQABIOCgpJTkZMVVhEQl8yEAEyuDwKEkFwcGxpY2F0aW9uU2VydmljZRJl",
"CgZDcmVhdGUSHS5hcGkuQ3JlYXRlQXBwbGljYXRpb25SZXF1ZXN0Gh4uYXBp",
"LkNyZWF0ZUFwcGxpY2F0aW9uUmVzcG9uc2UiHILT5JMCFiIRL2FwaS9hcHBs",
"aWNhdGlvbnM6ASoSXgoDR2V0EhouYXBpLkdldEFwcGxpY2F0aW9uUmVxdWVz",
"dBobLmFwaS5HZXRBcHBsaWNhdGlvblJlc3BvbnNlIh6C0+STAhgSFi9hcGkv",
"YXBwbGljYXRpb25zL3tpZH0SbgoGVXBkYXRlEh0uYXBpLlVwZGF0ZUFwcGxp",
"Y2F0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSItgtPkkwIn",
"GiIvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb24uaWR9OgEqEl8KBkRl",
"bGV0ZRIdLmFwaS5EZWxldGVBcHBsaWNhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"cHJvdG9idWYuRW1wdHkiHoLT5JMCGCoWL2FwaS9hcHBsaWNhdGlvbnMve2lk",
"fRJeCgRMaXN0EhwuYXBpLkxpc3RBcHBsaWNhdGlvbnNSZXF1ZXN0Gh0uYXBp",
"Lkxpc3RBcHBsaWNhdGlvbnNSZXNwb25zZSIZgtPkkwITEhEvYXBpL2FwcGxp",
"Y2F0aW9ucxKIAQoQTGlzdEludGVncmF0aW9ucxIcLmFwaS5MaXN0SW50ZWdy",
"YXRpb25zUmVxdWVzdBodLmFwaS5MaXN0SW50ZWdyYXRpb25zUmVzcG9uc2Ui",
"N4LT5JMCMRIvL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMSnwEKFUNyZWF0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5D",
"cmVhdGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5IkuC0+STAkUiQC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHA6ASoSkwEKEkdl",
"dEh0dHBJbnRlZ3JhdGlvbhIeLmFwaS5HZXRIdHRwSW50ZWdyYXRpb25SZXF1",
"ZXN0Gh8uYXBpLkdldEh0dHBJbnRlZ3JhdGlvblJlc3BvbnNlIjyC0+STAjYS",
"NC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRp",
"b25zL2h0dHASnwEKFVVwZGF0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5VcGRh",
"dGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVt",
"cHR5IkuC0+STAkUaQC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5h",
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHA6ASoSkAEKFURlbGV0",
"ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5EZWxldGVIdHRwSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjyC0+STAjYqNC9hcGkv",
"YXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0",
"dHASqwEKGUNyZWF0ZUluZmx1eERiSW50ZWdyYXRpb24SJS5hcGkuQ3JlYXRl",
"SW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu",
"RW1wdHkiT4LT5JMCSSJEL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u",
"LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvaW5mbHV4ZGI6ASoSowEK",
"FkdldEluZmx1eERiSW50ZWdyYXRpb24SIi5hcGkuR2V0SW5mbHV4RGJJbnRl",
"Z3JhdGlvblJlcXVlc3QaIy5hcGkuR2V0SW5mbHV4RGJJbnRlZ3JhdGlvblJl",
"c3BvbnNlIkCC0+STAjoSOC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlv",
"bl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRiEqsBChlVcGRhdGVJbmZsdXhE",
"YkludGVncmF0aW9uEiUuYXBpLlVwZGF0ZUluZmx1eERiSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5Ik+C0+STAkkaRC9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL2luZmx1eGRiOgEqEpwBChlEZWxldGVJbmZsdXhEYkludGVn",
"cmF0aW9uEiUuYXBpLkRlbGV0ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0",
"GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkCC0+STAjoqOC9hcGkvYXBwbGlj",
"YXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRi",
"ErQBChxDcmVhdGVUaGluZ3NCb2FyZEludGVncmF0aW9uEiguYXBpLkNyZWF0",
"ZVRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5IlKC0+STAkwiRy9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3Jh",
"dGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL3RoaW5nc2JvYXJk",
"OgEqEq8BChlHZXRUaGluZ3NCb2FyZEludGVncmF0aW9uEiUuYXBpLkdldFRo",
"aW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1ZXN0GiYuYXBpLkdldFRoaW5nc0Jv",
"YXJkSW50ZWdyYXRpb25SZXNwb25zZSJDgtPkkwI9EjsvYXBpL2FwcGxpY2F0",
"aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy90aGluZ3Nib2Fy",
"ZBK0AQocVXBkYXRlVGhpbmdzQm9hcmRJbnRlZ3JhdGlvbhIoLmFwaS5VcGRh",
"dGVUaGluZ3NCb2FyZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdy",
"YXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy90aGluZ3Nib2Fy",
"ZDoBKhKlAQocRGVsZXRlVGhpbmdzQm9hcmRJbnRlZ3JhdGlvbhIoLmFwaS5E",
"ZWxldGVUaGluZ3NCb2FyZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSJDgtPkkwI9KjsvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy90aGluZ3Nib2FyZBKuAQoaQ3Jl",
"YXRlTXlEZXZpY2VzSW50ZWdyYXRpb24SJi5hcGkuQ3JlYXRlTXlEZXZpY2Vz",
"SW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlCC",
"0+STAkoiRS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNh",
"dGlvbl9pZH0vaW50ZWdyYXRpb25zL215ZGV2aWNlczoBKhKnAQoXR2V0TXlE",
"ZXZpY2VzSW50ZWdyYXRpb24SIy5hcGkuR2V0TXlEZXZpY2VzSW50ZWdyYXRp",
"b25SZXF1ZXN0GiQuYXBpLkdldE15RGV2aWNlc0ludGVncmF0aW9uUmVzcG9u",
"c2UiQYLT5JMCOxI5L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzEq4BChpVcGRhdGVNeURldmljZXNJ",
"bnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVNeURldmljZXNJbnRlZ3JhdGlvblJl",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUILT5JMCShpFL2FwaS9h",
"cHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRl",
"Z3JhdGlvbnMvbXlkZXZpY2VzOgEqEp8BChpEZWxldGVNeURldmljZXNJbnRl",
"Z3JhdGlvbhImLmFwaS5EZWxldGVNeURldmljZXNJbnRlZ3JhdGlvblJlcXVl",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiQYLT5JMCOyo5L2FwaS9hcHBs",
"aWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZp",
"Y2VzEq4BChpDcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvbhImLmFwaS5DcmVh",
"dGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiUILT5JMCSiJFL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0",
"aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbG9yYWNsb3VkOgEq",
"EqcBChdHZXRMb3JhQ2xvdWRJbnRlZ3JhdGlvbhIjLmFwaS5HZXRMb3JhQ2xv",
"dWRJbnRlZ3JhdGlvblJlcXVlc3QaJC5hcGkuR2V0TG9yYUNsb3VkSW50ZWdy",
"YXRpb25SZXNwb25zZSJBgtPkkwI7EjkvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQSrgEKGlVwZGF0",
"ZUxvcmFDbG91ZEludGVncmF0aW9uEiYuYXBpLlVwZGF0ZUxvcmFDbG91ZElu",
"dGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJQgtPk",
"kwJKGkUvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQ6ASoSnwEKGkRlbGV0ZUxv",
"cmFDbG91ZEludGVncmF0aW9uEiYuYXBpLkRlbGV0ZUxvcmFDbG91ZEludGVn",
"cmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJBgtPkkwI7",
"KjkvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0",
"aW9ucy9sb3JhY2xvdWQSsAEKGkNyZWF0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"EiYuYXBpLkNyZWF0ZUdjcFB1YlN1YkludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMIkcvYXBpL2FwcGxpY2F0aW9u",
"cy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9n",
"Y3AtcHViLXN1YjoBKhKpAQoXR2V0R2NwUHViU3ViSW50ZWdyYXRpb24SIy5h",
"cGkuR2V0R2NwUHViU3ViSW50ZWdyYXRpb25SZXF1ZXN0GiQuYXBpLkdldEdj",
"cFB1YlN1YkludGVncmF0aW9uUmVzcG9uc2UiQ4LT5JMCPRI7L2FwaS9hcHBs",
"aWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvZ2NwLXB1",
"Yi1zdWISsAEKGlVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9uEiYuYXBpLlVw",
"ZGF0ZUdjcFB1YlN1YkludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdy",
"YXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9nY3AtcHViLXN1",
"YjoBKhKhAQoaRGVsZXRlR2NwUHViU3ViSW50ZWdyYXRpb24SJi5hcGkuRGVs",
"ZXRlR2NwUHViU3ViSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5IkOC0+STAj0qOy9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNh",
"dGlvbl9pZH0vaW50ZWdyYXRpb25zL2djcC1wdWItc3ViEqYBChdDcmVhdGVB",
"d3NTbnNJbnRlZ3JhdGlvbhIjLmFwaS5DcmVhdGVBd3NTbnNJbnRlZ3JhdGlv",
"blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiToLT5JMCSCJDL2Fw",
"aS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9p",
"bnRlZ3JhdGlvbnMvYXdzLXNuczoBKhKcAQoUR2V0QXdzU25zSW50ZWdyYXRp",
"b24SIC5hcGkuR2V0QXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GiEuYXBpLkdl",
"dEF3c1Nuc0ludGVncmF0aW9uUmVzcG9uc2UiP4LT5JMCORI3L2FwaS9hcHBs",
"aWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNu",
"cxKmAQoXVXBkYXRlQXdzU25zSW50ZWdyYXRpb24SIy5hcGkuVXBkYXRlQXdz",
"U25zSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5",
"Ik6C0+STAkgaQy9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBs",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F3cy1zbnM6ASoSlwEKF0RlbGV0",
"ZUF3c1Nuc0ludGVncmF0aW9uEiMuYXBpLkRlbGV0ZUF3c1Nuc0ludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSI/gtPkkwI5Kjcv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy9hd3Mtc25zEsIBCiBDcmVhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlv",
"bhIsLmFwaS5DcmVhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVl",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiWILT5JMCUiJNL2FwaS9hcHBs",
"CBIXCg9mb3J3YXJkX2ZfcG9ydHMYECADKA0SGAoQZ25zc191c2VfcnhfdGlt",
"ZRgFIAEoCBIhChlnbnNzX3VzZV9nYXRld2F5X2xvY2F0aW9uGBEgASgIEhEK",
"CXBhcnNlX3RsdhgGIAEoCBIeChZnZW9sb2NhdGlvbl9idWZmZXJfdHRsGAcg",
"ASgNEiMKG2dlb2xvY2F0aW9uX21pbl9idWZmZXJfc2l6ZRgIIAEoDRIYChBn",
"ZW9sb2NhdGlvbl90ZG9hGAkgASgIEhgKEGdlb2xvY2F0aW9uX3Jzc2kYCiAB",
"KAgSGAoQZ2VvbG9jYXRpb25fZ25zcxgLIAEoCBImCh5nZW9sb2NhdGlvbl9n",
"bnNzX3BheWxvYWRfZmllbGQYDCABKAkSJAocZ2VvbG9jYXRpb25fZ25zc191",
"c2VfcnhfdGltZRgNIAEoCBIYChBnZW9sb2NhdGlvbl93aWZpGA4gASgIEiYK",
"Hmdlb2xvY2F0aW9uX3dpZmlfcGF5bG9hZF9maWVsZBgPIAEoCSJTCiFDcmVh",
"dGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QSLgoLaW50ZWdyYXRpb24Y",
"ASABKAsyGS5hcGkuTG9yYUNsb3VkSW50ZWdyYXRpb24iOAoeR2V0TG9yYUNs",
"b3VkSW50ZWdyYXRpb25SZXF1ZXN0EhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJ",
"IlEKH0dldExvcmFDbG91ZEludGVncmF0aW9uUmVzcG9uc2USLgoLaW50ZWdy",
"YXRpb24YASABKAsyGS5hcGkuTG9yYUNsb3VkSW50ZWdyYXRpb24iUwohVXBk",
"YXRlTG9yYUNsb3VkSW50ZWdyYXRpb25SZXF1ZXN0Ei4KC2ludGVncmF0aW9u",
"GAEgASgLMhkuYXBpLkxvcmFDbG91ZEludGVncmF0aW9uIjsKIURlbGV0ZUxv",
"cmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgB",
"IAEoCSKRAQoUR2NwUHViU3ViSW50ZWdyYXRpb24SFgoOYXBwbGljYXRpb25f",
"aWQYASABKAkSHwoIZW5jb2RpbmcYAiABKA4yDS5hcGkuRW5jb2RpbmcSGAoQ",
"Y3JlZGVudGlhbHNfZmlsZRgDIAEoCRISCgpwcm9qZWN0X2lkGAQgASgJEhIK",
"CnRvcGljX25hbWUYBSABKAkiUwohQ3JlYXRlR2NwUHViU3ViSW50ZWdyYXRp",
"b25SZXF1ZXN0Ei4KC2ludGVncmF0aW9uGAEgASgLMhkuYXBpLkdjcFB1YlN1",
"YkludGVncmF0aW9uIjgKHkdldEdjcFB1YlN1YkludGVncmF0aW9uUmVxdWVz",
"dBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJRCh9HZXRHY3BQdWJTdWJJbnRl",
"Z3JhdGlvblJlc3BvbnNlEi4KC2ludGVncmF0aW9uGAEgASgLMhkuYXBpLkdj",
"cFB1YlN1YkludGVncmF0aW9uIlMKIVVwZGF0ZUdjcFB1YlN1YkludGVncmF0",
"aW9uUmVxdWVzdBIuCgtpbnRlZ3JhdGlvbhgBIAEoCzIZLmFwaS5HY3BQdWJT",
"dWJJbnRlZ3JhdGlvbiI7CiFEZWxldGVHY3BQdWJTdWJJbnRlZ3JhdGlvblJl",
"cXVlc3QSFgoOYXBwbGljYXRpb25faWQYASABKAkioQEKEUF3c1Nuc0ludGVn",
"cmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEh8KCGVuY29kaW5nGAIg",
"ASgOMg0uYXBpLkVuY29kaW5nEg4KBnJlZ2lvbhgDIAEoCRIVCg1hY2Nlc3Nf",
"a2V5X2lkGAQgASgJEhkKEXNlY3JldF9hY2Nlc3Nfa2V5GAUgASgJEhEKCXRv",
"cGljX2FybhgGIAEoCSJNCh5DcmVhdGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVl",
"c3QSKwoLaW50ZWdyYXRpb24YASABKAsyFi5hcGkuQXdzU25zSW50ZWdyYXRp",
"b24iNQobR2V0QXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0EhYKDmFwcGxpY2F0",
"aW9uX2lkGAEgASgJIksKHEdldEF3c1Nuc0ludGVncmF0aW9uUmVzcG9uc2US",
"KwoLaW50ZWdyYXRpb24YASABKAsyFi5hcGkuQXdzU25zSW50ZWdyYXRpb24i",
"TQoeVXBkYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0EisKC2ludGVncmF0",
"aW9uGAEgASgLMhYuYXBpLkF3c1Nuc0ludGVncmF0aW9uIjgKHkRlbGV0ZUF3",
"c1Nuc0ludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEo",
"CSKGAQoaQXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb24SFgoOYXBwbGljYXRp",
"b25faWQYASABKAkSHwoIZW5jb2RpbmcYAiABKA4yDS5hcGkuRW5jb2RpbmcS",
"GQoRY29ubmVjdGlvbl9zdHJpbmcYAyABKAkSFAoMcHVibGlzaF9uYW1lGAQg",
"ASgJIl8KJ0NyZWF0ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVz",
"dBI0CgtpbnRlZ3JhdGlvbhgBIAEoCzIfLmFwaS5BenVyZVNlcnZpY2VCdXNJ",
"bnRlZ3JhdGlvbiI+CiRHZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJl",
"cXVlc3QSFgoOYXBwbGljYXRpb25faWQYASABKAkiXQolR2V0QXp1cmVTZXJ2",
"aWNlQnVzSW50ZWdyYXRpb25SZXNwb25zZRI0CgtpbnRlZ3JhdGlvbhgBIAEo",
"CzIfLmFwaS5BenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbiJfCidVcGRhdGVB",
"enVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QSNAoLaW50ZWdyYXRp",
"b24YASABKAsyHy5hcGkuQXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb24iQQon",
"RGVsZXRlQXp1cmVTZXJ2aWNlQnVzSW50ZWdyYXRpb25SZXF1ZXN0EhYKDmFw",
"cGxpY2F0aW9uX2lkGAEgASgJIk8KFlBpbG90VGhpbmdzSW50ZWdyYXRpb24S",
"FgoOYXBwbGljYXRpb25faWQYASABKAkSDgoGc2VydmVyGAIgASgJEg0KBXRv",
"a2VuGAMgASgJIlcKI0NyZWF0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb25SZXF1",
"ZXN0EjAKC2ludGVncmF0aW9uGAEgASgLMhsuYXBpLlBpbG90VGhpbmdzSW50",
"ZWdyYXRpb24iOgogR2V0UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QS",
"FgoOYXBwbGljYXRpb25faWQYASABKAkiVQohR2V0UGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlc3BvbnNlEjAKC2ludGVncmF0aW9uGAEgASgLMhsuYXBpLlBp",
"bG90VGhpbmdzSW50ZWdyYXRpb24iVwojVXBkYXRlUGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlcXVlc3QSMAoLaW50ZWdyYXRpb24YASABKAsyGy5hcGkuUGls",
"b3RUaGluZ3NJbnRlZ3JhdGlvbiI9CiNEZWxldGVQaWxvdFRoaW5nc0ludGVn",
"cmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSJOChBJZnR0",
"dEludGVncmF0aW9uEhYKDmFwcGxpY2F0aW9uX2lkGAEgASgJEgsKA2tleRgC",
"IAEoCRIVCg11cGxpbmtfdmFsdWVzGAMgAygJIksKHUNyZWF0ZUlmdHR0SW50",
"ZWdyYXRpb25SZXF1ZXN0EioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklm",
"dHR0SW50ZWdyYXRpb24iNAoaR2V0SWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QS",
"FgoOYXBwbGljYXRpb25faWQYASABKAkiSQobR2V0SWZ0dHRJbnRlZ3JhdGlv",
"blJlc3BvbnNlEioKC2ludGVncmF0aW9uGAEgASgLMhUuYXBpLklmdHR0SW50",
"ZWdyYXRpb24iSwodVXBkYXRlSWZ0dHRJbnRlZ3JhdGlvblJlcXVlc3QSKgoL",
"aW50ZWdyYXRpb24YASABKAsyFS5hcGkuSWZ0dHRJbnRlZ3JhdGlvbiI3Ch1E",
"ZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9p",
"ZBgBIAEoCSJJCi9HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRp",
"ZmljYXRlUmVxdWVzdBIWCg5hcHBsaWNhdGlvbl9pZBgBIAEoCSKWAQowR2Vu",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZVJlc3BvbnNl",
"EhAKCHRsc19jZXJ0GAEgASgJEg8KB3Rsc19rZXkYAiABKAkSDwoHY2FfY2Vy",
"dBgDIAEoCRIuCgpleHBpcmVzX2F0GAQgASgLMhouZ29vZ2xlLnByb3RvYnVm",
"LlRpbWVzdGFtcCoiCghFbmNvZGluZxIICgRKU09OEAASDAoIUFJPVE9CVUYQ",
"ASq/AQoPSW50ZWdyYXRpb25LaW5kEggKBEhUVFAQABINCglJTkZMVVhfREIQ",
"ARIQCgxUSElOR1NfQk9BUkQQAhIOCgpNWV9ERVZJQ0VTEAMSDgoKTE9SQV9D",
"TE9VRBAEEg8KC0dDUF9QVUJfU1VCEAUSCwoHQVdTX1NOUxAGEhUKEUFaVVJF",
"X1NFUlZJQ0VfQlVTEAcSEAoMUElMT1RfVEhJTkdTEAgSDwoLTVFUVF9HTE9C",
"QUwQCRIJCgVJRlRUVBAKKj8KEUluZmx1eERiUHJlY2lzaW9uEgYKAk5TEAAS",
"BQoBVRABEgYKAk1TEAISBQoBUxADEgUKAU0QBBIFCgFIEAUqMQoPSW5mbHV4",
"RGJWZXJzaW9uEg4KCklORkxVWERCXzEQABIOCgpJTkZMVVhEQl8yEAEyuDwK",
"EkFwcGxpY2F0aW9uU2VydmljZRJlCgZDcmVhdGUSHS5hcGkuQ3JlYXRlQXBw",
"bGljYXRpb25SZXF1ZXN0Gh4uYXBpLkNyZWF0ZUFwcGxpY2F0aW9uUmVzcG9u",
"c2UiHILT5JMCFiIRL2FwaS9hcHBsaWNhdGlvbnM6ASoSXgoDR2V0EhouYXBp",
"LkdldEFwcGxpY2F0aW9uUmVxdWVzdBobLmFwaS5HZXRBcHBsaWNhdGlvblJl",
"c3BvbnNlIh6C0+STAhgSFi9hcGkvYXBwbGljYXRpb25zL3tpZH0SbgoGVXBk",
"YXRlEh0uYXBpLlVwZGF0ZUFwcGxpY2F0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSItgtPkkwInGiIvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb24uaWR9OgEqEl8KBkRlbGV0ZRIdLmFwaS5EZWxldGVBcHBsaWNh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiHoLT5JMCGCoW",
"L2FwaS9hcHBsaWNhdGlvbnMve2lkfRJeCgRMaXN0EhwuYXBpLkxpc3RBcHBs",
"aWNhdGlvbnNSZXF1ZXN0Gh0uYXBpLkxpc3RBcHBsaWNhdGlvbnNSZXNwb25z",
"ZSIZgtPkkwITEhEvYXBpL2FwcGxpY2F0aW9ucxKIAQoQTGlzdEludGVncmF0",
"aW9ucxIcLmFwaS5MaXN0SW50ZWdyYXRpb25zUmVxdWVzdBodLmFwaS5MaXN0",
"SW50ZWdyYXRpb25zUmVzcG9uc2UiN4LT5JMCMRIvL2FwaS9hcHBsaWNhdGlv",
"bnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMSnwEKFUNyZWF0ZUh0",
"dHBJbnRlZ3JhdGlvbhIhLmFwaS5DcmVhdGVIdHRwSW50ZWdyYXRpb25SZXF1",
"ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUiQC9hcGkvYXBw",
"bGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdy",
"YXRpb25zL2h0dHA6ASoSkwEKEkdldEh0dHBJbnRlZ3JhdGlvbhIeLmFwaS5H",
"ZXRIdHRwSW50ZWdyYXRpb25SZXF1ZXN0Gh8uYXBpLkdldEh0dHBJbnRlZ3Jh",
"dGlvblJlc3BvbnNlIjyC0+STAjYSNC9hcGkvYXBwbGljYXRpb25zL3thcHBs",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2h0dHASnwEKFVVwZGF0ZUh0dHBJ",
"bnRlZ3JhdGlvbhIhLmFwaS5VcGRhdGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0",
"GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkuC0+STAkUaQC9hcGkvYXBwbGlj",
"YXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRp",
"b25zL2h0dHA6ASoSkAEKFURlbGV0ZUh0dHBJbnRlZ3JhdGlvbhIhLmFwaS5E",
"ZWxldGVIdHRwSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5IjyC0+STAjYqNC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlv",
"bl9pZH0vaW50ZWdyYXRpb25zL2h0dHASqwEKGUNyZWF0ZUluZmx1eERiSW50",
"ZWdyYXRpb24SJS5hcGkuQ3JlYXRlSW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVl",
"c3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiT4LT5JMCSSJEL2FwaS9hcHBs",
"aWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3Jh",
"dGlvbnMvYXp1cmUtc2VydmljZS1idXM6ASoSwQEKHUdldEF6dXJlU2Vydmlj",
"ZUJ1c0ludGVncmF0aW9uEikuYXBpLkdldEF6dXJlU2VydmljZUJ1c0ludGVn",
"cmF0aW9uUmVxdWVzdBoqLmFwaS5HZXRBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh",
"dGlvblJlc3BvbnNlIkmC0+STAkMSQS9hcGkvYXBwbGljYXRpb25zL3thcHBs",
"aWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2F6dXJlLXNlcnZpY2UtYnVzEsIB",
"CiBVcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5VcGRh",
"dGVBenVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUu",
"cHJvdG9idWYuRW1wdHkiWILT5JMCUhpNL2FwaS9hcHBsaWNhdGlvbnMve2lu",
"dGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUt",
"c2VydmljZS1idXM6ASoSswEKIERlbGV0ZUF6dXJlU2VydmljZUJ1c0ludGVn",
"cmF0aW9uEiwuYXBpLkRlbGV0ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJJgtPkkwJDKkEvYXBp",
"L2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9h",
"enVyZS1zZXJ2aWNlLWJ1cxK1AQocQ3JlYXRlUGlsb3RUaGluZ3NJbnRlZ3Jh",
"dGlvbhIoLmFwaS5DcmVhdGVQaWxvdFRoaW5nc0ludGVncmF0aW9uUmVxdWVz",
"dBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJTgtPkkwJNIkgvYXBpL2FwcGxp",
"Y2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0",
"aW9ucy9waWxvdC10aGluZ3M6ASoSsAEKGUdldFBpbG90VGhpbmdzSW50ZWdy",
"YXRpb24SJS5hcGkuR2V0UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3Qa",
"Ji5hcGkuR2V0UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlc3BvbnNlIkSC0+ST",
"Aj4SPC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdy",
"YXRpb25zL3BpbG90LXRoaW5ncxK1AQocVXBkYXRlUGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvbhIoLmFwaS5VcGRhdGVQaWxvdFRoaW5nc0ludGVncmF0aW9uUmVx",
"dWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJTgtPkkwJNGkgvYXBpL2Fw",
"cGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVn",
"cmF0aW9ucy9waWxvdC10aGluZ3M6ASoSpgEKHERlbGV0ZVBpbG90VGhpbmdz",
"SW50ZWdyYXRpb24SKC5hcGkuRGVsZXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlv",
"blJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiRILT5JMCPio8L2Fw",
"aS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMv",
"cGlsb3QtdGhpbmdzEqIBChZDcmVhdGVJZnR0dEludGVncmF0aW9uEiIuYXBp",
"LkNyZWF0ZUlmdHR0SW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3Rv",
"YnVmLkVtcHR5IkyC0+STAkYiQS9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3Jh",
"dGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2lmdHR0OgEqEpcB",
"ChNHZXRJZnR0dEludGVncmF0aW9uEh8uYXBpLkdldElmdHR0SW50ZWdyYXRp",
"b25SZXF1ZXN0GiAuYXBpLkdldElmdHR0SW50ZWdyYXRpb25SZXNwb25zZSI9",
"gtPkkwI3EjUvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy9pZnR0dBKiAQoWVXBkYXRlSWZ0dHRJbnRlZ3JhdGlvbhIi",
"LmFwaS5VcGRhdGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSJMgtPkkwJGGkEvYXBpL2FwcGxpY2F0aW9ucy97aW50",
"ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dDoB",
"KhKTAQoWRGVsZXRlSWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5EZWxldGVJZnR0",
"dEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSI9",
"gtPkkwI3KjUvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy9pZnR0dBLhAQooR2VuZXJhdGVNcXR0SW50ZWdyYXRpb25D",
"bGllbnRDZXJ0aWZpY2F0ZRI0LmFwaS5HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlv",
"bkNsaWVudENlcnRpZmljYXRlUmVxdWVzdBo1LmFwaS5HZW5lcmF0ZU1xdHRJ",
"bnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVzcG9uc2UiSILT5JMCQiJA",
"L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlv",
"bnMvbXF0dC9jZXJ0aWZpY2F0ZUJoChFpby5jaGlycHN0YWNrLmFwaUIQQXBw",
"bGljYXRpb25Qcm90b1ABWi5naXRodWIuY29tL2NoaXJwc3RhY2svY2hpcnBz",
"dGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hpcnBzdGFjay5BcGliBnByb3RvMw=="));
"dGlvbnMvaW5mbHV4ZGI6ASoSowEKFkdldEluZmx1eERiSW50ZWdyYXRpb24S",
"Ii5hcGkuR2V0SW5mbHV4RGJJbnRlZ3JhdGlvblJlcXVlc3QaIy5hcGkuR2V0",
"SW5mbHV4RGJJbnRlZ3JhdGlvblJlc3BvbnNlIkCC0+STAjoSOC9hcGkvYXBw",
"bGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1",
"eGRiEqsBChlVcGRhdGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLlVwZGF0",
"ZUluZmx1eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVm",
"LkVtcHR5Ik+C0+STAkkaRC9hcGkvYXBwbGljYXRpb25zL3tpbnRlZ3JhdGlv",
"bi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2luZmx1eGRiOgEqEpwB",
"ChlEZWxldGVJbmZsdXhEYkludGVncmF0aW9uEiUuYXBpLkRlbGV0ZUluZmx1",
"eERiSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5",
"IkCC0+STAjoqOC9hcGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0v",
"aW50ZWdyYXRpb25zL2luZmx1eGRiErQBChxDcmVhdGVUaGluZ3NCb2FyZElu",
"dGVncmF0aW9uEiguYXBpLkNyZWF0ZVRoaW5nc0JvYXJkSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IlKC0+STAkwiRy9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL3RoaW5nc2JvYXJkOgEqEq8BChlHZXRUaGluZ3NCb2FyZElu",
"dGVncmF0aW9uEiUuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXF1",
"ZXN0GiYuYXBpLkdldFRoaW5nc0JvYXJkSW50ZWdyYXRpb25SZXNwb25zZSJD",
"gtPkkwI9EjsvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZBK0AQocVXBkYXRlVGhpbmdzQm9hcmRJ",
"bnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVUaGluZ3NCb2FyZEludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy90aGluZ3Nib2FyZDoBKhKlAQocRGVsZXRlVGhpbmdzQm9h",
"cmRJbnRlZ3JhdGlvbhIoLmFwaS5EZWxldGVUaGluZ3NCb2FyZEludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJDgtPkkwI9Kjsv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy90aGluZ3Nib2FyZBKuAQoaQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb24S",
"Ji5hcGkuQ3JlYXRlTXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GhYuZ29v",
"Z2xlLnByb3RvYnVmLkVtcHR5IlCC0+STAkoiRS9hcGkvYXBwbGljYXRpb25z",
"L3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL215",
"ZGV2aWNlczoBKhKnAQoXR2V0TXlEZXZpY2VzSW50ZWdyYXRpb24SIy5hcGku",
"R2V0TXlEZXZpY2VzSW50ZWdyYXRpb25SZXF1ZXN0GiQuYXBpLkdldE15RGV2",
"aWNlc0ludGVncmF0aW9uUmVzcG9uc2UiQYLT5JMCOxI5L2FwaS9hcHBsaWNh",
"dGlvbnMve2FwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2Vz",
"Eq4BChpVcGRhdGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5VcGRhdGVN",
"eURldmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYu",
"RW1wdHkiUILT5JMCShpFL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9u",
"LmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzOgEqEp8B",
"ChpEZWxldGVNeURldmljZXNJbnRlZ3JhdGlvbhImLmFwaS5EZWxldGVNeURl",
"dmljZXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiQYLT5JMCOyo5L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvbXlkZXZpY2VzEq4BChpDcmVhdGVMb3JhQ2xvdWRJ",
"bnRlZ3JhdGlvbhImLmFwaS5DcmVhdGVMb3JhQ2xvdWRJbnRlZ3JhdGlvblJl",
"cXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiUILT5JMCSiJFL2FwaS9h",
"cHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRl",
"Z3JhdGlvbnMvbG9yYWNsb3VkOgEqEqcBChdHZXRMb3JhQ2xvdWRJbnRlZ3Jh",
"dGlvbhIjLmFwaS5HZXRMb3JhQ2xvdWRJbnRlZ3JhdGlvblJlcXVlc3QaJC5h",
"cGkuR2V0TG9yYUNsb3VkSW50ZWdyYXRpb25SZXNwb25zZSJBgtPkkwI7Ejkv",
"YXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9u",
"cy9sb3JhY2xvdWQSrgEKGlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYu",
"YXBpLlVwZGF0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2ds",
"ZS5wcm90b2J1Zi5FbXB0eSJQgtPkkwJKGkUvYXBpL2FwcGxpY2F0aW9ucy97",
"aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3Jh",
"Y2xvdWQ6ASoSnwEKGkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uEiYuYXBp",
"LkRlbGV0ZUxvcmFDbG91ZEludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5w",
"cm90b2J1Zi5FbXB0eSJBgtPkkwI7KjkvYXBpL2FwcGxpY2F0aW9ucy97YXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9sb3JhY2xvdWQSsAEKGkNyZWF0",
"ZUdjcFB1YlN1YkludGVncmF0aW9uEiYuYXBpLkNyZWF0ZUdjcFB1YlN1Yklu",
"dGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPk",
"kwJMIkcvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKpAQoXR2V0R2Nw",
"UHViU3ViSW50ZWdyYXRpb24SIy5hcGkuR2V0R2NwUHViU3ViSW50ZWdyYXRp",
"b25SZXF1ZXN0GiQuYXBpLkdldEdjcFB1YlN1YkludGVncmF0aW9uUmVzcG9u",
"c2UiQ4LT5JMCPRI7L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvZ2NwLXB1Yi1zdWISsAEKGlVwZGF0ZUdjcFB1YlN1",
"YkludGVncmF0aW9uEiYuYXBpLlVwZGF0ZUdjcFB1YlN1YkludGVncmF0aW9u",
"UmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJSgtPkkwJMGkcvYXBp",
"L2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9L2lu",
"dGVncmF0aW9ucy9nY3AtcHViLXN1YjoBKhKhAQoaRGVsZXRlR2NwUHViU3Vi",
"SW50ZWdyYXRpb24SJi5hcGkuRGVsZXRlR2NwUHViU3ViSW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkOC0+STAj0qOy9hcGkv",
"YXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL2dj",
"cC1wdWItc3ViEqYBChdDcmVhdGVBd3NTbnNJbnRlZ3JhdGlvbhIjLmFwaS5D",
"cmVhdGVBd3NTbnNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiToLT5JMCSCJDL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0",
"aW9uLmFwcGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXdzLXNuczoBKhKc",
"AQoUR2V0QXdzU25zSW50ZWdyYXRpb24SIC5hcGkuR2V0QXdzU25zSW50ZWdy",
"YXRpb25SZXF1ZXN0GiEuYXBpLkdldEF3c1Nuc0ludGVncmF0aW9uUmVzcG9u",
"c2UiP4LT5JMCORI3L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXdzLXNucxKmAQoXVXBkYXRlQXdzU25zSW50ZWdy",
"YXRpb24SIy5hcGkuVXBkYXRlQXdzU25zSW50ZWdyYXRpb25SZXF1ZXN0GhYu",
"Z29vZ2xlLnByb3RvYnVmLkVtcHR5Ik6C0+STAkgaQy9hcGkvYXBwbGljYXRp",
"b25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F3cy1zbnM6ASoSlwEKF0RlbGV0ZUF3c1Nuc0ludGVncmF0aW9uEiMuYXBp",
"LkRlbGV0ZUF3c1Nuc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90",
"b2J1Zi5FbXB0eSI/gtPkkwI5KjcvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGlj",
"YXRpb25faWR9L2ludGVncmF0aW9ucy9hd3Mtc25zEsIBCiBDcmVhdGVBenVy",
"ZVNlcnZpY2VCdXNJbnRlZ3JhdGlvbhIsLmFwaS5DcmVhdGVBenVyZVNlcnZp",
"Y2VCdXNJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1w",
"dHkiWILT5JMCUiJNL2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFw",
"cGxpY2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6",
"ASoSwQEKHUdldEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEikuYXBpLkdl",
"dEF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoqLmFwaS5HZXRB",
"enVyZVNlcnZpY2VCdXNJbnRlZ3JhdGlvblJlc3BvbnNlIkmC0+STAkMSQS9h",
"cGkvYXBwbGljYXRpb25zL3thcHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25z",
"L2F6dXJlLXNlcnZpY2UtYnVzEsIBCiBVcGRhdGVBenVyZVNlcnZpY2VCdXNJ",
"bnRlZ3JhdGlvbhIsLmFwaS5VcGRhdGVBenVyZVNlcnZpY2VCdXNJbnRlZ3Jh",
"dGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9idWYuRW1wdHkiWILT5JMCUhpN",
"L2FwaS9hcHBsaWNhdGlvbnMve2ludGVncmF0aW9uLmFwcGxpY2F0aW9uX2lk",
"fS9pbnRlZ3JhdGlvbnMvYXp1cmUtc2VydmljZS1idXM6ASoSswEKIERlbGV0",
"ZUF6dXJlU2VydmljZUJ1c0ludGVncmF0aW9uEiwuYXBpLkRlbGV0ZUF6dXJl",
"U2VydmljZUJ1c0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1",
"Zi5FbXB0eSJJgtPkkwJDKkEvYXBpL2FwcGxpY2F0aW9ucy97YXBwbGljYXRp",
"b25faWR9L2ludGVncmF0aW9ucy9henVyZS1zZXJ2aWNlLWJ1cxK1AQocQ3Jl",
"YXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5DcmVhdGVQaWxvdFRo",
"aW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0",
"eSJTgtPkkwJNIkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBw",
"bGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoSsAEK",
"GUdldFBpbG90VGhpbmdzSW50ZWdyYXRpb24SJS5hcGkuR2V0UGlsb3RUaGlu",
"Z3NJbnRlZ3JhdGlvblJlcXVlc3QaJi5hcGkuR2V0UGlsb3RUaGluZ3NJbnRl",
"Z3JhdGlvblJlc3BvbnNlIkSC0+STAj4SPC9hcGkvYXBwbGljYXRpb25zL3th",
"cHBsaWNhdGlvbl9pZH0vaW50ZWdyYXRpb25zL3BpbG90LXRoaW5ncxK1AQoc",
"VXBkYXRlUGlsb3RUaGluZ3NJbnRlZ3JhdGlvbhIoLmFwaS5VcGRhdGVQaWxv",
"dFRoaW5nc0ludGVncmF0aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5F",
"bXB0eSJTgtPkkwJNGkgvYXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24u",
"YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9waWxvdC10aGluZ3M6ASoS",
"pgEKHERlbGV0ZVBpbG90VGhpbmdzSW50ZWdyYXRpb24SKC5hcGkuRGVsZXRl",
"UGlsb3RUaGluZ3NJbnRlZ3JhdGlvblJlcXVlc3QaFi5nb29nbGUucHJvdG9i",
"dWYuRW1wdHkiRILT5JMCPio8L2FwaS9hcHBsaWNhdGlvbnMve2FwcGxpY2F0",
"aW9uX2lkfS9pbnRlZ3JhdGlvbnMvcGlsb3QtdGhpbmdzEqIBChZDcmVhdGVJ",
"ZnR0dEludGVncmF0aW9uEiIuYXBpLkNyZWF0ZUlmdHR0SW50ZWdyYXRpb25S",
"ZXF1ZXN0GhYuZ29vZ2xlLnByb3RvYnVmLkVtcHR5IkyC0+STAkYiQS9hcGkv",
"YXBwbGljYXRpb25zL3tpbnRlZ3JhdGlvbi5hcHBsaWNhdGlvbl9pZH0vaW50",
"ZWdyYXRpb25zL2lmdHR0OgEqEpcBChNHZXRJZnR0dEludGVncmF0aW9uEh8u",
"YXBpLkdldElmdHR0SW50ZWdyYXRpb25SZXF1ZXN0GiAuYXBpLkdldElmdHR0",
"SW50ZWdyYXRpb25SZXNwb25zZSI9gtPkkwI3EjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBKiAQoWVXBk",
"YXRlSWZ0dHRJbnRlZ3JhdGlvbhIiLmFwaS5VcGRhdGVJZnR0dEludGVncmF0",
"aW9uUmVxdWVzdBoWLmdvb2dsZS5wcm90b2J1Zi5FbXB0eSJMgtPkkwJGGkEv",
"YXBpL2FwcGxpY2F0aW9ucy97aW50ZWdyYXRpb24uYXBwbGljYXRpb25faWR9",
"L2ludGVncmF0aW9ucy9pZnR0dDoBKhKTAQoWRGVsZXRlSWZ0dHRJbnRlZ3Jh",
"dGlvbhIiLmFwaS5EZWxldGVJZnR0dEludGVncmF0aW9uUmVxdWVzdBoWLmdv",
"b2dsZS5wcm90b2J1Zi5FbXB0eSI9gtPkkwI3KjUvYXBpL2FwcGxpY2F0aW9u",
"cy97YXBwbGljYXRpb25faWR9L2ludGVncmF0aW9ucy9pZnR0dBLhAQooR2Vu",
"ZXJhdGVNcXR0SW50ZWdyYXRpb25DbGllbnRDZXJ0aWZpY2F0ZRI0LmFwaS5H",
"ZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmljYXRlUmVxdWVz",
"dBo1LmFwaS5HZW5lcmF0ZU1xdHRJbnRlZ3JhdGlvbkNsaWVudENlcnRpZmlj",
"YXRlUmVzcG9uc2UiSILT5JMCQiJAL2FwaS9hcHBsaWNhdGlvbnMve2FwcGxp",
"Y2F0aW9uX2lkfS9pbnRlZ3JhdGlvbnMvbXF0dC9jZXJ0aWZpY2F0ZUJoChFp",
"by5jaGlycHN0YWNrLmFwaUIQQXBwbGljYXRpb25Qcm90b1ABWi5naXRodWIu",
"Y29tL2NoaXJwc3RhY2svY2hpcnBzdGFjay9hcGkvZ28vdjQvYXBpqgIOQ2hp",
"cnBzdGFjay5BcGliBnByb3RvMw=="));
descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
new pbr::FileDescriptor[] { global::Google.Api.AnnotationsReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.TimestampReflection.Descriptor, global::Google.Protobuf.WellKnownTypes.EmptyReflection.Descriptor, },
new pbr::GeneratedClrTypeInfo(new[] {typeof(global::Chirpstack.Api.Encoding), typeof(global::Chirpstack.Api.IntegrationKind), typeof(global::Chirpstack.Api.InfluxDbPrecision), typeof(global::Chirpstack.Api.InfluxDbVersion), }, null, new pbr::GeneratedClrTypeInfo[] {
@ -401,7 +402,7 @@ namespace Chirpstack.Api {
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.UpdateMyDevicesIntegrationRequest), global::Chirpstack.Api.UpdateMyDevicesIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.DeleteMyDevicesIntegrationRequest), global::Chirpstack.Api.DeleteMyDevicesIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.LoraCloudIntegration), global::Chirpstack.Api.LoraCloudIntegration.Parser, new[]{ "ApplicationId", "ModemGeolocationServices" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.LoraCloudModemGeolocationServices), global::Chirpstack.Api.LoraCloudModemGeolocationServices.Parser, new[]{ "Token", "ModemEnabled", "ModemPort", "GnssPort", "GnssUseRxTime", "ParseTlv", "GeolocationBufferTtl", "GeolocationMinBufferSize", "GeolocationTdoa", "GeolocationRssi", "GeolocationGnss", "GeolocationGnssPayloadField", "GeolocationGnssUseRxTime", "GeolocationWifi", "GeolocationWifiPayloadField" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.LoraCloudModemGeolocationServices), global::Chirpstack.Api.LoraCloudModemGeolocationServices.Parser, new[]{ "Token", "ModemEnabled", "ForwardFPorts", "GnssUseRxTime", "GnssUseGatewayLocation", "ParseTlv", "GeolocationBufferTtl", "GeolocationMinBufferSize", "GeolocationTdoa", "GeolocationRssi", "GeolocationGnss", "GeolocationGnssPayloadField", "GeolocationGnssUseRxTime", "GeolocationWifi", "GeolocationWifiPayloadField" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.CreateLoraCloudIntegrationRequest), global::Chirpstack.Api.CreateLoraCloudIntegrationRequest.Parser, new[]{ "Integration" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetLoraCloudIntegrationRequest), global::Chirpstack.Api.GetLoraCloudIntegrationRequest.Parser, new[]{ "ApplicationId" }, null, null, null, null),
new pbr::GeneratedClrTypeInfo(typeof(global::Chirpstack.Api.GetLoraCloudIntegrationResponse), global::Chirpstack.Api.GetLoraCloudIntegrationResponse.Parser, new[]{ "Integration" }, null, null, null, null),
@ -3661,7 +3662,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -4163,7 +4164,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -4757,7 +4758,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -4959,7 +4960,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -5742,7 +5743,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -6336,7 +6337,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -6529,7 +6530,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -6961,7 +6962,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -7555,7 +7556,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -7748,7 +7749,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -8180,7 +8181,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -8774,7 +8775,7 @@ namespace Chirpstack.Api {
public const int ApplicationIdFieldNumber = 1;
private string applicationId_ = "";
/// <summary>
/// Application ID (UUIO).
/// Application ID (UUID).
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
@ -9195,9 +9196,9 @@ namespace Chirpstack.Api {
public LoraCloudModemGeolocationServices(LoraCloudModemGeolocationServices other) : this() {
token_ = other.token_;
modemEnabled_ = other.modemEnabled_;
modemPort_ = other.modemPort_;
gnssPort_ = other.gnssPort_;
forwardFPorts_ = other.forwardFPorts_.Clone();
gnssUseRxTime_ = other.gnssUseRxTime_;
gnssUseGatewayLocation_ = other.gnssUseGatewayLocation_;
parseTlv_ = other.parseTlv_;
geolocationBufferTtl_ = other.geolocationBufferTtl_;
geolocationMinBufferSize_ = other.geolocationMinBufferSize_;
@ -9247,38 +9248,19 @@ namespace Chirpstack.Api {
}
}
/// <summary>Field number for the "modem_port" field.</summary>
public const int ModemPortFieldNumber = 3;
private uint modemPort_;
/// <summary>Field number for the "forward_f_ports" field.</summary>
public const int ForwardFPortsFieldNumber = 16;
private static readonly pb::FieldCodec<uint> _repeated_forwardFPorts_codec
= pb::FieldCodec.ForUInt32(130);
private readonly pbc::RepeatedField<uint> forwardFPorts_ = new pbc::RepeatedField<uint>();
/// <summary>
/// Modem port (fPort).
/// ChirpStack will only forward the FrmPayload to the MGS if the port
/// is equal to the configured value.
/// Forward FPorts.
/// Forward uplink messages matching the given FPorts to the MGS.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public uint ModemPort {
get { return modemPort_; }
set {
modemPort_ = value;
}
}
/// <summary>Field number for the "gnss_port" field.</summary>
public const int GnssPortFieldNumber = 4;
private uint gnssPort_;
/// <summary>
/// GNSS port (fPort).
/// ChirpStack will forward the FrmPayload to MGS as GNSS payload if the
/// port is equal to the configured value.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public uint GnssPort {
get { return gnssPort_; }
set {
gnssPort_ = value;
}
public pbc::RepeatedField<uint> ForwardFPorts {
get { return forwardFPorts_; }
}
/// <summary>Field number for the "gnss_use_rx_time" field.</summary>
@ -9298,6 +9280,26 @@ namespace Chirpstack.Api {
}
}
/// <summary>Field number for the "gnss_use_gateway_location" field.</summary>
public const int GnssUseGatewayLocationFieldNumber = 17;
private bool gnssUseGatewayLocation_;
/// <summary>
/// Use gateway location for GNSS resolving.
/// In the case this is set to true, ChirpStack will provide the location of
/// one of the gateways to the MGS resolver to aid the resolving process.
/// Disable this in case the gateway location is not accurate / incorrectly
/// configured as an incorrect location will cause the resolver to return an
/// error.
/// </summary>
[global::System.Diagnostics.DebuggerNonUserCodeAttribute]
[global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
public bool GnssUseGatewayLocation {
get { return gnssUseGatewayLocation_; }
set {
gnssUseGatewayLocation_ = value;
}
}
/// <summary>Field number for the "parse_tlv" field.</summary>
public const int ParseTlvFieldNumber = 6;
private bool parseTlv_;
@ -9481,9 +9483,9 @@ namespace Chirpstack.Api {
}
if (Token != other.Token) return false;
if (ModemEnabled != other.ModemEnabled) return false;
if (ModemPort != other.ModemPort) return false;
if (GnssPort != other.GnssPort) return false;
if(!forwardFPorts_.Equals(other.forwardFPorts_)) return false;
if (GnssUseRxTime != other.GnssUseRxTime) return false;
if (GnssUseGatewayLocation != other.GnssUseGatewayLocation) return false;
if (ParseTlv != other.ParseTlv) return false;
if (GeolocationBufferTtl != other.GeolocationBufferTtl) return false;
if (GeolocationMinBufferSize != other.GeolocationMinBufferSize) return false;
@ -9503,9 +9505,9 @@ namespace Chirpstack.Api {
int hash = 1;
if (Token.Length != 0) hash ^= Token.GetHashCode();
if (ModemEnabled != false) hash ^= ModemEnabled.GetHashCode();
if (ModemPort != 0) hash ^= ModemPort.GetHashCode();
if (GnssPort != 0) hash ^= GnssPort.GetHashCode();
hash ^= forwardFPorts_.GetHashCode();
if (GnssUseRxTime != false) hash ^= GnssUseRxTime.GetHashCode();
if (GnssUseGatewayLocation != false) hash ^= GnssUseGatewayLocation.GetHashCode();
if (ParseTlv != false) hash ^= ParseTlv.GetHashCode();
if (GeolocationBufferTtl != 0) hash ^= GeolocationBufferTtl.GetHashCode();
if (GeolocationMinBufferSize != 0) hash ^= GeolocationMinBufferSize.GetHashCode();
@ -9542,14 +9544,6 @@ namespace Chirpstack.Api {
output.WriteRawTag(16);
output.WriteBool(ModemEnabled);
}
if (ModemPort != 0) {
output.WriteRawTag(24);
output.WriteUInt32(ModemPort);
}
if (GnssPort != 0) {
output.WriteRawTag(32);
output.WriteUInt32(GnssPort);
}
if (GnssUseRxTime != false) {
output.WriteRawTag(40);
output.WriteBool(GnssUseRxTime);
@ -9594,6 +9588,11 @@ namespace Chirpstack.Api {
output.WriteRawTag(122);
output.WriteString(GeolocationWifiPayloadField);
}
forwardFPorts_.WriteTo(output, _repeated_forwardFPorts_codec);
if (GnssUseGatewayLocation != false) {
output.WriteRawTag(136, 1);
output.WriteBool(GnssUseGatewayLocation);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(output);
}
@ -9612,14 +9611,6 @@ namespace Chirpstack.Api {
output.WriteRawTag(16);
output.WriteBool(ModemEnabled);
}
if (ModemPort != 0) {
output.WriteRawTag(24);
output.WriteUInt32(ModemPort);
}
if (GnssPort != 0) {
output.WriteRawTag(32);
output.WriteUInt32(GnssPort);
}
if (GnssUseRxTime != false) {
output.WriteRawTag(40);
output.WriteBool(GnssUseRxTime);
@ -9664,6 +9655,11 @@ namespace Chirpstack.Api {
output.WriteRawTag(122);
output.WriteString(GeolocationWifiPayloadField);
}
forwardFPorts_.WriteTo(ref output, _repeated_forwardFPorts_codec);
if (GnssUseGatewayLocation != false) {
output.WriteRawTag(136, 1);
output.WriteBool(GnssUseGatewayLocation);
}
if (_unknownFields != null) {
_unknownFields.WriteTo(ref output);
}
@ -9680,15 +9676,13 @@ namespace Chirpstack.Api {
if (ModemEnabled != false) {
size += 1 + 1;
}
if (ModemPort != 0) {
size += 1 + pb::CodedOutputStream.ComputeUInt32Size(ModemPort);
}
if (GnssPort != 0) {
size += 1 + pb::CodedOutputStream.ComputeUInt32Size(GnssPort);
}
size += forwardFPorts_.CalculateSize(_repeated_forwardFPorts_codec);
if (GnssUseRxTime != false) {
size += 1 + 1;
}
if (GnssUseGatewayLocation != false) {
size += 2 + 1;
}
if (ParseTlv != false) {
size += 1 + 1;
}
@ -9737,15 +9731,13 @@ namespace Chirpstack.Api {
if (other.ModemEnabled != false) {
ModemEnabled = other.ModemEnabled;
}
if (other.ModemPort != 0) {
ModemPort = other.ModemPort;
}
if (other.GnssPort != 0) {
GnssPort = other.GnssPort;
}
forwardFPorts_.Add(other.forwardFPorts_);
if (other.GnssUseRxTime != false) {
GnssUseRxTime = other.GnssUseRxTime;
}
if (other.GnssUseGatewayLocation != false) {
GnssUseGatewayLocation = other.GnssUseGatewayLocation;
}
if (other.ParseTlv != false) {
ParseTlv = other.ParseTlv;
}
@ -9799,14 +9791,6 @@ namespace Chirpstack.Api {
ModemEnabled = input.ReadBool();
break;
}
case 24: {
ModemPort = input.ReadUInt32();
break;
}
case 32: {
GnssPort = input.ReadUInt32();
break;
}
case 40: {
GnssUseRxTime = input.ReadBool();
break;
@ -9851,6 +9835,15 @@ namespace Chirpstack.Api {
GeolocationWifiPayloadField = input.ReadString();
break;
}
case 130:
case 128: {
forwardFPorts_.AddEntriesFrom(input, _repeated_forwardFPorts_codec);
break;
}
case 136: {
GnssUseGatewayLocation = input.ReadBool();
break;
}
}
}
#endif
@ -9874,14 +9867,6 @@ namespace Chirpstack.Api {
ModemEnabled = input.ReadBool();
break;
}
case 24: {
ModemPort = input.ReadUInt32();
break;
}
case 32: {
GnssPort = input.ReadUInt32();
break;
}
case 40: {
GnssUseRxTime = input.ReadBool();
break;
@ -9926,6 +9911,15 @@ namespace Chirpstack.Api {
GeolocationWifiPayloadField = input.ReadString();
break;
}
case 130:
case 128: {
forwardFPorts_.AddEntriesFrom(ref input, _repeated_forwardFPorts_codec);
break;
}
case 136: {
GnssUseGatewayLocation = input.ReadBool();
break;
}
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -866,15 +866,17 @@ export class LoraCloudModemGeolocationServices extends jspb.Message {
getModemEnabled(): boolean;
setModemEnabled(value: boolean): LoraCloudModemGeolocationServices;
getModemPort(): number;
setModemPort(value: number): LoraCloudModemGeolocationServices;
getGnssPort(): number;
setGnssPort(value: number): LoraCloudModemGeolocationServices;
getForwardFPortsList(): Array<number>;
setForwardFPortsList(value: Array<number>): LoraCloudModemGeolocationServices;
clearForwardFPortsList(): LoraCloudModemGeolocationServices;
addForwardFPorts(value: number, index?: number): LoraCloudModemGeolocationServices;
getGnssUseRxTime(): boolean;
setGnssUseRxTime(value: boolean): LoraCloudModemGeolocationServices;
getGnssUseGatewayLocation(): boolean;
setGnssUseGatewayLocation(value: boolean): LoraCloudModemGeolocationServices;
getParseTlv(): boolean;
setParseTlv(value: boolean): LoraCloudModemGeolocationServices;
@ -917,9 +919,9 @@ export namespace LoraCloudModemGeolocationServices {
export type AsObject = {
token: string,
modemEnabled: boolean,
modemPort: number,
gnssPort: number,
forwardFPortsList: Array<number>,
gnssUseRxTime: boolean,
gnssUseGatewayLocation: boolean,
parseTlv: boolean,
geolocationBufferTtl: number,
geolocationMinBufferSize: number,

View File

@ -907,7 +907,7 @@ if (goog.DEBUG && !COMPILED) {
* @constructor
*/
proto.api.LoraCloudModemGeolocationServices = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
jspb.Message.initialize(this, opt_data, 0, -1, proto.api.LoraCloudModemGeolocationServices.repeatedFields_, null);
};
goog.inherits(proto.api.LoraCloudModemGeolocationServices, jspb.Message);
if (goog.DEBUG && !COMPILED) {
@ -8074,6 +8074,13 @@ proto.api.LoraCloudIntegration.prototype.hasModemGeolocationServices = function(
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.api.LoraCloudModemGeolocationServices.repeatedFields_ = [16];
if (jspb.Message.GENERATE_TO_OBJECT) {
@ -8107,9 +8114,9 @@ proto.api.LoraCloudModemGeolocationServices.toObject = function(includeInstance,
var f, obj = {
token: jspb.Message.getFieldWithDefault(msg, 1, ""),
modemEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
modemPort: jspb.Message.getFieldWithDefault(msg, 3, 0),
gnssPort: jspb.Message.getFieldWithDefault(msg, 4, 0),
forwardFPortsList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f,
gnssUseRxTime: jspb.Message.getBooleanFieldWithDefault(msg, 5, false),
gnssUseGatewayLocation: jspb.Message.getBooleanFieldWithDefault(msg, 17, false),
parseTlv: jspb.Message.getBooleanFieldWithDefault(msg, 6, false),
geolocationBufferTtl: jspb.Message.getFieldWithDefault(msg, 7, 0),
geolocationMinBufferSize: jspb.Message.getFieldWithDefault(msg, 8, 0),
@ -8164,18 +8171,18 @@ proto.api.LoraCloudModemGeolocationServices.deserializeBinaryFromReader = functi
var value = /** @type {boolean} */ (reader.readBool());
msg.setModemEnabled(value);
break;
case 3:
var value = /** @type {number} */ (reader.readUint32());
msg.setModemPort(value);
break;
case 4:
var value = /** @type {number} */ (reader.readUint32());
msg.setGnssPort(value);
case 16:
var value = /** @type {!Array<number>} */ (reader.readPackedUint32());
msg.setForwardFPortsList(value);
break;
case 5:
var value = /** @type {boolean} */ (reader.readBool());
msg.setGnssUseRxTime(value);
break;
case 17:
var value = /** @type {boolean} */ (reader.readBool());
msg.setGnssUseGatewayLocation(value);
break;
case 6:
var value = /** @type {boolean} */ (reader.readBool());
msg.setParseTlv(value);
@ -8259,17 +8266,10 @@ proto.api.LoraCloudModemGeolocationServices.serializeBinaryToWriter = function(m
f
);
}
f = message.getModemPort();
if (f !== 0) {
writer.writeUint32(
3,
f
);
}
f = message.getGnssPort();
if (f !== 0) {
writer.writeUint32(
4,
f = message.getForwardFPortsList();
if (f.length > 0) {
writer.writePackedUint32(
16,
f
);
}
@ -8280,6 +8280,13 @@ proto.api.LoraCloudModemGeolocationServices.serializeBinaryToWriter = function(m
f
);
}
f = message.getGnssUseGatewayLocation();
if (f) {
writer.writeBool(
17,
f
);
}
f = message.getParseTlv();
if (f) {
writer.writeBool(
@ -8390,38 +8397,39 @@ proto.api.LoraCloudModemGeolocationServices.prototype.setModemEnabled = function
/**
* optional uint32 modem_port = 3;
* @return {number}
* repeated uint32 forward_f_ports = 16;
* @return {!Array<number>}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getModemPort = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
proto.api.LoraCloudModemGeolocationServices.prototype.getForwardFPortsList = function() {
return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 16));
};
/**
* @param {!Array<number>} value
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setForwardFPortsList = function(value) {
return jspb.Message.setField(this, 16, value || []);
};
/**
* @param {number} value
* @param {number=} opt_index
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setModemPort = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
proto.api.LoraCloudModemGeolocationServices.prototype.addForwardFPorts = function(value, opt_index) {
return jspb.Message.addToRepeatedField(this, 16, value, opt_index);
};
/**
* optional uint32 gnss_port = 4;
* @return {number}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getGnssPort = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* Clears the list making it empty but non-null.
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setGnssPort = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
proto.api.LoraCloudModemGeolocationServices.prototype.clearForwardFPortsList = function() {
return this.setForwardFPortsList([]);
};
@ -8443,6 +8451,24 @@ proto.api.LoraCloudModemGeolocationServices.prototype.setGnssUseRxTime = functio
};
/**
* optional bool gnss_use_gateway_location = 17;
* @return {boolean}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getGnssUseGatewayLocation = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 17, false));
};
/**
* @param {boolean} value
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setGnssUseGatewayLocation = function(value) {
return jspb.Message.setProto3BooleanField(this, 17, value);
};
/**
* optional bool parse_tlv = 6;
* @return {boolean}

View File

@ -1,6 +1,6 @@
{
"name": "@chirpstack/chirpstack-api-grpc-web",
"version": "4.3.0",
"version": "4.3.2",
"description": "Chirpstack gRPC-web API",
"license": "MIT",
"devDependencies": {

View File

@ -8,7 +8,7 @@ plugins {
}
group = "io.chirpstack"
version = "4.3.0"
version = "4.3.2"
repositories {
mavenCentral()

View File

@ -942,15 +942,17 @@ export class LoraCloudModemGeolocationServices extends jspb.Message {
getModemEnabled(): boolean;
setModemEnabled(value: boolean): void;
getModemPort(): number;
setModemPort(value: number): void;
getGnssPort(): number;
setGnssPort(value: number): void;
clearForwardFPortsList(): void;
getForwardFPortsList(): Array<number>;
setForwardFPortsList(value: Array<number>): void;
addForwardFPorts(value: number, index?: number): number;
getGnssUseRxTime(): boolean;
setGnssUseRxTime(value: boolean): void;
getGnssUseGatewayLocation(): boolean;
setGnssUseGatewayLocation(value: boolean): void;
getParseTlv(): boolean;
setParseTlv(value: boolean): void;
@ -995,9 +997,9 @@ export namespace LoraCloudModemGeolocationServices {
export type AsObject = {
token: string,
modemEnabled: boolean,
modemPort: number,
gnssPort: number,
forwardFPortsList: Array<number>,
gnssUseRxTime: boolean,
gnssUseGatewayLocation: boolean,
parseTlv: boolean,
geolocationBufferTtl: number,
geolocationMinBufferSize: number,

View File

@ -907,7 +907,7 @@ if (goog.DEBUG && !COMPILED) {
* @constructor
*/
proto.api.LoraCloudModemGeolocationServices = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
jspb.Message.initialize(this, opt_data, 0, -1, proto.api.LoraCloudModemGeolocationServices.repeatedFields_, null);
};
goog.inherits(proto.api.LoraCloudModemGeolocationServices, jspb.Message);
if (goog.DEBUG && !COMPILED) {
@ -8074,6 +8074,13 @@ proto.api.LoraCloudIntegration.prototype.hasModemGeolocationServices = function(
/**
* List of repeated fields within this message type.
* @private {!Array<number>}
* @const
*/
proto.api.LoraCloudModemGeolocationServices.repeatedFields_ = [16];
if (jspb.Message.GENERATE_TO_OBJECT) {
@ -8107,9 +8114,9 @@ proto.api.LoraCloudModemGeolocationServices.toObject = function(includeInstance,
var f, obj = {
token: jspb.Message.getFieldWithDefault(msg, 1, ""),
modemEnabled: jspb.Message.getBooleanFieldWithDefault(msg, 2, false),
modemPort: jspb.Message.getFieldWithDefault(msg, 3, 0),
gnssPort: jspb.Message.getFieldWithDefault(msg, 4, 0),
forwardFPortsList: (f = jspb.Message.getRepeatedField(msg, 16)) == null ? undefined : f,
gnssUseRxTime: jspb.Message.getBooleanFieldWithDefault(msg, 5, false),
gnssUseGatewayLocation: jspb.Message.getBooleanFieldWithDefault(msg, 17, false),
parseTlv: jspb.Message.getBooleanFieldWithDefault(msg, 6, false),
geolocationBufferTtl: jspb.Message.getFieldWithDefault(msg, 7, 0),
geolocationMinBufferSize: jspb.Message.getFieldWithDefault(msg, 8, 0),
@ -8164,18 +8171,18 @@ proto.api.LoraCloudModemGeolocationServices.deserializeBinaryFromReader = functi
var value = /** @type {boolean} */ (reader.readBool());
msg.setModemEnabled(value);
break;
case 3:
var value = /** @type {number} */ (reader.readUint32());
msg.setModemPort(value);
break;
case 4:
var value = /** @type {number} */ (reader.readUint32());
msg.setGnssPort(value);
case 16:
var value = /** @type {!Array<number>} */ (reader.readPackedUint32());
msg.setForwardFPortsList(value);
break;
case 5:
var value = /** @type {boolean} */ (reader.readBool());
msg.setGnssUseRxTime(value);
break;
case 17:
var value = /** @type {boolean} */ (reader.readBool());
msg.setGnssUseGatewayLocation(value);
break;
case 6:
var value = /** @type {boolean} */ (reader.readBool());
msg.setParseTlv(value);
@ -8259,17 +8266,10 @@ proto.api.LoraCloudModemGeolocationServices.serializeBinaryToWriter = function(m
f
);
}
f = message.getModemPort();
if (f !== 0) {
writer.writeUint32(
3,
f
);
}
f = message.getGnssPort();
if (f !== 0) {
writer.writeUint32(
4,
f = message.getForwardFPortsList();
if (f.length > 0) {
writer.writePackedUint32(
16,
f
);
}
@ -8280,6 +8280,13 @@ proto.api.LoraCloudModemGeolocationServices.serializeBinaryToWriter = function(m
f
);
}
f = message.getGnssUseGatewayLocation();
if (f) {
writer.writeBool(
17,
f
);
}
f = message.getParseTlv();
if (f) {
writer.writeBool(
@ -8390,38 +8397,39 @@ proto.api.LoraCloudModemGeolocationServices.prototype.setModemEnabled = function
/**
* optional uint32 modem_port = 3;
* @return {number}
* repeated uint32 forward_f_ports = 16;
* @return {!Array<number>}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getModemPort = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 3, 0));
proto.api.LoraCloudModemGeolocationServices.prototype.getForwardFPortsList = function() {
return /** @type {!Array<number>} */ (jspb.Message.getRepeatedField(this, 16));
};
/**
* @param {!Array<number>} value
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setForwardFPortsList = function(value) {
return jspb.Message.setField(this, 16, value || []);
};
/**
* @param {number} value
* @param {number=} opt_index
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setModemPort = function(value) {
return jspb.Message.setProto3IntField(this, 3, value);
proto.api.LoraCloudModemGeolocationServices.prototype.addForwardFPorts = function(value, opt_index) {
return jspb.Message.addToRepeatedField(this, 16, value, opt_index);
};
/**
* optional uint32 gnss_port = 4;
* @return {number}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getGnssPort = function() {
return /** @type {number} */ (jspb.Message.getFieldWithDefault(this, 4, 0));
};
/**
* @param {number} value
* Clears the list making it empty but non-null.
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setGnssPort = function(value) {
return jspb.Message.setProto3IntField(this, 4, value);
proto.api.LoraCloudModemGeolocationServices.prototype.clearForwardFPortsList = function() {
return this.setForwardFPortsList([]);
};
@ -8443,6 +8451,24 @@ proto.api.LoraCloudModemGeolocationServices.prototype.setGnssUseRxTime = functio
};
/**
* optional bool gnss_use_gateway_location = 17;
* @return {boolean}
*/
proto.api.LoraCloudModemGeolocationServices.prototype.getGnssUseGatewayLocation = function() {
return /** @type {boolean} */ (jspb.Message.getBooleanFieldWithDefault(this, 17, false));
};
/**
* @param {boolean} value
* @return {!proto.api.LoraCloudModemGeolocationServices} returns this
*/
proto.api.LoraCloudModemGeolocationServices.prototype.setGnssUseGatewayLocation = function(value) {
return jspb.Message.setProto3BooleanField(this, 17, value);
};
/**
* optional bool parse_tlv = 6;
* @return {boolean}

2
api/js/package.json vendored
View File

@ -1,6 +1,6 @@
{
"name": "@chirpstack/chirpstack-api",
"version": "4.3.0",
"version": "4.3.2",
"description": "Chirpstack JS and TS API",
"license": "MIT",
"devDependencies": {

View File

@ -9,7 +9,7 @@ plugins {
}
group = "io.chirpstack"
version = "4.3.0"
version = "4.3.2"
repositories {
mavenCentral()

28
api/md/api/api.md vendored
View File

@ -580,7 +580,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -610,7 +610,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -640,7 +640,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -670,7 +670,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -860,7 +860,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -920,7 +920,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -980,7 +980,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -1040,7 +1040,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
@ -1070,7 +1070,7 @@
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
| headers | [HttpIntegration.HeadersEntry](#api-HttpIntegration-HeadersEntry) | repeated | HTTP headers to set when making requests. |
| encoding | [Encoding](#api-Encoding) | | Payload encoding. |
| event_endpoint_url | [string](#string) | | Event endpoint URL. The HTTP integration will POST all events to this enpoint. The request will contain a query parameters &#34;event&#34; containing the type of the event. |
@ -1123,7 +1123,7 @@ Note: The first value is always used for the DevEUI. |
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
| endpoint | [string](#string) | | InfluxDb API write endpoint (e.g. http://localhost:8086/write). |
| db | [string](#string) | | InfluxDb database name. (InfluxDb v1) |
| username | [string](#string) | | InfluxDb username. (InfluxDb v1) |
@ -1246,9 +1246,9 @@ Note: The first value is always used for the DevEUI. |
| ----- | ---- | ----- | ----------- |
| token | [string](#string) | | API token. |
| modem_enabled | [bool](#bool) | | Device implements Modem / Modem-E stack. |
| modem_port | [uint32](#uint32) | | Modem port (fPort). ChirpStack will only forward the FrmPayload to the MGS if the port is equal to the configured value. |
| gnss_port | [uint32](#uint32) | | GNSS port (fPort). ChirpStack will forward the FrmPayload to MGS as GNSS payload if the port is equal to the configured value. |
| forward_f_ports | [uint32](#uint32) | repeated | Forward FPorts. Forward uplink messages matching the given FPorts to the MGS. |
| gnss_use_rx_time | [bool](#bool) | | Use rx time for GNSS resolving. In case this is set to true, the MGS resolver will use the RX time of the network instead of the timestamp included in the LR1110 payload. |
| gnss_use_gateway_location | [bool](#bool) | | Use gateway location for GNSS resolving. In the case this is set to true, ChirpStack will provide the location of one of the gateways to the MGS resolver to aid the resolving process. Disable this in case the gateway location is not accurate / incorrectly configured as an incorrect location will cause the resolver to return an error. |
| parse_tlv | [bool](#bool) | | Parse TLV records. If enabled, stream records (expected in TLV format) are scanned for GNSS data (0x06 or 0x07). If found, ChirpStack will make an additional geolocation call to the MGS API for resolving the location of the detected payload. |
| geolocation_buffer_ttl | [uint32](#uint32) | | Geolocation buffer TTL (in seconds). If &gt; 0, uplink RX meta-data will be stored in a buffer so that the meta-data of multiple uplinks can be used for geolocation. |
| geolocation_min_buffer_size | [uint32](#uint32) | | Geolocation minimum buffer size. If &gt; 0, geolocation will only be performed when the buffer has at least the given size. |
@ -1273,7 +1273,7 @@ Note: The first value is always used for the DevEUI. |
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
| endpoint | [string](#string) | | myDevices API endpoint. |
@ -1306,7 +1306,7 @@ Note: The first value is always used for the DevEUI. |
| Field | Type | Label | Description |
| ----- | ---- | ----- | ----------- |
| application_id | [string](#string) | | Application ID (UUIO). |
| application_id | [string](#string) | | Application ID (UUID). |
| server | [string](#string) | | ThingsBoard server endpoint, e.g. https://example.com |

View File

@ -499,7 +499,7 @@ message ListIntegrationsResponse {
}
message HttpIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// HTTP headers to set when making requests.
@ -521,7 +521,7 @@ message CreateHttpIntegrationRequest {
}
message GetHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -536,7 +536,7 @@ message UpdateHttpIntegrationRequest {
}
message DeleteHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -555,7 +555,7 @@ enum InfluxDbVersion {
}
message InfluxDbIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// InfluxDb API write endpoint (e.g. http://localhost:8086/write).
@ -595,7 +595,7 @@ message CreateInfluxDbIntegrationRequest {
}
message GetInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -610,12 +610,12 @@ message UpdateInfluxDbIntegrationRequest {
}
message DeleteInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message ThingsBoardIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// ThingsBoard server endpoint, e.g. https://example.com
@ -628,7 +628,7 @@ message CreateThingsBoardIntegrationRequest {
}
message GetThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -643,12 +643,12 @@ message UpdateThingsBoardIntegrationRequest {
}
message DeleteThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message MyDevicesIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// myDevices API endpoint.
@ -661,7 +661,7 @@ message CreateMyDevicesIntegrationRequest {
}
message GetMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -676,7 +676,7 @@ message UpdateMyDevicesIntegrationRequest {
}
message DeleteMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -695,21 +695,23 @@ message LoraCloudModemGeolocationServices {
// Device implements Modem / Modem-E stack.
bool modem_enabled = 2;
// Modem port (fPort).
// ChirpStack will only forward the FrmPayload to the MGS if the port
// is equal to the configured value.
uint32 modem_port = 3;
// GNSS port (fPort).
// ChirpStack will forward the FrmPayload to MGS as GNSS payload if the
// port is equal to the configured value.
uint32 gnss_port = 4;
// Forward FPorts.
// Forward uplink messages matching the given FPorts to the MGS.
repeated uint32 forward_f_ports = 16;
// Use rx time for GNSS resolving.
// In case this is set to true, the MGS resolver will use the RX time of the
// network instead of the timestamp included in the LR1110 payload.
bool gnss_use_rx_time = 5;
// Use gateway location for GNSS resolving.
// In the case this is set to true, ChirpStack will provide the location of
// one of the gateways to the MGS resolver to aid the resolving process.
// Disable this in case the gateway location is not accurate / incorrectly
// configured as an incorrect location will cause the resolver to return an
// error.
bool gnss_use_gateway_location = 17;
// Parse TLV records.
// If enabled, stream records (expected in TLV format) are scanned for GNSS
// data (0x06 or 0x07). If found, ChirpStack will make an additional

View File

@ -499,7 +499,7 @@ message ListIntegrationsResponse {
}
message HttpIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// HTTP headers to set when making requests.
@ -521,7 +521,7 @@ message CreateHttpIntegrationRequest {
}
message GetHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -536,7 +536,7 @@ message UpdateHttpIntegrationRequest {
}
message DeleteHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -555,7 +555,7 @@ enum InfluxDbVersion {
}
message InfluxDbIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// InfluxDb API write endpoint (e.g. http://localhost:8086/write).
@ -595,7 +595,7 @@ message CreateInfluxDbIntegrationRequest {
}
message GetInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -610,12 +610,12 @@ message UpdateInfluxDbIntegrationRequest {
}
message DeleteInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message ThingsBoardIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// ThingsBoard server endpoint, e.g. https://example.com
@ -628,7 +628,7 @@ message CreateThingsBoardIntegrationRequest {
}
message GetThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -643,12 +643,12 @@ message UpdateThingsBoardIntegrationRequest {
}
message DeleteThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message MyDevicesIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// myDevices API endpoint.
@ -661,7 +661,7 @@ message CreateMyDevicesIntegrationRequest {
}
message GetMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -676,7 +676,7 @@ message UpdateMyDevicesIntegrationRequest {
}
message DeleteMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -695,21 +695,23 @@ message LoraCloudModemGeolocationServices {
// Device implements Modem / Modem-E stack.
bool modem_enabled = 2;
// Modem port (fPort).
// ChirpStack will only forward the FrmPayload to the MGS if the port
// is equal to the configured value.
uint32 modem_port = 3;
// GNSS port (fPort).
// ChirpStack will forward the FrmPayload to MGS as GNSS payload if the
// port is equal to the configured value.
uint32 gnss_port = 4;
// Forward FPorts.
// Forward uplink messages matching the given FPorts to the MGS.
repeated uint32 forward_f_ports = 16;
// Use rx time for GNSS resolving.
// In case this is set to true, the MGS resolver will use the RX time of the
// network instead of the timestamp included in the LR1110 payload.
bool gnss_use_rx_time = 5;
// Use gateway location for GNSS resolving.
// In the case this is set to true, ChirpStack will provide the location of
// one of the gateways to the MGS resolver to aid the resolving process.
// Disable this in case the gateway location is not accurate / incorrectly
// configured as an incorrect location will cause the resolver to return an
// error.
bool gnss_use_gateway_location = 17;
// Parse TLV records.
// If enabled, stream records (expected in TLV format) are scanned for GNSS
// data (0x06 or 0x07). If found, ChirpStack will make an additional

View File

@ -10,13 +10,15 @@ pip install chirpstack-api
## Usage
All messages, services, constants, etc. are auto-generated from the ChirpStack protobuf definitions. The result is that
this package structure matches that of the protobuf definitions.
All messages, services, constants, etc. are auto-generated from the ChirpStack
protobuf definitions. The result is that this package structure matches that
of the protobuf definitions.
The protobuf definitions can be found here: https://github.com/brocaar/chirpstack-api/tree/master/protobuf
The protobuf definitions can be found here:
[https://github.com/chirpstack/chirpstack/tree/master/api/proto](https://github.com/chirpstack/chirpstack/tree/master/api/proto)
## Links
* [`chirpstack-api` Python package page](https://pypi.org/project/chirpstack-api/)
* [ChirpStack documentation](https://www.chirpstack.io/)
* [ChirpStack Application Server API examples](https://www.chirpstack.io/application-server/api/python-examples/)
* [Code examples](https://www.chirpstack.io/docs/chirpstack/api/python-examples.html)

File diff suppressed because one or more lines are too long

View File

@ -496,7 +496,8 @@ class LoraCloudIntegration(_message.Message):
def __init__(self, application_id: _Optional[str] = ..., modem_geolocation_services: _Optional[_Union[LoraCloudModemGeolocationServices, _Mapping]] = ...) -> None: ...
class LoraCloudModemGeolocationServices(_message.Message):
__slots__ = ["geolocation_buffer_ttl", "geolocation_gnss", "geolocation_gnss_payload_field", "geolocation_gnss_use_rx_time", "geolocation_min_buffer_size", "geolocation_rssi", "geolocation_tdoa", "geolocation_wifi", "geolocation_wifi_payload_field", "gnss_port", "gnss_use_rx_time", "modem_enabled", "modem_port", "parse_tlv", "token"]
__slots__ = ["forward_f_ports", "geolocation_buffer_ttl", "geolocation_gnss", "geolocation_gnss_payload_field", "geolocation_gnss_use_rx_time", "geolocation_min_buffer_size", "geolocation_rssi", "geolocation_tdoa", "geolocation_wifi", "geolocation_wifi_payload_field", "gnss_use_gateway_location", "gnss_use_rx_time", "modem_enabled", "parse_tlv", "token"]
FORWARD_F_PORTS_FIELD_NUMBER: _ClassVar[int]
GEOLOCATION_BUFFER_TTL_FIELD_NUMBER: _ClassVar[int]
GEOLOCATION_GNSS_FIELD_NUMBER: _ClassVar[int]
GEOLOCATION_GNSS_PAYLOAD_FIELD_FIELD_NUMBER: _ClassVar[int]
@ -506,12 +507,12 @@ class LoraCloudModemGeolocationServices(_message.Message):
GEOLOCATION_TDOA_FIELD_NUMBER: _ClassVar[int]
GEOLOCATION_WIFI_FIELD_NUMBER: _ClassVar[int]
GEOLOCATION_WIFI_PAYLOAD_FIELD_FIELD_NUMBER: _ClassVar[int]
GNSS_PORT_FIELD_NUMBER: _ClassVar[int]
GNSS_USE_GATEWAY_LOCATION_FIELD_NUMBER: _ClassVar[int]
GNSS_USE_RX_TIME_FIELD_NUMBER: _ClassVar[int]
MODEM_ENABLED_FIELD_NUMBER: _ClassVar[int]
MODEM_PORT_FIELD_NUMBER: _ClassVar[int]
PARSE_TLV_FIELD_NUMBER: _ClassVar[int]
TOKEN_FIELD_NUMBER: _ClassVar[int]
forward_f_ports: _containers.RepeatedScalarFieldContainer[int]
geolocation_buffer_ttl: int
geolocation_gnss: bool
geolocation_gnss_payload_field: str
@ -521,13 +522,12 @@ class LoraCloudModemGeolocationServices(_message.Message):
geolocation_tdoa: bool
geolocation_wifi: bool
geolocation_wifi_payload_field: str
gnss_port: int
gnss_use_gateway_location: bool
gnss_use_rx_time: bool
modem_enabled: bool
modem_port: int
parse_tlv: bool
token: str
def __init__(self, token: _Optional[str] = ..., modem_enabled: bool = ..., modem_port: _Optional[int] = ..., gnss_port: _Optional[int] = ..., gnss_use_rx_time: bool = ..., parse_tlv: bool = ..., geolocation_buffer_ttl: _Optional[int] = ..., geolocation_min_buffer_size: _Optional[int] = ..., geolocation_tdoa: bool = ..., geolocation_rssi: bool = ..., geolocation_gnss: bool = ..., geolocation_gnss_payload_field: _Optional[str] = ..., geolocation_gnss_use_rx_time: bool = ..., geolocation_wifi: bool = ..., geolocation_wifi_payload_field: _Optional[str] = ...) -> None: ...
def __init__(self, token: _Optional[str] = ..., modem_enabled: bool = ..., forward_f_ports: _Optional[_Iterable[int]] = ..., gnss_use_rx_time: bool = ..., gnss_use_gateway_location: bool = ..., parse_tlv: bool = ..., geolocation_buffer_ttl: _Optional[int] = ..., geolocation_min_buffer_size: _Optional[int] = ..., geolocation_tdoa: bool = ..., geolocation_rssi: bool = ..., geolocation_gnss: bool = ..., geolocation_gnss_payload_field: _Optional[str] = ..., geolocation_gnss_use_rx_time: bool = ..., geolocation_wifi: bool = ..., geolocation_wifi_payload_field: _Optional[str] = ...) -> None: ...
class MyDevicesIntegration(_message.Message):
__slots__ = ["application_id", "endpoint"]

View File

@ -18,7 +18,7 @@ CLASSIFIERS = [
setup(
name='chirpstack-api',
version = "4.3.0",
version = "4.3.2",
url='https://github.com/brocaar/chirpstack-api',
author='Orne Brocaar',
author_email='info@brocaar.com',

501
api/rust/Cargo.lock generated vendored
View File

@ -4,40 +4,19 @@ version = 3
[[package]]
name = "anyhow"
version = "1.0.68"
version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2cb2f989d18dd141ab8ae82f64d1a8cdd37e0840f73a406896cf5e99502fab61"
[[package]]
name = "async-stream"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dad5c83079eae9969be7fadefe640a1c566901f05ff91ab221de4b6f68d9507e"
dependencies = [
"async-stream-impl",
"futures-core",
]
[[package]]
name = "async-stream-impl"
version = "0.3.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10f203db73a71dfa2fb6dd22763990fa26f3d2625a6da2da900d23b87d26be27"
dependencies = [
"proc-macro2",
"quote",
"syn",
]
checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4"
[[package]]
name = "async-trait"
version = "0.1.64"
version = "0.1.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cd7fce9ba8c3c042128ce72d8b2ddbf3a05747efb67ea0313c635e10bda47a2"
checksum = "b9ccdd8f2a161be9bd5c023df56f1b2a0bd1d83872ae53b71a84a12c9bf6e842"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.15",
]
[[package]]
@ -48,9 +27,9 @@ checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
[[package]]
name = "axum"
version = "0.6.4"
version = "0.6.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5694b64066a2459918d8074c2ce0d5a88f409431994c2356617c8ae0c4721fc"
checksum = "b70caf9f1b0c045f7da350636435b775a9733adf2df56e8aa2a29210fbc335d4"
dependencies = [
"async-trait",
"axum-core",
@ -70,16 +49,15 @@ dependencies = [
"serde",
"sync_wrapper",
"tower",
"tower-http",
"tower-layer",
"tower-service",
]
[[package]]
name = "axum-core"
version = "0.3.2"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1cae3e661676ffbacb30f1a824089a8c9150e71017f7e1e38f2aa32009188d34"
checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c"
dependencies = [
"async-trait",
"bytes",
@ -98,6 +76,12 @@ version = "0.13.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
[[package]]
name = "base64"
version = "0.21.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a4a4ddaa51a5bc52a6948f74c06d20aaaddb71924eab79b8c97a8c556e942d6a"
[[package]]
name = "bitflags"
version = "1.3.2"
@ -110,6 +94,12 @@ version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be"
[[package]]
name = "cc"
version = "1.0.79"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f"
[[package]]
name = "cfg-if"
version = "1.0.0"
@ -118,7 +108,7 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]]
name = "chirpstack_api"
version = "4.3.0"
version = "4.3.2"
dependencies = [
"hex",
"pbjson",
@ -135,9 +125,9 @@ dependencies = [
[[package]]
name = "chrono"
version = "0.4.23"
version = "0.4.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "16b0a3d9ed01224b22057780a37bb8c5dbfe1be8ba48678e7bf57ec4b385411f"
checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b"
dependencies = [
"num-integer",
"num-traits",
@ -150,10 +140,31 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91"
[[package]]
name = "fastrand"
version = "1.8.0"
name = "errno"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "fastrand"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
dependencies = [
"instant",
]
@ -172,36 +183,36 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
[[package]]
name = "futures-channel"
version = "0.3.26"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2e5317663a9089767a1ec00a487df42e0ca174b61b4483213ac24448e4664df5"
checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2"
dependencies = [
"futures-core",
]
[[package]]
name = "futures-core"
version = "0.3.26"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ec90ff4d0fe1f57d600049061dc6bb68ed03c7d2fbd697274c41805dcb3f8608"
checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c"
[[package]]
name = "futures-sink"
version = "0.3.26"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f310820bb3e8cfd46c80db4d7fb8353e15dfff853a127158425f31e0be6c8364"
checksum = "f43be4fe21a13b9781a69afa4985b0f6ee0e1afab2c6f454a8cf30e2b2237b6e"
[[package]]
name = "futures-task"
version = "0.3.26"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dcf79a1bf610b10f42aea489289c5a2c478a786509693b80cd39c44ccd936366"
checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65"
[[package]]
name = "futures-util"
version = "0.3.26"
version = "0.3.28"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c1d6de3acfef38d2be4b1f543f553131788603495be83da675e180c8d6b7bd1"
checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533"
dependencies = [
"futures-core",
"futures-task",
@ -211,9 +222,9 @@ dependencies = [
[[package]]
name = "getrandom"
version = "0.2.8"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4"
dependencies = [
"cfg-if",
"libc",
@ -222,9 +233,9 @@ dependencies = [
[[package]]
name = "h2"
version = "0.3.15"
version = "0.3.18"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
checksum = "17f8a914c2987b688368b5138aa05321db91f4090cf26118185672ad588bce21"
dependencies = [
"bytes",
"fnv",
@ -247,9 +258,15 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
[[package]]
name = "heck"
version = "0.4.0"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2540771e65fc8cb83cd6e8a237f70c319bd5c29f78ed1084ba5d50eeac86f7f9"
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]]
name = "hermit-abi"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
[[package]]
name = "hex"
@ -259,9 +276,9 @@ checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
[[package]]
name = "http"
version = "0.2.8"
version = "0.2.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482"
dependencies = [
"bytes",
"fnv",
@ -279,12 +296,6 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "http-range-header"
version = "0.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
[[package]]
name = "httparse"
version = "1.8.0"
@ -299,9 +310,9 @@ checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
[[package]]
name = "hyper"
version = "0.14.23"
version = "0.14.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c"
checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4"
dependencies = [
"bytes",
"futures-channel",
@ -335,9 +346,9 @@ dependencies = [
[[package]]
name = "indexmap"
version = "1.9.2"
version = "1.9.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1885e79c1fc4b10f0e172c475f458b7f7b93061064d98c3293e98c5ba0c8b399"
checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99"
dependencies = [
"autocfg",
"hashbrown",
@ -352,6 +363,17 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "io-lifetimes"
version = "1.0.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9c66c74d2ae7e79a5a8f7ac924adbe38ee42a859c6539ad869eb51f0b52dc220"
dependencies = [
"hermit-abi",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "itertools"
version = "0.10.5"
@ -363,9 +385,9 @@ dependencies = [
[[package]]
name = "itoa"
version = "1.0.5"
version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fad582f4b9e86b6caa621cabeb0963332d92eea04729ab12892c2533951e6440"
checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6"
[[package]]
name = "lazy_static"
@ -375,9 +397,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
version = "0.2.139"
version = "0.2.142"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "201de327520df007757c1f0adce6e827fe8562fbc28bfd9c15571c66ca1f5f79"
checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317"
[[package]]
name = "linux-raw-sys"
version = "0.3.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36eb31c1778188ae1e64398743890d0877fef36d11521ac60406b42016e8c2cf"
[[package]]
name = "log"
@ -402,20 +430,20 @@ checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d"
[[package]]
name = "mime"
version = "0.3.16"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a60c7ce501c71e03a9c9c0d35b861413ae925bd979cc7a4e30d060069aaac8d"
checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a"
[[package]]
name = "mio"
version = "0.8.5"
version = "0.8.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9"
dependencies = [
"libc",
"log",
"wasi",
"windows-sys",
"windows-sys 0.45.0",
]
[[package]]
@ -445,9 +473,9 @@ dependencies = [
[[package]]
name = "once_cell"
version = "1.17.0"
version = "1.17.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6f61fba1741ea2b3d6a1e3178721804bb716a68a6aeba1149b5d52e3d464ea66"
checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3"
[[package]]
name = "pbjson"
@ -455,7 +483,7 @@ version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "048f9ac93c1eab514f9470c4bc8d97ca2a0a236b84f45cc19d69a59fc11467f6"
dependencies = [
"base64",
"base64 0.13.1",
"serde",
]
@ -494,9 +522,9 @@ checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
[[package]]
name = "petgraph"
version = "0.6.2"
version = "0.6.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
checksum = "4dd7d28ee937e54fe3080c91faa1c3a46c06de6252988a7f4592ba2310ef22a4"
dependencies = [
"fixedbitset",
"indexmap",
@ -519,7 +547,7 @@ checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 1.0.109",
]
[[package]]
@ -542,28 +570,28 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]]
name = "prettyplease"
version = "0.1.23"
version = "0.1.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e97e3215779627f01ee256d2fad52f3d95e8e1c11e9fc6fd08f7cd455d5d5c78"
checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86"
dependencies = [
"proc-macro2",
"syn",
"syn 1.0.109",
]
[[package]]
name = "proc-macro2"
version = "1.0.50"
version = "1.0.56"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6ef7d57beacfaf2d8aee5937dab7b7f28de3cb8b1828479bb5de2a7106f2bae2"
checksum = "2b63bdb0cd06f1f4dedf69b254734f9b45af66e4a031e42a7480257d9898b435"
dependencies = [
"unicode-ident",
]
[[package]]
name = "prost"
version = "0.11.6"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21dc42e00223fc37204bd4aa177e69420c604ca4a183209a8f9de30c6d934698"
checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd"
dependencies = [
"bytes",
"prost-derive",
@ -571,9 +599,9 @@ dependencies = [
[[package]]
name = "prost-build"
version = "0.11.6"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3f8ad728fb08fe212df3c05169e940fbb6d9d16a877ddde14644a983ba2012e"
checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270"
dependencies = [
"bytes",
"heck",
@ -586,39 +614,38 @@ dependencies = [
"prost",
"prost-types",
"regex",
"syn",
"syn 1.0.109",
"tempfile",
"which",
]
[[package]]
name = "prost-derive"
version = "0.11.6"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bda8c0881ea9f722eb9629376db3d0b903b462477c1aafcb0566610ac28ac5d"
checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4"
dependencies = [
"anyhow",
"itertools",
"proc-macro2",
"quote",
"syn",
"syn 1.0.109",
]
[[package]]
name = "prost-types"
version = "0.11.6"
version = "0.11.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a5e0526209433e96d83d750dd81a99118edbc55739e7e61a46764fd2ad537788"
checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13"
dependencies = [
"bytes",
"prost",
]
[[package]]
name = "quote"
version = "1.0.23"
version = "1.0.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8856d8364d252a14d474036ea1358d63c9e6965c8e5c1885c18f73d70bff9c7b"
checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc"
dependencies = [
"proc-macro2",
]
@ -655,77 +682,82 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.2.16"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
dependencies = [
"bitflags",
]
[[package]]
name = "regex"
version = "1.7.1"
version = "1.8.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48aaa5748ba571fb95cd2c85c09f629215d3a6ece942baa100950af03a34f733"
checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370"
dependencies = [
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.6.28"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
checksum = "a5996294f19bd3aae0453a862ad728f60e6600695733dd5df01da90c54363a3c"
[[package]]
name = "remove_dir_all"
version = "0.5.3"
name = "rustix"
version = "0.37.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
checksum = "a0661814f891c57c930a610266415528da53c4933e6dea5fb350cbfe048a9ece"
dependencies = [
"winapi",
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "rustversion"
version = "1.0.11"
version = "1.0.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5583e89e108996506031660fe09baa5011b9dd0341b89029313006d1fb508d70"
checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06"
[[package]]
name = "serde"
version = "1.0.152"
version = "1.0.160"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bb7d1f0d3021d347a83e556fc4683dea2ea09d87bccdf88ff5c12545d89d5efb"
checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.152"
version = "1.0.160"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af487d118eecd09402d70a5d72551860e788df87b464af30e5ea6a38c75c541e"
checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.15",
]
[[package]]
name = "slab"
version = "0.4.7"
version = "0.4.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
checksum = "6528351c9bc8ab22353f9d776db39a20288e8d6c37ef8cfe3317cf875eecfc2d"
dependencies = [
"autocfg",
]
[[package]]
name = "socket2"
version = "0.4.7"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662"
dependencies = [
"libc",
"winapi",
@ -733,9 +765,20 @@ dependencies = [
[[package]]
name = "syn"
version = "1.0.107"
version = "1.0.109"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f4064b5b16e03ae50984a5a8ed5d4f8803e6bc1fd170a3cda91a1be4b18e3f5"
checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237"
dependencies = [
"proc-macro2",
"quote",
"unicode-ident",
]
[[package]]
name = "syn"
version = "2.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822"
dependencies = [
"proc-macro2",
"quote",
@ -744,39 +787,37 @@ dependencies = [
[[package]]
name = "sync_wrapper"
version = "0.1.1"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20518fe4a4c9acf048008599e464deb21beeae3d3578418951a189c235a7a9a8"
checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
[[package]]
name = "tempfile"
version = "3.3.0"
version = "3.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5cdb1ef4eaeeaddc8fbd371e5017057064af0911902ef36b39801f67cc6d79e4"
checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998"
dependencies = [
"cfg-if",
"fastrand",
"libc",
"redox_syscall",
"remove_dir_all",
"winapi",
"rustix",
"windows-sys 0.45.0",
]
[[package]]
name = "tokio"
version = "1.25.0"
version = "1.28.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c8e00990ebabbe4c14c08aca901caed183ecd5c09562a12c824bb53d3c3fd3af"
checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f"
dependencies = [
"autocfg",
"bytes",
"libc",
"memchr",
"mio",
"pin-project-lite",
"socket2",
"tokio-macros",
"windows-sys",
"windows-sys 0.48.0",
]
[[package]]
@ -791,20 +832,20 @@ dependencies = [
[[package]]
name = "tokio-macros"
version = "1.8.2"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d266c00fde287f55d3f1c3e96c500c362a2b8c695076ec180f27918820bc6df8"
checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.15",
]
[[package]]
name = "tokio-stream"
version = "0.1.11"
version = "0.1.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d660770404473ccd7bc9f8b28494a811bc18542b915c0855c51e8f419d5223ce"
checksum = "397c988d37662c7dda6d2208364a706264bf3d6138b11d436cbac0ad38832842"
dependencies = [
"futures-core",
"pin-project-lite",
@ -813,9 +854,9 @@ dependencies = [
[[package]]
name = "tokio-util"
version = "0.7.4"
version = "0.7.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
checksum = "806fe8c2c87eccc8b3267cbae29ed3ab2d0bd37fca70ab622e46aaa9375ddb7d"
dependencies = [
"bytes",
"futures-core",
@ -827,14 +868,13 @@ dependencies = [
[[package]]
name = "tonic"
version = "0.8.3"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8f219fad3b929bef19b1f86fbc0358d35daed8f2cac972037ac0dc10bbb8d5fb"
checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a"
dependencies = [
"async-stream",
"async-trait",
"axum",
"base64",
"base64 0.21.0",
"bytes",
"futures-core",
"futures-util",
@ -846,28 +886,25 @@ dependencies = [
"percent-encoding",
"pin-project",
"prost",
"prost-derive",
"tokio",
"tokio-stream",
"tokio-util",
"tower",
"tower-layer",
"tower-service",
"tracing",
"tracing-futures",
]
[[package]]
name = "tonic-build"
version = "0.8.4"
version = "0.9.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5bf5e9b9c0f7e0a7c027dcfaba7b2c60816c7049171f679d99ee2ff65d0de8c4"
checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07"
dependencies = [
"prettyplease",
"proc-macro2",
"prost-build",
"quote",
"syn",
"syn 1.0.109",
]
[[package]]
@ -890,25 +927,6 @@ dependencies = [
"tracing",
]
[[package]]
name = "tower-http"
version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f873044bf02dd1e8239e9c1293ea39dad76dc594ec16185d0a1bf31d8dc8d858"
dependencies = [
"bitflags",
"bytes",
"futures-core",
"futures-util",
"http",
"http-body",
"http-range-header",
"pin-project-lite",
"tower",
"tower-layer",
"tower-service",
]
[[package]]
name = "tower-layer"
version = "0.3.2"
@ -923,12 +941,10 @@ checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
[[package]]
name = "tracing"
version = "0.1.37"
version = "0.1.38"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
checksum = "cf9cf6a813d3f40c88b0b6b6f29a5c95c6cdbf97c1f9cc53fb820200f5ad814d"
dependencies = [
"cfg-if",
"log",
"pin-project-lite",
"tracing-attributes",
"tracing-core",
@ -936,13 +952,13 @@ dependencies = [
[[package]]
name = "tracing-attributes"
version = "0.1.23"
version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
checksum = "0f57e3ca2a01450b1a921183a9c9cbfda207fd822cef4ccb00a65402cbba7a74"
dependencies = [
"proc-macro2",
"quote",
"syn",
"syn 2.0.15",
]
[[package]]
@ -954,16 +970,6 @@ dependencies = [
"once_cell",
]
[[package]]
name = "tracing-futures"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "97d095ae15e245a057c8e8451bab9b3ee1e1f68e9ba2b4fbc18d0ac5237835f2"
dependencies = [
"pin-project",
"tracing",
]
[[package]]
name = "try-lock"
version = "0.2.4"
@ -972,9 +978,9 @@ checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed"
[[package]]
name = "unicode-ident"
version = "1.0.6"
version = "1.0.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "84a22b9f218b40614adcb3f4ff08b703773ad44fa9423e4e0d346d5db86e4ebc"
checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4"
[[package]]
name = "want"
@ -1027,57 +1033,132 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
[[package]]
name = "windows-sys"
version = "0.42.0"
version = "0.45.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0"
dependencies = [
"windows_aarch64_gnullvm",
"windows_aarch64_msvc",
"windows_i686_gnu",
"windows_i686_msvc",
"windows_x86_64_gnu",
"windows_x86_64_gnullvm",
"windows_x86_64_msvc",
"windows-targets 0.42.2",
]
[[package]]
name = "windows-sys"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9"
dependencies = [
"windows-targets 0.48.0",
]
[[package]]
name = "windows-targets"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071"
dependencies = [
"windows_aarch64_gnullvm 0.42.2",
"windows_aarch64_msvc 0.42.2",
"windows_i686_gnu 0.42.2",
"windows_i686_msvc 0.42.2",
"windows_x86_64_gnu 0.42.2",
"windows_x86_64_gnullvm 0.42.2",
"windows_x86_64_msvc 0.42.2",
]
[[package]]
name = "windows-targets"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7b1eb6f0cd7c80c79759c929114ef071b87354ce476d9d94271031c0497adfd5"
dependencies = [
"windows_aarch64_gnullvm 0.48.0",
"windows_aarch64_msvc 0.48.0",
"windows_i686_gnu 0.48.0",
"windows_i686_msvc 0.48.0",
"windows_x86_64_gnu 0.48.0",
"windows_x86_64_gnullvm 0.48.0",
"windows_x86_64_msvc 0.48.0",
]
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c9864e83243fdec7fc9c5444389dcbbfd258f745e7853198f365e3c4968a608"
checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8"
[[package]]
name = "windows_aarch64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "91ae572e1b79dba883e0d315474df7305d12f569b400fcf90581b06062f7e1bc"
[[package]]
name = "windows_aarch64_msvc"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c8b1b673ffc16c47a9ff48570a9d85e25d265735c503681332589af6253c6c7"
checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43"
[[package]]
name = "windows_aarch64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b2ef27e0d7bdfcfc7b868b317c1d32c641a6fe4629c171b8928c7b08d98d7cf3"
[[package]]
name = "windows_i686_gnu"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "de3887528ad530ba7bdbb1faa8275ec7a1155a45ffa57c37993960277145d640"
checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f"
[[package]]
name = "windows_i686_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "622a1962a7db830d6fd0a69683c80a18fda201879f0f447f065a3b7467daa241"
[[package]]
name = "windows_i686_msvc"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf4d1122317eddd6ff351aa852118a2418ad4214e6613a50e0191f7004372605"
checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060"
[[package]]
name = "windows_i686_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4542c6e364ce21bf45d69fdd2a8e455fa38d316158cfd43b3ac1c5b1b19f8e00"
[[package]]
name = "windows_x86_64_gnu"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c1040f221285e17ebccbc2591ffdc2d44ee1f9186324dd3e84e99ac68d699c45"
checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36"
[[package]]
name = "windows_x86_64_gnu"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca2b8a661f7628cbd23440e50b05d705db3686f894fc9580820623656af974b1"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "628bfdf232daa22b0d64fdb62b09fcc36bb01f05a3939e20ab73aaf9470d0463"
checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3"
[[package]]
name = "windows_x86_64_gnullvm"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7896dbc1f41e08872e9d5e8f8baa8fdd2677f29468c4e156210174edc7f7b953"
[[package]]
name = "windows_x86_64_msvc"
version = "0.42.1"
version = "0.42.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "447660ad36a13288b1db4d4248e857b510e8c3a225c822ba4fb748c0aafecffd"
checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0"
[[package]]
name = "windows_x86_64_msvc"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"

17
api/rust/Cargo.toml vendored
View File

@ -1,7 +1,7 @@
[package]
name = "chirpstack_api"
description = "ChirpStack Protobuf / gRPC API definitions."
version = "4.3.0"
version = "4.3.2"
authors = ["Orne Brocaar <info@brocaar.com>"]
license = "MIT"
homepage = "https://www.chirpstack.io"
@ -9,22 +9,23 @@ repository = "https://github.com/chirpstack/chirpstack"
edition = "2021"
[features]
default = ["api"]
default = ["api", "json"]
api = ["tonic/transport", "tonic-build/transport", "tokio"]
json = ["pbjson", "pbjson-types", "serde"]
internal = []
[dependencies]
prost = "0.11"
prost-types = "0.11"
pbjson = "0.5"
pbjson-types = "0.5"
hex = "0.4"
rand = "0.8"
tonic = { version = "0.8", features = ["codegen", "prost"], default-features = false }
tokio = { version = "1.25", features = ["macros"], optional = true }
serde = { version = "1.0" }
tonic = { version = "0.9", features = ["codegen", "prost"], default-features = false, optional = true }
tokio = { version = "1.27", features = ["macros"], optional = true }
pbjson = { version = "0.5", optional = true }
pbjson-types = { version = "0.5", optional = true }
serde = { version = "1.0", optional = true }
[build-dependencies]
tonic-build = { version = "0.8", features = ["prost"], default-features = false }
tonic-build = { version = "0.9", features = ["prost"], default-features = false }
pbjson-build = "0.5"

94
api/rust/build.rs vendored
View File

@ -16,12 +16,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
std::fs::create_dir_all(out_dir.join("meta")).unwrap();
std::fs::create_dir_all(out_dir.join("api")).unwrap();
#[cfg(feature = "json")]
let well_known_types_path = "::pbjson_types";
#[cfg(not(feature = "json"))]
let well_known_types_path = "::prost_types";
// common
tonic_build::configure()
.out_dir(out_dir.join("common"))
.file_descriptor_set_path(out_dir.join("common").join("proto_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::pbjson_types")
.extern_path(".google.protobuf", well_known_types_path)
.compile(
&[cs_dir.join("common").join("common.proto").to_str().unwrap()],
&[
@ -30,18 +36,21 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
],
)?;
let descriptor_set = std::fs::read(out_dir.join("common").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("common"))
.build(&[".common"])?;
#[cfg(feature = "json")]
{
let descriptor_set = std::fs::read(out_dir.join("common").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("common"))
.build(&[".common"])?;
}
// gw
tonic_build::configure()
.out_dir(out_dir.join("gw"))
.file_descriptor_set_path(out_dir.join("gw").join("proto_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::pbjson_types")
.extern_path(".google.protobuf", well_known_types_path)
.extern_path(".common", "crate::common")
.compile(
&[cs_dir.join("gw").join("gw.proto").to_str().unwrap()],
@ -51,19 +60,22 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
],
)?;
let descriptor_set = std::fs::read(out_dir.join("gw").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("gw"))
.extern_path(".common", "crate::common")
.build(&[".gw"])?;
#[cfg(feature = "json")]
{
let descriptor_set = std::fs::read(out_dir.join("gw").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("gw"))
.extern_path(".common", "crate::common")
.build(&[".gw"])?;
}
// internal
tonic_build::configure()
.out_dir(out_dir.join("internal"))
.file_descriptor_set_path(out_dir.join("internal").join("proto_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::pbjson_types")
.extern_path(".google.protobuf", well_known_types_path)
.extern_path(".common", "crate::common")
.compile(
&[cs_dir
@ -77,19 +89,22 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
],
)?;
let descriptor_set = std::fs::read(out_dir.join("internal").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("internal"))
.extern_path(".common", "crate::common")
.build(&[".internal"])?;
#[cfg(feature = "json")]
{
let descriptor_set = std::fs::read(out_dir.join("internal").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("internal"))
.extern_path(".common", "crate::common")
.build(&[".internal"])?;
}
// integration
tonic_build::configure()
.out_dir(out_dir.join("integration"))
.file_descriptor_set_path(out_dir.join("integration").join("proto_descriptor.bin"))
.compile_well_known_types(true)
.extern_path(".google.protobuf", "::pbjson_types")
.extern_path(".google.protobuf", well_known_types_path)
.extern_path(".common", "crate::common")
.extern_path(".gw", "crate::gw")
.compile(
@ -104,14 +119,18 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
],
)?;
let descriptor_set = std::fs::read(out_dir.join("integration").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.emit_fields()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("integration"))
.extern_path(".common", "crate::common")
.extern_path(".gw", "crate::gw")
.build(&[".integration"])?;
#[cfg(feature = "json")]
{
let descriptor_set =
std::fs::read(out_dir.join("integration").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.emit_fields()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("integration"))
.extern_path(".common", "crate::common")
.extern_path(".gw", "crate::gw")
.build(&[".integration"])?;
}
// meta
tonic_build::configure()
@ -125,13 +144,16 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
&[proto_dir.join("chirpstack").to_str().unwrap()],
)?;
let descriptor_set = std::fs::read(out_dir.join("meta").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("meta"))
.extern_path(".common", "crate::common")
.extern_path(".gw", "crate::gw")
.build(&[".meta"])?;
#[cfg(feature = "json")]
{
let descriptor_set = std::fs::read(out_dir.join("meta").join("proto_descriptor.bin"))?;
pbjson_build::Builder::new()
.register_descriptors(&descriptor_set)?
.out_dir(out_dir.join("meta"))
.extern_path(".common", "crate::common")
.extern_path(".gw", "crate::gw")
.build(&[".meta"])?;
}
// api
tonic_build::configure()

View File

@ -499,7 +499,7 @@ message ListIntegrationsResponse {
}
message HttpIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// HTTP headers to set when making requests.
@ -521,7 +521,7 @@ message CreateHttpIntegrationRequest {
}
message GetHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -536,7 +536,7 @@ message UpdateHttpIntegrationRequest {
}
message DeleteHttpIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -555,7 +555,7 @@ enum InfluxDbVersion {
}
message InfluxDbIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// InfluxDb API write endpoint (e.g. http://localhost:8086/write).
@ -595,7 +595,7 @@ message CreateInfluxDbIntegrationRequest {
}
message GetInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -610,12 +610,12 @@ message UpdateInfluxDbIntegrationRequest {
}
message DeleteInfluxDbIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message ThingsBoardIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// ThingsBoard server endpoint, e.g. https://example.com
@ -628,7 +628,7 @@ message CreateThingsBoardIntegrationRequest {
}
message GetThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -643,12 +643,12 @@ message UpdateThingsBoardIntegrationRequest {
}
message DeleteThingsBoardIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
message MyDevicesIntegration {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
// myDevices API endpoint.
@ -661,7 +661,7 @@ message CreateMyDevicesIntegrationRequest {
}
message GetMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -676,7 +676,7 @@ message UpdateMyDevicesIntegrationRequest {
}
message DeleteMyDevicesIntegrationRequest {
// Application ID (UUIO).
// Application ID (UUID).
string application_id = 1;
}
@ -695,21 +695,23 @@ message LoraCloudModemGeolocationServices {
// Device implements Modem / Modem-E stack.
bool modem_enabled = 2;
// Modem port (fPort).
// ChirpStack will only forward the FrmPayload to the MGS if the port
// is equal to the configured value.
uint32 modem_port = 3;
// GNSS port (fPort).
// ChirpStack will forward the FrmPayload to MGS as GNSS payload if the
// port is equal to the configured value.
uint32 gnss_port = 4;
// Forward FPorts.
// Forward uplink messages matching the given FPorts to the MGS.
repeated uint32 forward_f_ports = 16;
// Use rx time for GNSS resolving.
// In case this is set to true, the MGS resolver will use the RX time of the
// network instead of the timestamp included in the LR1110 payload.
bool gnss_use_rx_time = 5;
// Use gateway location for GNSS resolving.
// In the case this is set to true, ChirpStack will provide the location of
// one of the gateways to the MGS resolver to aid the resolving process.
// Disable this in case the gateway location is not accurate / incorrectly
// configured as an incorrect location will cause the resolver to return an
// error.
bool gnss_use_gateway_location = 17;
// Parse TLV records.
// If enabled, stream records (expected in TLV format) are scanned for GNSS
// data (0x06 or 0x07). If found, ChirpStack will make an additional

View File

@ -2,7 +2,8 @@ use std::error::Error;
use std::fmt;
use std::str::FromStr;
tonic::include_proto!("common/common");
include!(concat!(env!("OUT_DIR"), "/common/common.rs"));
#[cfg(feature = "json")]
include!(concat!(env!("OUT_DIR"), "/common/common.serde.rs"));
#[allow(clippy::from_over_into)]

3
api/rust/src/gw.rs vendored
View File

@ -2,7 +2,8 @@ use rand::Rng;
use std::error::Error;
use std::str::FromStr;
tonic::include_proto!("gw/gw");
include!(concat!(env!("OUT_DIR"), "/gw/gw.rs"));
#[cfg(feature = "json")]
include!(concat!(env!("OUT_DIR"), "/gw/gw.serde.rs"));
#[allow(clippy::from_over_into)]

View File

@ -1,4 +1,5 @@
tonic::include_proto!("integration/integration");
include!(concat!(env!("OUT_DIR"), "/integration/integration.rs"));
#[cfg(feature = "json")]
include!(concat!(
env!("OUT_DIR"),
"/integration/integration.serde.rs"

View File

@ -1,2 +1,3 @@
tonic::include_proto!("internal/internal");
include!(concat!(env!("OUT_DIR"), "/internal/internal.rs"));
#[cfg(feature = "json")]
include!(concat!(env!("OUT_DIR"), "/internal/internal.serde.rs"));

View File

@ -1,2 +1,3 @@
tonic::include_proto!("meta/meta");
include!(concat!(env!("OUT_DIR"), "/meta/meta.rs"));
#[cfg(feature = "json")]
include!(concat!(env!("OUT_DIR"), "/meta/meta.serde.rs"));

View File

@ -1,6 +1,6 @@
[package]
name = "backend"
version = "4.3.0"
version = "4.3.2"
authors = ["Orne Brocaar <info@brocaar.com>"]
edition = "2018"
publish = false
@ -16,7 +16,7 @@ rand = "0.8"
aes-kw = "0.2"
reqwest = { version = "0.11", features = ["json", "rustls-tls"], default-features = false }
chrono = { version = "0.4", features = ["serde"] }
tokio = { version = "1.25", features = ["macros" ] }
tokio = { version = "1.27", features = ["macros" ] }
# Development and testing
[dev-dependencies]

View File

@ -2,8 +2,8 @@
name = "chirpstack"
description = "ChirpStack is an open-source LoRaWAN(TM) Network Server"
repository = "https://github.com/chirpstack/chirpstack"
homepage="https://www.chirpstack.io/"
version = "4.3.0"
homepage = "https://www.chirpstack.io/"
version = "4.3.2"
authors = ["Orne Brocaar <info@brocaar.com>"]
edition = "2021"
publish = false
@ -11,7 +11,7 @@ license = "MIT"
[dependencies]
# CLI interface
clap = { version = "4.1", features = ["derive"] }
clap = { version = "4.2", features = ["derive"] }
# Configuration
serde = { version = "1.0", features = ["derive", "rc"] }
@ -23,16 +23,26 @@ handlebars = "4.3"
# Database
validator = "0.16"
diesel = { version = "2.0", features = [ "chrono", "postgres", "r2d2", "uuid", "serde_json", "numeric" ] }
diesel = { version = "2.0", features = [
"chrono",
"postgres",
"r2d2",
"uuid",
"serde_json",
"numeric",
] }
diesel_migrations = { version = "2.0" }
r2d2 = "0.8"
bigdecimal = "0.3"
redis = { version = "0.22", features = ["r2d2", "cluster"] }
pq-sys = { version = "0.4.7", features = ["pkg-config"] }
redis = { version = "0.23", features = ["r2d2", "cluster", "tls-rustls"] }
pq-sys = { version = "0.4", features = ["pkg-config"] }
# Logging
tracing = "0.1"
tracing-subscriber = { version = "0.3", features = ["fmt", "ansi"], default-features = true }
tracing-subscriber = { version = "0.3", features = [
"fmt",
"ansi",
], default-features = true }
# ChirpStack API definitions
chirpstack_api = { path = "../api/rust", features = ["default", "internal"] }
@ -40,12 +50,16 @@ lrwn = { path = "../lrwn" }
backend = { path = "../backend" }
# HTTP
reqwest = { version = "0.11", features = ["json"] }
reqwest = { version = "0.11", features = [
"json",
"rustls-tls",
], default-features = false }
# Integrations
aws-types = "0.49"
aws-config = "0.49"
aws-sdk-sns = "0.19"
aws-types = "0.55"
aws-credential-types = "0.55"
aws-config = { version = "0.55", default-features = false }
aws-sdk-sns = "0.25"
hmac = "0.12"
sha2 = "0.10"
urlencoding = "2.1"
@ -54,26 +68,26 @@ gcp_auth = "0.7"
lapin = "2.1"
tokio-executor-trait = "2.1"
tokio-reactor-trait = "1.1"
rdkafka = { version = "0.29", features = ["cmake-build"]}
rdkafka = { version = "0.29", features = ["cmake-build"] }
# gRPC and Protobuf
tonic = "0.8"
tonic-web = "0.5"
tonic-reflection = "0.6"
tokio = { version = "1.25", features = ["macros", "rt-multi-thread"] }
tonic = "0.9"
tonic-web = "0.9"
tonic-reflection = "0.9"
tokio = { version = "1.27", features = ["macros", "rt-multi-thread"] }
tokio-stream = "0.1"
prost-types = "0.11"
prost = "0.11"
pbjson-types = "0.5"
# gRPC and HTTP multiplexing
warp = { version = "0.3", features = ["tls"] }
warp = { version = "0.3", features = ["tls"], default-features = false }
hyper = "0.14"
tower = "0.4"
futures = "0.3"
http = "0.2"
http-body = "0.4"
rust-embed = "6.4"
rust-embed = "6.6"
mime_guess = "2.0"
tower-http = { version = "0.4", features = ["trace", "auth"] }
@ -82,7 +96,7 @@ thiserror = "1.0"
anyhow = "1.0"
# Authentication
pbkdf2 = "0.11"
pbkdf2 = { version = "0.12", features = ["simple"] }
rand_core = { version = "0.6", features = ["std"] }
jsonwebtoken = "8.2"
openssl = { version = "0.10", features = ["vendored"] }
@ -93,11 +107,16 @@ paho-mqtt = { version = "0.12", features = ["vendored-ssl"] }
hex = "0.4"
# Codecs
rquickjs = { version = "0.1", features = ["bindgen", "loader", "array-buffer", "chrono"] }
rquickjs = { version = "0.1", features = [
"bindgen",
"loader",
"array-buffer",
"chrono",
] }
# Misc
lazy_static = "1.4"
uuid = { version = "1.3", features = [ "v4", "serde" ] }
uuid = { version = "1.3", features = ["v4", "serde"] }
chrono = "0.4"
async-trait = "0.1"
aes = "0.8"
@ -106,7 +125,7 @@ base64 = "0.21"
async-recursion = "1.0"
regex = "1.7"
petgraph = "0.6"
prometheus-client = "0.19"
prometheus-client = "0.20"
pin-project = "1.0"
# Development and testing
@ -117,8 +136,16 @@ bytes = "1.4"
# Debian packaging.
[package.metadata.deb]
assets = [
["target/release/chirpstack", "usr/bin/", "755"],
["configuration/*.toml", "etc/chirpstack/", "640"],
[
"target/release/chirpstack",
"usr/bin/",
"755",
],
[
"configuration/*.toml",
"etc/chirpstack/",
"640",
],
]
conf-files = [
"/etc/chirpstack/chirpstack.toml",

View File

@ -37,11 +37,10 @@ impl Algorithm {
}
nb_step -= 1;
} else {
if tx_power_index > 0 {
// Increase the tx-power.
// (note that a decrease in index increases the tx-power)
tx_power_index -= 1;
}
// Increase the tx-power.
// (note that a decrease in index increases the tx-power)
// Subtract only if > 0
tx_power_index = tx_power_index.saturating_sub(1);
nb_step += 1;
}

View File

@ -911,9 +911,9 @@ impl ApplicationService for Application {
modem_geolocation_services: application::LoraCloudModemGeolocationServices {
token: req_mgs.token.clone(),
modem_enabled: req_mgs.modem_enabled,
modem_port: req_mgs.modem_port,
gnss_port: req_mgs.gnss_port,
forward_f_ports: req_mgs.forward_f_ports.clone(),
gnss_use_rx_time: req_mgs.gnss_use_rx_time,
gnss_use_gateway_location: req_mgs.gnss_use_gateway_location,
parse_tlv: req_mgs.parse_tlv,
geolocation_buffer_ttl: req_mgs.geolocation_buffer_ttl,
geolocation_min_buffer_size: req_mgs.geolocation_min_buffer_size,
@ -928,6 +928,7 @@ impl ApplicationService for Application {
geolocation_wifi_payload_field: req_mgs
.geolocation_wifi_payload_field
.clone(),
..Default::default()
},
},
),
@ -972,9 +973,9 @@ impl ApplicationService for Application {
modem_geolocation_services: Some(api::LoraCloudModemGeolocationServices {
token: mgs.token.clone(),
modem_enabled: mgs.modem_enabled,
modem_port: mgs.modem_port,
gnss_port: mgs.gnss_port,
forward_f_ports: mgs.forward_f_ports.clone(),
gnss_use_rx_time: mgs.gnss_use_rx_time,
gnss_use_gateway_location: mgs.gnss_use_gateway_location,
parse_tlv: mgs.parse_tlv,
geolocation_buffer_ttl: mgs.geolocation_buffer_ttl,
geolocation_min_buffer_size: mgs.geolocation_min_buffer_size,
@ -1035,9 +1036,9 @@ impl ApplicationService for Application {
modem_geolocation_services: application::LoraCloudModemGeolocationServices {
token: req_mgs.token.clone(),
modem_enabled: req_mgs.modem_enabled,
modem_port: req_mgs.modem_port,
gnss_port: req_mgs.gnss_port,
forward_f_ports: req_mgs.forward_f_ports.clone(),
gnss_use_rx_time: req_mgs.gnss_use_rx_time,
gnss_use_gateway_location: req_mgs.gnss_use_gateway_location,
parse_tlv: req_mgs.parse_tlv,
geolocation_buffer_ttl: req_mgs.geolocation_buffer_ttl,
geolocation_min_buffer_size: req_mgs.geolocation_min_buffer_size,
@ -1052,6 +1053,7 @@ impl ApplicationService for Application {
geolocation_wifi_payload_field: req_mgs
.geolocation_wifi_payload_field
.clone(),
..Default::default()
},
},
),
@ -2610,9 +2612,9 @@ pub mod test {
modem_geolocation_services: Some(api::LoraCloudModemGeolocationServices {
token: "test-token".into(),
modem_enabled: true,
modem_port: 199,
gnss_port: 198,
forward_f_ports: vec![199, 198, 197, 192],
gnss_use_rx_time: true,
gnss_use_gateway_location: true,
parse_tlv: true,
geolocation_buffer_ttl: 300,
geolocation_min_buffer_size: 2,
@ -2647,9 +2649,9 @@ pub mod test {
modem_geolocation_services: Some(api::LoraCloudModemGeolocationServices {
token: "test-token".into(),
modem_enabled: true,
modem_port: 199,
gnss_port: 198,
forward_f_ports: vec![199, 198, 197, 192],
gnss_use_rx_time: true,
gnss_use_gateway_location: true,
parse_tlv: true,
geolocation_buffer_ttl: 300,
geolocation_min_buffer_size: 2,
@ -2674,9 +2676,9 @@ pub mod test {
modem_geolocation_services: Some(api::LoraCloudModemGeolocationServices {
token: "test-token-updated".into(),
modem_enabled: true,
modem_port: 199,
gnss_port: 198,
forward_f_ports: vec![199, 198, 197, 192],
gnss_use_rx_time: true,
gnss_use_gateway_location: true,
parse_tlv: true,
geolocation_buffer_ttl: 300,
geolocation_min_buffer_size: 2,
@ -2711,9 +2713,9 @@ pub mod test {
modem_geolocation_services: Some(api::LoraCloudModemGeolocationServices {
token: "test-token-updated".into(),
modem_enabled: true,
modem_port: 199,
gnss_port: 198,
forward_f_ports: vec![199, 198, 197, 192],
gnss_use_rx_time: true,
gnss_use_gateway_location: true,
parse_tlv: true,
geolocation_buffer_ttl: 300,
geolocation_min_buffer_size: 2,

View File

@ -844,7 +844,7 @@ impl InternalService for Internal {
out.rx1_delay = region_conf.network.rx1_delay as u32;
out.rx1_dr_offset = region_conf.network.rx1_dr_offset as u32;
out.rx2_dr = region_conf.network.rx2_dr as u32;
out.rx2_frequency = region_conf.network.rx2_frequency as u32;
out.rx2_frequency = region_conf.network.rx2_frequency;
out.class_b_ping_slot_dr = region_conf.network.class_b.ping_slot_dr as u32;
out.class_b_ping_slot_frequency = region_conf.network.class_b.ping_slot_frequency;
}

View File

@ -223,7 +223,7 @@ pub fn ul_meta_data_to_rx_info(ul_meta_data: &ULMetaData) -> Result<Vec<gw::Upli
gateway_id: hex::encode(&gw_info.id),
context: gw_info.ul_token.clone(),
rssi: gw_info.rssi.unwrap_or_default() as i32,
snr: gw_info.snr.unwrap_or_default() as f32,
snr: gw_info.snr.unwrap_or_default(),
location: if gw_info.lat.is_some() && gw_info.lon.is_some() {
Some(common::Location {
latitude: gw_info.lat.unwrap(),

View File

@ -11,12 +11,12 @@ pub async fn run() -> Result<()> {
"Starting ChirpStack LoRaWAN Network Server"
);
storage::setup().await?;
region::setup()?;
backend::setup()?;
adr::setup().await?;
integration::setup().await?;
gateway::backend::setup().await?;
storage::setup().await?;
downlink::setup().await;
api::setup().await?;

View File

@ -287,7 +287,7 @@ impl CayenneLpp {
val.fields.insert(
format!("{}", k),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(*v as f64)),
kind: Some(pbjson_types::value::Kind::NumberValue(*v)),
},
);
}
@ -305,7 +305,7 @@ impl CayenneLpp {
val.fields.insert(
format!("{}", k),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(*v as f64)),
kind: Some(pbjson_types::value::Kind::NumberValue(*v)),
},
);
}
@ -359,7 +359,7 @@ impl CayenneLpp {
val.fields.insert(
format!("{}", k),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(*v as f64)),
kind: Some(pbjson_types::value::Kind::NumberValue(*v)),
},
);
}
@ -377,7 +377,7 @@ impl CayenneLpp {
val.fields.insert(
format!("{}", k),
pbjson_types::Value {
kind: Some(pbjson_types::value::Kind::NumberValue(*v as f64)),
kind: Some(pbjson_types::value::Kind::NumberValue(*v)),
},
);
}

View File

@ -44,7 +44,7 @@ impl serialize::ToSql<Text, Pg> for Codec
where
str: serialize::ToSql<Text, Pg>,
{
fn to_sql<'b>(&self, out: &mut serialize::Output<'b, '_, Pg>) -> serialize::Result {
fn to_sql(&self, out: &mut serialize::Output<'_, '_, Pg>) -> serialize::Result {
<str as serialize::ToSql<Text, Pg>>::to_sql(&self.to_string(), &mut out.reborrow())
}
}

View File

@ -13,7 +13,7 @@ lazy_static! {
static ref CONFIG: Mutex<Arc<Configuration>> = Mutex::new(Arc::new(Default::default()));
}
#[derive(Serialize, Deserialize, Clone)]
#[derive(Default, Serialize, Deserialize, Clone)]
#[serde(default)]
pub struct Configuration {
pub logging: Logging,
@ -33,28 +33,6 @@ pub struct Configuration {
pub regions: Vec<Region>,
}
impl Default for Configuration {
fn default() -> Self {
Configuration {
logging: Default::default(),
postgresql: Default::default(),
redis: Default::default(),
api: Default::default(),
gateway: Default::default(),
network: Default::default(),
monitoring: Default::default(),
integration: Default::default(),
codec: Default::default(),
user_authentication: Default::default(),
join_server: Default::default(),
backend_interfaces: Default::default(),
roaming: Default::default(),
keks: Vec::new(),
regions: vec![],
}
}
}
#[derive(Serialize, Deserialize, Clone)]
#[serde(default)]
pub struct Logging {
@ -637,6 +615,7 @@ pub struct GatewayBackendMqtt {
pub tls_key: String,
#[serde(with = "humantime_serde")]
pub keep_alive_interval: Duration,
pub v4_migrate: bool,
}
impl Default for GatewayBackendMqtt {
@ -655,6 +634,7 @@ impl Default for GatewayBackendMqtt {
tls_cert: "".into(),
tls_key: "".into(),
keep_alive_interval: Duration::from_secs(30),
v4_migrate: true,
}
}
}

View File

@ -23,27 +23,22 @@ pub fn select_downlink_gateway(
min_snr_margin: f32,
rx_info: &mut internal::DeviceGatewayRxInfo,
) -> Result<internal::DeviceGatewayRxInfoItem> {
rx_info.items = rx_info
.items
.iter()
.filter(|rx_info| {
if let Some(tenant_id) = &tenant_id {
if tenant_id.as_bytes().to_vec() == rx_info.tenant_id {
// The tenant is the same as the gateway tenant.
true
} else {
// If tenant_id is different, filter out rx_info elements that have
// is_private_down=true.
!rx_info.is_private_down
}
rx_info.items.retain(|rx_info| {
if let Some(tenant_id) = &tenant_id {
if tenant_id.as_bytes().to_vec() == rx_info.tenant_id {
// The tenant is the same as the gateway tenant.
true
} else {
// If tenant_id is None, filter out rx_info elements that have
// If tenant_id is different, filter out rx_info elements that have
// is_private_down=true.
!rx_info.is_private_down
}
})
.cloned()
.collect();
} else {
// If tenant_id is None, filter out rx_info elements that have
// is_private_down=true.
!rx_info.is_private_down
}
});
if rx_info.items.is_empty() {
return Err(anyhow!(

View File

@ -113,7 +113,7 @@ impl JoinAccept<'_> {
.gateway_tenant_id_map
.get(&gw_id)
.map(|v| v.into_bytes().to_vec())
.unwrap_or_else(|| Vec::new()),
.unwrap_or_else(Vec::new),
}
})
.collect(),

View File

@ -92,7 +92,7 @@ impl PassiveRoamingDownlink {
.gateway_tenant_id_map
.get(&gw_id)
.map(|v| v.into_bytes().to_vec())
.unwrap_or_else(|| Vec::new()),
.unwrap_or_else(Vec::new),
}
})
.collect(),
@ -127,7 +127,7 @@ impl PassiveRoamingDownlink {
let dl_freq_1 = self.dl_meta_data.dl_freq_1.unwrap();
let dl_freq_1 = (dl_freq_1 * 1_000_000.0) as u32;
let data_rate_1 = self.dl_meta_data.data_rate_1.unwrap();
let data_rate_1 = self.region_conf.get_data_rate(data_rate_1 as u8)?;
let data_rate_1 = self.region_conf.get_data_rate(data_rate_1)?;
let rx_delay_1 = self.dl_meta_data.rx_delay_1.unwrap();
let mut tx_info = gw::DownlinkTxInfo {
@ -169,7 +169,7 @@ impl PassiveRoamingDownlink {
let dl_freq_2 = self.dl_meta_data.dl_freq_2.unwrap();
let dl_freq_2 = (dl_freq_2 * 1_000_000.0) as u32;
let data_rate_2 = self.dl_meta_data.data_rate_2.unwrap();
let data_rate_2 = self.region_conf.get_data_rate(data_rate_2 as u8)?;
let data_rate_2 = self.region_conf.get_data_rate(data_rate_2)?;
let rx_delay_1 = self.dl_meta_data.rx_delay_1.unwrap();
let mut tx_info = gw::DownlinkTxInfo {

View File

@ -69,6 +69,7 @@ pub struct MqttBackend<'a> {
client: mqtt::AsyncClient,
templates: handlebars::Handlebars<'a>,
qos: usize,
v4_migrate: bool,
}
#[derive(Serialize)]
@ -197,6 +198,7 @@ impl<'a> MqttBackend<'a> {
client,
templates,
qos: conf.qos,
v4_migrate: conf.v4_migrate,
};
// connect
@ -209,12 +211,14 @@ impl<'a> MqttBackend<'a> {
// Consumer loop.
tokio::spawn({
let region_config_id = region_config_id.to_string();
let v4_migrate = conf.v4_migrate;
async move {
info!("Starting MQTT consumer loop");
while let Some(msg_opt) = stream.next().await {
if let Some(msg) = msg_opt {
message_callback(&region_config_id, region_common_name, msg).await;
message_callback(v4_migrate, &region_config_id, region_common_name, msg)
.await;
}
}
}
@ -271,7 +275,10 @@ impl GatewayBackend for MqttBackend<'_> {
.inc();
let topic = self.get_command_topic(&df.gateway_id, "down")?;
let mut df = df.clone();
df.v4_migrate();
if self.v4_migrate {
df.v4_migrate();
}
let json = gateway_is_json(&df.gateway_id);
let b = match json {
@ -313,6 +320,7 @@ impl GatewayBackend for MqttBackend<'_> {
}
async fn message_callback(
v4_migrate: bool,
region_config_id: &str,
region_common_name: CommonName,
msg: mqtt::Message,
@ -357,7 +365,10 @@ async fn message_callback(
true => serde_json::from_slice(b)?,
false => chirpstack_api::gw::UplinkFrame::decode(&mut Cursor::new(b))?,
};
event.v4_migrate();
if v4_migrate {
event.v4_migrate();
}
if let Some(rx_info) = &mut event.rx_info {
set_gateway_json(&rx_info.gateway_id, json);
@ -381,7 +392,11 @@ async fn message_callback(
true => serde_json::from_slice(b)?,
false => chirpstack_api::gw::GatewayStats::decode(&mut Cursor::new(b))?,
};
event.v4_migrate();
if v4_migrate {
event.v4_migrate();
}
event
.metadata
.insert("region_config_id".to_string(), region_config_id.to_string());
@ -401,7 +416,11 @@ async fn message_callback(
true => serde_json::from_slice(b)?,
false => chirpstack_api::gw::DownlinkTxAck::decode(&mut Cursor::new(b))?,
};
event.v4_migrate();
if v4_migrate {
event.v4_migrate();
}
set_gateway_json(&event.gateway_id, json);
tokio::spawn(downlink::tx_ack::TxAck::handle(event));
} else {

View File

@ -2,11 +2,10 @@ use std::collections::HashMap;
use anyhow::Result;
use async_trait::async_trait;
use aws_sdk_sns::model::MessageAttributeValue;
use aws_types::credentials::future;
use aws_types::credentials::ProvideCredentials;
use aws_credential_types::provider::{future, ProvideCredentials, Result as CredentialsResult};
use aws_credential_types::Credentials;
use aws_sdk_sns::types::MessageAttributeValue;
use aws_types::region::Region;
use aws_types::{credentials, Credentials};
use base64::{engine::general_purpose, Engine as _};
use prost::Message;
use tracing::{info, trace};
@ -30,7 +29,7 @@ impl StaticCredentials {
}
}
fn credentials(&self) -> credentials::Result {
fn credentials(&self) -> CredentialsResult {
Ok(Credentials::new(
self.aws_access_key_id.clone(),
self.aws_secret_access_key.clone(),

View File

@ -57,10 +57,15 @@ impl Integration {
.query(&[("event", event)])
.headers(headers.clone())
.send()
.await?;
.await;
match res.error_for_status() {
Ok(_) => {}
match res {
Ok(res) => match res.error_for_status() {
Ok(_) => {}
Err(e) => {
error!(event = %event, url = %url, error = %e, "Posting event failed");
}
},
Err(e) => {
error!(event = %event, url = %url, error = %e, "Posting event failed");
}

View File

@ -489,7 +489,6 @@ pub struct AntennaLocation {
#[derive(Clone)]
pub enum UplinkMsg {
UpDf(UplinkMsgUpDf),
Modem(UplinkMsgModem),
Gnss(UplinkMsgGnss),
Wifi(UplinkMsgWifi),
Joining(UplinkMsgJoining),
@ -502,7 +501,6 @@ impl Serialize for UplinkMsg {
{
match self {
UplinkMsg::UpDf(v) => v.serialize(serializer),
UplinkMsg::Modem(v) => v.serialize(serializer),
UplinkMsg::Gnss(v) => v.serialize(serializer),
UplinkMsg::Wifi(v) => v.serialize(serializer),
UplinkMsg::Joining(v) => v.serialize(serializer),
@ -556,15 +554,14 @@ impl<'de> Visitor<'de> for Eui64WrapperVisitor {
E: de::Error,
{
let s = value.to_string().replace('-', "");
let b = hex::decode(&s).map_err(|e| E::custom(format!("{}", e)))?;
let b = hex::decode(s).map_err(|e| E::custom(format!("{}", e)))?;
let eui64 = EUI64::from_slice(&b).map_err(|e| E::custom(format!("{}", e)))?;
Ok(Eui64Wrapper(eui64))
}
}
// UplinkMsgUpDf implements the LoRa Cloud UplinkMsg object.
// The purpose of this message is to create a downlink opportunity for LoRa Cloud.
#[derive(Serialize, Clone)]
#[derive(Default, Serialize, Clone)]
pub struct UplinkMsgUpDf {
#[serde(rename = "msgtype")]
pub msg_type: String, // must be set to "updf"
@ -573,21 +570,16 @@ pub struct UplinkMsgUpDf {
pub port: u8,
pub dr: u8,
pub freq: u32,
pub timestamp: f64, // senconds since UTC
pub payload: String, // leave this blank
}
// UplinkMsgModem implements the LoRa Cloud UplinkMsg object containing a modem payload.
#[derive(Serialize, Clone)]
pub struct UplinkMsgModem {
#[serde(rename = "msgtype")]
pub msg_type: String, // must be set to "modem"
pub payload: String, // HEX format
#[serde(rename = "fcnt")]
pub f_cnt: u32,
pub timestamp: f64, // seconds since UTC
pub dr: u8,
pub freq: u32,
pub timestamp: f64, // senconds since UTC
pub payload: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub gnss_capture_time: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gnss_capture_time_accuracy: Option<f64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gnss_assist_position: Option<Vec<f64>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gnss_assist_altitude: Option<f64>,
}
// UplinkMsgGnss implements the LoRa Cloud UplinkMsg object containing a gnss payload.
@ -696,6 +688,7 @@ pub mod test {
freq: 868100000,
timestamp: 12345.0,
payload: "".into(),
..Default::default()
}),
};
let json_s = serde_json::to_string(&updf).unwrap();

View File

@ -59,31 +59,72 @@ impl Integration {
Ok(())
}
async fn modem_modem(
async fn modem_updf(
&self,
vars: &HashMap<String, String>,
pl: &integration::UplinkEvent,
) -> Result<()> {
let di = pl.device_info.as_ref().unwrap();
info!(dev_eui = %di.dev_eui, "Forwarding modem message");
info!(dev_eui = %di.dev_eui, "Forwarding updf message");
let ts: DateTime<Utc> = pl.time.as_ref().unwrap().clone().try_into()?;
let dev_eui = EUI64::from_str(&di.dev_eui)?;
let req = client::UplinkRequest {
dev_eui: client::Eui64Wrapper::new(&dev_eui),
uplink: client::UplinkMsg::Modem(client::UplinkMsgModem {
msg_type: "modem".into(),
payload: hex::encode(&pl.data),
f_cnt: pl.f_cnt,
timestamp: ts.timestamp_millis() as f64 / 1000.0,
dr: pl.dr as u8,
freq: pl.tx_info.as_ref().unwrap().frequency,
uplink: client::UplinkMsg::UpDf({
let mut msg_updf = client::UplinkMsgUpDf {
msg_type: "updf".into(),
f_cnt: pl.f_cnt,
port: pl.f_port as u8,
dr: pl.dr as u8,
freq: pl.tx_info.as_ref().unwrap().frequency,
timestamp: ts.timestamp_millis() as f64 / 1000.0,
payload: hex::encode(&pl.data),
gnss_capture_time: match self.config.modem_geolocation_services.gnss_use_rx_time
{
false => None,
true => {
let ts = match get_time_since_gps_epoch_chrono(&pl.rx_info) {
Some(v) => v,
None => Utc::now().to_gps_time(),
};
// Compensate for gnss scanning time and uplink.
let ts = ts - Duration::seconds(6);
Some(ts.num_seconds() as f64)
}
},
gnss_capture_time_accuracy: match self
.config
.modem_geolocation_services
.gnss_use_rx_time
{
false => None,
true => Some(15.0),
},
gnss_assist_position: None,
gnss_assist_altitude: None,
};
if self
.config
.modem_geolocation_services
.gnss_use_gateway_location
{
if let Some(loc) = get_start_location(&pl.rx_info) {
msg_updf.gnss_assist_position = Some(vec![loc.latitude, loc.longitude]);
msg_updf.gnss_assist_altitude = Some(loc.altitude);
}
}
msg_updf
}),
};
let resp = self.client.uplink_send(&req).await?;
self.handle_modem_response(vars, pl, &resp, common::LocationSource::Unknown)
self.handle_modem_response(vars, pl, &resp, common::LocationSource::GeoResolverGnss)
.await?;
Ok(())
@ -133,9 +174,15 @@ impl Integration {
gnss_assist_altitude: None,
};
if let Some(loc) = get_start_location(&pl.rx_info) {
msg_gnss.gnss_assist_position = Some(vec![loc.latitude, loc.longitude]);
msg_gnss.gnss_assist_altitude = Some(loc.altitude);
if self
.config
.modem_geolocation_services
.gnss_use_gateway_location
{
if let Some(loc) = get_start_location(&pl.rx_info) {
msg_gnss.gnss_assist_position = Some(vec![loc.latitude, loc.longitude]);
msg_gnss.gnss_assist_altitude = Some(loc.altitude);
}
}
msg_gnss
@ -169,6 +216,7 @@ impl Integration {
freq: pl.tx_info.as_ref().unwrap().frequency,
timestamp: ts.timestamp_millis() as f64 / 1000.0,
payload: "".into(),
..Default::default()
}),
};
@ -698,12 +746,13 @@ impl IntegrationTrait for Integration {
pl: &integration::UplinkEvent,
) -> Result<()> {
if self.config.modem_geolocation_services.modem_enabled {
if pl.f_port == self.config.modem_geolocation_services.modem_port {
// Modem payloads.
self.modem_modem(vars, pl).await?;
} else if pl.f_port == self.config.modem_geolocation_services.gnss_port {
// GNSS payloads.
self.modem_gnss(vars, pl).await?;
if self
.config
.modem_geolocation_services
.forward_f_ports
.contains(&pl.f_port)
{
self.modem_updf(vars, pl).await?;
} else {
// Only forward meta-data.
self.modem_metadata(vars, pl).await?;

View File

@ -129,7 +129,7 @@ impl serialize::ToSql<Text, Pg> for IntegrationKind
where
str: serialize::ToSql<Text, Pg>,
{
fn to_sql<'b>(&self, out: &mut serialize::Output<'b, '_, Pg>) -> serialize::Result {
fn to_sql(&self, out: &mut serialize::Output<'_, '_, Pg>) -> serialize::Result {
<str as serialize::ToSql<Text, Pg>>::to_sql(&self.to_string(), &mut out.reborrow())
}
}
@ -158,7 +158,7 @@ impl deserialize::FromSql<Jsonb, Pg> for IntegrationConfiguration {
}
impl serialize::ToSql<Jsonb, Pg> for IntegrationConfiguration {
fn to_sql<'b>(&self, out: &mut serialize::Output<'b, '_, Pg>) -> serialize::Result {
fn to_sql(&self, out: &mut serialize::Output<'_, '_, Pg>) -> serialize::Result {
let value = serde_json::to_value(self)?;
<serde_json::Value as serialize::ToSql<Jsonb, Pg>>::to_sql(&value, &mut out.reborrow())
}
@ -200,13 +200,16 @@ pub struct LoraCloudConfiguration {
pub modem_geolocation_services: LoraCloudModemGeolocationServices,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[derive(Default, Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(default)]
pub struct LoraCloudModemGeolocationServices {
pub token: String,
pub modem_enabled: bool,
pub modem_port: u32,
pub gnss_port: u32,
pub forward_f_ports: Vec<u32>,
pub gnss_use_rx_time: bool,
pub gnss_use_gateway_location: bool,
pub parse_tlv: bool,
pub geolocation_buffer_ttl: u32,
pub geolocation_min_buffer_size: u32,
@ -466,7 +469,7 @@ pub async fn get_integration(
let application_id = *application_id;
move || -> Result<Integration, Error> {
let mut c = get_db_conn()?;
let i: Integration = application_integration::dsl::application_integration
let mut i: Integration = application_integration::dsl::application_integration
.filter(
application_integration::dsl::application_id
.eq(application_id)
@ -474,6 +477,19 @@ pub async fn get_integration(
)
.first(&mut c)
.map_err(|e| Error::from_diesel(e, application_id.to_string()))?;
// For backwards compatibiliy
if let IntegrationConfiguration::LoraCloud(conf) = &mut i.configuration {
if conf.modem_geolocation_services.forward_f_ports.is_empty() {
conf.modem_geolocation_services.forward_f_ports = vec![
conf.modem_geolocation_services.modem_port,
conf.modem_geolocation_services.gnss_port,
197,
192,
];
}
}
Ok(i)
}
})

View File

@ -91,7 +91,7 @@ impl deserialize::FromSql<Jsonb, Pg> for Measurements {
}
impl serialize::ToSql<Jsonb, Pg> for Measurements {
fn to_sql<'b>(&self, out: &mut serialize::Output<'b, '_, Pg>) -> serialize::Result {
fn to_sql(&self, out: &mut serialize::Output<'_, '_, Pg>) -> serialize::Result {
let value = serde_json::to_value(&self.0)?;
<serde_json::Value as serialize::ToSql<Jsonb, Pg>>::to_sql(&value, &mut out.reborrow())
}

View File

@ -219,20 +219,25 @@ pub async fn setup() -> Result<()> {
Ok(())
}
pub fn get_db_pool() -> PgPool {
pub fn get_db_pool() -> Result<PgPool> {
let pool_r = PG_POOL.read().unwrap();
let pool = pool_r.as_ref().unwrap().clone();
pool
let pool = pool_r
.as_ref()
.ok_or_else(|| anyhow!("PostgreSQL connection pool is not initialized (yet)"))?
.clone();
Ok(pool)
}
pub fn get_db_conn() -> Result<PgPoolConnection> {
let pool = get_db_pool();
pool.get().context("Get connection from pool error")
let pool = get_db_pool()?;
Ok(pool.get()?)
}
pub fn get_redis_conn() -> Result<RedisPoolConnection> {
let pool_r = REDIS_POOL.read().unwrap();
let pool = pool_r.as_ref().unwrap();
let pool = pool_r
.as_ref()
.ok_or_else(|| anyhow!("Redis connection pool is not initialized (yet)"))?;
Ok(match pool {
RedisPool::Client(v) => RedisPoolConnection::Client(v.get()?),
RedisPool::ClusterClient(v) => RedisPoolConnection::ClusterClient(v.get()?),

View File

@ -50,7 +50,7 @@ pub async fn global_search(
let search = search.to_string();
let (query, tags) = parse_search_query(&search);
let query = format!("%{}%", query);
let tags = serde_json::to_value(&tags).context("To serde_json value")?;
let tags = serde_json::to_value(tags).context("To serde_json value")?;
move || -> Result<Vec<SearchResult>, Error> {
let mut c = get_db_conn()?;

View File

@ -288,7 +288,7 @@ impl Data {
.gateway_tenant_id_map
.get(&gw_id)
.map(|v| v.into_bytes().to_vec())
.unwrap_or_else(|| Vec::new()),
.unwrap_or_else(Vec::new),
}
})
.collect(),

View File

@ -375,13 +375,13 @@ fn filter_rx_info_by_tenant_id(tenant_id: Uuid, uplink: &mut UplinkFrameSet) ->
.gateway_private_up_map
.get(&gateway_id)
.cloned()
.unwrap_or_else(|| true)
.unwrap_or(true)
|| force_gws_private)
|| uplink
.gateway_tenant_id_map
.get(&gateway_id)
.cloned()
.unwrap_or_else(|| Uuid::new_v4())
.unwrap_or_else(Uuid::new_v4)
== tenant_id
{
rx_info_set.push(rx_info.clone());

View File

@ -3,7 +3,7 @@ name = "lrwn"
description = "Library for encoding / decoding LoRaWAN frames."
homepage = "https://www.chirpstack.io"
license = "MIT"
version = "4.3.0"
version = "4.3.2"
authors = ["Orne Brocaar <info@brocaar.com>"]
edition = "2018"
repository = "https://github.com/chirpstack/chirpstack"

View File

@ -1,4 +1,4 @@
FROM alpine:3.17.0
FROM alpine:3.17.3
ENV PROJECT_PATH=/chirpstack/ui

View File

@ -1,6 +1,6 @@
{
"name": "chirpstack-ui",
"version": "4.3.0",
"version": "4.3.2",
"private": true,
"dependencies": {
"@ant-design/colors": "^6.0.0",
@ -28,6 +28,7 @@
"codemirror": "^5.65.3",
"google-protobuf": "^3.21.2",
"grpc-web": "^1.4.2",
"js-file-download": "^0.4.12",
"leaflet": "^1.7.1",
"leaflet.awesome-markers": "^2.0.5",
"react": "^17.0.2",

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 KiB

After

Width:  |  Height:  |  Size: 28 KiB

View File

@ -1,8 +1,9 @@
import React, { Component } from "react";
import moment from "moment";
import JSONTreeOriginal from "react-json-tree";
import fileDownload from "js-file-download";
import { Tag, Drawer, Button, Table, Spin } from "antd";
import { Tag, Drawer, Button, Table, Spin, Space } from "antd";
import { ZoomInOutlined } from "@ant-design/icons";
import { LogItem } from "@chirpstack/chirpstack-api-grpc-web/api/internal_pb";
@ -14,6 +15,7 @@ interface IProps {
interface IState {
drawerOpen: boolean;
body: any;
drawerTitle: any;
}
class LogTable extends Component<IProps, IState> {
@ -23,6 +25,7 @@ class LogTable extends Component<IProps, IState> {
this.state = {
drawerOpen: false,
body: null,
drawerTitle: null,
};
}
@ -32,15 +35,29 @@ class LogTable extends Component<IProps, IState> {
});
};
onDrawerOpen = (body: any) => {
onDrawerOpen = (time: any, body: any) => {
let ts = new Date(0);
ts.setUTCSeconds(time.seconds);
let drawerTitle = moment(ts).format("YYYY-MM-DD HH:mm:ss");
return () => {
this.setState({
body: body,
drawerTitle: drawerTitle,
drawerOpen: true,
});
};
};
downloadSingleFrame = () => {
fileDownload(JSON.stringify(JSON.parse(this.state.body), null, 4), "single-log.json", "application/json");
};
downloadFrames = () => {
let items = this.props.logs.map((l, i) => JSON.parse(l.getBody()));
fileDownload(JSON.stringify(items, null, 4), "log.json");
};
render() {
let items = this.props.logs.map((l, i) => l.toObject());
let body = JSON.parse(this.state.body);
@ -67,13 +84,14 @@ class LogTable extends Component<IProps, IState> {
};
return (
<div>
<Space direction="vertical" size="large" style={{ width: "100%" }}>
<Drawer
title="Details"
title={`Details: ${this.state.drawerTitle}`}
placement="right"
width={650}
onClose={this.onDrawerClose}
visible={this.state.drawerOpen}
extra={<Button onClick={this.downloadSingleFrame}>Download</Button>}
>
<JSONTreeOriginal
data={body}
@ -85,9 +103,10 @@ class LogTable extends Component<IProps, IState> {
/>
</Drawer>
{items.length !== 0 && (
<div className="spinner">
<Spin />
</div>
<Space direction="horizontal" style={{ float: "right" }} size="large">
<Spin size="small" />
<Button onClick={this.downloadFrames}>Download</Button>
</Space>
)}
<Table
showHeader={false}
@ -117,7 +136,7 @@ class LogTable extends Component<IProps, IState> {
type="primary"
shape="round"
size="small"
onClick={this.onDrawerOpen(obj.body)}
onClick={this.onDrawerOpen(obj.time, obj.body)}
>
{text}
</Button>
@ -144,7 +163,7 @@ class LogTable extends Component<IProps, IState> {
},
]}
/>
</div>
</Space>
);
}
}

View File

@ -111,3 +111,11 @@ pre {
.CodeMirror {
height: 600px;
}
.ant-drawer {
padding-top: 64px;
}
.ant-drawer-body {
padding-bottom: 88px; /* 64 + 24 */
}

View File

@ -34,9 +34,8 @@ class CreateLoRaCloudIntegration extends Component<IProps> {
render() {
let i = new LoraCloudIntegration();
let mgs = new LoraCloudModemGeolocationServices();
mgs.setModemPort(199);
mgs.setGnssPort(198);
mgs.setModemEnabled(true);
mgs.setForwardFPortsList([192, 197, 198, 199]);
i.setModemGeolocationServices(mgs);

View File

@ -1,6 +1,7 @@
import React, { Component } from "react";
import { Form, Input, InputNumber, Switch, Button, Tabs, Collapse } from "antd";
import { MinusCircleOutlined, PlusOutlined } from "@ant-design/icons";
import {
LoraCloudIntegration,
@ -56,9 +57,9 @@ class LoRaCloudIntegrationForm extends Component<IProps, IState> {
if (mgsv !== undefined) {
mgs.setToken(mgsv.token);
mgs.setModemEnabled(mgsv.modemEnabled);
mgs.setModemPort(mgsv.modemPort);
mgs.setGnssPort(mgsv.gnssPort);
mgs.setForwardFPortsList(mgsv.forwardFPortsList);
mgs.setGnssUseRxTime(mgsv.gnssUseRxTime);
mgs.setGnssUseGatewayLocation(mgsv.gnssUseGatewayLocation);
mgs.setParseTlv(mgsv.parseTlv);
mgs.setGeolocationBufferTtl(mgsv.geolocationBufferTtl);
mgs.setGeolocationMinBufferSize(mgsv.geolocationMinBufferSize);
@ -119,7 +120,7 @@ class LoRaCloudIntegrationForm extends Component<IProps, IState> {
tooltip="This token can be obtained from loracloud.com"
rules={[{ required: true, message: "Please enter a token!" }]}
>
<Input />
<Input type="password" />
</Form.Item>
<Form.Item
name={["modemGeolocationServices", "modemEnabled"]}
@ -129,24 +130,26 @@ class LoRaCloudIntegrationForm extends Component<IProps, IState> {
<Switch onChange={this.onModemEnabledChange} />
</Form.Item>
{this.state.modemEnabled && (
<Form.Item
label="GNSS port (FPort)"
name={["modemGeolocationServices", "gnssPort"]}
tooltip="ChirpStack will only forward the FRMPayload for GNSS geolocation to LoRa Cloud when the uplink matches the configured port."
rules={[{ required: true, message: "Please enter a port number!" }]}
>
<InputNumber min={0} max={255} />
</Form.Item>
)}
{this.state.modemEnabled && (
<Form.Item
label="Modem port (FPort)"
name={["modemGeolocationServices", "modemPort"]}
tooltip="ChirpStack will only forward the FRMPayload to LoRa Cloud when the uplink matches the configured port."
rules={[{ required: true, message: "Please enter a port number!" }]}
>
<InputNumber min={0} max={255} />
</Form.Item>
<Form.List name={["modemGeolocationServices", "forwardFPortsList"]}>
{(fields, { add, remove }) => (
<Form.Item label="Forward messages on these FPorts to LoRa Cloud">
{fields.map((field, index) => (
<Form.Item
{...field}
rules={[{ required: true, message: "Please a FPort value!" }]}
style={{ display: "inline-block", width: "100px", marginRight: "24px" }}
>
<InputNumber
min={1}
max={255}
addonAfter={<MinusCircleOutlined onClick={() => remove(index)} />}
/>
</Form.Item>
))}
<Button type="dashed" onClick={() => add()} icon={<PlusOutlined />} />
</Form.Item>
)}
</Form.List>
)}
{this.state.modemEnabled && (
<Form.Item
@ -160,9 +163,19 @@ class LoRaCloudIntegrationForm extends Component<IProps, IState> {
)}
{this.state.modemEnabled && (
<Form.Item
label="My device adheres to the LoRa Edge&trade; Tracker Reference Design protocol"
label="Use location of receiving gateways for assistance"
name={["modemGeolocationServices", "gnssUseGatewayLocation"]}
tooltip="If enabled, the gateway location will be provided to the geolocation resolver to aid the resolving process."
valuePropName="checked"
>
<Switch />
</Form.Item>
)}
{this.state.modemEnabled && (
<Form.Item
label="My device adheres to the LoRa Edge&trade; Tracker Modem-E Version Reference Design protocol"
name={["modemGeolocationServices", "parseTlv"]}
tooltip="If enabled, ChirpStack Application Server will try to resolve the location of the device if a geolocation payload is detected."
tooltip="If enabled, ChirpStack will try to resolve the location of the device if a geolocation payload is detected."
valuePropName="checked"
>
<Switch />

View File

@ -1881,7 +1881,7 @@
integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==
"@chirpstack/chirpstack-api-grpc-web@file:../api/grpc-web":
version "4.1.3"
version "4.3.1"
dependencies:
"@types/google-protobuf" "^3.15.6"
google-protobuf "^3.21.2"
@ -3315,11 +3315,16 @@ acorn@^7.0.0, acorn@^7.1.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.0:
acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.0:
version "8.8.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.0.tgz#88c0187620435c7f6015803f5539dae05a9dbea8"
integrity sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==
acorn@^8.7.1:
version "8.8.2"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.8.2.tgz#1b2f25db02af965399b9776b0c2c391276d37c4a"
integrity sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==
address@^1.0.1:
version "1.1.2"
resolved "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz#bf1116c9c758c51b7a933d296b72c221ed9428b6"
@ -4001,9 +4006,9 @@ caniuse-api@^3.0.0:
lodash.uniq "^4.5.0"
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001332:
version "1.0.30001338"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001338.tgz#b5dd7a7941a51a16480bdf6ff82bded1628eec0d"
integrity sha512-1gLHWyfVoRDsHieO+CaeYe7jSo/MT7D7lhaXUiwwbuR5BwQxORs0f1tAwUSQr3YbxRXJvxHM/PA5FfPQRnsPeQ==
version "1.0.30001477"
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001477.tgz"
integrity sha512-lZim4iUHhGcy5p+Ri/G7m84hJwncj+Kz7S5aD4hoQfslKZJgt0tHc/hafVbqHC5bbhHb+mrW2JOUHkI5KH7toQ==
case-sensitive-paths-webpack-plugin@^2.4.0:
version "2.4.0"
@ -4823,9 +4828,9 @@ dns-equal@^1.0.0:
integrity sha1-s55/HabrCnW6nBcySzR1PEfgZU0=
dns-packet@^5.2.2:
version "5.3.1"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.3.1.tgz#eb94413789daec0f0ebe2fcc230bdc9d7c91b43d"
integrity sha512-spBwIj0TK0Ey3666GwIdWVfUpLyubpU53BTCu8iPn4r4oXd9O14Hjg3EHw3ts2oed77/SeckunUYCyRlSngqHw==
version "5.4.0"
resolved "https://registry.yarnpkg.com/dns-packet/-/dns-packet-5.4.0.tgz#1f88477cf9f27e78a213fb6d118ae38e759a879b"
integrity sha512-EgqGeaBB8hLiHLZtp/IbaDQTL8pZ0+IvwzSHA6d7VyMDM+B9hgddEMa9xjK5oYnw0ci0JQ6g2XCD7/f6cafU6g==
dependencies:
"@leichtgewicht/ip-codec" "^2.0.1"
@ -4993,10 +4998,10 @@ encodeurl@~1.0.2:
resolved "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz#ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59"
integrity sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=
enhanced-resolve@^5.9.2:
version "5.9.3"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz#44a342c012cbc473254af5cc6ae20ebd0aae5d88"
integrity sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==
enhanced-resolve@^5.10.0:
version "5.12.0"
resolved "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz#300e1c90228f5b570c4d35babf263f6da7155634"
integrity sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==
dependencies:
graceful-fs "^4.2.4"
tapable "^2.2.0"
@ -7020,6 +7025,11 @@ jest@^27.4.3:
import-local "^3.0.2"
jest-cli "^27.5.1"
js-file-download@^0.4.12:
version "0.4.12"
resolved "https://registry.yarnpkg.com/js-file-download/-/js-file-download-0.4.12.tgz#10c70ef362559a5b23cdbdc3bd6f399c3d91d821"
integrity sha512-rML+NkoD08p5Dllpjo0ffy4jRHeY6Zsapvr/W86N7E0yuzAO6qa5X9+xog6zQNlH102J7IXljNY2FtS6Lj3ucg==
"js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0:
version "4.0.0"
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
@ -7083,12 +7093,7 @@ jsesc@~0.5.0:
resolved "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz#e7dee66e35d6fc16f710fe91d5cf69f70f08911d"
integrity sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=
json-parse-better-errors@^1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz#bb867cfb3450e69107c131d1c514bab3dc8bcaa9"
integrity sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==
json-parse-even-better-errors@^2.3.0:
json-parse-even-better-errors@^2.3.0, json-parse-even-better-errors@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz#7c47805a94319928e05777405dc12e1f7a4ee02d"
integrity sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==
@ -11143,10 +11148,10 @@ walker@^1.0.7:
dependencies:
makeerror "1.0.x"
watchpack@^2.3.1:
version "2.3.1"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.1.tgz#4200d9447b401156eeca7767ee610f8809bc9d25"
integrity sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==
watchpack@^2.4.0:
version "2.4.0"
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.4.0.tgz#fa33032374962c78113f93c7f2fb4c54c9862a5d"
integrity sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==
dependencies:
glob-to-regexp "^0.4.1"
graceful-fs "^4.1.2"
@ -11254,33 +11259,33 @@ webpack-sources@^3.2.3:
integrity sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==
webpack@^5.64.4:
version "5.72.0"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.72.0.tgz#f8bc40d9c6bb489a4b7a8a685101d6022b8b6e28"
integrity sha512-qmSmbspI0Qo5ld49htys8GY9XhS9CGqFoHTsOVAnjBdg0Zn79y135R+k4IR4rKK6+eKaabMhJwiVB7xw0SJu5w==
version "5.76.3"
resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.76.3.tgz#dffdc72c8950e5b032fddad9c4452e7787d2f489"
integrity sha512-18Qv7uGPU8b2vqGeEEObnfICyw2g39CHlDEK4I7NK13LOur1d0HGmGNKGT58Eluwddpn3oEejwvBPoP4M7/KSA==
dependencies:
"@types/eslint-scope" "^3.7.3"
"@types/estree" "^0.0.51"
"@webassemblyjs/ast" "1.11.1"
"@webassemblyjs/wasm-edit" "1.11.1"
"@webassemblyjs/wasm-parser" "1.11.1"
acorn "^8.4.1"
acorn "^8.7.1"
acorn-import-assertions "^1.7.6"
browserslist "^4.14.5"
chrome-trace-event "^1.0.2"
enhanced-resolve "^5.9.2"
enhanced-resolve "^5.10.0"
es-module-lexer "^0.9.0"
eslint-scope "5.1.1"
events "^3.2.0"
glob-to-regexp "^0.4.1"
graceful-fs "^4.2.9"
json-parse-better-errors "^1.0.2"
json-parse-even-better-errors "^2.3.1"
loader-runner "^4.2.0"
mime-types "^2.1.27"
neo-async "^2.6.2"
schema-utils "^3.1.0"
tapable "^2.1.1"
terser-webpack-plugin "^5.1.3"
watchpack "^2.3.1"
watchpack "^2.4.0"
webpack-sources "^3.2.3"
websocket-driver@>=0.5.1, websocket-driver@^0.7.4: