bumble 0.0.203__py3-none-any.whl → 0.0.207__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. bumble/_version.py +2 -2
  2. bumble/apps/auracast.py +626 -87
  3. bumble/apps/bench.py +227 -148
  4. bumble/apps/controller_info.py +23 -7
  5. bumble/apps/device_info.py +50 -4
  6. bumble/apps/lea_unicast/app.py +61 -201
  7. bumble/apps/pair.py +13 -8
  8. bumble/apps/show.py +6 -6
  9. bumble/att.py +10 -11
  10. bumble/audio/__init__.py +17 -0
  11. bumble/audio/io.py +553 -0
  12. bumble/controller.py +24 -9
  13. bumble/core.py +4 -1
  14. bumble/device.py +993 -48
  15. bumble/drivers/common.py +2 -0
  16. bumble/drivers/intel.py +593 -24
  17. bumble/gatt.py +67 -12
  18. bumble/gatt_client.py +14 -2
  19. bumble/gatt_server.py +12 -1
  20. bumble/hci.py +854 -33
  21. bumble/host.py +363 -64
  22. bumble/l2cap.py +3 -16
  23. bumble/pairing.py +3 -0
  24. bumble/profiles/aics.py +45 -80
  25. bumble/profiles/ascs.py +6 -18
  26. bumble/profiles/asha.py +5 -5
  27. bumble/profiles/bass.py +9 -21
  28. bumble/profiles/device_information_service.py +4 -1
  29. bumble/profiles/gatt_service.py +166 -0
  30. bumble/profiles/gmap.py +193 -0
  31. bumble/profiles/heart_rate_service.py +5 -6
  32. bumble/profiles/le_audio.py +87 -4
  33. bumble/profiles/pacs.py +48 -16
  34. bumble/profiles/tmap.py +3 -9
  35. bumble/profiles/{vcp.py → vcs.py} +33 -28
  36. bumble/profiles/vocs.py +299 -0
  37. bumble/sdp.py +223 -93
  38. bumble/smp.py +8 -3
  39. bumble/tools/intel_fw_download.py +130 -0
  40. bumble/tools/intel_util.py +154 -0
  41. bumble/transport/usb.py +8 -2
  42. bumble/utils.py +22 -7
  43. bumble/vendor/android/hci.py +29 -4
  44. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/METADATA +12 -10
  45. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/RECORD +49 -43
  46. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/WHEEL +1 -1
  47. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/entry_points.txt +3 -0
  48. bumble/apps/lea_unicast/liblc3.wasm +0 -0
  49. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/LICENSE +0 -0
  50. {bumble-0.0.203.dist-info → bumble-0.0.207.dist-info}/top_level.txt +0 -0
@@ -0,0 +1,130 @@
1
+ # Copyright 2024 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -----------------------------------------------------------------------------
16
+ # Imports
17
+ # -----------------------------------------------------------------------------
18
+ import logging
19
+ import pathlib
20
+ import urllib.request
21
+ import urllib.error
22
+
23
+ import click
24
+
25
+ from bumble.colors import color
26
+ from bumble.drivers import intel
27
+
28
+
29
+ # -----------------------------------------------------------------------------
30
+ # Logging
31
+ # -----------------------------------------------------------------------------
32
+ logger = logging.getLogger(__name__)
33
+
34
+
35
+ # -----------------------------------------------------------------------------
36
+ # Constants
37
+ # -----------------------------------------------------------------------------
38
+ LINUX_KERNEL_GIT_SOURCE = "https://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git/plain/intel"
39
+
40
+
41
+ # -----------------------------------------------------------------------------
42
+ # Functions
43
+ # -----------------------------------------------------------------------------
44
+ def download_file(base_url, name):
45
+ url = f"{base_url}/{name}"
46
+ with urllib.request.urlopen(url) as file:
47
+ data = file.read()
48
+ print(f"Downloaded {name}: {len(data)} bytes")
49
+ return data
50
+
51
+
52
+ # -----------------------------------------------------------------------------
53
+ @click.command
54
+ @click.option(
55
+ "--output-dir",
56
+ default="",
57
+ help="Output directory where the files will be saved. Defaults to the OS-specific"
58
+ "app data dir, which the driver will check when trying to find firmware",
59
+ show_default=True,
60
+ )
61
+ @click.option(
62
+ "--source",
63
+ type=click.Choice(["linux-kernel"]),
64
+ default="linux-kernel",
65
+ show_default=True,
66
+ )
67
+ @click.option("--single", help="Only download a single image set, by its base name")
68
+ @click.option("--force", is_flag=True, help="Overwrite files if they already exist")
69
+ def main(output_dir, source, single, force):
70
+ """Download Intel firmware images and configs."""
71
+
72
+ # Check that the output dir exists
73
+ if output_dir == '':
74
+ output_dir = intel.intel_firmware_dir()
75
+ else:
76
+ output_dir = pathlib.Path(output_dir)
77
+ if not output_dir.is_dir():
78
+ print("Output dir does not exist or is not a directory")
79
+ return
80
+
81
+ base_url = {
82
+ "linux-kernel": LINUX_KERNEL_GIT_SOURCE,
83
+ }[source]
84
+
85
+ print("Downloading")
86
+ print(color("FROM:", "green"), base_url)
87
+ print(color("TO:", "green"), output_dir)
88
+
89
+ if single:
90
+ images = [(f"{single}.sfi", f"{single}.ddc")]
91
+ else:
92
+ images = [
93
+ (f"{base_name}.sfi", f"{base_name}.ddc")
94
+ for base_name in intel.INTEL_FW_IMAGE_NAMES
95
+ ]
96
+
97
+ for fw_name, config_name in images:
98
+ print(color("---", "yellow"))
99
+ fw_image_out = output_dir / fw_name
100
+ if not force and fw_image_out.exists():
101
+ print(color(f"{fw_image_out} already exists, skipping", "red"))
102
+ continue
103
+ if config_name:
104
+ config_image_out = output_dir / config_name
105
+ if not force and config_image_out.exists():
106
+ print(color("f{config_image_out} already exists, skipping", "red"))
107
+ continue
108
+
109
+ try:
110
+ fw_image = download_file(base_url, fw_name)
111
+ except urllib.error.HTTPError as error:
112
+ print(f"Failed to download {fw_name}: {error}")
113
+ continue
114
+
115
+ config_image = None
116
+ if config_name:
117
+ try:
118
+ config_image = download_file(base_url, config_name)
119
+ except urllib.error.HTTPError as error:
120
+ print(f"Failed to download {config_name}: {error}")
121
+ continue
122
+
123
+ fw_image_out.write_bytes(fw_image)
124
+ if config_image:
125
+ config_image_out.write_bytes(config_image)
126
+
127
+
128
+ # -----------------------------------------------------------------------------
129
+ if __name__ == '__main__':
130
+ main()
@@ -0,0 +1,154 @@
1
+ # Copyright 2024 Google LLC
2
+ #
3
+ # Licensed under the Apache License, Version 2.0 (the "License");
4
+ # you may not use this file except in compliance with the License.
5
+ # You may obtain a copy of the License at
6
+ #
7
+ # https://www.apache.org/licenses/LICENSE-2.0
8
+ #
9
+ # Unless required by applicable law or agreed to in writing, software
10
+ # distributed under the License is distributed on an "AS IS" BASIS,
11
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
+ # See the License for the specific language governing permissions and
13
+ # limitations under the License.
14
+
15
+ # -----------------------------------------------------------------------------
16
+ # Imports
17
+ # -----------------------------------------------------------------------------
18
+ import logging
19
+ import asyncio
20
+ import os
21
+ from typing import Any, Optional
22
+
23
+ import click
24
+
25
+ from bumble.colors import color
26
+ from bumble import transport
27
+ from bumble.drivers import intel
28
+ from bumble.host import Host
29
+
30
+ # -----------------------------------------------------------------------------
31
+ # Logging
32
+ # -----------------------------------------------------------------------------
33
+ logger = logging.getLogger(__name__)
34
+
35
+
36
+ # -----------------------------------------------------------------------------
37
+ def print_device_info(device_info: dict[intel.ValueType, Any]) -> None:
38
+ if (mode := device_info.get(intel.ValueType.CURRENT_MODE_OF_OPERATION)) is not None:
39
+ print(
40
+ color("MODE:", "yellow"),
41
+ mode.name,
42
+ )
43
+ print(color("DETAILS:", "yellow"))
44
+ for key, value in device_info.items():
45
+ print(f" {color(key.name, 'green')}: {value}")
46
+
47
+
48
+ # -----------------------------------------------------------------------------
49
+ async def get_driver(host: Host, force: bool) -> Optional[intel.Driver]:
50
+ # Create a driver
51
+ driver = await intel.Driver.for_host(host, force)
52
+ if driver is None:
53
+ print("Device does not appear to be an Intel device")
54
+ return None
55
+
56
+ return driver
57
+
58
+
59
+ # -----------------------------------------------------------------------------
60
+ async def do_info(usb_transport, force):
61
+ async with await transport.open_transport(usb_transport) as (
62
+ hci_source,
63
+ hci_sink,
64
+ ):
65
+ host = Host(hci_source, hci_sink)
66
+ driver = await get_driver(host, force)
67
+ if driver is None:
68
+ return
69
+
70
+ # Get and print the device info
71
+ print_device_info(await driver.read_device_info())
72
+
73
+
74
+ # -----------------------------------------------------------------------------
75
+ async def do_load(usb_transport: str, force: bool) -> None:
76
+ async with await transport.open_transport(usb_transport) as (
77
+ hci_source,
78
+ hci_sink,
79
+ ):
80
+ host = Host(hci_source, hci_sink)
81
+ driver = await get_driver(host, force)
82
+ if driver is None:
83
+ return
84
+
85
+ # Reboot in bootloader mode
86
+ await driver.load_firmware()
87
+
88
+ # Get and print the device info
89
+ print_device_info(await driver.read_device_info())
90
+
91
+
92
+ # -----------------------------------------------------------------------------
93
+ async def do_bootloader(usb_transport: str, force: bool) -> None:
94
+ async with await transport.open_transport(usb_transport) as (
95
+ hci_source,
96
+ hci_sink,
97
+ ):
98
+ host = Host(hci_source, hci_sink)
99
+ driver = await get_driver(host, force)
100
+ if driver is None:
101
+ return
102
+
103
+ # Reboot in bootloader mode
104
+ await driver.reboot_bootloader()
105
+
106
+
107
+ # -----------------------------------------------------------------------------
108
+ @click.group()
109
+ def main():
110
+ logging.basicConfig(level=os.environ.get('BUMBLE_LOGLEVEL', 'INFO').upper())
111
+
112
+
113
+ @main.command
114
+ @click.argument("usb_transport")
115
+ @click.option(
116
+ "--force",
117
+ is_flag=True,
118
+ default=False,
119
+ help="Try to get the device info even if the USB info doesn't match",
120
+ )
121
+ def info(usb_transport, force):
122
+ """Get the firmware info."""
123
+ asyncio.run(do_info(usb_transport, force))
124
+
125
+
126
+ @main.command
127
+ @click.argument("usb_transport")
128
+ @click.option(
129
+ "--force",
130
+ is_flag=True,
131
+ default=False,
132
+ help="Load even if the USB info doesn't match",
133
+ )
134
+ def load(usb_transport, force):
135
+ """Load a firmware image."""
136
+ asyncio.run(do_load(usb_transport, force))
137
+
138
+
139
+ @main.command
140
+ @click.argument("usb_transport")
141
+ @click.option(
142
+ "--force",
143
+ is_flag=True,
144
+ default=False,
145
+ help="Attempt to reboot event if the USB info doesn't match",
146
+ )
147
+ def bootloader(usb_transport, force):
148
+ """Reboot in bootloader mode."""
149
+ asyncio.run(do_bootloader(usb_transport, force))
150
+
151
+
152
+ # -----------------------------------------------------------------------------
153
+ if __name__ == '__main__':
154
+ main()
bumble/transport/usb.py CHANGED
@@ -149,7 +149,10 @@ async def open_usb_transport(spec: str) -> Transport:
149
149
 
150
150
  if status != usb1.TRANSFER_COMPLETED:
151
151
  logger.warning(
152
- color(f'!!! OUT transfer not completed: status={status}', 'red')
152
+ color(
153
+ f'!!! OUT transfer not completed: status={status}',
154
+ 'red',
155
+ )
153
156
  )
154
157
 
155
158
  async def process_queue(self):
@@ -275,7 +278,10 @@ async def open_usb_transport(spec: str) -> Transport:
275
278
  )
276
279
  else:
277
280
  logger.warning(
278
- color(f'!!! IN transfer not completed: status={status}', 'red')
281
+ color(
282
+ f'!!! IN[{packet_type}] transfer not completed: status={status}',
283
+ 'red',
284
+ )
279
285
  )
280
286
  self.loop.call_soon_threadsafe(self.on_transport_lost)
281
287
 
bumble/utils.py CHANGED
@@ -24,17 +24,19 @@ import logging
24
24
  import sys
25
25
  import warnings
26
26
  from typing import (
27
+ Any,
27
28
  Awaitable,
28
- Set,
29
- TypeVar,
30
- List,
31
- Tuple,
32
29
  Callable,
33
- Any,
30
+ List,
34
31
  Optional,
32
+ Protocol,
33
+ Set,
34
+ Tuple,
35
+ TypeVar,
35
36
  Union,
36
37
  overload,
37
38
  )
39
+ from typing_extensions import Self
38
40
 
39
41
  from pyee import EventEmitter
40
42
 
@@ -445,7 +447,7 @@ def deprecated(msg: str):
445
447
  def wrapper(function):
446
448
  @functools.wraps(function)
447
449
  def inner(*args, **kwargs):
448
- warnings.warn(msg, DeprecationWarning)
450
+ warnings.warn(msg, DeprecationWarning, stacklevel=2)
449
451
  return function(*args, **kwargs)
450
452
 
451
453
  return inner
@@ -462,7 +464,7 @@ def experimental(msg: str):
462
464
  def wrapper(function):
463
465
  @functools.wraps(function)
464
466
  def inner(*args, **kwargs):
465
- warnings.warn(msg, FutureWarning)
467
+ warnings.warn(msg, FutureWarning, stacklevel=2)
466
468
  return function(*args, **kwargs)
467
469
 
468
470
  return inner
@@ -487,3 +489,16 @@ class OpenIntEnum(enum.IntEnum):
487
489
  obj._value_ = value
488
490
  obj._name_ = f"{cls.__name__}[{value}]"
489
491
  return obj
492
+
493
+
494
+ # -----------------------------------------------------------------------------
495
+ class ByteSerializable(Protocol):
496
+ """
497
+ Type protocol for classes that can be instantiated from bytes and serialized
498
+ to bytes.
499
+ """
500
+
501
+ @classmethod
502
+ def from_bytes(cls, data: bytes) -> Self: ...
503
+
504
+ def __bytes__(self) -> bytes: ...
@@ -16,6 +16,7 @@
16
16
  # Imports
17
17
  # -----------------------------------------------------------------------------
18
18
  import struct
19
+ from typing import Dict, Optional, Type
19
20
 
20
21
  from bumble.hci import (
21
22
  name_or_number,
@@ -24,7 +25,9 @@ from bumble.hci import (
24
25
  HCI_Constant,
25
26
  HCI_Object,
26
27
  HCI_Command,
27
- HCI_Vendor_Event,
28
+ HCI_Event,
29
+ HCI_Extended_Event,
30
+ HCI_VENDOR_EVENT,
28
31
  STATUS_SPEC,
29
32
  )
30
33
 
@@ -48,7 +51,6 @@ HCI_DYNAMIC_AUDIO_BUFFER_COMMAND = hci_vendor_command_op_code(0x15F)
48
51
  HCI_BLUETOOTH_QUALITY_REPORT_EVENT = 0x58
49
52
 
50
53
  HCI_Command.register_commands(globals())
51
- HCI_Vendor_Event.register_subevents(globals())
52
54
 
53
55
 
54
56
  # -----------------------------------------------------------------------------
@@ -279,7 +281,29 @@ class HCI_Dynamic_Audio_Buffer_Command(HCI_Command):
279
281
 
280
282
 
281
283
  # -----------------------------------------------------------------------------
282
- @HCI_Vendor_Event.event(
284
+ class HCI_Android_Vendor_Event(HCI_Extended_Event):
285
+ event_code: int = HCI_VENDOR_EVENT
286
+ subevent_classes: Dict[int, Type[HCI_Extended_Event]] = {}
287
+
288
+ @classmethod
289
+ def subclass_from_parameters(
290
+ cls, parameters: bytes
291
+ ) -> Optional[HCI_Extended_Event]:
292
+ subevent_code = parameters[0]
293
+ if subevent_code == HCI_BLUETOOTH_QUALITY_REPORT_EVENT:
294
+ quality_report_id = parameters[1]
295
+ if quality_report_id in (0x01, 0x02, 0x03, 0x04, 0x07, 0x08, 0x09):
296
+ return HCI_Bluetooth_Quality_Report_Event.from_parameters(parameters)
297
+
298
+ return None
299
+
300
+
301
+ HCI_Android_Vendor_Event.register_subevents(globals())
302
+ HCI_Event.add_vendor_factory(HCI_Android_Vendor_Event.subclass_from_parameters)
303
+
304
+
305
+ # -----------------------------------------------------------------------------
306
+ @HCI_Extended_Event.event(
283
307
  fields=[
284
308
  ('quality_report_id', 1),
285
309
  ('packet_types', 1),
@@ -308,10 +332,11 @@ class HCI_Dynamic_Audio_Buffer_Command(HCI_Command):
308
332
  ('tx_last_subevent_packets', 4),
309
333
  ('crc_error_packets', 4),
310
334
  ('rx_duplicate_packets', 4),
335
+ ('rx_unreceived_packets', 4),
311
336
  ('vendor_specific_parameters', '*'),
312
337
  ]
313
338
  )
314
- class HCI_Bluetooth_Quality_Report_Event(HCI_Vendor_Event):
339
+ class HCI_Bluetooth_Quality_Report_Event(HCI_Android_Vendor_Event):
315
340
  # pylint: disable=line-too-long
316
341
  '''
317
342
  See https://source.android.com/docs/core/connect/bluetooth/hci_requirements#bluetooth-quality-report-sub-event
@@ -1,17 +1,16 @@
1
- Metadata-Version: 2.1
1
+ Metadata-Version: 2.2
2
2
  Name: bumble
3
- Version: 0.0.203
3
+ Version: 0.0.207
4
4
  Summary: Bluetooth Stack for Apps, Emulation, Test and Experimentation
5
- Home-page: https://github.com/google/bumble
6
- Author: Google
7
- Author-email: tbd@tbd.com
5
+ Author-email: Google <bumble-dev@google.com>
6
+ Project-URL: Homepage, https://github.com/google/bumble
8
7
  Requires-Python: >=3.8
9
8
  Description-Content-Type: text/markdown
10
9
  License-File: LICENSE
11
10
  Requires-Dist: aiohttp~=3.8; platform_system != "Emscripten"
12
11
  Requires-Dist: appdirs>=1.4; platform_system != "Emscripten"
13
12
  Requires-Dist: click>=8.1.3; platform_system != "Emscripten"
14
- Requires-Dist: cryptography==39; platform_system != "Emscripten"
13
+ Requires-Dist: cryptography>=39; platform_system != "Emscripten"
15
14
  Requires-Dist: cryptography>=39.0; platform_system == "Emscripten"
16
15
  Requires-Dist: grpcio>=1.62.1; platform_system != "Emscripten"
17
16
  Requires-Dist: humanize>=4.6.0; platform_system != "Emscripten"
@@ -35,6 +34,7 @@ Requires-Dist: pytest-html>=3.2.0; extra == "test"
35
34
  Requires-Dist: coverage>=6.4; extra == "test"
36
35
  Provides-Extra: development
37
36
  Requires-Dist: black==24.3; extra == "development"
37
+ Requires-Dist: bt-test-interfaces>=0.0.6; extra == "development"
38
38
  Requires-Dist: grpcio-tools>=1.62.1; extra == "development"
39
39
  Requires-Dist: invoke>=1.7.3; extra == "development"
40
40
  Requires-Dist: mobly>=1.12.2; extra == "development"
@@ -45,16 +45,18 @@ Requires-Dist: pyyaml>=6.0; extra == "development"
45
45
  Requires-Dist: types-appdirs>=1.4.3; extra == "development"
46
46
  Requires-Dist: types-invoke>=1.7.3; extra == "development"
47
47
  Requires-Dist: types-protobuf>=4.21.0; extra == "development"
48
- Requires-Dist: wasmtime==20.0.0; extra == "development"
49
48
  Provides-Extra: avatar
50
49
  Requires-Dist: pandora-avatar==0.0.10; extra == "avatar"
51
50
  Requires-Dist: rootcanal==1.10.0; python_version >= "3.10" and extra == "avatar"
52
51
  Provides-Extra: pandora
53
52
  Requires-Dist: bt-test-interfaces>=0.0.6; extra == "pandora"
54
53
  Provides-Extra: documentation
55
- Requires-Dist: mkdocs>=1.4.0; extra == "documentation"
56
- Requires-Dist: mkdocs-material>=8.5.6; extra == "documentation"
57
- Requires-Dist: mkdocstrings[python]>=0.19.0; extra == "documentation"
54
+ Requires-Dist: mkdocs>=1.6.0; extra == "documentation"
55
+ Requires-Dist: mkdocs-material>=9.6; extra == "documentation"
56
+ Requires-Dist: mkdocstrings[python]>=0.27.0; extra == "documentation"
57
+ Provides-Extra: auracast
58
+ Requires-Dist: lc3py; (python_version >= "3.10" and platform_system == "Linux" and platform_machine == "x86_64") and extra == "auracast"
59
+ Requires-Dist: sounddevice>=0.5.1; extra == "auracast"
58
60
 
59
61
 
60
62
  _ _ _
@@ -1,8 +1,8 @@
1
1
  bumble/__init__.py,sha256=Q8jkz6rgl95IMAeInQVt_2GLoJl3DcEP2cxtrQ-ho5c,110
2
- bumble/_version.py,sha256=S9xMkf5dpbGiPXrFIMCaq0E-C6SAhQr_6T4y8wOvYoQ,415
2
+ bumble/_version.py,sha256=jmWBoK3noH8SOitnHxsR8mEYSEdPJ5p78NFlFLHEizc,415
3
3
  bumble/a2dp.py,sha256=_dCq-qyG5OglDVlaOFwAgFe_ugvHuEdEYL-kWFf6sWQ,31775
4
4
  bumble/at.py,sha256=Giu2VUSJKH-jIh10lOfumiqy-FyO99Ra6nJ7UiWQ0H8,3114
5
- bumble/att.py,sha256=yw_yg_be19O9Nx1mh_JE_ZoYfiNsD3a59rFQPuknQL0,32711
5
+ bumble/att.py,sha256=XyVtZ7AXbuperIm_uqMSN2haXYU_nPcXVz7HXGlex-Q,32567
6
6
  bumble/avc.py,sha256=cO1-8x7BvuBCQVJg-9nTibkLFC4y0_2SNERZ8_7Kn_c,16407
7
7
  bumble/avctp.py,sha256=yHAjJRjLGtR0Q-iWcLS7cJRz5Jr2YiRmZd6LZV4Xjt4,9935
8
8
  bumble/avdtp.py,sha256=2ki_BE4SHiu3Sx9oHCknfjF-bBcgPB9TsyF5upciUYI,76773
@@ -11,55 +11,54 @@ bumble/bridge.py,sha256=T6es5oS1dy8QgkxQ8iOD-YcZ0SWOv8jaqC7TGxqodk4,3003
11
11
  bumble/codecs.py,sha256=75TGfq-XWWtr-mCRRG7QzJYNRebG50Ypt_QGQkoWlxU,20915
12
12
  bumble/colors.py,sha256=CC5tBDnN86bvlbYf1KIVdyj7QBLaqEDT_hQVB0p7FeU,3118
13
13
  bumble/company_ids.py,sha256=B68e2QPsDeRYP9jjbGs4GGDwEkGxcXGTsON_CHA0uuI,118528
14
- bumble/controller.py,sha256=biUkQisEZOc9-TGkUXYPes1RONA6TizKwDYIQWJx_7A,61593
15
- bumble/core.py,sha256=T43ZszjsU_89B0UJwQ9GCzvKU7oj1_RBzsdGr9jX9xY,72440
14
+ bumble/controller.py,sha256=w7KAbh1NH1_TRiiiXZX2EBgM9nGXteHH8fpns8Dshg4,62116
15
+ bumble/core.py,sha256=TWXoBItq0UFwLmjbm4QXQoEK4eWFLnFhJzuTSpKb-LM,72544
16
16
  bumble/crypto.py,sha256=L6z3dn9-dgKYRtOM6O3F6n6Ju4PwTM3LAFJtCg_ie78,9382
17
17
  bumble/decoder.py,sha256=0-VNWZT-u7lvK3qBpAuYT0M6Rz_bMgMi4CjfUXX_6RM,9728
18
- bumble/device.py,sha256=BuVejCWditUcMzTM1RBOC-mHdu9tNMOv0AyeCp_iX9E,194628
18
+ bumble/device.py,sha256=al6h9s0WAIWeWWEY0Z_O8BONhUqF4uifJFHzJKX5MQc,230241
19
19
  bumble/gap.py,sha256=dRU2_TWvqTDx80hxeSbXlWIeWvptWH4_XbItG5y948Q,2138
20
- bumble/gatt.py,sha256=tXSDE2E4RsaFSW6rIz8qb0VJE4ZpcE-zafneCprcp2g,39010
21
- bumble/gatt_client.py,sha256=Nb6xxQUDB68T7qF4GzlIPeER2SlroSGXbECZeSmzU4A,43190
22
- bumble/gatt_server.py,sha256=T-Not_wPOrXtleiOwY0brJsbUI81NXb1vwq0Mun8QO8,37441
23
- bumble/hci.py,sha256=DXRF7df0LxyZlxyROGK7fTE1982_uBQtiveNIcV-10U,289646
20
+ bumble/gatt.py,sha256=cwU6c0UjhNICIVhA4hnVhvysHXDC7S-vB4byBY9SK-0,40972
21
+ bumble/gatt_client.py,sha256=oZupZy_vHpyLoh8HvN0gtDBgK-zUnEvdweggdt1vQOE,43788
22
+ bumble/gatt_server.py,sha256=cRIvPUrfTa8Kwn6KWsTzC33-AVoAPNzEMbXWbk_I6N4,37516
23
+ bumble/hci.py,sha256=xYKsSvwjZj0pAPgtGDyRaVxKOi4garuzSaiTd2ICWok,313243
24
24
  bumble/helpers.py,sha256=m0w4UgFFNDEnXwHrDyfRlcBObdVed2fqXGL0lvR3c8s,12733
25
25
  bumble/hfp.py,sha256=UDqB-z5nEzLgRojJeC6TbFRaPXV3Ht0jvQV03ksyiLU,75749
26
26
  bumble/hid.py,sha256=hJKm6qhNa0kQTGmp_VxNh3-ywgBDdJpPPFcvtFiRL0A,20335
27
- bumble/host.py,sha256=gLDLx71ibS9DkeoXvzMFesssaT4svGx7SjasVdCio5I,49196
27
+ bumble/host.py,sha256=MNjN_NFQxPB1NKWw5jf35z0VbOzE3nrNub6opqecwtA,61315
28
28
  bumble/keys.py,sha256=WbIQ7Ob81mW75qmEPQ2rBLfnqBMA-ts2yowWXP9UaCY,12654
29
- bumble/l2cap.py,sha256=VT0mv3S6fzVhF1ouahykTmKBbEKDc9DfH0qoKmPH8ZE,81291
29
+ bumble/l2cap.py,sha256=_bDO9VXhqDc1eNjqQBO82NYAsQipVxlrvcNSQIaWfL0,80809
30
30
  bumble/link.py,sha256=SU7Ls2Lyg1XuY8x6yP9tAC83SYmMTU2a-vQ_CWCfq90,24107
31
- bumble/pairing.py,sha256=tgPUba6xNxMi-2plm3xfRlzHq-uPRNZEIGWaN0qNGCs,9853
31
+ bumble/pairing.py,sha256=OJ3mzv46iTtv8P0mZb3PEDUzTemlcIADPMah21jeSyA,10008
32
32
  bumble/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
33
33
  bumble/rfcomm.py,sha256=dh5t5vlDEfw3yHgQfzegMYPnShP8Zo-3ScABUvmXNLI,40751
34
34
  bumble/rtp.py,sha256=388X3aCv-QrWJ37r_VPqXYJtvNGWPsHnJasqs41g_-s,3487
35
- bumble/sdp.py,sha256=bztdDr7cYUA5sSL1SWe7rhgVjMCoUnc2bA4tdkwJQcE,45446
36
- bumble/smp.py,sha256=LzCdIexJQCW3wcmV5bVjsJJ-LEqPGdBER089-VymUsE,77625
35
+ bumble/sdp.py,sha256=x7TQ1LlggWQDIaEZZaVNSd2PhfVtnjQ9xV1LTJ_y0Xs,49583
36
+ bumble/smp.py,sha256=ic_9ozECbsZPsho0kU6eMcB2zIl6JODUx-tqdm8IdxU,77878
37
37
  bumble/snoop.py,sha256=1mzwmp9LToUXbPnFsLrt8S4UHs0kqzbu7LDydwbmkZI,5715
38
- bumble/utils.py,sha256=e0i-4d28-9zP3gYcd1rdNd669rkPnRs5oJCERUEDfxo,15099
38
+ bumble/utils.py,sha256=pddRUOgO8GJbymfLGDq-paWfk1N6lV0vieZ1DR1YCAY,15510
39
39
  bumble/apps/README.md,sha256=XTwjRAY-EJWDXpl1V8K3Mw8B7kIqzUIUizRjVBVhoIE,1769
40
40
  bumble/apps/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
41
- bumble/apps/auracast.py,sha256=zSsduDSTOa6Tf5qnty_nHyrOYFKjlYWyAz4zDNXA_uQ,25065
42
- bumble/apps/bench.py,sha256=RitVnx9mzmW-1cB4O7wan-lQeFDlazdjTW-BQcuTDb0,58410
41
+ bumble/apps/auracast.py,sha256=ATs15CV082WbMm6Vl7tpz7DRzorY6x_of6DVJMywKeA,44040
42
+ bumble/apps/bench.py,sha256=2Lf3fZD79rMRyaIZy5DqBSdMMT9YlcE3-aqE4c7eD38,61236
43
43
  bumble/apps/ble_rpa_tool.py,sha256=ZQtsbfnLPd5qUAkEBPpNgJLRynBBc7q_9cDHKUW2SQ0,1701
44
44
  bumble/apps/console.py,sha256=rwD9y3g8Mm_mAEvrcXjbtcv5d8mwF3yTbmE6Vet2BEk,45300
45
- bumble/apps/controller_info.py,sha256=WScuK5Ytp5aFEosAcgRTCEeey6SmxDFmyB7KBhgVx6s,11759
45
+ bumble/apps/controller_info.py,sha256=SRjTY66I8752oPa_G3y2D_H9NQj3HWxQ_fWKllNu4yo,12484
46
46
  bumble/apps/controller_loopback.py,sha256=VJAFsUdFwm2KgOrRuLADymMpZl5qVO0RGkDSr-1XKtY,7214
47
47
  bumble/apps/controllers.py,sha256=R6XJ1XpyuXlyqSCmI7PromVIcoYTcYfpmO-TqTYXnUI,2326
48
- bumble/apps/device_info.py,sha256=kQSO7F60cmUKw99LHfyly9s_ox2mD0dNGsgxCnKoFOQ,7999
48
+ bumble/apps/device_info.py,sha256=K7LcVpOOaunRMAKSSOTiDvqCavOZRdsDiXj2ofoJeG0,9942
49
49
  bumble/apps/gatt_dump.py,sha256=wwA-NhRnbgUkbj-Ukym7NDG2j2n_36t_tn93dLDVdIg,4487
50
50
  bumble/apps/gg_bridge.py,sha256=JdW5QT6xN9c2XDDJoHDRo5W3N_RdVkCtTmlcOsJhlx8,14693
51
51
  bumble/apps/hci_bridge.py,sha256=0mO36AO3ea0yrrTaYuySc7Un5NTuvVn08ItXvJql3CQ,4029
52
52
  bumble/apps/l2cap_bridge.py,sha256=524VgEmgCP4g7T0UdgmsePmNVhDFRJECeaZ_uzKsbco,13062
53
- bumble/apps/pair.py,sha256=NtDxLfdnlOY_ZEtVNGVXWjv6_x_hndok_ydhV6zkFtI,18503
53
+ bumble/apps/pair.py,sha256=cZovlR4alLGCruS4Iy_dcJkJchIoV4vNwcNyycWLhxw,18591
54
54
  bumble/apps/pandora_server.py,sha256=5qaoLCpcZE2KsGO21-7t6Vg4dBjBWbnyOQXwrLhxkuE,1397
55
55
  bumble/apps/rfcomm_bridge.py,sha256=bAdDz84YpYkEfZ6vanQ_VUEpEF4MS4Y9fmbXB4bhoi4,17633
56
56
  bumble/apps/scan.py,sha256=b6hIppiJqDfR7VFW2wl3-lkPdFvHLqYZKY8VjjNnhls,8366
57
- bumble/apps/show.py,sha256=8w0-8jLtN6IM6_58pOHbEmE1Rmxm71O48ACrXixC2jk,6218
57
+ bumble/apps/show.py,sha256=ELp1nEZBCIp1vK-pbjguqjEC8e-In5m-WMbKl_K6Jsk,6232
58
58
  bumble/apps/unbond.py,sha256=LDPWpmgKLMGYDdIFGTdGciFDcUliZ0OmseEbGfJ-MAM,3176
59
59
  bumble/apps/usb_probe.py,sha256=zJqrqKSGVYcOntXzgONdluZDE6jfj3IwPNuLqmDPDsU,10351
60
- bumble/apps/lea_unicast/app.py,sha256=3WnSApFcLzjpZXmU7kYlX54vApDpFEiF6exJFWbJkOI,21469
60
+ bumble/apps/lea_unicast/app.py,sha256=Fqm5XsAgcJCbHohz5rpV63SfB1MbyXH-o0GUn9RpYS8,17393
61
61
  bumble/apps/lea_unicast/index.html,sha256=d1IHsYd8TGOnxNZKaHolf4Y-7VwT1kO9Z72vpGMdy3k,2354
62
- bumble/apps/lea_unicast/liblc3.wasm,sha256=nYMzG9fP8_71K9dQfVI9QPQPkFRPHoqZEEExs1y6Oac,158603
63
62
  bumble/apps/link_relay/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
64
63
  bumble/apps/link_relay/link_relay.py,sha256=GOESYPzkMJFrz5VOI_BSmnmgz4Y8EdSLHMWgdA63aDg,10066
65
64
  bumble/apps/link_relay/logging.yml,sha256=t-P72RAHsTZOESw0M4I3CQPonymcjkd9SLE0eY_ZNiM,311
@@ -70,9 +69,11 @@ bumble/apps/speaker/speaker.css,sha256=nyM5TjzDYkkLwFzsaIOuTSngzSvgDnkLe0Z-fAn1_
70
69
  bumble/apps/speaker/speaker.html,sha256=kfAZ5oZSFc9ygBFIUuZEn5LUNQnHBvrnuHU6VAptyiU,1188
71
70
  bumble/apps/speaker/speaker.js,sha256=DrT831yg3oBXKZ5usnfZjRU9X6Nw3zjIWSkz6sIgVtw,9373
72
71
  bumble/apps/speaker/speaker.py,sha256=OTqygA9VbQW_XxTxqxS0vRW_wvhnKHssSxDz1lQZ9ZU,24763
72
+ bumble/audio/__init__.py,sha256=tc75ofvV52qED31kB_LYRVLNrxtbZqnOWO8lHsZK3Ww,747
73
+ bumble/audio/io.py,sha256=xxEv-yUwlNRX-4ccy7VdrHBmLL4OrOekgI81hIpMWRU,17789
73
74
  bumble/drivers/__init__.py,sha256=lxqJTghh21rQFThRTurwLysZm385TUcn8ZdpHQSWD88,3196
74
- bumble/drivers/common.py,sha256=pS783hudolLZAzF8IUWp7g6TXyQsUCEzqCsd1VGeYfQ,1507
75
- bumble/drivers/intel.py,sha256=-YcJI4ZC_fhHHxWyE8b4eB8V7suOFH1n9uayckGE9Uw,3231
75
+ bumble/drivers/common.py,sha256=HZWILnQ0P5StGuhpeU7qj-0pqBvMGyOXrZv2J56_ACE,1532
76
+ bumble/drivers/intel.py,sha256=vd8O_blmgUEi_eJx4Ixaa_TpZDTXpfbbCt9sRr1GlJM,22759
76
77
  bumble/drivers/rtk.py,sha256=nsfAqNzvxvAwbh6UYgxOCSNwgw7XouIBFA03FrLTs4M,22088
77
78
  bumble/pandora/__init__.py,sha256=jaPtYCLfLeLUGj8-TmS3Gkv0l1_DBadYj8ZMAPLPAao,3463
78
79
  bumble/pandora/config.py,sha256=KD85n3oRbuvD65sRah2H0gpxEW4YbD7HbYbsxdcpDDA,2388
@@ -83,27 +84,32 @@ bumble/pandora/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
83
84
  bumble/pandora/security.py,sha256=YErueKNLsnmcRe6dKo724Ht-buOqmZl2Gauswcc8FW0,21946
84
85
  bumble/pandora/utils.py,sha256=Fq4glL0T5cJ2FODoDotmDNdYFOkTOR7DyyL8vkcxp20,3949
85
86
  bumble/profiles/__init__.py,sha256=yBGC8Ti5LvZuoh1F42XtfrBilb39T77_yuxESZeX2yI,581
86
- bumble/profiles/aics.py,sha256=2iXU3nFQ099zS13BsyRaq4-3PWiOaxCWfaWF8pa3C9g,18541
87
- bumble/profiles/ascs.py,sha256=Y2_fd_5LOb9hon60LcQl3R-FoAIsOd_J37RZpveh-7c,25471
88
- bumble/profiles/asha.py,sha256=QXUp7ImuMD48L0mpuNxPcIkv8VvoENynCuF2PEVqzFM,10373
87
+ bumble/profiles/aics.py,sha256=Kb50MTBPxWHZbc0JUBogv3YEV2wZIGrqs8E7qhEm7aI,17230
88
+ bumble/profiles/ascs.py,sha256=jRFZDPgym7ZRs_bqmLjLwi5nAHg_lwfRcq_P6Ynvg4s,24839
89
+ bumble/profiles/asha.py,sha256=XLXinlmC1Zn1MiK_eg62F89gG-4HnBHco_KzoEXtCUE,10273
89
90
  bumble/profiles/bap.py,sha256=3fI8IB34l1CSzH0CwAD84qCxz_nV-SOP5q9VDzb3Aqk,21979
90
- bumble/profiles/bass.py,sha256=Wiqum0Wsr5PpVzTAPDcyKLTfJoKXJUYOzqB320aSiUs,14950
91
+ bumble/profiles/bass.py,sha256=5t91bOZDolmfiv9c1pQ1FmewKhXUtqPH7c1Qr8GR9IA,14557
91
92
  bumble/profiles/battery_service.py,sha256=w-uF4jLoDozJOoykimb2RkrKjVyCke6ts2-h-F1PYyc,2292
92
93
  bumble/profiles/cap.py,sha256=6gH7oOnUKjOggMPuB7rtbwj0AneoNmnWzQ_iR3io8e0,1945
93
94
  bumble/profiles/csip.py,sha256=qpI9W0_FWIpsuJrHhxfbKaa-TD21epxEa3EuCm8gh6c,10156
94
- bumble/profiles/device_information_service.py,sha256=RfqnXywcwcSTiFalxd1LVTTdeWLxHGsMvlvr9fI0GJI,6193
95
+ bumble/profiles/device_information_service.py,sha256=3c_p3s7jMxPKWHObXOesZ4ZZKr1SgaTe8RvyuangZuM,6258
95
96
  bumble/profiles/gap.py,sha256=jUjfy6MPL7k6wgNn3ny3PVgSX6-SLmjUepFYHjGc3IU,3870
97
+ bumble/profiles/gatt_service.py,sha256=n85zh22nNNcxeajLtX0ZzZLESPwXDGDxoZdttEtOZW4,6675
98
+ bumble/profiles/gmap.py,sha256=jNhYoqD9oLkZubCQ9zllwKtXVyVoZVoIZJcI_DUuJGw,7035
96
99
  bumble/profiles/hap.py,sha256=IbE1KzjIMEq6FxtFqTgA2DN0pPnpu0996KJRjuN3oaQ,25614
97
- bumble/profiles/heart_rate_service.py,sha256=_MG1ApmF1B7b4xRzELuahtRWzLm49i9O4m7I6ZFU4mw,8644
98
- bumble/profiles/le_audio.py,sha256=1x6OpIc0JMa32YVcfM8lq6jnXHlriHUcOkAs0EttJJk,3093
100
+ bumble/profiles/heart_rate_service.py,sha256=56LFL3lYoCMJZ-4ec3mQPDqcvr5lahCeZzDVRKsbakE,8609
101
+ bumble/profiles/le_audio.py,sha256=eDdMLwaisA3Wg7XhNVDoLOWchJ5CCfT0cqxOqCo8l04,5839
99
102
  bumble/profiles/mcp.py,sha256=vIN1r_if4LmOcGCgZuDYTYLMQzU6-1pKUFx1Z3iSAeY,17415
100
- bumble/profiles/pacs.py,sha256=bhlU5M6E9e1YKf-qJnJL3GwTqOPuSvYDpY_UYq0Nnd8,8730
103
+ bumble/profiles/pacs.py,sha256=3q_d2Dfc9kYIip9TChgu49SG_BE-vQhhLyDgJh-_0eM,10012
101
104
  bumble/profiles/pbp.py,sha256=51aoQcZMXzTzeatHd0zNVN7kYcv4atzr2OWpzxlSVP8,1630
102
105
  bumble/profiles/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
103
- bumble/profiles/tmap.py,sha256=hpz5VYEdEOty4D9ApCRDero9Tf3L9arSZWnLCNkZoHI,3005
104
- bumble/profiles/vcp.py,sha256=Lx1Odg7PQO9nXkpxRpK04MRuy975uIK8kSqcwrk4iSE,8035
106
+ bumble/profiles/tmap.py,sha256=24hPPDc4xVKanRqTHRaOG_R95qmUVrO5_m_MhCcltiQ,2833
107
+ bumble/profiles/vcs.py,sha256=cB9-DU9gFhGQxfjStRCAZmkGXj3SDtfZlBtBOR26c_E,8149
108
+ bumble/profiles/vocs.py,sha256=V_UWVL83MPR2GNJMouiMzXUhsazD1xhbrQqZ2gP_mFw,10895
105
109
  bumble/tools/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
106
110
  bumble/tools/generate_company_id_list.py,sha256=ysbPb3zmxKFBiSQ_MBG2r15-sqR5P_GWT6i0YUTTXOM,1736
111
+ bumble/tools/intel_fw_download.py,sha256=8YJ3y3yww7bEvL9cINq9cFucoCWf-Gf3pyu-gl4-UJE,4453
112
+ bumble/tools/intel_util.py,sha256=2hWoKS1NM8XJSmjZWBdn5mF33BWq2nWiYSNcfpUcY24,4699
107
113
  bumble/tools/rtk_fw_download.py,sha256=KEPG-rDrdPGKBzZ78P4s3udLRYT3p7vesGhXvJTWTic,5453
108
114
  bumble/tools/rtk_util.py,sha256=TwZhupHQrQYsYHLdRGyzXKd24pwCk8kkzqK1Rj2guco,5087
109
115
  bumble/transport/__init__.py,sha256=Z01fvuKpqAbhJd0wYcGhW09W2tycM71ck80XoZ8a87Q,7012
@@ -120,7 +126,7 @@ bumble/transport/tcp_client.py,sha256=deyUJYpj04QE00Mw_PTU5PHPA6mr1Nui3f5-QCy2zO
120
126
  bumble/transport/tcp_server.py,sha256=tvu7FuPeqiXfoj2HQU8wu4AiwKjDDDCKlKjgtqWc5hg,3779
121
127
  bumble/transport/udp.py,sha256=di8I6HHACgBx3un-dzAahz9lTIUrh4LdeuYpeoifQEM,2239
122
128
  bumble/transport/unix.py,sha256=CS6Ksrkat5uUXOpo7RlxAYJsM3lMS4T3OrdCqzIHTg8,1981
123
- bumble/transport/usb.py,sha256=FO2Trx9rQ_pdX6Aal7eDxOpubjBEeUmoH3jcwVwKSYA,22022
129
+ bumble/transport/usb.py,sha256=K-uFelrgEA9Q2IxWpGui2PmuX2-DvCSczkQQXI22qLQ,22179
124
130
  bumble/transport/vhci.py,sha256=iI2WpighnvIP5zeyJUFSbjEdmCo24CWMdICamIcyJck,2250
125
131
  bumble/transport/ws_client.py,sha256=9gqm5jlVT_H6LfwsQwPpky07CINhgOK96ef53SMAxms,1757
126
132
  bumble/transport/ws_server.py,sha256=goe4xx7OnZiJy1a00Bg0CXM8uJhsGXbsijMYq2n62bI,3328
@@ -162,12 +168,12 @@ bumble/transport/grpc_protobuf/rootcanal/configuration_pb2.pyi,sha256=W8j1bXHBrk
162
168
  bumble/transport/grpc_protobuf/rootcanal/configuration_pb2_grpc.py,sha256=1oboBPFxaTEXt9Aw7EAj8gXHDCNMhZD2VXqocC9l_gk,159
163
169
  bumble/vendor/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
164
170
  bumble/vendor/android/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
165
- bumble/vendor/android/hci.py,sha256=GZrkhaWmcMt1JpnRhv0NoySGkf2H4lNUV2f_omRZW0I,10741
171
+ bumble/vendor/android/hci.py,sha256=-ZryisGrnxYEXEM9kcR2ta4joNhAgAxgRYAEYLq5tT0,11651
166
172
  bumble/vendor/zephyr/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
167
173
  bumble/vendor/zephyr/hci.py,sha256=d83bC0TvT947eN4roFjLkQefWtHOoNsr4xib2ctSkvA,3195
168
- bumble-0.0.203.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
169
- bumble-0.0.203.dist-info/METADATA,sha256=NgnILxtPNVp-DXsAjL6B2RjJoYFaw2jUoyUj4XC0ZaQ,5726
170
- bumble-0.0.203.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91
171
- bumble-0.0.203.dist-info/entry_points.txt,sha256=2TAnDAHiYVEo9Gnugk29QIsHpCgRgnPqBszLSgIX2T0,984
172
- bumble-0.0.203.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
173
- bumble-0.0.203.dist-info/RECORD,,
174
+ bumble-0.0.207.dist-info/LICENSE,sha256=FvaYh4NRWIGgS_OwoBs5gFgkCmAghZ-DYnIGBZPuw-s,12142
175
+ bumble-0.0.207.dist-info/METADATA,sha256=-k4cZeBTfBD0smZbv1GOk9jsvJVd2toT4qS6bZRqXws,5966
176
+ bumble-0.0.207.dist-info/WHEEL,sha256=In9FTNxeP60KnTkGw7wk6mJPYd_dQSjEZmXdBdMCI-8,91
177
+ bumble-0.0.207.dist-info/entry_points.txt,sha256=0mBShtMEyPU3NxVWkl-cixtC7W04yZxJmAh2WN-UzX8,1140
178
+ bumble-0.0.207.dist-info/top_level.txt,sha256=tV6JJKaHPYMFiJYiBYFW24PCcfLxTJZdlu6BmH3Cb00,7
179
+ bumble-0.0.207.dist-info/RECORD,,