mirror of
https://github.com/MeshEnvy/mesh-forge.git
synced 2026-03-28 17:42:55 +01:00
917 lines
63 KiB
Diff
917 lines
63 KiB
Diff
diff --git a/.gitignore b/.gitignore
|
|
index cc742c6c1..0b75b63b8 100644
|
|
--- a/.gitignore
|
|
+++ b/.gitignore
|
|
@@ -32,7 +32,7 @@ __pycache__
|
|
*.swo
|
|
*~
|
|
|
|
-venv/
|
|
+.venv/
|
|
release/
|
|
.vscode/extensions.json
|
|
/compile_commands.json
|
|
@@ -41,3 +41,11 @@ src/mesh/raspihttp/private_key.pem
|
|
|
|
# Ignore logo (set at build time with platformio-custom.py)
|
|
data/boot/logo.*
|
|
+
|
|
+# Ignore 3rd party plugins
|
|
+plugins/*
|
|
+!plugins/README.md
|
|
+!plugins/sample-plugin
|
|
+
|
|
+# Ignore Python vendor directory
|
|
+pyvendor
|
|
\ No newline at end of file
|
|
diff --git a/bin/mpm_pio.py b/bin/mpm_pio.py
|
|
new file mode 100644
|
|
index 000000000..c75573465
|
|
--- /dev/null
|
|
+++ b/bin/mpm_pio.py
|
|
@@ -0,0 +1,116 @@
|
|
+#!/usr/bin/env python3
|
|
+"""
|
|
+Mesh Plugin Manager (MPM) - PlatformIO build integration shim.
|
|
+
|
|
+This script is intended to be used only as a PlatformIO extra_script.
|
|
+It imports the real `mpm` package from Poetry's `.venv` and
|
|
+exposes the build helpers expected by the firmware build.
|
|
+"""
|
|
+
|
|
+import os
|
|
+import sys
|
|
+import glob
|
|
+
|
|
+# Provided by PlatformIO/SCons when used as `pre:` extra_script
|
|
+Import("env") # type: ignore[name-defined] # noqa: F821
|
|
+
|
|
+
|
|
+def find_site_packages(venv_dir, label=""):
|
|
+ """Find site-packages directory in a venv (handles different Python versions)."""
|
|
+ if not os.path.isdir(venv_dir):
|
|
+ print(f"MPM: {strip_root_dir(venv_dir)} ({label}) does not exist or is not a directory")
|
|
+ return None
|
|
+ lib_dir = os.path.join(venv_dir, "lib")
|
|
+ if not os.path.isdir(lib_dir):
|
|
+ print(f"MPM: {strip_root_dir(lib_dir)} ({label}) does not exist or is not a directory")
|
|
+ return None
|
|
+ pattern = os.path.join(lib_dir, "python*/site-packages")
|
|
+ matches = glob.glob(pattern)
|
|
+ return matches[0] if matches else None
|
|
+
|
|
+
|
|
+def add_to_path(directory, env_var="PATH", label=""):
|
|
+ """Add directory to environment variable if it exists and isn't already present."""
|
|
+ if not directory or not os.path.isdir(directory):
|
|
+ print(f"MPM: {strip_root_dir(directory)} ({label}) does not exist or is not a directory")
|
|
+ return False
|
|
+ current = os.environ.get(env_var, "")
|
|
+ if directory not in current:
|
|
+ os.environ[env_var] = f"{directory}:{current}" if current else directory
|
|
+ print(f"MPM: Added {strip_root_dir(directory)} ({label}) to {env_var}")
|
|
+ return True
|
|
+ return False
|
|
+
|
|
+
|
|
+def add_to_sys_path(directory, label=""):
|
|
+ """Add directory to sys.path if it exists and isn't already present."""
|
|
+ if not directory or not os.path.isdir(directory):
|
|
+ print(f"MPM: {strip_root_dir(directory)} ({label}) does not exist or is not a directory")
|
|
+ return False
|
|
+ if directory not in sys.path:
|
|
+ sys.path.insert(0, directory)
|
|
+ print(f"MPM: Added {strip_root_dir(directory)} ({label}) to sys.path")
|
|
+ return True
|
|
+ return False
|
|
+
|
|
+
|
|
+# Find Poetry's .venv directory using PROJECT_DIR from PlatformIO env
|
|
+# (__file__ is not available when exec'd by SCons)
|
|
+project_dir = env["PROJECT_DIR"] # type: ignore[name-defined] # noqa: F821
|
|
+print(f"MPM DEBUG: project_dir = {project_dir}")
|
|
+
|
|
+root_dir = os.path.abspath(os.path.join(project_dir, ".."))
|
|
+print(f"MPM DEBUG: root_dir = {root_dir}")
|
|
+
|
|
+def strip_root_dir(path):
|
|
+ if path is None:
|
|
+ return "./"
|
|
+ return "./" + os.path.relpath(path, root_dir)
|
|
+
|
|
+# First, try to find mpm source and mpm's .venv for local development
|
|
+# (mpm is at ../../mpm relative to firmware directory)
|
|
+mpm_dir = os.path.join(project_dir, "..", "mpm")
|
|
+mpm_dir = os.path.abspath(mpm_dir) # Resolve relative path
|
|
+mpm_source_dir = os.path.join(mpm_dir, "src")
|
|
+mpm_venv_dir = os.path.join(mpm_dir, ".venv")
|
|
+firmware_venv_dir = os.path.join(project_dir, ".venv")
|
|
+mpm_site_packages = find_site_packages(mpm_venv_dir, "mpm .venv")
|
|
+firmware_site_packages = find_site_packages(firmware_venv_dir, "firmware .venv")
|
|
+mpm_venv_bin = os.path.join(mpm_venv_dir, "bin")
|
|
+firmware_venv_bin = os.path.join(firmware_venv_dir, "bin")
|
|
+
|
|
+print(f"MPM Directories:")
|
|
+print(f" mpm_dir: {strip_root_dir(mpm_dir)}")
|
|
+print(f" mpm_source_dir: {strip_root_dir(mpm_source_dir)}")
|
|
+print(f" mpm_venv_dir: {strip_root_dir(mpm_venv_dir)}")
|
|
+print(f" firmware_venv_dir: {strip_root_dir(firmware_venv_dir)}")
|
|
+print(f" mpm_site_packages: {strip_root_dir(mpm_site_packages)}")
|
|
+print(f" firmware_site_packages: {strip_root_dir(firmware_site_packages)}")
|
|
+print(f" mpm_venv_bin: {strip_root_dir(mpm_venv_bin)}")
|
|
+print(f" firmware_venv_bin: {strip_root_dir(firmware_venv_bin) }")
|
|
+
|
|
+# These are in reverse order because they are prepended to sys.path
|
|
+add_to_sys_path(firmware_site_packages, "firmware .venv") # Look for this last
|
|
+add_to_sys_path(mpm_site_packages, "mpm .venv") # Look for this next
|
|
+add_to_sys_path(mpm_source_dir, "mpm/src") # Look for this first
|
|
+
|
|
+# Add .venv/bin to PATH (prioritize mpm's .venv)
|
|
+add_to_path(firmware_venv_bin, "PATH", "firmware .venv/bin")
|
|
+add_to_path(mpm_venv_bin, "PATH", "mpm .venv/bin")
|
|
+
|
|
+add_to_path(mpm_site_packages, "PYTHONPATH", "mpm .venv/site-packages")
|
|
+add_to_path(firmware_site_packages, "PYTHONPATH", "firmware .venv/site-packages")
|
|
+
|
|
+# Use the installed `mpm` package
|
|
+from mesh_plugin_manager.build import init_plugins # type: ignore[import]
|
|
+from mesh_plugin_manager.build_utils import scan_plugins # type: ignore[import]
|
|
+from mesh_plugin_manager.proto import generate_all_protobuf_files # type: ignore[import]
|
|
+
|
|
+# Auto-initialize when imported by PlatformIO (not when run as __main__)
|
|
+if __name__ != "__main__":
|
|
+ try:
|
|
+ init_plugins(env) # type: ignore[name-defined] # noqa: F821
|
|
+ except NameError:
|
|
+ # If env is missing for some reason, just skip auto-init
|
|
+ pass
|
|
+
|
|
diff --git a/platformio.ini b/platformio.ini
|
|
index 1363a63fc..c775b2aab 100644
|
|
--- a/platformio.ini
|
|
+++ b/platformio.ini
|
|
@@ -14,7 +14,9 @@ description = Meshtastic
|
|
|
|
[env]
|
|
test_build_src = true
|
|
-extra_scripts = bin/platformio-custom.py
|
|
+extra_scripts =
|
|
+ bin/platformio-custom.py
|
|
+ pre:bin/mpm_pio.py
|
|
; note: we add src to our include search path so that lmic_project_config can override
|
|
; note: TINYGPS_OPTION_NO_CUSTOM_FIELDS is VERY important. We don't use custom fields and somewhere in that pile
|
|
; of code is a heap corruption bug!
|
|
@@ -24,6 +26,7 @@ build_flags = -Wno-missing-field-initializers
|
|
|
|
-Wno-format
|
|
-Isrc -Isrc/mesh -Isrc/mesh/generated -Isrc/gps -Isrc/buzz -Wl,-Map,"${platformio.build_dir}"/output.map
|
|
+ -Isrc/modules
|
|
-DUSE_THREAD_NAMES
|
|
-DTINYGPS_OPTION_NO_CUSTOM_FIELDS
|
|
-DPB_ENABLE_MALLOC=1
|
|
diff --git a/plugins/README.md b/plugins/README.md
|
|
new file mode 100644
|
|
index 000000000..0643d1f62
|
|
--- /dev/null
|
|
+++ b/plugins/README.md
|
|
@@ -0,0 +1,99 @@
|
|
+# Plugin Development Guide
|
|
+
|
|
+This directory houses plugins that extend the Meshtastic firmware. Plugins are automatically discovered and integrated into the build system.
|
|
+
|
|
+## Plugin Structure
|
|
+
|
|
+The only requirement for a plugin is that it must have a `./src` directory:
|
|
+
|
|
+```
|
|
+src/plugins/
|
|
+└── myplugin/
|
|
+ └── src/
|
|
+ ├── MyModule.h
|
|
+ ├── MyModule.cpp
|
|
+ └── mymodule.proto
|
|
+```
|
|
+
|
|
+- Plugin directory name can be anything
|
|
+- All source files must be placed in `./src`
|
|
+- Only files in `./src` are compiled (the root plugin directory and all other subdirectories are excluded from the build)
|
|
+
|
|
+## Python Dependencies
|
|
+
|
|
+The Mesh Plugin Manager (MPM) is installed as a development dependency via Poetry. To use MPM commands, run them through Poetry:
|
|
+
|
|
+```bash
|
|
+# From the firmware repo root (directory containing platformio.ini)
|
|
+poetry run mpm <command>
|
|
+```
|
|
+
|
|
+**Important**: Poetry must be configured to create the virtual environment in the project directory (`.venv`) so that the PlatformIO build system can find it. Configure it locally for the project:
|
|
+
|
|
+```bash
|
|
+poetry config virtualenvs.in-project true --local
|
|
+poetry install
|
|
+```
|
|
+
|
|
+The build system automatically uses MPM from the Poetry virtual environment during PlatformIO builds.
|
|
+
|
|
+## Automatic Protobuf Generation
|
|
+
|
|
+For convenience, the Meshtastic Plugin Manager (MPM) automatically scans for and generates protobuf files:
|
|
+
|
|
+- **Discovery**: MPM recursively scans plugin directories for `.proto` files
|
|
+- **Options file**: Auto-detects matching `.options` files (e.g., `mymodule.proto` → `mymodule.options`)
|
|
+- **Generation**: Uses `nanopb` tooling from the Poetry virtual environment to generate C++ files
|
|
+- **Output**: Generated files are placed in the same directory as the `.proto` file
|
|
+- **Timing**: Runs during PlatformIO pre-build phase (configured in `platformio.ini`)
|
|
+
|
|
+**Note**: You can use the Mesh Plugin Manager CLI via `poetry run mpm` to inspect or manage plugins.
|
|
+
|
|
+Example protobuf structure:
|
|
+
|
|
+```
|
|
+src/plugins/myplugin/src/
|
|
+├── mymodule.proto # Protobuf definition
|
|
+├── mymodule.options # Nanopb options (optional)
|
|
+├── mymodule.pb.h # Generated header
|
|
+└── mymodule.pb.c # Generated implementation
|
|
+```
|
|
+
|
|
+## Include Path Setup
|
|
+
|
|
+The plugin's `src/` directory is automatically added to the compiler's include path (`CPPPATH`) during build:
|
|
+
|
|
+- Headers in `src/` can be included directly: `#include "MyModule.h"`
|
|
+- No need to specify relative paths from other plugin files
|
|
+- The build system handles this automatically via `bin/mpm.py`
|
|
+
|
|
+## Module Registration
|
|
+
|
|
+If your plugin implements a Meshtastic module, you can use the automatic registration system:
|
|
+
|
|
+1. Include `ModuleRegistry.h` in your module `.cpp` file
|
|
+2. Place `MESHTASTIC_REGISTER_MODULE(ModuleClassName)` at the end of your implementation file
|
|
+3. Your module will be automatically initialized when the firmware starts
|
|
+
|
|
+Example:
|
|
+
|
|
+```cpp
|
|
+#include "MyModule.h"
|
|
+#include "ModuleRegistry.h"
|
|
+
|
|
+// ... module implementation ...
|
|
+
|
|
+MESHTASTIC_REGISTER_MODULE(MyModule);
|
|
+```
|
|
+
|
|
+**Note**: Module registration is optional. Plugins that don't implement Meshtastic modules (e.g., utility libraries) don't need this.
|
|
+
|
|
+For details on writing Meshtastic modules, see the [Module API documentation](https://meshtastic.org/docs/development/device/module-api/).
|
|
+
|
|
+## Example Plugin
|
|
+
|
|
+See the `lobbs` plugin for a complete example that demonstrates:
|
|
+
|
|
+- Protobuf definitions with options file
|
|
+- Module implementation with automatic registration
|
|
+- Proper source file organization
|
|
diff --git a/plugins/sample-plugin/README.md b/plugins/sample-plugin/README.md
|
|
new file mode 100644
|
|
index 000000000..f60ee9b9c
|
|
--- /dev/null
|
|
+++ b/plugins/sample-plugin/README.md
|
|
@@ -0,0 +1 @@
|
|
+Sample plugin
|
|
\ No newline at end of file
|
|
diff --git a/plugins/sample-plugin/src/SampleModule.cpp b/plugins/sample-plugin/src/SampleModule.cpp
|
|
new file mode 100644
|
|
index 000000000..647c78bd5
|
|
--- /dev/null
|
|
+++ b/plugins/sample-plugin/src/SampleModule.cpp
|
|
@@ -0,0 +1,13 @@
|
|
+#include "ModuleRegistry.h"
|
|
+#include "SinglePortModule.h"
|
|
+
|
|
+class MySampleModule : public SinglePortModule
|
|
+{
|
|
+ public:
|
|
+ MySampleModule() : SinglePortModule("my_sample_module", meshtastic_PortNum_REPLY_APP) {
|
|
+ LOG_INFO("MySampleModule constructor");
|
|
+ }
|
|
+};
|
|
+
|
|
+
|
|
+MESHTASTIC_REGISTER_MODULE(MySampleModule)
|
|
\ No newline at end of file
|
|
diff --git a/plugins/sample-plugin/src/SampleModule.h b/plugins/sample-plugin/src/SampleModule.h
|
|
new file mode 100644
|
|
index 000000000..4faef7774
|
|
--- /dev/null
|
|
+++ b/plugins/sample-plugin/src/SampleModule.h
|
|
@@ -0,0 +1,12 @@
|
|
+#ifndef SAMPLE_MODULE_H
|
|
+#define SAMPLE_MODULE_H
|
|
+
|
|
+#include "SinglePortModule.h"
|
|
+
|
|
+class MySampleModule : public SinglePortModule
|
|
+{
|
|
+ public:
|
|
+ MySampleModule() : SinglePortModule("my_sample_module", meshtastic_PortNum_REPLY_APP);
|
|
+};
|
|
+
|
|
+#endif
|
|
\ No newline at end of file
|
|
diff --git a/poetry.lock b/poetry.lock
|
|
new file mode 100644
|
|
index 000000000..9d9f1b97b
|
|
--- /dev/null
|
|
+++ b/poetry.lock
|
|
@@ -0,0 +1,468 @@
|
|
+# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
|
|
+
|
|
+[[package]]
|
|
+name = "certifi"
|
|
+version = "2025.11.12"
|
|
+description = "Python package for providing Mozilla's CA Bundle."
|
|
+optional = false
|
|
+python-versions = ">=3.7"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"},
|
|
+ {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"},
|
|
+]
|
|
+
|
|
+[[package]]
|
|
+name = "charset-normalizer"
|
|
+version = "3.4.4"
|
|
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
|
+optional = false
|
|
+python-versions = ">=3.7"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"},
|
|
+ {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"},
|
|
+ {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"},
|
|
+ {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"},
|
|
+ {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"},
|
|
+ {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"},
|
|
+ {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"},
|
|
+ {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"},
|
|
+ {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"},
|
|
+]
|
|
+
|
|
+[[package]]
|
|
+name = "grpcio"
|
|
+version = "1.76.0"
|
|
+description = "HTTP/2-based RPC framework"
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:65a20de41e85648e00305c1bb09a3598f840422e522277641145a32d42dcefcc"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:40ad3afe81676fd9ec6d9d406eda00933f218038433980aa19d401490e46ecde"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:035d90bc79eaa4bed83f524331d55e35820725c9fbb00ffa1904d5550ed7ede3"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4215d3a102bd95e2e11b5395c78562967959824156af11fa93d18fdd18050990"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:49ce47231818806067aea3324d4bf13825b658ad662d3b25fada0bdad9b8a6af"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8cc3309d8e08fd79089e13ed4819d0af72aa935dd8f435a195fd152796752ff2"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:971fd5a1d6e62e00d945423a567e42eb1fa678ba89072832185ca836a94daaa6"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9d9adda641db7207e800a7f089068f6f645959f2df27e870ee81d44701dd9db3"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-win32.whl", hash = "sha256:063065249d9e7e0782d03d2bca50787f53bd0fb89a67de9a7b521c4a01f1989b"},
|
|
+ {file = "grpcio-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:a6ae758eb08088d36812dd5d9af7a9859c05b1e0f714470ea243694b49278e7b"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:2e1743fbd7f5fa713a1b0a8ac8ebabf0ec980b5d8809ec358d488e273b9cf02a"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:a8c2cf1209497cf659a667d7dea88985e834c24b7c3b605e6254cbb5076d985c"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:08caea849a9d3c71a542827d6df9d5a69067b0a1efbea8a855633ff5d9571465"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f0e34c2079d47ae9f6188211db9e777c619a21d4faba6977774e8fa43b085e48"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8843114c0cfce61b40ad48df65abcfc00d4dba82eae8718fab5352390848c5da"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8eddfb4d203a237da6f3cc8a540dad0517d274b5a1e9e636fd8d2c79b5c1d397"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:32483fe2aab2c3794101c2a159070584e5db11d0aa091b2c0ea9c4fc43d0d749"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dcfe41187da8992c5f40aa8c5ec086fa3672834d2be57a32384c08d5a05b4c00"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-win32.whl", hash = "sha256:2107b0c024d1b35f4083f11245c0e23846ae64d02f40b2b226684840260ed054"},
|
|
+ {file = "grpcio-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:522175aba7af9113c48ec10cc471b9b9bd4f6ceb36aeb4544a8e2c80ed9d252d"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:81fd9652b37b36f16138611c7e884eb82e0cec137c40d3ef7c3f9b3ed00f6ed8"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:04bbe1bfe3a68bbfd4e52402ab7d4eb59d72d02647ae2042204326cf4bbad280"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d388087771c837cdb6515539f43b9d4bf0b0f23593a24054ac16f7a960be16f4"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:9f8f757bebaaea112c00dba718fc0d3260052ce714e25804a03f93f5d1c6cc11"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:980a846182ce88c4f2f7e2c22c56aefd515daeb36149d1c897f83cf57999e0b6"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f92f88e6c033db65a5ae3d97905c8fea9c725b63e28d5a75cb73b49bda5024d8"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4baf3cbe2f0be3289eb68ac8ae771156971848bb8aaff60bad42005539431980"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:615ba64c208aaceb5ec83bfdce7728b80bfeb8be97562944836a7a0a9647d882"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-win32.whl", hash = "sha256:45d59a649a82df5718fd9527ce775fd66d1af35e6d31abdcdc906a49c6822958"},
|
|
+ {file = "grpcio-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:c088e7a90b6017307f423efbb9d1ba97a22aa2170876223f9709e9d1de0b5347"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:26ef06c73eb53267c2b319f43e6634c7556ea37672029241a056629af27c10e2"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:45e0111e73f43f735d70786557dc38141185072d7ff8dc1829d6a77ac1471468"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:83d57312a58dcfe2a3a0f9d1389b299438909a02db60e2f2ea2ae2d8034909d3"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3e2a27c89eb9ac3d81ec8835e12414d73536c6e620355d65102503064a4ed6eb"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61f69297cba3950a524f61c7c8ee12e55c486cb5f7db47ff9dcee33da6f0d3ae"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6a15c17af8839b6801d554263c546c69c4d7718ad4321e3166175b37eaacca77"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:25a18e9810fbc7e7f03ec2516addc116a957f8cbb8cbc95ccc80faa072743d03"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:931091142fd8cc14edccc0845a79248bc155425eee9a98b2db2ea4f00a235a42"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-win32.whl", hash = "sha256:5e8571632780e08526f118f74170ad8d50fb0a48c23a746bef2a6ebade3abd6f"},
|
|
+ {file = "grpcio-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:f9f7bd5faab55f47231ad8dba7787866b69f5e93bc306e3915606779bbfb4ba8"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:ff8a59ea85a1f2191a0ffcc61298c571bc566332f82e5f5be1b83c9d8e668a62"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:06c3d6b076e7b593905d04fdba6a0525711b3466f43b3400266f04ff735de0cd"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fd5ef5932f6475c436c4a55e4336ebbe47bd3272be04964a03d316bbf4afbcbc"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b331680e46239e090f5b3cead313cc772f6caa7d0fc8de349337563125361a4a"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2229ae655ec4e8999599469559e97630185fdd53ae1e8997d147b7c9b2b72cba"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:490fa6d203992c47c7b9e4a9d39003a0c2bcc1c9aa3c058730884bbbb0ee9f09"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:479496325ce554792dba6548fae3df31a72cef7bad71ca2e12b0e58f9b336bfc"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:1c9b93f79f48b03ada57ea24725d83a30284a012ec27eab2cf7e50a550cbbbcc"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-win32.whl", hash = "sha256:747fa73efa9b8b1488a95d0ba1039c8e2dca0f741612d80415b1e1c560febf4e"},
|
|
+ {file = "grpcio-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:922fa70ba549fce362d2e2871ab542082d66e2aaf0c19480ea453905b01f384e"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:8ebe63ee5f8fa4296b1b8cfc743f870d10e902ca18afc65c68cf46fd39bb0783"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:3bf0f392c0b806905ed174dcd8bdd5e418a40d5567a05615a030a5aeddea692d"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b7604868b38c1bfd5cf72d768aedd7db41d78cb6a4a18585e33fb0f9f2363fd"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:e6d1db20594d9daba22f90da738b1a0441a7427552cc6e2e3d1297aeddc00378"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d099566accf23d21037f18a2a63d323075bebace807742e4b0ac210971d4dd70"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ebea5cc3aa8ea72e04df9913492f9a96d9348db876f9dda3ad729cfedf7ac416"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0c37db8606c258e2ee0c56b78c62fc9dee0e901b5dbdcf816c2dd4ad652b8b0c"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ebebf83299b0cb1721a8859ea98f3a77811e35dce7609c5c963b9ad90728f886"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-win32.whl", hash = "sha256:0aaa82d0813fd4c8e589fac9b65d7dd88702555f702fb10417f96e2a2a6d4c0f"},
|
|
+ {file = "grpcio-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:acab0277c40eff7143c2323190ea57b9ee5fd353d8190ee9652369fae735668a"},
|
|
+ {file = "grpcio-1.76.0.tar.gz", hash = "sha256:7be78388d6da1a25c0d5ec506523db58b18be22d9c37d8d3a32c08be4987bd73"},
|
|
+]
|
|
+
|
|
+[package.dependencies]
|
|
+typing-extensions = ">=4.12,<5.0"
|
|
+
|
|
+[package.extras]
|
|
+protobuf = ["grpcio-tools (>=1.76.0)"]
|
|
+
|
|
+[[package]]
|
|
+name = "grpcio-tools"
|
|
+version = "1.76.0"
|
|
+description = "Protobuf code generator for gRPC"
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:9b99086080ca394f1da9894ee20dedf7292dd614e985dcba58209a86a42de602"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:8d95b5c2394bbbe911cbfc88d15e24c9e174958cb44dad6aa8c46fe367f6cc2a"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d54e9ce2ffc5d01341f0c8898c1471d887ae93d77451884797776e0a505bd503"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c83f39f64c2531336bd8d5c846a2159c9ea6635508b0f8ed3ad0d433e25b53c9"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be480142fae0d986d127d6cb5cbc0357e4124ba22e96bb8b9ece32c48bc2c8ea"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7fefd41fc4ca11fab36f42bdf0f3812252988f8798fca8bec8eae049418deacd"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63551f371082173e259e7f6ec24b5f1fe7d66040fadd975c966647bca605a2d3"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:75a2c34584c99ff47e5bb267866e7dec68d30cd3b2158e1ee495bfd6db5ad4f0"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-win32.whl", hash = "sha256:908758789b0a612102c88e8055b7191eb2c4290d5d6fc50fb9cac737f8011ef1"},
|
|
+ {file = "grpcio_tools-1.76.0-cp310-cp310-win_amd64.whl", hash = "sha256:ec6e49e7c4b2a222eb26d1e1726a07a572b6e629b2cf37e6bb784c9687904a52"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:c6480f6af6833850a85cca1c6b435ef4ffd2ac8e88ef683b4065233827950243"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:c7c23fe1dc09818e16a48853477806ad77dd628b33996f78c05a293065f8210c"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fcdce7f7770ff052cd4e60161764b0b3498c909bde69138f8bd2e7b24a3ecd8f"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:b598fdcebffa931c7da5c9e90b5805fff7e9bc6cf238319358a1b85704c57d33"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6a9818ff884796b12dcf8db32126e40ec1098cacf5697f27af9cfccfca1c1fae"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:105e53435b2eed3961da543db44a2a34479d98d18ea248219856f30a0ca4646b"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:454a1232c7f99410d92fa9923c7851fd4cdaf657ee194eac73ea1fe21b406d6e"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ca9ccf667afc0268d45ab202af4556c72e57ea36ebddc93535e1a25cbd4f8aba"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-win32.whl", hash = "sha256:a83c87513b708228b4cad7619311daba65b40937745103cadca3db94a6472d9c"},
|
|
+ {file = "grpcio_tools-1.76.0-cp311-cp311-win_amd64.whl", hash = "sha256:2ce5e87ec71f2e4041dce4351f2a8e3b713e3bca6b54c69c3fbc6c7ad1f4c386"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:4ad555b8647de1ebaffb25170249f89057721ffb74f7da96834a07b4855bb46a"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:243af7c8fc7ff22a40a42eb8e0f6f66963c1920b75aae2a2ec503a9c3c8b31c1"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8207b890f423142cc0025d041fb058f7286318df6a049565c27869d73534228b"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:3dafa34c2626a6691d103877e8a145f54c34cf6530975f695b396ed2fc5c98f8"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:30f1d2dda6ece285b3d9084e94f66fa721ebdba14ae76b2bc4c581c8a166535c"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a889af059dc6dbb82d7b417aa581601316e364fe12eb54c1b8d95311ea50916d"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c3f2c3c44c56eb5d479ab178f0174595d0a974c37dade442f05bb73dfec02f31"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:479ce02dff684046f909a487d452a83a96b4231f7c70a3b218a075d54e951f56"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-win32.whl", hash = "sha256:9ba4bb539936642a44418b38ee6c3e8823c037699e2cb282bd8a44d76a4be833"},
|
|
+ {file = "grpcio_tools-1.76.0-cp312-cp312-win_amd64.whl", hash = "sha256:0cd489016766b05f9ed8a6b6596004b62c57d323f49593eac84add032a6d43f7"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-linux_armv7l.whl", hash = "sha256:ff48969f81858397ef33a36b326f2dbe2053a48b254593785707845db73c8f44"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:aa2f030fd0ef17926026ee8e2b700e388d3439155d145c568fa6b32693277613"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bacbf3c54f88c38de8e28f8d9b97c90b76b105fb9ddef05d2c50df01b32b92af"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0d4e4afe9a0e3c24fad2f1af45f98cf8700b2bfc4d790795756ba035d2ea7bdc"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fbbd4e1fc5af98001ceef5e780e8c10921d94941c3809238081e73818ef707f1"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b05efe5a59883ab8292d596657273a60e0c3e4f5a9723c32feb9fc3a06f2f3ef"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:be483b90e62b7892eb71fa1fc49750bee5b2ee35b5ec99dd2b32bed4bedb5d71"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:630cd7fd3e8a63e20703a7ad816979073c2253e591b5422583c27cae2570de73"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-win32.whl", hash = "sha256:eb2567280f9f6da5444043f0e84d8408c7a10df9ba3201026b30e40ef3814736"},
|
|
+ {file = "grpcio_tools-1.76.0-cp313-cp313-win_amd64.whl", hash = "sha256:0071b1c0bd0f5f9d292dca4efab32c92725d418e57f9c60acdc33c0172af8b53"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-linux_armv7l.whl", hash = "sha256:c53c5719ef2a435997755abde3826ba4087174bd432aa721d8fac781fcea79e4"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:e3db1300d7282264639eeee7243f5de7e6a7c0283f8bf05d66c0315b7b0f0b36"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0b018a4b7455a7e8c16d0fdb3655a6ba6c9536da6de6c5d4f11b6bb73378165b"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ec6e4de3866e47cfde56607b1fae83ecc5aa546e06dec53de11f88063f4b5275"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b8da4d828883913f1852bdd67383713ae5c11842f6c70f93f31893eab530aead"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:5c120c2cf4443121800e7f9bcfe2e94519fa25f3bb0b9882359dd3b252c78a7b"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:8b7df5591d699cd9076065f1f15049e9c3597e0771bea51c8c97790caf5e4197"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:a25048c5f984d33e3f5b6ad7618e98736542461213ade1bd6f2fcfe8ce804e3d"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-win32.whl", hash = "sha256:4b77ce6b6c17869858cfe14681ad09ed3a8a80e960e96035de1fd87f78158740"},
|
|
+ {file = "grpcio_tools-1.76.0-cp314-cp314-win_amd64.whl", hash = "sha256:2ccd2c8d041351cc29d0fc4a84529b11ee35494a700b535c1f820b642f2a72fc"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-linux_armv7l.whl", hash = "sha256:12e1186b0256414a9153d414e4852e7282863a8173ebcee67b3ebe2e1c47a755"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-macosx_11_0_universal2.whl", hash = "sha256:14c17014d2349b9954385bee487f51979b4b7f9067017099ae45c4f93360d373"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:888346b8b3f4152953626e38629ade9d79940ae85c8fd539ce39b72602191fb2"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0cc0b3edf1f076b2475a98122a51f3f3358b9a740dedff1a9a4dec6477ef96"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cbc16156ba2533e5bad16ff1648213dc3b0a0b0e4de6d17b65e8d60578014002"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f919e480983e610263846dbeab22ad808ad0fac6d4bd15c52e9f7f80d1f08479"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:fdd8b382ed21d7d429a9879198743abead0b08ad2249b554fd2f2395450bcdf1"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:fe0cc10dd31ac01cadc8af1ce7877cc770bc2a71aa96569bc3c1897c1eac0116"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-win32.whl", hash = "sha256:6ae1d11477b05baead0fce051dece86a0e79d9b592245e0026c998da11c278c4"},
|
|
+ {file = "grpcio_tools-1.76.0-cp39-cp39-win_amd64.whl", hash = "sha256:2d7679680a456528b9a71a2589cb24d3dd82ec34327281f5695077a567dee433"},
|
|
+ {file = "grpcio_tools-1.76.0.tar.gz", hash = "sha256:ce80169b5e6adf3e8302f3ebb6cb0c3a9f08089133abca4b76ad67f751f5ad88"},
|
|
+]
|
|
+
|
|
+[package.dependencies]
|
|
+grpcio = ">=1.76.0"
|
|
+protobuf = ">=6.31.1,<7.0.0"
|
|
+setuptools = "*"
|
|
+
|
|
+[[package]]
|
|
+name = "idna"
|
|
+version = "3.11"
|
|
+description = "Internationalized Domain Names in Applications (IDNA)"
|
|
+optional = false
|
|
+python-versions = ">=3.8"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"},
|
|
+ {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"},
|
|
+]
|
|
+
|
|
+[package.extras]
|
|
+all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
|
|
+
|
|
+[[package]]
|
|
+name = "mesh-plugin-manager"
|
|
+version = "1.0.1"
|
|
+description = ""
|
|
+optional = false
|
|
+python-versions = ">=3.14"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "mesh_plugin_manager-1.0.1-py3-none-any.whl", hash = "sha256:2880baf3d9991102d30297d597730c89cfa7977d2c6b9003c98bec92bd553160"},
|
|
+ {file = "mesh_plugin_manager-1.0.1.tar.gz", hash = "sha256:f307ac5569e9922157bd8c5047b607dba3f31e4bff11f23255cf0eacc186f99f"},
|
|
+]
|
|
+
|
|
+[package.dependencies]
|
|
+grpcio-tools = ">=1.0.0"
|
|
+nanopb = ">=0.4.9"
|
|
+requests = ">=2.31.0"
|
|
+resolvelib = ">=1.0.0"
|
|
+semver = ">=3.0.0"
|
|
+
|
|
+[[package]]
|
|
+name = "nanopb"
|
|
+version = "0.4.9.1"
|
|
+description = "Nanopb is a small code-size Protocol Buffers implementation in ansi C. It is especially suitable for use in microcontrollers, but fits any memory restricted system."
|
|
+optional = false
|
|
+python-versions = ">=2.7"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "nanopb-0.4.9.1-py2.py3-none-any.whl", hash = "sha256:9bd159eb50e7568b49dc3051839f346f9a2408454cddfc4cf100ab95470a73d4"},
|
|
+ {file = "nanopb-0.4.9.1.tar.gz", hash = "sha256:96244de4e41b986ac5778196e66708195bad503e95dece5dc3a2e739527d7e26"},
|
|
+]
|
|
+
|
|
+[package.dependencies]
|
|
+protobuf = ">=3.19"
|
|
+
|
|
+[package.extras]
|
|
+grpcio-tools = ["grpcio-tools (>=1.46.0)"]
|
|
+
|
|
+[[package]]
|
|
+name = "protobuf"
|
|
+version = "6.33.1"
|
|
+description = ""
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b"},
|
|
+ {file = "protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed"},
|
|
+ {file = "protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490"},
|
|
+ {file = "protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178"},
|
|
+ {file = "protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53"},
|
|
+ {file = "protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1"},
|
|
+ {file = "protobuf-6.33.1-cp39-cp39-win32.whl", hash = "sha256:023af8449482fa884d88b4563d85e83accab54138ae098924a985bcbb734a213"},
|
|
+ {file = "protobuf-6.33.1-cp39-cp39-win_amd64.whl", hash = "sha256:df051de4fd7e5e4371334e234c62ba43763f15ab605579e04c7008c05735cd82"},
|
|
+ {file = "protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa"},
|
|
+ {file = "protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b"},
|
|
+]
|
|
+
|
|
+[[package]]
|
|
+name = "requests"
|
|
+version = "2.32.5"
|
|
+description = "Python HTTP for Humans."
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"},
|
|
+ {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"},
|
|
+]
|
|
+
|
|
+[package.dependencies]
|
|
+certifi = ">=2017.4.17"
|
|
+charset_normalizer = ">=2,<4"
|
|
+idna = ">=2.5,<4"
|
|
+urllib3 = ">=1.21.1,<3"
|
|
+
|
|
+[package.extras]
|
|
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
|
|
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
|
|
+
|
|
+[[package]]
|
|
+name = "resolvelib"
|
|
+version = "1.2.1"
|
|
+description = "Resolve abstract dependencies into concrete ones"
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "resolvelib-1.2.1-py3-none-any.whl", hash = "sha256:fb06b66c8da04172d9e72a21d7d06186d8919e32ae5ab5cdf5b9d920be805ac2"},
|
|
+ {file = "resolvelib-1.2.1.tar.gz", hash = "sha256:7d08a2022f6e16ce405d60b68c390f054efcfd0477d4b9bd019cc941c28fad1c"},
|
|
+]
|
|
+
|
|
+[package.extras]
|
|
+lint = ["mypy", "ruff", "types-requests"]
|
|
+release = ["build", "towncrier", "twine"]
|
|
+test = ["packaging", "pytest"]
|
|
+
|
|
+[[package]]
|
|
+name = "semver"
|
|
+version = "3.0.4"
|
|
+description = "Python helper for Semantic Versioning (https://semver.org)"
|
|
+optional = false
|
|
+python-versions = ">=3.7"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "semver-3.0.4-py3-none-any.whl", hash = "sha256:9c824d87ba7f7ab4a1890799cec8596f15c1241cb473404ea1cb0c55e4b04746"},
|
|
+ {file = "semver-3.0.4.tar.gz", hash = "sha256:afc7d8c584a5ed0a11033af086e8af226a9c0b206f313e0301f8dd7b6b589602"},
|
|
+]
|
|
+
|
|
+[[package]]
|
|
+name = "setuptools"
|
|
+version = "80.9.0"
|
|
+description = "Easily download, build, install, upgrade, and uninstall Python packages"
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922"},
|
|
+ {file = "setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c"},
|
|
+]
|
|
+
|
|
+[package.extras]
|
|
+check = ["pytest-checkdocs (>=2.4)", "pytest-ruff (>=0.2.1) ; sys_platform != \"cygwin\"", "ruff (>=0.8.0) ; sys_platform != \"cygwin\""]
|
|
+core = ["importlib_metadata (>=6) ; python_version < \"3.10\"", "jaraco.functools (>=4)", "jaraco.text (>=3.7)", "more_itertools", "more_itertools (>=8.8)", "packaging (>=24.2)", "platformdirs (>=4.2.2)", "tomli (>=2.0.1) ; python_version < \"3.11\"", "wheel (>=0.43.0)"]
|
|
+cover = ["pytest-cov"]
|
|
+doc = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "pyproject-hooks (!=1.1)", "rst.linker (>=1.9)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier", "towncrier (<24.7)"]
|
|
+enabler = ["pytest-enabler (>=2.2)"]
|
|
+test = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "ini2toml[lite] (>=0.14)", "jaraco.develop (>=7.21) ; python_version >= \"3.9\" and sys_platform != \"cygwin\"", "jaraco.envs (>=2.2)", "jaraco.path (>=3.7.2)", "jaraco.test (>=5.5)", "packaging (>=24.2)", "pip (>=19.1)", "pyproject-hooks (!=1.1)", "pytest (>=6,!=8.1.*)", "pytest-home (>=0.5)", "pytest-perf ; sys_platform != \"cygwin\"", "pytest-subprocess", "pytest-timeout", "pytest-xdist (>=3)", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel (>=0.44.0)"]
|
|
+type = ["importlib_metadata (>=7.0.2) ; python_version < \"3.10\"", "jaraco.develop (>=7.21) ; sys_platform != \"cygwin\"", "mypy (==1.14.*)", "pytest-mypy"]
|
|
+
|
|
+[[package]]
|
|
+name = "typing-extensions"
|
|
+version = "4.15.0"
|
|
+description = "Backported and Experimental Type Hints for Python 3.9+"
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"},
|
|
+ {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"},
|
|
+]
|
|
+
|
|
+[[package]]
|
|
+name = "urllib3"
|
|
+version = "2.5.0"
|
|
+description = "HTTP library with thread-safe connection pooling, file post, and more."
|
|
+optional = false
|
|
+python-versions = ">=3.9"
|
|
+groups = ["main"]
|
|
+files = [
|
|
+ {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"},
|
|
+ {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"},
|
|
+]
|
|
+
|
|
+[package.extras]
|
|
+brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""]
|
|
+h2 = ["h2 (>=4,<5)"]
|
|
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
|
|
+zstd = ["zstandard (>=0.18.0)"]
|
|
+
|
|
+[metadata]
|
|
+lock-version = "2.1"
|
|
+python-versions = ">=3.14"
|
|
+content-hash = "ee2d4092588dc9bdf6c361a299dbbbaed90b489bbaeb9b2580184f3e06e51b88"
|
|
diff --git a/pyproject.toml b/pyproject.toml
|
|
new file mode 100644
|
|
index 000000000..0c47b1ea6
|
|
--- /dev/null
|
|
+++ b/pyproject.toml
|
|
@@ -0,0 +1,15 @@
|
|
+[project]
|
|
+name = "firmware"
|
|
+version = "2.8.0"
|
|
+description = ""
|
|
+authors = [{ name = "Your Name", email = "you@example.com" }]
|
|
+readme = "README.md"
|
|
+requires-python = ">=3.14"
|
|
+dependencies = ["mesh-plugin-manager (>=0.1.0,<2.0.0)"]
|
|
+
|
|
+[build-system]
|
|
+requires = ["poetry-core>=2.0.0,<3.0.0"]
|
|
+build-backend = "poetry.core.masonry.api"
|
|
+
|
|
+[tool.poetry]
|
|
+package-mode = false
|
|
diff --git a/src/modules/ModuleRegistry.cpp b/src/modules/ModuleRegistry.cpp
|
|
new file mode 100644
|
|
index 000000000..5c83dc70f
|
|
--- /dev/null
|
|
+++ b/src/modules/ModuleRegistry.cpp
|
|
@@ -0,0 +1,30 @@
|
|
+// src/modules/ModuleRegistry.cpp
|
|
+
|
|
+#include "ModuleRegistry.h"
|
|
+#include "DebugConfiguration.h"
|
|
+
|
|
+// Initialize the global vector in static storage.
|
|
+// This vector will be populated by the constructor-attributed functions.
|
|
+std::vector<ModuleInitFunc> g_module_init_functions;
|
|
+
|
|
+/**
|
|
+ * @brief Called by a module's constructor-attributed function to add
|
|
+ * its setup routine to the central list.
|
|
+ */
|
|
+void register_module_initializer(ModuleInitFunc func) {
|
|
+ // This push_back happens during C++ static initialization, before main().
|
|
+ g_module_init_functions.push_back(func);
|
|
+}
|
|
+
|
|
+/**
|
|
+ * @brief Initializes all modules that have self-registered.
|
|
+ * Called once by the core Meshtastic firmware setup routine.
|
|
+ */
|
|
+void init_dynamic_modules() {
|
|
+ LOG_INFO("Initializing dynamic modules via vector...\n");
|
|
+
|
|
+ // Loop through the collected pointers and execute the setup functions
|
|
+ for (ModuleInitFunc func : g_module_init_functions) {
|
|
+ func(); // Executes the module's initialization code (e.g., new MyModule())
|
|
+ }
|
|
+}
|
|
\ No newline at end of file
|
|
diff --git a/src/modules/ModuleRegistry.h b/src/modules/ModuleRegistry.h
|
|
new file mode 100644
|
|
index 000000000..82f571a5e
|
|
--- /dev/null
|
|
+++ b/src/modules/ModuleRegistry.h
|
|
@@ -0,0 +1,31 @@
|
|
+// src/modules/ModuleRegistry.h
|
|
+
|
|
+#ifndef MODULE_REGISTRY_H
|
|
+#define MODULE_REGISTRY_H
|
|
+
|
|
+#include <vector> // Required for std::vector
|
|
+
|
|
+// Define the function pointer type for module initialization
|
|
+typedef void (*ModuleInitFunc)(void);
|
|
+
|
|
+// The central list to hold pointers to the initialization functions.
|
|
+// This is defined externally in the CPP file.
|
|
+extern std::vector<ModuleInitFunc> g_module_init_functions;
|
|
+
|
|
+// Function that all modules will call to register themselves
|
|
+void register_module_initializer(ModuleInitFunc func);
|
|
+
|
|
+// Function called by the core firmware setup to initialize all modules
|
|
+void init_dynamic_modules();
|
|
+
|
|
+/**
|
|
+ * @brief Macro used by module authors to self-register a new Meshtastic Module.
|
|
+ * This creates a lambda that instantiates the module and automatically applies the constructor attribute.
|
|
+ * * @param ModuleClassName The name of the module's C++ class (e.g., MySensorModule).
|
|
+ */
|
|
+#define MESHTASTIC_REGISTER_MODULE(ModuleClassName) \
|
|
+ static void __attribute__((constructor)) register_##ModuleClassName() { \
|
|
+ register_module_initializer([]() { new ModuleClassName(); }); \
|
|
+ }
|
|
+
|
|
+#endif // MODULE_REGISTRY_H
|
|
\ No newline at end of file
|
|
diff --git a/src/modules/Modules.cpp b/src/modules/Modules.cpp
|
|
index 827524fc3..3cd0f6405 100644
|
|
--- a/src/modules/Modules.cpp
|
|
+++ b/src/modules/Modules.cpp
|
|
@@ -9,6 +9,8 @@
|
|
#include "input/UpDownInterruptImpl1.h"
|
|
#include "input/i2cButton.h"
|
|
#include "modules/SystemCommandsModule.h"
|
|
+#include "modules/ModuleRegistry.h"
|
|
+
|
|
#if HAS_TRACKBALL
|
|
#include "input/TrackballInterruptImpl1.h"
|
|
#endif
|
|
@@ -305,6 +307,9 @@ void setupModules()
|
|
if (moduleConfig.has_range_test && moduleConfig.range_test.enabled)
|
|
new RangeTestModule();
|
|
#endif
|
|
+
|
|
+ init_dynamic_modules();
|
|
+
|
|
// NOTE! This module must be added LAST because it likes to check for replies from other modules and avoid sending extra
|
|
// acks
|
|
routingModule = new RoutingModule();
|