From 5f924ed28014e02528f04c218f139f5d3f16da60 Mon Sep 17 00:00:00 2001 From: Orinks Date: Tue, 26 May 2026 16:34:12 -0400 Subject: [PATCH] feat(soundpacks): add local sound pack management --- .github/workflows/ci.yml | 7 +- .gitignore | 1 - CHANGELOG.md | 2 + README.md | 4 + pyproject.toml | 9 + src/portkeydrop/app.py | 64 ++ .../default/connections/connect_failed.ogg | Bin 0 -> 29018 bytes .../default/connections/connect_success.ogg | Bin 0 -> 26399 bytes .../default/connections/disconnect.ogg | Bin 0 -> 28118 bytes .../file_operations/delete_complete.ogg | Bin 0 -> 11492 bytes .../default/file_operations/delete_failed.ogg | Bin 0 -> 25997 bytes .../file_operations/folder_create_failed.ogg | Bin 0 -> 15238 bytes .../file_operations/folder_created.ogg | Bin 0 -> 27537 bytes .../file_operations/rename_complete.ogg | Bin 0 -> 18095 bytes .../default/file_operations/rename_failed.ogg | Bin 0 -> 28780 bytes .../default/general/error.ogg | Bin 0 -> 15165 bytes .../default/general/exit.ogg | Bin 0 -> 28166 bytes .../default/general/notify.ogg | Bin 0 -> 15755 bytes .../default/general/startup.ogg | Bin 0 -> 16584 bytes .../default/general/success.ogg | Bin 0 -> 28732 bytes .../default_soundpacks/default/pack.json | 27 + .../default/transfers/transfer_cancelled.ogg | Bin 0 -> 16666 bytes .../default/transfers/transfer_complete.ogg | Bin 0 -> 16639 bytes .../default/transfers/transfer_failed.ogg | Bin 0 -> 13902 bytes .../default/transfers/transfer_queued.ogg | Bin 0 -> 15029 bytes .../default/transfers/transfer_started.ogg | Bin 0 -> 21111 bytes src/portkeydrop/dialogs/settings.py | 97 ++ src/portkeydrop/dialogs/soundpack_manager.py | 486 ++++++++ src/portkeydrop/dialogs/soundpack_wizard.py | 366 ++++++ src/portkeydrop/settings.py | 19 + src/portkeydrop/sound_events.py | 91 ++ src/portkeydrop/soundpack_paths.py | 66 ++ src/portkeydrop/soundpacks.py | 296 +++++ tests/test_app.py | 21 + tests/test_app_migration_startup.py | 17 +- tests/test_settings.py | 31 + tests/test_settings_dialog_a11y.py | 23 + tests/test_soundpacks.py | 434 +++++++ uv.lock | 1014 +++++++++++++++++ 39 files changed, 3065 insertions(+), 10 deletions(-) create mode 100644 src/portkeydrop/default_soundpacks/default/connections/connect_failed.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/connections/connect_success.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/connections/disconnect.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/delete_complete.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/delete_failed.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/folder_create_failed.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/folder_created.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/rename_complete.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/file_operations/rename_failed.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/general/error.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/general/exit.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/general/notify.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/general/startup.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/general/success.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/pack.json create mode 100644 src/portkeydrop/default_soundpacks/default/transfers/transfer_cancelled.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/transfers/transfer_complete.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/transfers/transfer_failed.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/transfers/transfer_queued.ogg create mode 100644 src/portkeydrop/default_soundpacks/default/transfers/transfer_started.ogg create mode 100644 src/portkeydrop/dialogs/soundpack_manager.py create mode 100644 src/portkeydrop/dialogs/soundpack_wizard.py create mode 100644 src/portkeydrop/sound_events.py create mode 100644 src/portkeydrop/soundpack_paths.py create mode 100644 src/portkeydrop/soundpacks.py create mode 100644 tests/test_soundpacks.py create mode 100644 uv.lock diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index cae7e61..626c995 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -159,7 +159,8 @@ jobs: --compare-branch=origin/${{ github.base_ref }} \ --fail-under=80 \ --diff-range-notation='..' \ - --exclude '*/portkeydrop/ui/*' \ - --exclude '*/portkeydrop/dialogs/*' \ - --exclude '*/portkeydrop/importers/winscp.py' + --exclude \ + '*/portkeydrop/ui/*' \ + '*/portkeydrop/dialogs/*' \ + '*/portkeydrop/importers/winscp.py' echo "✅ New code meets coverage threshold!" diff --git a/.gitignore b/.gitignore index 4ae1f0e..ae93818 100644 --- a/.gitignore +++ b/.gitignore @@ -9,7 +9,6 @@ dist/ .ruff_cache/ .coverage cov.json -uv.lock # Security - credentials and keys .env diff --git a/CHANGELOG.md b/CHANGELOG.md index 5d5629c..c9d42bc 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -11,6 +11,8 @@ All notable changes to this project will be documented in this file. ### Added - Batch transfers: select multiple local or remote files and folders, then use Ctrl+U, Ctrl+D, or Ctrl+T to queue them together. +- Default sound pack: Portkey Drop now includes built-in transfer, connection, file + operation, and app event sounds with a structured folder layout for custom packs. - FTP connections can now enable explicit SSL with the AUTH SSL command. - Experimental WebDAV connections for basic browse, upload, download, delete, folder creation, and rename workflows. diff --git a/README.md b/README.md index 8f86de5..c1fc103 100644 --- a/README.md +++ b/README.md @@ -11,6 +11,10 @@ Two side-by-side file browsers: Each pane is a labeled standard list control, so screen readers announce "Local Files" or "Remote Files" when you Tab between them. Use Shift+Arrow or Ctrl+Arrow/Space in a file pane to select multiple items for batch transfers. +## Sound Packs + +Portkey Drop includes a built-in default sound pack with short cues for transfers, connections, file operations, and general app events. Sound packs live under a pack folder with section subfolders, such as `default/transfers/transfer_complete.ogg`, and a `pack.json` manifest maps each event to its sound file. + ## Keyboard Shortcuts | Shortcut | Action | diff --git a/pyproject.toml b/pyproject.toml index 6713f12..de36c1c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,6 +7,8 @@ dependencies = [ "asyncssh>=2.14", "puttykeys", "keyring>=25.0", + "platform-utils>=1.6.0", + "sound_lib @ git+https://github.com/samtupy/sound_lib_macos_fixes.git", "wxPython>=4.2", "prismatoid", "webdavclient3>=3.14", @@ -33,6 +35,13 @@ build-backend = "hatchling.build" [tool.hatch.build.targets.wheel] packages = ["src/portkeydrop"] +artifacts = [ + "src/portkeydrop/default_soundpacks/**/*.json", + "src/portkeydrop/default_soundpacks/**/*.ogg", +] + +[tool.hatch.metadata] +allow-direct-references = true [tool.ruff] target-version = "py311" diff --git a/src/portkeydrop/app.py b/src/portkeydrop/app.py index a04b00e..27447fa 100644 --- a/src/portkeydrop/app.py +++ b/src/portkeydrop/app.py @@ -57,6 +57,8 @@ save_settings, update_last_local_folder, ) +from portkeydrop.soundpack_paths import ensure_default_soundpack, get_soundpacks_dir +from portkeydrop.soundpacks import SoundPlayer from portkeydrop.sites import Site, SiteManager from portkeydrop.screen_reader import ScreenReaderAnnouncer from portkeydrop.services.updater import ( @@ -135,7 +137,14 @@ def __init__(self) -> None: self._transfer_state_by_id: dict[str, str] = {} self._transfer_progress_by_id: dict[str, int] = {} self._last_failed_transfer: str | None = None + self._exit_sound_played = False self._announcer = ScreenReaderAnnouncer() + self._soundpacks_dir = ensure_default_soundpack(get_soundpacks_dir()) + audio_settings = getattr(self._settings, "audio", None) + self._sound_player = SoundPlayer( + self._soundpacks_dir, + getattr(audio_settings, "sound_pack", "default"), + ) self._restore_transfer_queue() self._remote_filter_text = "" self._local_filter_text = "" @@ -732,6 +741,7 @@ def _on_connect_success(self, client) -> None: else str(client._info.protocol) ) self.log_event(f"Connected to {client._info.host} via {protocol_type}") + self._play_sound_event("connect_success") self._refresh_remote_files() self._toolbar_panel.Hide() self.GetSizer().Layout() @@ -742,6 +752,7 @@ def _on_connect_failure(self, exc: Exception) -> None: self._client = None self._update_status("Disconnected", "") self.log_event(f"Connection failed: {exc}") + self._play_sound_event("connect_failed") wx.MessageBox(f"Connection failed: {exc}", "Error", wx.OK | wx.ICON_ERROR, self) def _on_disconnect(self, event) -> None: @@ -759,12 +770,14 @@ def _on_disconnect(self, event) -> None: self._update_title() if was_connected: self.log_event("Disconnected from server") + self._play_sound_event("disconnect") if not self._toolbar_panel.IsShown(): self._toolbar_panel.Show() self.GetSizer().Layout() self.tb_host.SetFocus() def _on_exit(self, event: wx.CommandEvent) -> None: + self._play_exit_sound_once() self.request_exit() def request_exit(self) -> None: @@ -1638,9 +1651,11 @@ def _delete_remote(self) -> None: self._client.delete(f.path) self._announce(f"Deleted {f.name}") self._update_status("Delete complete.", self._client.cwd) + self._play_sound_event("delete_complete") self._refresh_remote_files() except Exception as e: self._update_status("Delete failed.", self._client.cwd) + self._play_sound_event("delete_failed") wx.MessageBox(f"Delete failed: {e}", "Error", wx.OK | wx.ICON_ERROR, self) def _delete_local(self) -> None: @@ -1654,8 +1669,10 @@ def _delete_local(self) -> None: try: delete_local(f.path) self._announce(f"Deleted {f.name}") + self._play_sound_event("delete_complete") self._refresh_local_files() except Exception as e: + self._play_sound_event("delete_failed") wx.MessageBox(f"Delete failed: {e}", "Error", wx.OK | wx.ICON_ERROR, self) def _on_rename(self, event) -> None: @@ -1680,9 +1697,11 @@ def _rename_remote(self) -> None: self._client.rename(f.path, new_path) self._announce(f"Renamed to {new_name}") self._update_status("Rename complete.", self._client.cwd) + self._play_sound_event("rename_complete") self._refresh_remote_files() except Exception as e: self._update_status("Rename failed.", self._client.cwd) + self._play_sound_event("rename_failed") wx.MessageBox(f"Rename failed: {e}", "Error", wx.OK | wx.ICON_ERROR, self) dlg.Destroy() @@ -1698,8 +1717,10 @@ def _rename_local(self) -> None: try: rename_local(f.path, new_name) self._announce(f"Renamed to {new_name}") + self._play_sound_event("rename_complete") self._refresh_local_files() except Exception as e: + self._play_sound_event("rename_failed") wx.MessageBox(f"Rename failed: {e}", "Error", wx.OK | wx.ICON_ERROR, self) dlg.Destroy() @@ -1723,9 +1744,11 @@ def _mkdir_remote(self) -> None: self._client.mkdir(path) self._announce(f"Created directory {name}") self._update_status("Directory created.", self._client.cwd) + self._play_sound_event("folder_created") self._refresh_remote_files() except Exception as e: self._update_status("Create directory failed.", self._client.cwd) + self._play_sound_event("folder_create_failed") wx.MessageBox( f"Failed to create directory: {e}", "Error", wx.OK | wx.ICON_ERROR, self ) @@ -1740,8 +1763,10 @@ def _mkdir_local(self) -> None: try: mkdir_local(self._local_cwd, name) self._announce(f"Created directory {name}") + self._play_sound_event("folder_created") self._refresh_local_files() except Exception as e: + self._play_sound_event("folder_create_failed") wx.MessageBox( f"Failed to create directory: {e}", "Error", wx.OK | wx.ICON_ERROR, self ) @@ -1805,6 +1830,7 @@ def _on_transfer_update(self, event) -> None: if job.status == TransferStatus.PENDING: latest_status_message = f"{direction_label} queued." + self._play_sound_event("transfer_queued") elif job.status == TransferStatus.IN_PROGRESS: progress_message = self._format_transfer_progress_message( job, direction_label, filename @@ -1812,12 +1838,15 @@ def _on_transfer_update(self, event) -> None: latest_status_message = ( f"{direction_label} in progress..." if state_changed else progress_message ) + if state_changed: + self._play_sound_event("transfer_started") if self._should_announce_transfer_progress(job): self._announce(progress_message) elif job.status == TransferStatus.COMPLETE: latest_status_message = f"{direction_label} complete." self._clear_transfer_progress(job.id) self.log_event(f"{direction_label} complete: {filename}") + self._play_sound_event("transfer_complete") if job.direction == TransferDirection.DOWNLOAD: refresh_local_files = True else: @@ -1828,12 +1857,14 @@ def _on_transfer_update(self, event) -> None: error_msg = job.error or "Unknown error" self.log_event(f"{direction_label} failed: {filename} — {error_msg}") self._announce(f"{direction_label} failed.") + self._play_sound_event("transfer_failed") self._last_failed_transfer = job.id self._retry_last_failed_item.Enable(True) elif job.status == TransferStatus.CANCELLED: latest_status_message = f"{direction_label} cancelled." self._clear_transfer_progress(job.id) self.log_event(f"{direction_label} cancelled: {filename}") + self._play_sound_event("transfer_cancelled") if refresh_local_files: self._refresh_local_files() @@ -1884,6 +1915,7 @@ def _on_settings(self, event: wx.CommandEvent) -> None: self._transfer_service.set_max_workers( self._settings.transfer.concurrent_transfers, ) + self._refresh_sound_player() self.update_check_updates_menu_label() self._start_auto_update_checks() self._sync_tray_icon() @@ -2247,6 +2279,7 @@ def _on_close(self, event) -> None: if event is not None and hasattr(event, "Veto"): event.Veto() return + self._play_exit_sound_once() if self._auto_update_check_timer: self._auto_update_check_timer.Stop() self._destroy_tray_icon() @@ -2277,6 +2310,36 @@ def _announce(self, message: str) -> None: logger.debug("Announcement requested: %s", message) self._announcer.announce(message) + def _refresh_sound_player(self) -> None: + """Refresh the event player after audio settings change.""" + if not hasattr(self, "_soundpacks_dir"): + self._soundpacks_dir = ensure_default_soundpack(get_soundpacks_dir()) + audio_settings = getattr(self._settings, "audio", None) + self._sound_player = SoundPlayer( + self._soundpacks_dir, + getattr(audio_settings, "sound_pack", "default"), + ) + + def _play_sound_event(self, event_key: str) -> bool: + """Play an event sound if enabled and mapped in the active pack.""" + settings = getattr(self, "_settings", None) + audio = getattr(settings, "audio", None) + enabled = bool(getattr(audio, "sound_enabled", True)) + muted = set(getattr(audio, "muted_sound_events", []) or []) + pack = getattr(audio, "sound_pack", "default") + if not hasattr(self, "_sound_player"): + return False + if getattr(self._sound_player, "pack_name", None) != pack: + self._refresh_sound_player() + return self._sound_player.play_event(event_key, enabled=enabled, muted=muted) + + def _play_exit_sound_once(self) -> bool: + """Play the exit sound once for menu and window-close paths.""" + if getattr(self, "_exit_sound_played", False): + return False + self._exit_sound_played = True + return self._play_sound_event("exit") + class PortkeyDropApp(wx.App): """Main wxPython application.""" @@ -2321,4 +2384,5 @@ def OnInit(self) -> bool: frame = MainFrame() frame.Show() self.SetTopWindow(frame) + wx.CallAfter(frame._play_sound_event, "startup") return True diff --git a/src/portkeydrop/default_soundpacks/default/connections/connect_failed.ogg b/src/portkeydrop/default_soundpacks/default/connections/connect_failed.ogg new file mode 100644 index 0000000000000000000000000000000000000000..dd540b59231df8dad895143f1f5edff6f2f03fe7 GIT binary patch literal 29018 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/connections/connect_success.ogg b/src/portkeydrop/default_soundpacks/default/connections/connect_success.ogg new file mode 100644 index 0000000000000000000000000000000000000000..15f2d68773adc3e1272fdc2f3ea840f80898992e GIT binary patch literal 26399 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/connections/disconnect.ogg b/src/portkeydrop/default_soundpacks/default/connections/disconnect.ogg new file mode 100644 index 0000000000000000000000000000000000000000..71e55542cb6c33cacbe2a8a5cd0a8f93d64e3a58 GIT binary patch literal 28118 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뮯{y(&p=TWiv$mU8cSaa2SrLeMUt_K$+OPS?=rqYoxkeO&d<8-liin7nMyK z8GJe-Anm93t^SdM*LMQuED$F`e8|`G=$O@-V=>3U1EQ0=o+$G+6z?%2m?m8n2Go7x z0a2ijlLRTeOVtX*{Q?|{=bQi%z?71P3~Wu!B$QnCSn0kR2P@9K4C%eg9+g|8M3TXh zDBe&7LkEyev7&&P+HcTm!1TnLHflFPwxhnlsMb_!V)BEp)-`H+y@UOHuIP!M(eO$Y zmq*=MC3q?u`5`C(kQO@cHnwy++owJMUTPmSeX$Wuu&^4R(4|)RqJTP}Ow2x(?P<^J zCW*l{9=lHFpsCAY#FHz8f25oEvUh!fL{v5UAj|&FBUm}x(Usvf1V|xz4uaFf zMe+$E65v9DZVEE0oTxLn(&0%(K92LH0vOGE>$SVmhdZb*|4xafsodPn5CGWx%Q>-q zvyws$*C}aBc}{`Rmw*+`8PvlFpU~?|{Rkojw8n1;WIQa6w3Xo#;V8O>&@lVk72M5c z;WN%HUdhtzEx;ov5Tf;F&d)4~ z2TxhELxqKHo@AeV2|z4Pna$9(f(Enkkq)q>0~w`a|GW&y*VNc^@?(_seePWv_4WS$ zm;k)oUWcE&ja!oNKTHYO?g1r#1=47dEhpPHeplU=LisJth5kogf1kgYT{Y-k3)ix< zvlwzXbc|`QEEal(HZ`K>rsYk!2mA39J!R6PWi!o#CEdIB_Gw(HlFL!cZX+; zYT3O(9Kl2>2y#Fklr%`7`-v0W>bn&LK{1>bDu$P@L<35PBdl^_I)KnZbgG8iy~ zWk1VIqQhj=y+~S-s`rTb6ovqzk$3*V@+PTCuHDV&27}RPLDiD!q>r~z;F;RUn;Q7Z$LrYH1GjkUM-&`Kn|;P5MBwwd75-dU%a1D3vUQ`w&xn`w zsLwvU`;|gXrpe`(hoD`NMtDXs9{9#fPTm4Qhh8PTjrbZE!v9dw<1pcE0BBvb+V3@N zx--%^L(BYPUu7p++Fillir0N`z4pvA5!~r6Dv~aOjelrrTG;T!-aRU*T0>pm8!Yhk zWKVZgDr}_jS@_8|&ZpO7id$A-j7#}fA5+|ZR&ADpY-qR50#TQ#72rl<2^C-hhzW+Y zi4V~b8Zh7bKGm{C5;Npma|3Ud(H#ef@-G_T=Jg?zB|%w^jhu_=l97~7k!HR9Nu0np zYx)o2J|_57{JFn7D|ESY0kE97ff2XDZR6Sz%>O$O&??9-^rl7%Bw=yhxb-}~`9|XG zi5(v>hxB9-Y_UFIuo!=Rd}(5yl~wrZ)q0vj%e{Nm3e3RD1~8O+Jo#(sTwL613`oX} zAb-Zs12=gD-h$rVz*G&~i56@Shv||Nj-L^iu8vd@)wr0E#&cJRfh_na?Lj6&e2@|5_d; literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/file_operations/delete_complete.ogg b/src/portkeydrop/default_soundpacks/default/file_operations/delete_complete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8e85d7266bcbdfab194cea418f5cf6bb34c8b53a GIT binary patch literal 11492 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/file_operations/rename_complete.ogg b/src/portkeydrop/default_soundpacks/default/file_operations/rename_complete.ogg new file mode 100644 index 0000000000000000000000000000000000000000..87f92ac0c865e535578a18636d07d6040534909e GIT binary patch literal 18095 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 EUuDI_ivR!s literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/file_operations/rename_failed.ogg b/src/portkeydrop/default_soundpacks/default/file_operations/rename_failed.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8e35224ab5104fec850e1669147b5038aec1d528 GIT binary patch literal 28780 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/general/error.ogg b/src/portkeydrop/default_soundpacks/default/general/error.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9772d650c93e8939a94aed9ad46147bff4753ace GIT binary patch literal 15165 zcmeHucT`i`zV2LU1PB-)Kxi6zXd0@Zpdo-1LFv*BRjN`HDV9(T5j0c*Q3KMOfOJuV z0)l`vDPluKMMVX5Tefa}E4a@Y=bUlJxOa?q|9aysW>(hh`Sowkx!ApLpA$fUzb_|h zkvZ@2LKgK5v>u8*5bYNd!z(~AuJFF#>l3v0)d}t9_5A0>>&dJ6!_(rI==NX#aTz0j z4~2tU*!so>8E9|ZyiuD%;q}-6e**XW9|#DHHi7H>;W}+2UL`3!#P4@E2>tt8jb`Qw z0W1Iv1zTbtW1Q^*03HBN{pNzi!K+^$B_>r{5)zrbr)Tw+;|a_z`03r%D(S>wxGaXG z7a$G*3NX~L#nB72*H^!+mwF-MAgz9j_mq}F$&*Sm$)ERlBcJ<#_S)p-daRH;8m1jk zvGS<|M=SZXf85k63jJ7Wm4$w{)v9D;Mzn8{QiQiGmFL>i_|?koZPaVZ^BiroW;|lv zUFCZi^WO9;DHTtH2l>ZsjSdq0Tj0WgwL;#=zsLJc76~w5z5wfN!f>w$ue4rZ;iu)0G27$QR!B+re%!Ytr%m= zgXXsm+79J854Cv-{zC|`*x`#RrfK11d@I*@OiX`lN^exm&Oy&^>VJ@&2uW-D0uv&C zE~p@sfz@UEuCavy4@)e?n&E!W1UF!oE|QAJi$9JU2^T--)DX^2^=3GqRqd)NJR5Vz z=w(Ux9jRv}F?ZB%7xi)kBs@VVO{**@YA<|l6Ry0yfS#+ zzi<3&>O+O)<~v6mIG0R1dJ5x5kgt@_U4QVja4tuCP_2A@)~OvfH7WLvQmPdPlh-IG z0g#ISS1p!LC;Bnvt4g8;)T_&LSn9XQmq&DlHF>xCn|HRnX}XCw!)dop+Gy%eyZUFf zy*MA!Xk-;u(Kh3uQ2{HsTE%aRf`v*7V4Gs3*6bs_FdDWBPO`wi3T{PdOhj(tU((pB zEUe7G^?6O1UG~IAxSu(6za!0i?$G1eqmO5^_DZG)x)=Og`b|1a3E-L2nmOkAWoq9l zN!dl?|1IFZEyps7a4TDOC|hY~i;~@>=I95#-5>QP#4KQSaT52Q5I-~}5$I&#J*6Kw zazfJ$N9N1vsWZ|e}@o$#H)s{7b zji*J^?&EJ7O(tOPaL_{XUj+aFmyO%Wb0ta+j#|@>`qPeDF3u({|J^msGcB00`2a`( zaIKj=|E8vmXD zzxq_gpYV@I?Ph zbNz4p-v2+w|I-|R)eaJdKN7T3c?|@^5CSKZOmj%q<9dt$_i?>oX{7`81c!hW0#_7c98gxgib~Ue*bv-n+*Yg%>yR3PFrG>! z(+IxB|21P705BjvzyM;mssH>d3In(@yj9=z0r@hB4sb*EBVJh!gPnQ%4!jCc!AlD=CR!%*hW*> zK6uaukdy%TiDAL>__C$=vf$#{+fkasAI%*Ic1|uX`Okt2US^b$iz{nu)!~W8)uxHq3@-APWd0tq z@eShdM)}^1klNZ>INl(f;RdsZ0;M>-E{z()VD^yrY<{3SW&y6f-J%H#f(ro>7rSMs zx&)!Q0i+-vyu;RbW~TX5TL0m=R2BORg^pG*l1N0 zIHKkAb8Koz<&KVOXuyy&gg6W-c7)5WIMq zs*P2HG1nle98a@SOJo1L`a=w7xBws400XKpA%FM=KZ(Aq=VjN*{#S3VfE1gCWT7RbTSNht506{Zof0&4wYC|*`XOSzW2ja;G3;%Bb)L;m?EzvKW#9#`@r=hw z?JXUmJ2SNhJW@pl`X&79+h!FqMOykNJsR3D{+Z2PZF8ZcT|~vqMy)p2uu(K9G&TfO zJTT_wu zcMrH5oKM5UbF8&1&-(`khO^dMZF!F5-xYZ|9`G=0L%}zAB1fCQD;#Zh!sGGgSgT#T zJO7>wuKBOo*i9cpyWtyYmedYl@}ePa?@Ah)?ywN}tU6 z$P}@IEE~DC^&AxmV3emMLp3+oi;g$io@4u{mTzT_m>D8M@3lo!5Q}^cP?@iyGoST2}@E88--Nu*edvG(2 zRZtJ^7^vx^@pGGkPqKDZ>tN{ z_{Hm6wXwEVNzHA#A5(xvU~juNy3ardlVqia(OzDP)GIX&Q<5Vmr#vV&7~Ep}ViPL2 zk{{vBU_+0#K3e{!^rqPpqrcs5mwx}F)fayS6kfYr^DSh--sy;$NcQx@Fh$SSq>0QL zVcp_M2k|w)&V2jstH&xZpHATZrsD3_!FXCUV5w^vWXX&eOH+w)o(C z=_}L+76p#sRT6t9*2i5543qR68}RTj71G;3sdTtERS6QrsbOl7T}X9Y@aE)cBBdRY zmDZLJOsD5pxT~(V&N2Mxr|o9nNlB+DQU%CnIru(=RSO>}5^dlP0tSZt>3HEC(o!Rr zF@ppWiW9_71W1%bh(==|3d~O7^imZ40n<^T5QhiHWPVx>@0#g{p2{2^b=&&0<9$Hm zR^+#=7`s(IK-wi_&Q5aZQt?z1tt0xQc(f>N6feEgX*>Jz$)7p8Rv{HhJAR=KG;W?@ z&OG-Smtqv58Jbtl$U}@ak+NYLF~K$gZQqbpKva~!EkV?rFr`o8OjEbwBz2+6B(x>K zxUq!^S%(j&QMl=#%q;En4vaq@S&zNpLmM6}g~SZy`{Vc(=kfkYnRW8L1{f+9|J62@ zw!8mH>S-*3n0Z*r4UxVfH{Sm(UKS!DeFT46PFcqu;WI9+bd&jc*l4KxJ*QvwF5x-^ z4z^S3LUr`n)|TQYc}{}F{u0GldWzeTZfs0JVCq4 zpsN=1X{dnxSfUbh+EiN&mxJlS;OGHKssuVm0TZ;v&v($-i5rT#VPTt_oF)?oo>=Vk z<*=Y3KC194pCLd<4bs720C@EJuM1Ji2bQfCs{&?={WQOBxZv6{DVOwT-lDS;>;T5? zxK{eCq6fC+ENz~qfsyY0c>le|AHU2P>PoFkJ^yD}e))ITcPj)t+J*HLhZAXPfVjoS z6YqAfrNH#Y)pV1*&e3+I^&U3Wa(LVBg@NSkY60W@-h~ZLL7FPkXt#}S4+*ul0$BgE z`U048O^b9?w>4m=0keX+E%#qT9T=2fQJejut<~TVW+X=qZ&mabf}R$jFre@qE{S`p z8y8tp#ud)Ok*EWUxMal7+kZWNW>eh#MztrZTCFkR*O_ZMm2)B310|sYn_C`=?)!Ov z(GHcLUl)r%iesBLch{ELA{cw6SFz&Qde7JV9O6?m}|2TBXf)F#b&gG z6{weYMlfyJRfobB)ufh9O`nwuNGGdI;Q#o}!Ubm61trOPd7LC=DqbwYnq0nrNe=@A z%G<0`@wdm&H*+Yg3p#=qrR4PuQZ!bqR)XF^S2RWK{gk*=Gqm~~+ij;e3phptJ%|KU z8H%|Xegp<}ARF>2{%h~8b4MikR?>^L4}RZ%RP{mv1%6(Y0bFZDm%32;^QH!lA1{J} zq@FH8?5_9w4y=E0;k4wm;6hH-JBgz|-RC>AP;VtR-P-wMK*K+Ng!A*7r{KgUiJ(KW z7IY?(U?kbNhcU>X+v+~uT6K<=%IzZwO=Czz&AZ=3`}+ym+_DoxV5z4Oour8y%oo-0 zd7|V-f8YBDj5wL;yFP@4S~Ft$3RyrWGA#*%<1%{u(jkyzD2P~JX*wPwYl0Yk5{Z)4 zqXHyYpYYf9?>4cEcXq@HzV&i4p8k0uUf$D>?}lX6np=yJXzzRBr*pH(&jMaM!M?!9 z6489TBSGu%e&f)p=|uL7wOwG_?#4siPW3*IJzWociP&t{&vr`nJLf=SM7NNNMGZ?R zD6doBCw7%u$s5S8KD4olcjxaR4){E!%U#yV&gMHn-d}GMI4erqDik%a>Y>LFAXyXe zq~emX4!aulfB-2|1t!8{-0GCAc-_-8j&UIve$Axngepx}&iUy{7(<&~R!LD1LbPI7 zcKh+@WCY1jClXw9|EuG|;)S`Ql{R~)AALW^j<8LZ!{g3Ys~tmvB~*BREz815%@y9^ zhoO!!*mhg6dhD`LJk3NM8c%F98*SYD>8;{DSC7D6G^P>m*@T1_#Y8w@jg1s7s@@3oDD6njQ!ae>X&Y2DwoH zye<@|*1-YpQ%JhrEej&fL}~*J9#60}5zBoe;KaayRwgDDVw*+kEtGeO(YN!hXq$1e zhnP2ky(t5L^G1JN2vI%WRitrEC6sk;`q$+R0Uhs0EZ#kuxl1?>Ku>ejb@W_q?c9iY zrfHb~Od5XaHjY_W;x?weNzUXC)A0fy+eA9wcG>H!H2$37Cmff$v^yKpDQZWAnw7hC z*(7VK=%o}i(LF#+5V%DS1&t<+%qSVAuw@x>Qu9=K9A2iD%9e8ymvYM#p^7ONc_=7H z149F%^F~HAnStU`%z-E(!xZ#?><$9&26R%>1GuT5IM#HNg&3!(4R;g=QQVvI0VEC` z(zPWO9pR!g6jI#;&=(m<*<(_Fy}ZVL-_v?#X^dvK8vWp^TTc4;$;I8T3M$kFKCA=*-+$=@yL zOOL=8-%dx}f+z*1k8wn$b!-)O5)=!71Y3eapY+Bo2vDS8MRbDz4rtml(gn+;RCcXA zqihUY0I0OSKTfJRP3afe2yG)O#5Z!dGfBvwOF!Ndhi)JHvulAbbYS4+^^aEDMu*?6 zRuT1|!O&>GM7u+L3(o1Fl(P#=86)bIDj{mj^JrY?8!@vM#Erm;4W7qq|GLxdbYjNN zH|xFon~J6AR!g<&kUf=ZmPnAdglCqhX{I3b1{KxYbCi7uhQ z#;>K2B#;AU62Y?P-my?8UQ#1B=9T(-=%`G%j!(=18fl zSNKm4*JZ73hYqvedzm+U6#^W@pEmujjeXM2F0kN4<9~@}44(dgAMh;tl5*i#g+x+0 z-A44$wVPEVEB9a9nVkDm?%DQ|YZ-m{&dN@R50DORy4na1*b^R?$?8i>HGt1arQ#0C0TSVic2;1gjHcUqR?Ye!YKW5ic+K(D*q zFCjA#Xzv0$P=@zggzs4LMcXRul_VMi3-*5Lu$cP`Z1BDgeYJf$|_ihr%Tb4R|$pbh6EL z*z2>7T}9$Em4)@}1?%l^`d1s*FcmwoRo~POKV3bMFtz(NK~5s>2Btb~j2%V<+d6+3 zNv2aaH0Z)o#(5pvsM|iY_qx`zBj2By4j0a|`|D8nr$y zn!4)R7#G-H8GRY?5PO${>$A%djV6DIKiu$#MfkC}BcJp0U%ifh7VYvgfB&8Rdjz)> z?l_N4`9OMnrS{b_#Al8$lA7xzePCo)?5~zD=MXy_16%j+D~a*|&)hlaa#33`L&#CE zmtPbCNC0qy80;lwD+ZQdgC7HQq(S!TH~?%iyenG^M!6hcXrYrHze0;S{YivDFy?A) z0ywL5Tzy;B9pS!13L#$1yT$Gs{EiG;#Ot1mxX`>^{IJ+H;?VkIKkfyP#=)_UBXSyD zlna5*H>YeP<~n{9x=!Y7h|xDLHTWR_nnv^L+yW$E;lj#{T?~`OicFrczkz=L;Wltd zz{&0YwOTb<=ehlq=e@hNH!b{r9nqO=8u?^twELmjuGZssoFk!~XPfC|Yg0m1RRP2d`~Lk!4b zfk)C5P-EMJhcK4r(*syvli*!WlO&LWr1eI5fn1dxuQ5y=Z_Q1SZ``QJoNX~jAMslc zvoV_6QF5w}lS{QZC{XH#|=iOXbo#-Yva=IT2reI z`{8BFhZy#Z|1zf`;L&l3L{4ejpK4t{*QrKqQv818&ylzfBO&f*Me3Du?~@g7yjeaO zIC%4j{F3#bEV>rc$F_4ZLeCt(gb72STj;x#6fX{{iyab{Hz3yb#MR{oD3mZjD#*20@W)Gs+e_H=>2y4jo;tFOfz?1*Ae$R?^PCGfoKbDrQXl< z39{R{>HSX=W$&-&x|`>mfGP1d!BG^SSz{%@!}xpYI>+j=&XP&Ftl-^nEg2Ur9)b zZI`FE-4R&0kY*uHPb1I|;fNf-6=7Vmx2ND0Fc^MDi5uXOQ~5L5vR>2->zv7rg|x|a z1PNYzIC14h;y5{tCD{`@J1B(#t)YQS*rXEySEW*$UsPOvm@Zp|MTl;^B3@)V z|9lv_2AeRS+iEoHDSz9OhaawLGJX`U5X>XKCdcmh`SaJWkEgeGTr2de(<;!f=7~FX z>1*_l3%%x+>Lb;5r)`&ym92YmG-Sl{z_0huRQG>=|29hM?4wIhS!`TU3dgj_WLzhE zK_&ImQvs>aoE^+FgxVrz!;`z*?sgnS!`iM?&-n>DIT1p0satI4L4c4geM@OLBMFZ| zdgnmxS=Mf)pq5P36m>YHoa}085kH?vy+Q_05l2Tu_c|jm!_?ruPl%C75<2s?%3kb& zo{66)J&Sf5XPgXL#x3X?eV7RxY+QdV;2tI{D+3|gBzs>UFZ;8-=Zkpx(V|GRh`Dy- zm&gTVKkU7DW-Q|pu3P1&WWE-Czs3nO&dtv4pG$l_oAtf)*|Eh7dmLTFbz;Zvj}!$; zAAR%a51-~`8*e>iNX9Y+J(aal!igCma~bJrReM|CmlzYz6{8&_Qt(SP-cZVql~lA0&hslQ?QKC}OB7 zFoWJQwK>agM8Yc1E$G;m)VyIKqKxOEDVFNHn$@(WYieP~75RBe zfYe`&_R@Igwor4wuGwyv-% z2{d_#E{_3QAllfEW@O05c|}ZiS)u({T(`2-?RZO7{wY#vf{c9C~*`T=fGtt{&m~ zknvEi@~s06vR?`XlXj$W`&sZ(#SbySkCWx*$Tv`u}<6>3&D zvcC5|x%2v?*T=)xjh9|4ZaiUe;II0MPwPkTA5gloOZEF4mz_8gswe zZIMiIiETr%iZXIs&VcF;sALZ8z8-SONb-7+4hs~-qWP%_=?E+zF%yvVFzN>Z*BJ*= z0mB%maG+Wp8O+o2?pLTRKaP+tx3Bfnl9qPl{u!)*%Ies3KGt+B=73FDVy@bOzEwxdz3%(;Klsl+*g5jGWaQnq znyH)fJdk6c# z4ukRB2#?l3LO-`LH8)gT&Q!T_cH({MOtJW8&i6W{;LqReX2w0t2*+SwB-qik&gz~0 ztVcs(yYXzU+_z-Hd68}BdOTLq;p_H#Y1+*dj|RPH>}!D)8K##z^rWcgW!#?a*Ot|h z>TYgsHeGHu?QcyTYDCKkCP|RuMDZuL31e176cay%IIa2lXWsg zXAC$1sPKU$4crD)dN2ox1VNxR73k#xYxosLhjaV%3qtv~Hvka}DW`jemC<_nbG^0# zZ26`$*LTh2y8k&9t&};&8sS3ae3!!i}&#wjp7{zZ#rXAk4jx#XcwPN-~3Z|eJ^OYd7!yB zNNPvMnhGD;U4^T%4ExjVMe}Zf{_kW?rIsyU!-tk;+q+z`Itf?2hX4hzq=7S_vH{5y z4zfxpK)tjx-vD_8izT5zGKS>75k|elR%w6~0xg1!PKas-aj;gC+Ihf@rp4i$#cYvf zN#~g+>iIXf^vfaGwR=smk^+Nc32(Pwmkax~0`G@;WuG@y3Hw=nF4k`JNpi!Xk4}f{ zj#d18S?eiWD!_;t@5D;s!OymyPiY#GiVl*hv1cVWBJV(?_ zv~t3Ms1eZTd$8eWNbfNN?$d;%j|rREgJ1TG&0pLd@^L^m_)pO+;RpBk!xc74>y_e7CL}h*;Y6F#pwQfmM2y|e&cOWoCQvO4n`0WG9>YJ5H~$} zBLWP{fx9FiD-Jr_9Lkg77upP=1tA>!#eyKv0ReP)7_K0g16&1C1Op4mp`gh;%ZLFm z2&?oow2&Lue}VZNqFNJ8NjRuTY_{%b!Q0c451*gdKJd)LXM8xbiOu5#HA0TRCwyFvh zY?TzVX0Gjzam+uy5HvbNbGt4SiO@{V2J+HWQ#N>F?&?Dg%4~<9oV5ob?sDrkVcBVGU zg?A=MVudY`IYhf4FN^8qQrDK^qWXw7Qidlh#PIcXNpXgoGQgsjq=BrN5@EOn00%}u z0ATup;L70OUV!2U!eT%PkoaIPvJs{XUhfHk2y^(gB*q~i>SiP0#t@-`&F*!^RN2ct zd>nPZ`O}AWNLvw2ojJD5<3CMb7_9%`4;Xw9arr|u#x1+a#-g9uc%>slQ@m>d*c+By zhSs%_d}ldULz%X^tC%3s~I2hEh5C#s>2I+fX$VkBG^8d zC$EYopS)PjF{*a+2c;JsE-eX6exkZTL$p&*Q0Y{V=f{FHNv2ZC)=CXIC-G7bTPAqEm++=sa0?&$)VI3VkU=H{@K>UG@h>jC{lGK5=bX@U1{&Agf{ za;*HS*{So{^Qj%Hn=wTrs^#yodZW8W0{7`PdZV^5b`bY`l) z89}`5$>rGqpq3|+Ji`iw+z%F`s8N8UMM}Z~3cxRiGXfVqJgW}^dOU#r-+&)Du+R)O zp+Fc?lOfuaz8m0$L7o5uwij+X3J!B9P$({)IAkXXG@bZfLwiU<>x=r@EiZ0+KV7K6 zQdEQtnDbuoC%6CcBC;X!s?Xu?ox5k*D=r}>m-oYm#-G=nW~tvpX`jBWwvEg4fS=R$ zEUrsiCe5br9ripMrb75an3A-%hyo-#%VLY8OwD_3&CcS3+cq4+ z?|fs+&ti%vx&&jxNp`ll^k5ttZ%^&gLz`jkK5#xni&2CjlB257LMKS4lIWVKxF#&< z2jis>hyx@%5Zg$lne~7{lORYl!o3V$vrJIZmE~)qzSm65&Usu*ta$y(LA8;pBKd-v zTdJ_bXKop{!8&AT0CoKQ;sb%blRG~||8Y#K<@-H{>EhSXZ@-+IJ;K)%bb}2McyTM` zXwbTE@(J^^)39qlw54lbLL~pGeXl}q3MS0Wy;xX$8bsu`appO9(Adw27aQhVSzks_6#z@tqn)l=raH}0G*$%AXC|m z$OB6V7)H`D3@)Gxf--mq12A$?SaAR_H2By9QLUMdioU2y&IqJR7waVPkO8hF`XEFbQ!xw@x5adWe48!2#jmL*mZ}Q zD}h{1))Pk({B7Io+f z&;7OKxfYYG=oD0~OMUyI|MISp&;rlnI;oG2+aN2?U%O?lFZ!N*`pA(|qbOI>I0Zav z>#@~Me7?!`p3_#XYVj)tvmwtvKj~G!;w_t9?b_3v0m4UFHGU^c#bDpT6Pk0zBUAG0 z1_z<{F?sVRO0uy11M}?}{)Mjf0iRJxbign~Hr-YS-Sy_#H8%Gc2v$;YEaIS=x;|$d zhgJmSUNjdzp#)TG2u}o=AaWc~0g#ghbVbl7FiwXxREY#Qe#D&8x*I@RkPaCptzP+* ziY!PnOSzu}RG{OZ`L60+@D4k>anF(Ne4FP&>oNzQC(hSg)_zz&@VLax9|W&&fAI3$ zrnn5k?rNc%1-Dv1bRB^XEW#i$RhsKMt$A&mc4n%h3-7GdC*iP?n`Z2YB1^B$`E0!e z(*{!+fmGJ&*Ho4y>j}#}CHmuu0@Ttg90x3HKGah9r8@@vrk_JPgaGzloLpvFMhzm> z!JtnFcJo{qE3N=R^=<(MnTrzz6aiT>jVEJ9xNo}Ws_1apBr?)7%dMA%HMKD^0h!oT zI>TRUyiFNGbk2E2-Cv?Prr4I>$aBz34R>-AZI-OtI@%y5txwAm=Y_27*}~H(n5OFm zvpOGgeFW}_IYh*nk??MOo|?lFxk{+gHTO>S5Q21risAi$$z^h7a&6H*7cqzYLycIlqB zRJLUla8VmV_OiwIbhhpF@Z4@Mh~L1!I5{uvF+9iff|Tp#=XkkD{mw0lV-KemmK8bgtt$e1GeO6F(Rm6NlSyoKv79#`1lO7K zdkddSYldA}Di{}-!6c&y7KH4Rw98Vp8cAe8$59bFQlE3t3~agY3RfH~tnK2%|H%@C zpmH!|5n$&EzY)n~Kvv8qQEsFO;I6NxsU5M~43y;O1yWvIWxukbHwn4%k24;%L%|Y* z9H}xapKzVtm-3mAEnB_SQ(xA-nnv?w+txkT5(cpL-AdU#CyCm8H{Eym=!5vQcxZEU zMCXBgjEs}!O)Dmb2m4T2;g_1lnTvw~dyvlkw+j_QdL6@YDKnXR7sa#EwNx4+o^b`K zIv}+SBG4c$X$FM@@b)>AGO-AH1p@-r&3+s*Fhw+}fgA8579o2BBpX8{EF}E^2nPUi z$X*w+-bD=48%=k7xiTrJN8hyPjkLoJVHzr~NFBG|oH^KiIf@#T>D1bG{Z?|vN5!X) zs|%fda__k|GEqCbk9>V{`iZ#nfnN5{$&Bq&A65rMc*ypT?7b_mXqP^}zt<>!vtV}1 zN7kpDgr58w@lCUrK+ED^BwND45&^z_z`V1t@ z^qVLojZk2Z1?E(*PEr9Uqztc@iAN~jqPC?FfqJ9_kfZmK&lE(q#!F?ht?3kChzFmD zO-u$OpsN{JJX8=z+yZO^5a(@~Lqa*{fZE=Aq=MAB{4`xk|ReA6%*hMamje^3nSY7lzV_F(una?{|$=9$o& zP0xJ}ANz#6cGb7v4Wqp5BZLI(-IhwvsqKNKQ)RemGP0@NiX^Cu(3YkWH zD68@i9OfVd2&o2SwpmK*TZJh1Mh#L*q`i#&;rhE65gIa360jHuBrvg!Ehr0y0H0rQ z6U22*7I^{$5g<~D4P^D<vPQh@ELx(ye+C} zB5Z!)bEv*CVz0cFeQeg4lmeUoMDMF50m)+#Q>cz>&n|Ar)!JT|BCs*V6!^4zJ%d(| zr*!oD8v;*y#`X!$$C)+6t=8{8Jl7UhQR`RKhj)R))?n9<>&MUDz0!Q(<;&RPVefC} z1?oPSfB13R7yD!BMxQM?C*op1&XC7Y0y!6uazJRTj-A~u|D&{t_R@PGPI7LQ{3E^@C6BC literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/general/exit.ogg b/src/portkeydrop/default_soundpacks/default/general/exit.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2ae9aab38458ca407a271c05adc784c6a5cfb2df GIT binary patch literal 28166 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 E17CLyzyJUM literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/general/startup.ogg b/src/portkeydrop/default_soundpacks/default/general/startup.ogg new file mode 100644 index 0000000000000000000000000000000000000000..baf6ef61d5b950ff6bbbee9fe79a1d522cd9829b GIT binary patch literal 16584 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 I?p+Q1FOiFMDF6Tf literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/general/success.ogg b/src/portkeydrop/default_soundpacks/default/general/success.ogg new file mode 100644 index 0000000000000000000000000000000000000000..68a1a8f9c870c6f13b54d252a17690a63b41569c GIT binary patch literal 28732 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/pack.json b/src/portkeydrop/default_soundpacks/default/pack.json new file mode 100644 index 0000000..f5e2bc8 --- /dev/null +++ b/src/portkeydrop/default_soundpacks/default/pack.json @@ -0,0 +1,27 @@ +{ + "name": "Default", + "author": "Portkey Drop", + "description": "Built-in Portkey Drop sound pack with short, gentle transfer and app cues.", + "version": "1.0.0", + "sounds": { + "transfer_queued": "transfers/transfer_queued.ogg", + "transfer_started": "transfers/transfer_started.ogg", + "transfer_complete": "transfers/transfer_complete.ogg", + "transfer_failed": "transfers/transfer_failed.ogg", + "transfer_cancelled": "transfers/transfer_cancelled.ogg", + "connect_success": "connections/connect_success.ogg", + "connect_failed": "connections/connect_failed.ogg", + "disconnect": "connections/disconnect.ogg", + "delete_complete": "file_operations/delete_complete.ogg", + "delete_failed": "file_operations/delete_failed.ogg", + "rename_complete": "file_operations/rename_complete.ogg", + "rename_failed": "file_operations/rename_failed.ogg", + "folder_created": "file_operations/folder_created.ogg", + "folder_create_failed": "file_operations/folder_create_failed.ogg", + "success": "general/success.ogg", + "error": "general/error.ogg", + "notify": "general/notify.ogg", + "startup": "general/startup.ogg", + "exit": "general/exit.ogg" + } +} diff --git a/src/portkeydrop/default_soundpacks/default/transfers/transfer_cancelled.ogg b/src/portkeydrop/default_soundpacks/default/transfers/transfer_cancelled.ogg new file mode 100644 index 0000000000000000000000000000000000000000..d9df0eadf880464ce505d9d97384e1645384a7c4 GIT binary patch literal 16666 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/transfers/transfer_queued.ogg b/src/portkeydrop/default_soundpacks/default/transfers/transfer_queued.ogg new file mode 100644 index 0000000000000000000000000000000000000000..c6b739b1114a1a276ec0445bc88aa811126978b9 GIT binary patch literal 15029 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 literal 0 HcmV?d00001 diff --git a/src/portkeydrop/default_soundpacks/default/transfers/transfer_started.ogg b/src/portkeydrop/default_soundpacks/default/transfers/transfer_started.ogg new file mode 100644 index 0000000000000000000000000000000000000000..ad382fa8f6d8223c4be40e57e54c60a3cfd2b35f GIT binary patch literal 21111 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 Oo(J{>GPrK9_dNhkb{C5P literal 0 HcmV?d00001 diff --git a/src/portkeydrop/dialogs/settings.py b/src/portkeydrop/dialogs/settings.py index 4a51762..bbd505c 100644 --- a/src/portkeydrop/dialogs/settings.py +++ b/src/portkeydrop/dialogs/settings.py @@ -8,6 +8,9 @@ from portkeydrop.protocols import SUPPORTED_PROTOCOL_VALUES from portkeydrop.settings import Settings +from portkeydrop.sound_events import SOUND_EVENT_SECTIONS, normalize_known_muted_sound_events +from portkeydrop.soundpack_paths import ensure_default_soundpack, get_soundpacks_dir +from portkeydrop.soundpacks import get_available_sound_packs CheckUpdatesCallback = Callable[[str, object | None], None] @@ -31,6 +34,8 @@ def __init__( self._settings = settings self._on_check_updates = on_check_updates self._spin_controls: list[tuple[wx.SpinCtrl, str]] = [] + self._sound_pack_ids: list[str] = [] + self._audio_event_checks: list[tuple[str, wx.CheckBox]] = [] self._build_ui() self._populate() @@ -51,6 +56,7 @@ def _build_ui(self) -> None: self._build_display_tab() self._build_connection_tab() self._build_updates_tab() + self._build_audio_tab() self._build_speech_tab() root.Add(self.notebook, 1, wx.EXPAND | wx.ALL, 8) @@ -444,6 +450,49 @@ def _build_speech_tab(self) -> None: sizer.AddStretchSpacer(1) self.notebook.AddPage(panel, "Speech") + def _build_audio_tab(self) -> None: + panel, sizer = self._new_tab_panel() + + self.sound_enabled_check = self._add_checkbox_row( + sizer, + wx.CheckBox(panel, label="Enable sound ¬ifications"), + name="Enable sound notifications", + ) + + self.sound_pack_choice = self._add_labeled_row( + panel, + sizer, + label="Sound &pack:", + make_control=lambda p: wx.Choice(p, choices=self._get_sound_pack_labels()), + control_name="Sound pack", + ) + + self.manage_soundpacks_button = self._add_labeled_row( + panel, + sizer, + label="", + make_control=lambda p: wx.Button(p, label="Manage Sound &Packs..."), + control_name="Manage sound packs", + ) + self.manage_soundpacks_button.Bind(wx.EVT_BUTTON, self._on_manage_soundpacks) + + muted_label = wx.StaticText(panel, label="Muted sound events:") + sizer.Add(muted_label, 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) + self._audio_event_checks = [] + for section_title, _description, events in SOUND_EVENT_SECTIONS: + sizer.Add(wx.StaticText(panel, label=section_title), 0, wx.LEFT | wx.RIGHT | wx.TOP, 10) + for event_key, display_name in events: + checkbox = wx.CheckBox(panel, label=display_name) + self._add_checkbox_row( + sizer, + checkbox, + name=f"Mute {display_name}", + ) + self._audio_event_checks.append((event_key, checkbox)) + + sizer.AddStretchSpacer(1) + self.notebook.AddPage(panel, "Audio") + # -- Data binding -------------------------------------------------- def _populate(self) -> None: @@ -486,6 +535,15 @@ def _populate(self) -> None: ) update_channel = getattr(s.app, "update_channel", "stable") self.update_channel_choice.SetSelection(0 if update_channel == "stable" else 1) + # Audio + self.sound_enabled_check.SetValue(getattr(s.audio, "sound_enabled", True)) + sound_pack = getattr(s.audio, "sound_pack", "default") + self.sound_pack_choice.SetSelection( + self._sound_pack_ids.index(sound_pack) if sound_pack in self._sound_pack_ids else 0 + ) + muted_events = set(normalize_known_muted_sound_events(s.audio.muted_sound_events)) + for event_key, checkbox in self._audio_event_checks: + checkbox.SetValue(event_key in muted_events) # Speech self.speech_rate_spin.SetValue(s.speech.rate) self.speech_volume_spin.SetValue(s.speech.volume) @@ -522,6 +580,16 @@ def get_settings(self) -> Settings: s.app.auto_update_enabled = self.auto_update_check.GetValue() s.app.update_check_interval_hours = self.update_interval_spin.GetValue() s.app.update_channel = self.update_channel_choice.GetStringSelection() + s.audio.sound_enabled = self.sound_enabled_check.GetValue() + selected_pack = self.sound_pack_choice.GetSelection() + s.audio.sound_pack = ( + self._sound_pack_ids[selected_pack] + if 0 <= selected_pack < len(self._sound_pack_ids) + else "default" + ) + s.audio.muted_sound_events = normalize_known_muted_sound_events( + event_key for event_key, checkbox in self._audio_event_checks if checkbox.GetValue() + ) s.speech.rate = self.speech_rate_spin.GetValue() s.speech.volume = self.speech_volume_spin.GetValue() @@ -534,3 +602,32 @@ def _on_check_updates_now(self, event: wx.CommandEvent) -> None: return channel = self.update_channel_choice.GetStringSelection() self._on_check_updates(channel, self) + + def _get_sound_pack_labels(self) -> list[str]: + soundpacks_dir = ensure_default_soundpack(get_soundpacks_dir()) + packs = get_available_sound_packs(soundpacks_dir) + ordered = sorted(packs.items(), key=lambda item: item[1].get("name", item[0]).lower()) + self._sound_pack_ids = [pack_id for pack_id, _data in ordered] + return [ + f"{data.get('name', pack_id)} (by {data.get('author', 'Unknown')})" + for pack_id, data in ordered + ] or ["Default (by Portkey Drop)"] + + def _on_manage_soundpacks(self, event: wx.CommandEvent) -> None: + from portkeydrop.dialogs.soundpack_manager import SoundPackManagerDialog + + dialog = SoundPackManagerDialog(self) + dialog.ShowModal() + dialog.Destroy() + current_pack = ( + self._sound_pack_ids[self.sound_pack_choice.GetSelection()] + if 0 <= self.sound_pack_choice.GetSelection() < len(self._sound_pack_ids) + else "default" + ) + labels = self._get_sound_pack_labels() + self.sound_pack_choice.Clear() + for label in labels: + self.sound_pack_choice.Append(label) + self.sound_pack_choice.SetSelection( + self._sound_pack_ids.index(current_pack) if current_pack in self._sound_pack_ids else 0 + ) diff --git a/src/portkeydrop/dialogs/soundpack_manager.py b/src/portkeydrop/dialogs/soundpack_manager.py new file mode 100644 index 0000000..686a4a9 --- /dev/null +++ b/src/portkeydrop/dialogs/soundpack_manager.py @@ -0,0 +1,486 @@ +"""wxPython sound pack manager dialog.""" + +from __future__ import annotations + +import json +import logging +import shutil +import tempfile +import zipfile +from dataclasses import dataclass +from pathlib import Path + +import wx + +from portkeydrop.sound_events import FRIENDLY_SOUND_EVENT_CHOICES +from portkeydrop.soundpack_paths import ensure_default_soundpack, get_soundpacks_dir +from portkeydrop.soundpacks import ( + AUDIO_WILDCARD, + SoundPackInstaller, + get_available_sound_packs, + parse_sound_entry, + play_sound_file, + safe_extractall, + slugify_pack_name, +) + +logger = logging.getLogger(__name__) + + +@dataclass +class SoundPackInfo: + """Information about a sound pack.""" + + pack_id: str + name: str + author: str + description: str + path: Path + sounds: dict + + +class SoundPackManagerDialog(wx.Dialog): + """Dialog for managing local sound packs.""" + + def __init__(self, parent: wx.Window | None, soundpacks_dir: Path | None = None) -> None: + super().__init__( + parent, + title="Sound Pack Manager", + size=(820, 560), + style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, + ) + self.soundpacks_dir = ensure_default_soundpack(soundpacks_dir or get_soundpacks_dir()) + self.installer = SoundPackInstaller(self.soundpacks_dir) + self.sound_packs: dict[str, SoundPackInfo] = {} + self.selected_pack: str | None = None + self._load_sound_packs() + self._build_ui() + self._refresh_pack_list() + self.Bind(wx.EVT_CHAR_HOOK, self._on_char_hook) + self.Centre() + + def _build_ui(self) -> None: + panel = wx.Panel(self) + root = wx.BoxSizer(wx.VERTICAL) + content = wx.BoxSizer(wx.HORIZONTAL) + content.Add(self._create_pack_list_panel(panel), 1, wx.EXPAND | wx.RIGHT, 10) + content.Add(self._create_details_panel(panel), 2, wx.EXPAND) + root.Add(content, 1, wx.EXPAND | wx.ALL, 10) + root.Add(self._create_button_panel(panel), 0, wx.EXPAND | wx.ALL, 10) + panel.SetSizer(root) + + def _create_pack_list_panel(self, parent: wx.Window) -> wx.BoxSizer: + sizer = wx.BoxSizer(wx.VERTICAL) + label = wx.StaticText(parent, label="Available sound packs:") + sizer.Add(label, 0, wx.BOTTOM, 5) + self.pack_listbox = wx.ListBox(parent, style=wx.LB_SINGLE) + self.pack_listbox.SetName("Available sound packs") + self.pack_listbox.Bind(wx.EVT_LISTBOX, self._on_pack_selected) + sizer.Add(self.pack_listbox, 1, wx.EXPAND | wx.BOTTOM, 10) + import_btn = wx.Button(parent, label="Import Sound Pack...") + import_btn.Bind(wx.EVT_BUTTON, self._on_import_pack) + sizer.Add(import_btn, 0, wx.EXPAND) + return sizer + + def _create_details_panel(self, parent: wx.Window) -> wx.BoxSizer: + sizer = wx.BoxSizer(wx.VERTICAL) + self.name_label = wx.StaticText(parent, label="No pack selected") + sizer.Add(self.name_label, 0, wx.BOTTOM, 5) + self.author_label = wx.StaticText(parent, label="") + sizer.Add(self.author_label, 0, wx.BOTTOM, 5) + self.description_label = wx.StaticText(parent, label="") + self.description_label.Wrap(400) + sizer.Add(self.description_label, 0, wx.BOTTOM, 10) + + sizer.Add(wx.StaticText(parent, label="Sounds in this pack:"), 0, wx.BOTTOM, 5) + self.sounds_listbox = wx.ListBox(parent) + self.sounds_listbox.SetName("Sounds in selected pack") + self.sounds_listbox.Bind(wx.EVT_LISTBOX, self._on_sound_selected) + sizer.Add(self.sounds_listbox, 1, wx.EXPAND | wx.BOTTOM, 5) + + preview_row = wx.BoxSizer(wx.HORIZONTAL) + self.preview_btn = wx.Button(parent, label="Preview Selected Sound") + self.preview_btn.Bind(wx.EVT_BUTTON, self._on_preview_sound) + self.preview_btn.Enable(False) + preview_row.Add(self.preview_btn, 0, wx.RIGHT, 5) + preview_row.Add( + wx.StaticText(parent, label="Volume:"), 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5 + ) + self.volume_spin = wx.SpinCtrl(parent, min=0, max=100, initial=100, size=(70, -1)) + self.volume_spin.SetName("Selected sound volume") + preview_row.Add(self.volume_spin, 0, wx.RIGHT, 5) + self.set_volume_btn = wx.Button(parent, label="Set Volume") + self.set_volume_btn.Bind(wx.EVT_BUTTON, self._on_set_volume) + self.set_volume_btn.Enable(False) + preview_row.Add(self.set_volume_btn, 0) + sizer.Add(preview_row, 0, wx.BOTTOM, 10) + + mapping_box = wx.StaticBox(parent, label="Sound mappings") + mapping_sizer = wx.StaticBoxSizer(mapping_box, wx.VERTICAL) + category_row = wx.BoxSizer(wx.HORIZONTAL) + category_row.Add( + wx.StaticText(parent, label="Event:"), 0, wx.ALIGN_CENTER_VERTICAL | wx.RIGHT, 5 + ) + self.event_choice = wx.Choice( + parent, choices=[name for name, _key in FRIENDLY_SOUND_EVENT_CHOICES] + ) + self.event_choice.SetName("Sound event") + self.event_choice.Bind(wx.EVT_CHOICE, self._on_event_changed) + category_row.Add(self.event_choice, 1, wx.RIGHT, 5) + self.mapping_file_text = wx.TextCtrl(parent, style=wx.TE_READONLY) + self.mapping_file_text.SetName("Mapped sound file") + category_row.Add(self.mapping_file_text, 1, wx.RIGHT, 5) + browse_btn = wx.Button(parent, label="Choose Sound...") + browse_btn.Bind(wx.EVT_BUTTON, self._on_browse_mapping) + category_row.Add(browse_btn, 0) + mapping_sizer.Add(category_row, 0, wx.EXPAND | wx.ALL, 5) + sizer.Add(mapping_sizer, 0, wx.EXPAND) + return sizer + + def _create_button_panel(self, parent: wx.Window) -> wx.BoxSizer: + sizer = wx.BoxSizer(wx.HORIZONTAL) + self.create_btn = wx.Button(parent, label="Create Sound Pack...") + self.create_btn.Bind(wx.EVT_BUTTON, self._on_create_pack) + sizer.Add(self.create_btn, 0, wx.RIGHT, 5) + self.duplicate_btn = wx.Button(parent, label="Duplicate") + self.duplicate_btn.Bind(wx.EVT_BUTTON, self._on_duplicate_pack) + self.duplicate_btn.Enable(False) + sizer.Add(self.duplicate_btn, 0, wx.RIGHT, 5) + self.edit_btn = wx.Button(parent, label="Edit...") + self.edit_btn.Bind(wx.EVT_BUTTON, self._on_edit_pack) + self.edit_btn.Enable(False) + sizer.Add(self.edit_btn, 0, wx.RIGHT, 5) + self.delete_btn = wx.Button(parent, label="Delete") + self.delete_btn.Bind(wx.EVT_BUTTON, self._on_delete_pack) + self.delete_btn.Enable(False) + sizer.Add(self.delete_btn, 0, wx.RIGHT, 5) + self.export_btn = wx.Button(parent, label="Export...") + self.export_btn.Bind(wx.EVT_BUTTON, self._on_export_pack) + self.export_btn.Enable(False) + sizer.Add(self.export_btn, 0) + sizer.AddStretchSpacer() + close_btn = wx.Button(parent, wx.ID_CLOSE, label="Close") + close_btn.Bind(wx.EVT_BUTTON, self._on_close) + sizer.Add(close_btn, 0) + return sizer + + def _load_sound_packs(self) -> None: + self.sound_packs.clear() + for pack_id, data in get_available_sound_packs(self.soundpacks_dir).items(): + self.sound_packs[pack_id] = SoundPackInfo( + pack_id=pack_id, + name=data.get("name", pack_id), + author=data.get("author", "Unknown"), + description=data.get("description", ""), + path=Path(data["path"]), + sounds=data.get("sounds", {}), + ) + + def _refresh_pack_list(self) -> None: + self.pack_listbox.Clear() + for pack_id, info in sorted(self.sound_packs.items(), key=lambda item: item[1].name): + self.pack_listbox.Append(f"{info.name} (by {info.author})", pack_id) + if self.pack_listbox.GetCount() > 0: + self.pack_listbox.SetSelection(0) + self._on_pack_selected(None) + + def _on_pack_selected(self, event) -> None: + selection = self.pack_listbox.GetSelection() + self.selected_pack = ( + None if selection == wx.NOT_FOUND else self.pack_listbox.GetClientData(selection) + ) + self._update_pack_details() + + def _update_pack_details(self) -> None: + if not self.selected_pack or self.selected_pack not in self.sound_packs: + self.name_label.SetLabel("No pack selected") + self.author_label.SetLabel("") + self.description_label.SetLabel("") + self.sounds_listbox.Clear() + for button in ( + self.preview_btn, + self.duplicate_btn, + self.edit_btn, + self.delete_btn, + self.export_btn, + self.set_volume_btn, + ): + button.Enable(False) + return + + info = self.sound_packs[self.selected_pack] + self.name_label.SetLabel(info.name) + self.author_label.SetLabel(f"Author: {info.author}") + self.description_label.SetLabel(info.description or "No description available") + self.description_label.Wrap(400) + self.sounds_listbox.Clear() + sounds, volumes = self._read_pack_sounds(info) + for event_key, sound_entry in sounds.items(): + filename, volume = parse_sound_entry(sound_entry, event_key, volumes) + status = "OK" if (info.path / filename).exists() else "Missing" + label = self._friendly_name(event_key) + self.sounds_listbox.Append( + f"{label} ({filename}) at {int(volume * 100)} percent - {status}", + (event_key, filename, volume), + ) + self.duplicate_btn.Enable(True) + self.edit_btn.Enable(True) + self.delete_btn.Enable(self.selected_pack != "default") + self.export_btn.Enable(True) + self._on_event_changed(None) + + def _on_sound_selected(self, event) -> None: + selection = self.sounds_listbox.GetSelection() + if selection == wx.NOT_FOUND or not self.selected_pack: + self.preview_btn.Enable(False) + self.set_volume_btn.Enable(False) + return + data = self.sounds_listbox.GetClientData(selection) + if not data: + return + _event_key, filename, volume = data + exists = (self.sound_packs[self.selected_pack].path / filename).exists() + self.volume_spin.SetValue(int(volume * 100)) + self.preview_btn.Enable(exists) + self.set_volume_btn.Enable(exists) + + def _on_preview_sound(self, event) -> None: + if not self.selected_pack: + return + selection = self.sounds_listbox.GetSelection() + if selection == wx.NOT_FOUND: + return + data = self.sounds_listbox.GetClientData(selection) + if not data: + return + _event_key, filename, _volume = data + play_sound_file( + self.sound_packs[self.selected_pack].path / filename, + volume=self.volume_spin.GetValue() / 100.0, + ) + + def _on_event_changed(self, event) -> None: + if not self.selected_pack or self.event_choice.GetSelection() == wx.NOT_FOUND: + self.mapping_file_text.SetValue("") + return + event_key = FRIENDLY_SOUND_EVENT_CHOICES[self.event_choice.GetSelection()][1] + sounds, volumes = self._read_pack_sounds(self.sound_packs[self.selected_pack]) + entry = sounds.get(event_key, "") + if entry: + filename, volume = parse_sound_entry(entry, event_key, volumes) + self.mapping_file_text.SetValue(filename) + self.volume_spin.SetValue(int(volume * 100)) + else: + self.mapping_file_text.SetValue("") + self.volume_spin.SetValue(100) + + def _on_browse_mapping(self, event) -> None: + if not self.selected_pack: + return + selection = self.event_choice.GetSelection() + if selection == wx.NOT_FOUND: + wx.MessageBox("Please select an event first.", "No Event", wx.OK | wx.ICON_INFORMATION) + return + event_key = FRIENDLY_SOUND_EVENT_CHOICES[selection][1] + with wx.FileDialog( + self, + "Select Audio File", + wildcard=AUDIO_WILDCARD, + style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + ) as dialog: + if dialog.ShowModal() != wx.ID_OK: + return + src_path = Path(dialog.GetPath()) + info = self.sound_packs[self.selected_pack] + dest_path = info.path / src_path.name + if src_path.resolve() != dest_path.resolve(): + shutil.copy2(src_path, dest_path) + self._write_sound_mapping( + info, event_key, src_path.name, self.volume_spin.GetValue() / 100.0 + ) + self._load_sound_packs() + self._update_pack_details() + + def _on_set_volume(self, event) -> None: + if not self.selected_pack: + return + selection = self.sounds_listbox.GetSelection() + if selection == wx.NOT_FOUND: + return + event_key, filename, _volume = self.sounds_listbox.GetClientData(selection) + info = self.sound_packs[self.selected_pack] + self._write_sound_mapping(info, event_key, filename, self.volume_spin.GetValue() / 100.0) + self._load_sound_packs() + self._update_pack_details() + + def _on_import_pack(self, event) -> None: + with wx.FileDialog( + self, + "Select Sound Pack ZIP File", + wildcard="ZIP files (*.zip)|*.zip", + style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + ) as dialog: + if dialog.ShowModal() != wx.ID_OK: + return + zip_path = Path(dialog.GetPath()) + try: + with zipfile.ZipFile(zip_path, "r") as zip_file: + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + safe_extractall(zip_file, temp_path) + pack_json = next(iter(temp_path.rglob("pack.json")), None) + if pack_json is None: + wx.MessageBox( + "Invalid sound pack: missing pack.json.", + "Import Error", + wx.OK | wx.ICON_ERROR, + ) + return + data = json.loads(pack_json.read_text(encoding="utf-8")) + pack_name = data.get("name", zip_path.stem) + pack_id = slugify_pack_name(pack_name) + pack_dir = self.soundpacks_dir / pack_id + if pack_dir.exists(): + result = wx.MessageBox( + f"A sound pack named '{pack_name}' already exists. Overwrite?", + "Pack Exists", + wx.YES_NO | wx.ICON_QUESTION, + ) + if result != wx.YES: + return + shutil.rmtree(pack_dir) + shutil.copytree(pack_json.parent, pack_dir) + self._load_sound_packs() + self._refresh_pack_list() + except Exception as exc: + logger.error("Failed to import sound pack: %s", exc) + wx.MessageBox( + f"Failed to import sound pack: {exc}", "Import Error", wx.OK | wx.ICON_ERROR + ) + + def _on_create_pack(self, event) -> None: + from portkeydrop.dialogs.soundpack_wizard import SoundPackWizardDialog + + wizard = SoundPackWizardDialog(self, self.soundpacks_dir) + result = wizard.ShowModal() + created_pack_id = wizard.created_pack_id + wizard.Destroy() + if result == wx.ID_OK and created_pack_id: + self._load_sound_packs() + self._refresh_pack_list() + self._select_pack(created_pack_id) + + def _on_duplicate_pack(self, event) -> None: + if not self.selected_pack: + return + info = self.sound_packs[self.selected_pack] + candidate = f"{self.selected_pack}_copy" + suffix = 2 + while (self.soundpacks_dir / candidate).exists(): + candidate = f"{self.selected_pack}_copy{suffix}" + suffix += 1 + shutil.copytree(info.path, self.soundpacks_dir / candidate) + pack_json = self.soundpacks_dir / candidate / "pack.json" + data = json.loads(pack_json.read_text(encoding="utf-8")) + data["name"] = f"{info.name} (Copy)" + pack_json.write_text(json.dumps(data, indent=2), encoding="utf-8") + self._load_sound_packs() + self._refresh_pack_list() + self._select_pack(candidate) + + def _on_edit_pack(self, event) -> None: + if not self.selected_pack: + return + info = self.sound_packs[self.selected_pack] + dialog = wx.TextEntryDialog(self, "Enter a new display name:", "Edit Sound Pack", info.name) + if dialog.ShowModal() == wx.ID_OK: + data_path = info.path / "pack.json" + data = json.loads(data_path.read_text(encoding="utf-8")) + data["name"] = dialog.GetValue().strip() or info.name + data_path.write_text(json.dumps(data, indent=2), encoding="utf-8") + self._load_sound_packs() + self._refresh_pack_list() + self._select_pack(self.selected_pack) + dialog.Destroy() + + def _on_delete_pack(self, event) -> None: + if not self.selected_pack or self.selected_pack == "default": + return + info = self.sound_packs[self.selected_pack] + result = wx.MessageBox( + f"Delete '{info.name}'? This cannot be undone.", + "Delete Sound Pack", + wx.YES_NO | wx.ICON_WARNING, + ) + if result != wx.YES: + return + shutil.rmtree(info.path) + self.selected_pack = None + self._load_sound_packs() + self._refresh_pack_list() + + def _on_export_pack(self, event) -> None: + if not self.selected_pack: + return + with wx.FileDialog( + self, + "Export Sound Pack", + defaultFile=f"{self.selected_pack}.zip", + wildcard="ZIP files (*.zip)|*.zip", + style=wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT, + ) as dialog: + if dialog.ShowModal() != wx.ID_OK: + return + ok, message = self.installer.export_pack(self.selected_pack, Path(dialog.GetPath())) + wx.MessageBox( + message, "Export Sound Pack", wx.OK | (wx.ICON_INFORMATION if ok else wx.ICON_ERROR) + ) + + def _select_pack(self, pack_id: str) -> None: + for index in range(self.pack_listbox.GetCount()): + if self.pack_listbox.GetClientData(index) == pack_id: + self.pack_listbox.SetSelection(index) + self._on_pack_selected(None) + break + + @staticmethod + def _friendly_name(event_key: str) -> str: + for display_name, key in FRIENDLY_SOUND_EVENT_CHOICES: + if key == event_key: + return display_name + return event_key.replace("_", " ").title() + + @staticmethod + def _read_pack_sounds(info: SoundPackInfo) -> tuple[dict, dict]: + try: + data = json.loads((info.path / "pack.json").read_text(encoding="utf-8")) + except Exception: + return {}, {} + sounds = data.get("sounds", {}) + volumes = data.get("volumes", {}) + return sounds if isinstance(sounds, dict) else {}, volumes if isinstance( + volumes, dict + ) else {} + + @staticmethod + def _write_sound_mapping( + info: SoundPackInfo, event_key: str, filename: str, volume: float + ) -> None: + data_path = info.path / "pack.json" + data = json.loads(data_path.read_text(encoding="utf-8")) + sounds = data.get("sounds", {}) + if volume < 1.0: + sounds[event_key] = {"file": filename, "volume": max(0.0, min(1.0, volume))} + else: + sounds[event_key] = filename + data["sounds"] = sounds + data_path.write_text(json.dumps(data, indent=2), encoding="utf-8") + + def _on_char_hook(self, event: wx.KeyEvent) -> None: + if event.GetKeyCode() == wx.WXK_ESCAPE: + self._on_close(event) + return + event.Skip() + + def _on_close(self, event) -> None: + self.EndModal(wx.ID_CLOSE) diff --git a/src/portkeydrop/dialogs/soundpack_wizard.py b/src/portkeydrop/dialogs/soundpack_wizard.py new file mode 100644 index 0000000..dbd9fae --- /dev/null +++ b/src/portkeydrop/dialogs/soundpack_wizard.py @@ -0,0 +1,366 @@ +"""wxPython sound pack creation wizard.""" + +from __future__ import annotations + +import contextlib +import json +import shutil +import tempfile +from dataclasses import dataclass, field +from pathlib import Path + +import wx + +from portkeydrop.sound_events import FRIENDLY_SOUND_EVENT_CHOICES +from portkeydrop.soundpacks import AUDIO_WILDCARD, play_sound_file, slugify_pack_name + + +@dataclass +class WizardState: + """State container for the wizard.""" + + pack_name: str = "" + author: str = "" + description: str = "" + selected_event_keys: list[str] = field(default_factory=list) + sound_mappings: dict[str, str] = field(default_factory=dict) + + +class SoundPackWizardDialog(wx.Dialog): + """Wizard dialog for creating a new sound pack.""" + + def __init__(self, parent: wx.Window, soundpacks_dir: Path) -> None: + super().__init__( + parent, + title="Create Sound Pack", + size=(650, 550), + style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER, + ) + self.soundpacks_dir = soundpacks_dir + self.current_step = 1 + self.total_steps = 4 + self.state = WizardState() + self.created_pack_id: str | None = None + self.staging_dir = Path(tempfile.mkdtemp(prefix="pkd_soundpack_wizard_")) + + self._build_shell() + self.Bind(wx.EVT_CHAR_HOOK, self._on_char_hook) + self._render_step() + self.Centre() + + def _build_shell(self) -> None: + self.panel = wx.Panel(self) + main_sizer = wx.BoxSizer(wx.VERTICAL) + + self.header_label = wx.StaticText(self.panel, label="") + main_sizer.Add(self.header_label, 0, wx.ALL, 10) + + self.content_panel = wx.Panel(self.panel) + self.content_sizer = wx.BoxSizer(wx.VERTICAL) + self.content_panel.SetSizer(self.content_sizer) + main_sizer.Add(self.content_panel, 1, wx.EXPAND | wx.LEFT | wx.RIGHT, 10) + + nav_sizer = wx.BoxSizer(wx.HORIZONTAL) + nav_sizer.AddStretchSpacer() + self.prev_btn = wx.Button(self.panel, label="< Previous") + self.prev_btn.Bind(wx.EVT_BUTTON, self._go_previous) + nav_sizer.Add(self.prev_btn, 0, wx.RIGHT, 5) + self.next_btn = wx.Button(self.panel, label="Next >") + self.next_btn.Bind(wx.EVT_BUTTON, self._go_next) + nav_sizer.Add(self.next_btn, 0, wx.RIGHT, 5) + self.cancel_btn = wx.Button(self.panel, wx.ID_CANCEL, label="Cancel") + self.cancel_btn.Bind(wx.EVT_BUTTON, self._on_cancel) + nav_sizer.Add(self.cancel_btn, 0) + + main_sizer.Add(nav_sizer, 0, wx.EXPAND | wx.ALL, 10) + self.panel.SetSizer(main_sizer) + + def _render_step(self) -> None: + titles = { + 1: "Pack Details", + 2: "Select Events", + 3: "Assign Sounds", + 4: "Preview and Finalize", + } + self.header_label.SetLabel( + f"Step {self.current_step} of {self.total_steps}: {titles[self.current_step]}" + ) + self.prev_btn.Enable(self.current_step > 1) + self.next_btn.SetLabel("Create Pack" if self.current_step == self.total_steps else "Next >") + self.content_sizer.Clear(True) + builders = { + 1: self._build_step1, + 2: self._build_step2, + 3: self._build_step3, + 4: self._build_step4, + } + builders[self.current_step]() + self.content_panel.Layout() + self.panel.Layout() + + def _build_step1(self) -> None: + self.content_sizer.Add( + wx.StaticText(self.content_panel, label="Pack name:"), 0, wx.BOTTOM, 3 + ) + self.name_input = wx.TextCtrl(self.content_panel, value=self.state.pack_name) + self.name_input.SetName("Sound pack name") + self.content_sizer.Add(self.name_input, 0, wx.EXPAND | wx.BOTTOM, 10) + + self.content_sizer.Add(wx.StaticText(self.content_panel, label="Author:"), 0, wx.BOTTOM, 3) + self.author_input = wx.TextCtrl(self.content_panel, value=self.state.author) + self.author_input.SetName("Sound pack author") + self.content_sizer.Add(self.author_input, 0, wx.EXPAND | wx.BOTTOM, 10) + + self.content_sizer.Add( + wx.StaticText(self.content_panel, label="Description:"), 0, wx.BOTTOM, 3 + ) + self.desc_input = wx.TextCtrl( + self.content_panel, + value=self.state.description, + style=wx.TE_MULTILINE, + size=(-1, 100), + ) + self.desc_input.SetName("Sound pack description") + self.content_sizer.Add(self.desc_input, 1, wx.EXPAND | wx.BOTTOM, 10) + self.name_input.SetFocus() + + def _build_step2(self) -> None: + self.content_sizer.Add( + wx.StaticText(self.content_panel, label="Choose the events you want sounds for:"), + 0, + wx.BOTTOM, + 10, + ) + scroll = wx.ScrolledWindow(self.content_panel, size=(-1, 300)) + scroll_sizer = wx.BoxSizer(wx.VERTICAL) + self.event_checks: list[tuple[str, wx.CheckBox]] = [] + for display_name, event_key in FRIENDLY_SOUND_EVENT_CHOICES: + checkbox = wx.CheckBox(scroll, label=display_name) + checkbox.SetName(f"{display_name} sound event") + checkbox.SetValue(event_key in self.state.selected_event_keys) + scroll_sizer.Add(checkbox, 0, wx.BOTTOM, 5) + self.event_checks.append((event_key, checkbox)) + scroll.SetSizer(scroll_sizer) + scroll.SetScrollRate(5, 5) + self.content_sizer.Add(scroll, 1, wx.EXPAND | wx.BOTTOM, 10) + + button_sizer = wx.BoxSizer(wx.HORIZONTAL) + common_btn = wx.Button(self.content_panel, label="Select Common") + common_btn.Bind(wx.EVT_BUTTON, self._select_common_events) + button_sizer.Add(common_btn, 0, wx.RIGHT, 5) + clear_btn = wx.Button(self.content_panel, label="Clear All") + clear_btn.Bind(wx.EVT_BUTTON, self._clear_all_events) + button_sizer.Add(clear_btn, 0) + self.content_sizer.Add(button_sizer, 0) + + def _select_common_events(self, event) -> None: + common = { + "transfer_queued", + "transfer_started", + "transfer_complete", + "transfer_failed", + "connect_success", + "connect_failed", + "success", + "error", + } + for key, checkbox in self.event_checks: + checkbox.SetValue(key in common) + + def _clear_all_events(self, event) -> None: + for _key, checkbox in self.event_checks: + checkbox.SetValue(False) + + def _build_step3(self) -> None: + self.content_sizer.Add( + wx.StaticText(self.content_panel, label="Assign a sound file to each selected event."), + 0, + wx.BOTTOM, + 10, + ) + scroll = wx.ScrolledWindow(self.content_panel, size=(-1, 350)) + grid = wx.FlexGridSizer(cols=3, hgap=5, vgap=5) + grid.AddGrowableCol(1, 1) + self.mapping_controls: list[tuple[str, wx.TextCtrl]] = [] + for key in self.state.selected_event_keys: + friendly = self._friendly_name(key) + grid.Add(wx.StaticText(scroll, label=f"{friendly}:"), 0, wx.ALIGN_CENTER_VERTICAL) + file_ctrl = wx.TextCtrl(scroll, style=wx.TE_READONLY) + file_ctrl.SetName(f"{friendly} sound file") + existing = self.state.sound_mappings.get(key) + if existing: + file_ctrl.SetValue(Path(existing).name) + grid.Add(file_ctrl, 1, wx.EXPAND) + choose_btn = wx.Button(scroll, label="Choose...") + choose_btn.Bind( + wx.EVT_BUTTON, + lambda evt, event_key=key, ctrl=file_ctrl: self._choose_sound_file(event_key, ctrl), + ) + grid.Add(choose_btn, 0) + self.mapping_controls.append((key, file_ctrl)) + scroll.SetSizer(grid) + scroll.SetScrollRate(5, 5) + self.content_sizer.Add(scroll, 1, wx.EXPAND) + + def _choose_sound_file(self, key: str, file_ctrl: wx.TextCtrl) -> None: + with wx.FileDialog( + self, + f"Choose sound for {self._friendly_name(key)}", + wildcard=AUDIO_WILDCARD, + style=wx.FD_OPEN | wx.FD_FILE_MUST_EXIST, + ) as dialog: + if dialog.ShowModal() != wx.ID_OK: + return + src = Path(dialog.GetPath()) + dest = self.staging_dir / src.name + if src.resolve() != dest.resolve(): + shutil.copy2(src, dest) + self.state.sound_mappings[key] = str(dest) + file_ctrl.SetValue(dest.name) + + def _build_step4(self) -> None: + assigned = len( + [key for key in self.state.selected_event_keys if key in self.state.sound_mappings] + ) + self.content_sizer.Add( + wx.StaticText( + self.content_panel, + label=f"Sounds assigned: {assigned} of {len(self.state.selected_event_keys)}", + ), + 0, + wx.BOTTOM, + 10, + ) + scroll = wx.ScrolledWindow(self.content_panel, size=(-1, 300)) + grid = wx.FlexGridSizer(cols=3, hgap=5, vgap=5) + grid.AddGrowableCol(1, 1) + for key in self.state.selected_event_keys: + grid.Add( + wx.StaticText(scroll, label=f"{self._friendly_name(key)}:"), + 0, + wx.ALIGN_CENTER_VERTICAL, + ) + file_name = ( + Path(self.state.sound_mappings[key]).name + if key in self.state.sound_mappings + else "(none)" + ) + grid.Add(wx.StaticText(scroll, label=file_name), 1, wx.EXPAND) + preview_btn = wx.Button(scroll, label="Preview") + preview_btn.Enable(key in self.state.sound_mappings) + preview_btn.Bind( + wx.EVT_BUTTON, lambda evt, event_key=key: self._preview_sound(event_key) + ) + grid.Add(preview_btn, 0) + scroll.SetSizer(grid) + scroll.SetScrollRate(5, 5) + self.content_sizer.Add(scroll, 1, wx.EXPAND) + + def _preview_sound(self, key: str) -> None: + src = self.state.sound_mappings.get(key) + if src: + play_sound_file(Path(src)) + + def _validate_current_step(self) -> bool: + if self.current_step == 1: + self.state.pack_name = self.name_input.GetValue().strip() + self.state.author = self.author_input.GetValue().strip() + self.state.description = self.desc_input.GetValue().strip() + if not self.state.pack_name: + wx.MessageBox("Please enter a pack name.", "Missing Name", wx.OK | wx.ICON_WARNING) + return False + elif self.current_step == 2: + self.state.selected_event_keys = [ + key for key, checkbox in self.event_checks if checkbox.GetValue() + ] + if not self.state.selected_event_keys: + wx.MessageBox( + "Please select at least one event.", + "No Selection", + wx.OK | wx.ICON_WARNING, + ) + return False + return True + + def _go_previous(self, event) -> None: + if self.current_step > 1: + self.current_step -= 1 + self._render_step() + + def _go_next(self, event) -> None: + if not self._validate_current_step(): + return + if self.current_step < self.total_steps: + self.current_step += 1 + self._render_step() + return + self._create_pack() + + def _create_pack(self) -> None: + pack_id = slugify_pack_name(self.state.pack_name) + candidate = pack_id + suffix = 2 + while (self.soundpacks_dir / candidate).exists(): + candidate = f"{pack_id}_{suffix}" + suffix += 1 + pack_dir = self.soundpacks_dir / candidate + pack_dir.mkdir(parents=True) + + sounds_mapping: dict[str, str] = {} + for key, src_path_str in self.state.sound_mappings.items(): + src_path = Path(src_path_str) + if src_path.exists(): + dest = pack_dir / src_path.name + shutil.copy2(src_path, dest) + sounds_mapping[key] = src_path.name + + pack_data = { + "name": self.state.pack_name, + "author": self.state.author or "Unknown", + "description": self.state.description, + "version": "1.0.0", + "sounds": sounds_mapping, + } + (pack_dir / "pack.json").write_text(json.dumps(pack_data, indent=2), encoding="utf-8") + self.created_pack_id = candidate + with contextlib.suppress(Exception): + shutil.rmtree(self.staging_dir) + wx.MessageBox( + f"Sound pack '{self.state.pack_name}' created successfully.", + "Pack Created", + wx.OK | wx.ICON_INFORMATION, + ) + self.EndModal(wx.ID_OK) + + def _on_char_hook(self, event: wx.KeyEvent) -> None: + if event.GetKeyCode() == wx.WXK_ESCAPE: + self._on_cancel(event) + return + event.Skip() + + def _on_cancel(self, event) -> None: + has_changes = bool( + self.state.pack_name + or self.state.author + or self.state.description + or self.state.selected_event_keys + or self.state.sound_mappings + ) + if has_changes: + result = wx.MessageBox( + "Discard changes and close the wizard?", + "Cancel Wizard", + wx.YES_NO | wx.ICON_QUESTION, + ) + if result != wx.YES: + return + with contextlib.suppress(Exception): + shutil.rmtree(self.staging_dir) + self.EndModal(wx.ID_CANCEL) + + @staticmethod + def _friendly_name(event_key: str) -> str: + for display_name, key in FRIENDLY_SOUND_EVENT_CHOICES: + if key == event_key: + return display_name + return event_key.replace("_", " ").title() diff --git a/src/portkeydrop/settings.py b/src/portkeydrop/settings.py index 6a659cc..6761224 100644 --- a/src/portkeydrop/settings.py +++ b/src/portkeydrop/settings.py @@ -8,6 +8,10 @@ from pathlib import Path from portkeydrop.portable import get_config_dir +from portkeydrop.sound_events import ( + DEFAULT_MUTED_SOUND_EVENTS, + normalize_known_muted_sound_events, +) logger = logging.getLogger(__name__) @@ -52,6 +56,13 @@ class SpeechSettings: verbosity: str = "normal" # minimal, normal, verbose +@dataclass +class AudioSettings: + sound_enabled: bool = True + sound_pack: str = "default" + muted_sound_events: list[str] = field(default_factory=lambda: list(DEFAULT_MUTED_SOUND_EVENTS)) + + @dataclass class AppSettings: remember_last_local_folder_on_startup: bool = True @@ -69,6 +80,7 @@ class Settings: display: DisplaySettings = field(default_factory=DisplaySettings) connection: ConnectionDefaults = field(default_factory=ConnectionDefaults) speech: SpeechSettings = field(default_factory=SpeechSettings) + audio: AudioSettings = field(default_factory=AudioSettings) app: AppSettings = field(default_factory=AppSettings) @@ -163,6 +175,13 @@ def _dict_to_settings(data: dict) -> Settings: if k in SpeechSettings.__dataclass_fields__ } ), + audio=AudioSettings( + **{ + k: (normalize_known_muted_sound_events(v) if k == "muted_sound_events" else v) + for k, v in data.get("audio", {}).items() + if k in AudioSettings.__dataclass_fields__ + } + ), app=AppSettings( **{ k: v diff --git a/src/portkeydrop/sound_events.py b/src/portkeydrop/sound_events.py new file mode 100644 index 0000000..2206d72 --- /dev/null +++ b/src/portkeydrop/sound_events.py @@ -0,0 +1,91 @@ +"""Shared sound event metadata for Portkey Drop.""" + +from __future__ import annotations + +from collections.abc import Collection +from itertools import chain + +DEFAULT_MUTED_SOUND_EVENTS: tuple[str, ...] = () + +SOUND_EVENT_SECTIONS: tuple[tuple[str, str, tuple[tuple[str, str], ...]], ...] = ( + ( + "Transfers", + "File transfer queue and result sounds.", + ( + ("transfer_queued", "Transfer queued"), + ("transfer_started", "Transfer started"), + ("transfer_complete", "Transfer complete"), + ("transfer_failed", "Transfer failed"), + ("transfer_cancelled", "Transfer cancelled"), + ), + ), + ( + "Connections", + "Server connection lifecycle sounds.", + ( + ("connect_success", "Connected"), + ("connect_failed", "Connection failed"), + ("disconnect", "Disconnected"), + ), + ), + ( + "File operations", + "Remote and local file operation result sounds.", + ( + ("delete_complete", "Delete complete"), + ("delete_failed", "Delete failed"), + ("rename_complete", "Rename complete"), + ("rename_failed", "Rename failed"), + ("folder_created", "Folder created"), + ("folder_create_failed", "Folder creation failed"), + ), + ), + ( + "General", + "General application feedback sounds.", + ( + ("success", "General success"), + ("error", "General error"), + ("notify", "General notification"), + ("startup", "App startup"), + ("exit", "App exit"), + ), + ), +) + +USER_MUTABLE_SOUND_EVENTS: tuple[tuple[str, str], ...] = tuple( + chain.from_iterable(events for _title, _description, events in SOUND_EVENT_SECTIONS) +) + +USER_MUTABLE_SOUND_EVENT_KEYS: frozenset[str] = frozenset( + event_key for event_key, _label in USER_MUTABLE_SOUND_EVENTS +) + +FRIENDLY_SOUND_EVENT_CHOICES: tuple[tuple[str, str], ...] = tuple( + (label, event_key) for event_key, label in USER_MUTABLE_SOUND_EVENTS +) + + +def normalize_muted_sound_events(events: Collection[str] | None) -> list[str]: + """Normalize muted event names while preserving order.""" + if not events: + return [] + + normalized: list[str] = [] + seen: set[str] = set() + for item in events: + event = str(item).strip() + if not event or event in seen: + continue + seen.add(event) + normalized.append(event) + return normalized + + +def normalize_known_muted_sound_events(events: Collection[str] | None) -> list[str]: + """Normalize muted events and drop unknown keys from the shared catalog.""" + return [ + event + for event in normalize_muted_sound_events(events) + if event in USER_MUTABLE_SOUND_EVENT_KEYS + ] diff --git a/src/portkeydrop/soundpack_paths.py b/src/portkeydrop/soundpack_paths.py new file mode 100644 index 0000000..138853c --- /dev/null +++ b/src/portkeydrop/soundpack_paths.py @@ -0,0 +1,66 @@ +"""Sound pack path helpers.""" + +from __future__ import annotations + +import json +from importlib import resources +from pathlib import Path + +from portkeydrop.portable import get_config_dir + + +def get_soundpacks_dir(config_dir: Path | None = None) -> Path: + """Return the writable soundpacks directory.""" + return (config_dir or get_config_dir()) / "soundpacks" + + +def _should_replace_pack_json(pack_json: Path) -> bool: + """Return whether an existing default pack manifest is still the old placeholder.""" + if not pack_json.exists(): + return True + try: + data = json.loads(pack_json.read_text(encoding="utf-8")) + except (OSError, json.JSONDecodeError): + return False + return data.get("sounds") == {} + + +def _copy_pack_resource(resource, target_dir: Path, *, replace_pack_json: bool) -> None: + """Copy packaged default sound pack files without overwriting user-edited assets.""" + for child in resource.iterdir(): + target = target_dir / child.name + if child.is_dir(): + target.mkdir(parents=True, exist_ok=True) + _copy_pack_resource(child, target, replace_pack_json=replace_pack_json) + continue + if target.exists() and not (child.name == "pack.json" and replace_pack_json): + continue + target.write_bytes(child.read_bytes()) + + +def ensure_default_soundpack(soundpacks_dir: Path | None = None) -> Path: + """Ensure the built-in default pack is available in the writable packs directory.""" + base_dir = soundpacks_dir or get_soundpacks_dir() + default_dir = base_dir / "default" + default_dir.mkdir(parents=True, exist_ok=True) + pack_json = default_dir / "pack.json" + replace_pack_json = _should_replace_pack_json(pack_json) + packaged_default = resources.files("portkeydrop").joinpath("default_soundpacks", "default") + if packaged_default.is_dir(): + _copy_pack_resource(packaged_default, default_dir, replace_pack_json=replace_pack_json) + elif replace_pack_json: + pack_json.write_text( + json.dumps( + { + "name": "Default", + "author": "Portkey Drop", + "description": "Default sound pack.", + "version": "1.0.0", + "sounds": {}, + }, + indent=2, + ) + + "\n", + encoding="utf-8", + ) + return base_dir diff --git a/src/portkeydrop/soundpacks.py b/src/portkeydrop/soundpacks.py new file mode 100644 index 0000000..4713771 --- /dev/null +++ b/src/portkeydrop/soundpacks.py @@ -0,0 +1,296 @@ +"""Sound pack lookup, management, and playback helpers.""" + +from __future__ import annotations + +import json +import logging +import shutil +import tempfile +import zipfile +from pathlib import Path +from typing import Any + +from portkeydrop.soundpack_paths import ensure_default_soundpack + +logger = logging.getLogger(__name__) + +AUDIO_WILDCARD = "Audio files (*.wav;*.mp3;*.ogg;*.flac)|*.wav;*.mp3;*.ogg;*.flac" +DEFAULT_PACK = "default" +SOUND_LIB_AVAILABLE = False +_sound_lib_output = None +_active_streams: list = [] + +try: + from sound_lib import output + + _sound_lib_output = output.Output() + SOUND_LIB_AVAILABLE = True +except ImportError: + pass +except Exception as exc: + logger.debug("sound_lib initialization failed: %s", exc) + + +def slugify_pack_name(value: str, fallback: str = "sound_pack") -> str: + """Return a filesystem-friendly pack identifier.""" + slug = value.strip().lower().replace("-", "_").replace(" ", "_") + slug = "".join(char for char in slug if char.isalnum() or char == "_") + while "__" in slug: + slug = slug.replace("__", "_") + return slug.strip("_") or fallback + + +def safe_extractall(zip_file: zipfile.ZipFile, target_dir: Path) -> None: + """Extract a zip archive after rejecting path traversal members.""" + target_dir = target_dir.resolve() + for member in zip_file.namelist(): + member_path = (target_dir / member).resolve() + try: + member_path.relative_to(target_dir) + except ValueError as exc: + raise ValueError( + f"Zip Slip detected: member '{member}' would extract outside target directory" + ) from exc + zip_file.extractall(target_dir) + + +def parse_sound_entry( + entry: str | dict[str, Any], event: str, volumes: dict[str, float] | None = None +) -> tuple[str, float]: + """Parse a pack sound entry and return a clamped filename/volume pair.""" + if isinstance(entry, dict): + filename = entry.get("file", f"{event}.wav") + volume = entry.get("volume", 1.0) + else: + filename = str(entry) if entry else f"{event}.wav" + volume = volumes[event] if volumes and event in volumes else 1.0 + + try: + volume = max(0.0, min(1.0, float(volume))) + except (TypeError, ValueError): + volume = 1.0 + return filename, volume + + +def load_pack_sounds(pack_json: Path) -> tuple[dict[str, Any], dict[str, float]]: + """Load sound and volume mappings from a pack.json file.""" + with open(pack_json, encoding="utf-8") as f: + meta: dict[str, Any] = json.load(f) + sounds = meta.get("sounds", {}) + volumes = meta.get("volumes", {}) + return sounds if isinstance(sounds, dict) else {}, volumes if isinstance(volumes, dict) else {} + + +def validate_sound_pack(pack_path: Path) -> tuple[bool, str]: + """Validate a sound pack directory and its pack.json contents.""" + if not pack_path.exists(): + return False, "Sound pack directory does not exist" + if not pack_path.is_dir(): + return False, "Sound pack path is not a directory" + + pack_json = pack_path / "pack.json" + if not pack_json.exists(): + return False, "Missing pack.json file" + + try: + with open(pack_json, encoding="utf-8") as f: + pack_data = json.load(f) + if "name" not in pack_data: + return False, "Missing 'name' field in pack.json" + if "sounds" not in pack_data: + return False, "Missing 'sounds' field in pack.json" + if not isinstance(pack_data["sounds"], dict): + return False, "'sounds' field must be a dictionary" + + missing_files = [] + for sound_name, sound_entry in pack_data["sounds"].items(): + filename = ( + sound_entry.get("file", f"{sound_name}.wav") + if isinstance(sound_entry, dict) + else str(sound_entry) + ) + if not filename or not (pack_path / filename).exists(): + missing_files.append(filename or sound_name) + if missing_files: + return False, f"Missing sound files: {', '.join(missing_files)}" + + volumes = pack_data.get("volumes", {}) + if not isinstance(volumes, dict): + return False, "'volumes' field must be a dictionary" + for event, volume in volumes.items(): + try: + value = float(volume) + except (TypeError, ValueError): + return False, f"Invalid volume value for '{event}': {volume}" + if value < 0.0 or value > 1.0: + return False, f"Volume for '{event}' must be between 0.0 and 1.0" + return True, "Sound pack is valid" + except json.JSONDecodeError as exc: + return False, f"Invalid JSON in pack.json: {exc}" + except Exception as exc: + return False, f"Error validating sound pack: {exc}" + + +def get_available_sound_packs(soundpacks_dir: Path) -> dict[str, dict[str, Any]]: + """Return all available sound packs with metadata.""" + ensure_default_soundpack(soundpacks_dir) + packs: dict[str, dict[str, Any]] = {} + for pack_dir in soundpacks_dir.iterdir(): + if not pack_dir.is_dir(): + continue + pack_json = pack_dir / "pack.json" + if not pack_json.exists(): + continue + try: + with open(pack_json, encoding="utf-8") as f: + data: dict[str, Any] = json.load(f) + data["directory"] = pack_dir.name + data["path"] = str(pack_dir) + packs[pack_dir.name] = data + except Exception as exc: + logger.error("Failed to load sound pack %s: %s", pack_dir.name, exc) + return packs + + +def get_sound_entry( + event: str, + pack_dir: str, + *, + soundpacks_dir: Path, + default_pack: str = DEFAULT_PACK, +) -> tuple[Path | None, float]: + """Resolve a sound file and volume for an event in a pack.""" + ensure_default_soundpack(soundpacks_dir) + for candidate_pack in (pack_dir, default_pack): + pack_path = soundpacks_dir / candidate_pack + pack_json = pack_path / "pack.json" + if not pack_json.exists(): + continue + try: + sounds, volumes = load_pack_sounds(pack_json) + entry = sounds.get(event) + if entry is None: + continue + filename, volume = parse_sound_entry(entry, event, volumes) + sound_file = pack_path / filename + if sound_file.exists(): + return sound_file, volume + except Exception as exc: + logger.error("Error reading sound pack %s: %s", candidate_pack, exc) + return None, 1.0 + + +class SoundPackInstaller: + """Handles local installation and management of sound packs.""" + + def __init__(self, soundpacks_dir: Path): + self.soundpacks_dir = ensure_default_soundpack(soundpacks_dir) + + def install_from_zip(self, zip_path: Path, pack_name: str | None = None) -> tuple[bool, str]: + """Install a sound pack from a ZIP file.""" + if not zip_path.exists(): + return False, f"ZIP file not found: {zip_path}" + + with tempfile.TemporaryDirectory() as temp_dir: + temp_path = Path(temp_dir) + try: + with zipfile.ZipFile(zip_path, "r") as zip_file: + safe_extractall(zip_file, temp_path) + pack_json_files = list(temp_path.rglob("pack.json")) + if not pack_json_files: + return False, "No pack.json file found in ZIP archive" + pack_dir = pack_json_files[0].parent + is_valid, message = validate_sound_pack(pack_dir) + if not is_valid: + return False, f"Invalid sound pack: {message}" + + with open(pack_dir / "pack.json", encoding="utf-8") as f: + pack_data = json.load(f) + target_name = slugify_pack_name(pack_name or pack_data.get("name", zip_path.stem)) + target_dir = self.soundpacks_dir / target_name + if target_dir.exists(): + return False, f"Sound pack '{target_name}' already exists" + shutil.copytree(pack_dir, target_dir) + return ( + True, + f"Successfully installed sound pack '{pack_data.get('name', target_name)}'", + ) + except zipfile.BadZipFile: + return False, "Invalid ZIP file" + except Exception as exc: + logger.error("Error installing sound pack: %s", exc) + return False, f"Installation failed: {exc}" + + def export_pack(self, pack_name: str, output_path: Path) -> tuple[bool, str]: + """Export a sound pack to a ZIP file.""" + pack_dir = self.soundpacks_dir / pack_name + if not pack_dir.exists(): + return False, f"Sound pack '{pack_name}' not found" + try: + with zipfile.ZipFile(output_path, "w", zipfile.ZIP_DEFLATED) as zip_file: + for file_path in pack_dir.rglob("*"): + if file_path.is_file(): + zip_file.write(file_path, file_path.relative_to(pack_dir)) + return True, f"Successfully exported sound pack to {output_path}" + except Exception as exc: + logger.error("Error exporting sound pack: %s", exc) + return False, f"Export failed: {exc}" + + def uninstall_pack(self, pack_name: str) -> tuple[bool, str]: + """Remove an installed sound pack.""" + if pack_name == DEFAULT_PACK: + return False, "Cannot uninstall the default sound pack" + pack_dir = self.soundpacks_dir / pack_name + if not pack_dir.exists(): + return False, f"Sound pack '{pack_name}' not found" + shutil.rmtree(pack_dir) + return True, f"Successfully uninstalled sound pack '{pack_name}'" + + +class SoundPlayer: + """Small optional-backend player for soundpack event sounds.""" + + def __init__(self, soundpacks_dir: Path, pack_name: str = DEFAULT_PACK) -> None: + self.soundpacks_dir = ensure_default_soundpack(soundpacks_dir) + self.pack_name = pack_name or DEFAULT_PACK + + def play_event( + self, event: str, *, enabled: bool = True, muted: set[str] | None = None + ) -> bool: + """Play a configured event sound when available.""" + if not enabled or event in (muted or set()): + return False + sound_file, volume = get_sound_entry( + event, + self.pack_name, + soundpacks_dir=self.soundpacks_dir, + ) + if sound_file is None: + return False + return play_sound_file(sound_file, volume=volume) + + +def play_sound_file(sound_file: Path, volume: float = 1.0) -> bool: + """Play a sound file with sound_lib, returning whether playback started.""" + if not sound_file.exists(): + return False + volume = max(0.0, min(1.0, volume)) + if volume <= 0.0: + return True + if not SOUND_LIB_AVAILABLE: + logger.warning("sound_lib audio backend unavailable") + return False + + try: + from sound_lib import stream + + _active_streams[:] = [active for active in _active_streams if active.is_playing] + sound_stream = stream.FileStream(file=str(sound_file)) + sound_stream.volume = volume + sound_stream.play() + _active_streams.append(sound_stream) + logger.debug("Played sound using sound_lib at volume %s: %s", volume, sound_file) + return True + except Exception as exc: + logger.warning("sound_lib playback failed: %s", exc) + return False diff --git a/tests/test_app.py b/tests/test_app.py index 04c265c..43da0b0 100644 --- a/tests/test_app.py +++ b/tests/test_app.py @@ -72,6 +72,7 @@ def _hydrate_frame(module): frame._show_transfer_queue = MagicMock() frame._refresh_local_files = MagicMock() frame._refresh_remote_files = MagicMock() + frame._play_sound_event = MagicMock(return_value=True) frame._get_selected_local_file = MagicMock() frame._get_selected_remote_file = MagicMock() frame._transfer_service = MagicMock() @@ -837,6 +838,7 @@ def test_delete_remote_updates_status_on_success(app_module): frame._update_status.assert_any_call("Deleting doc.txt...", "/remote") frame._update_status.assert_any_call("Delete complete.", "/remote") frame._refresh_remote_files.assert_called_once() + frame._play_sound_event.assert_called_with("delete_complete") def test_delete_remote_reports_failure(app_module): @@ -854,6 +856,7 @@ def test_delete_remote_reports_failure(app_module): frame._delete_remote() frame._update_status.assert_any_call("Delete failed.", "/remote") + frame._play_sound_event.assert_called_with("delete_failed") fake_wx.MessageBox.assert_called() @@ -876,6 +879,7 @@ def test_rename_remote_updates_status(app_module): frame._update_status.assert_any_call("Renaming old.txt...", "/remote") frame._update_status.assert_any_call("Rename complete.", "/remote") + frame._play_sound_event.assert_called_with("rename_complete") def test_rename_remote_handles_error(app_module): @@ -898,6 +902,7 @@ def test_rename_remote_handles_error(app_module): frame._rename_remote() frame._update_status.assert_any_call("Rename failed.", "/remote") + frame._play_sound_event.assert_called_with("rename_failed") fake_wx.MessageBox.assert_called() @@ -917,6 +922,7 @@ def test_mkdir_remote_updates_status(app_module): frame._update_status.assert_any_call("Creating directory new-dir...", "/remote") frame._update_status.assert_any_call("Directory created.", "/remote") + frame._play_sound_event.assert_called_with("folder_created") def test_mkdir_remote_reports_error(app_module): @@ -934,6 +940,7 @@ def test_mkdir_remote_reports_error(app_module): frame._mkdir_remote() frame._update_status.assert_any_call("Create directory failed.", "/remote") + frame._play_sound_event.assert_called_with("folder_create_failed") fake_wx.MessageBox.assert_called() @@ -2078,15 +2085,29 @@ def test_on_close_stops_auto_update_timer_and_skips_event(app_module, monkeypatc frame = object.__new__(app.MainFrame) frame._auto_update_check_timer = MagicMock(Stop=MagicMock()) frame._transfer_service = MagicMock() + frame._play_exit_sound_once = MagicMock() event = MagicMock(Skip=MagicMock()) monkeypatch.setattr(app, "save_queue", lambda *a, **kw: None) frame._on_close(event) + frame._play_exit_sound_once.assert_called_once() frame._auto_update_check_timer.Stop.assert_called_once() event.Skip.assert_called_once() +def test_play_exit_sound_once_deduplicates_menu_and_close_paths(app_module): + app, _ = app_module + frame = object.__new__(app.MainFrame) + frame._exit_sound_played = False + frame._play_sound_event = MagicMock(return_value=True) + + assert frame._play_exit_sound_once() is True + assert frame._play_exit_sound_once() is False + + frame._play_sound_event.assert_called_once_with("exit") + + def test_get_update_channel_falls_back_to_stable_on_exception(app_module): app, _ = app_module frame = object.__new__(app.MainFrame) diff --git a/tests/test_app_migration_startup.py b/tests/test_app_migration_startup.py index 7747110..730a697 100644 --- a/tests/test_app_migration_startup.py +++ b/tests/test_app_migration_startup.py @@ -22,6 +22,10 @@ def _app_instance(app): return instance +def _frame(): + return SimpleNamespace(Show=MagicMock(), _play_sound_event=MagicMock()) + + def test_on_init_portable_mode_runs_migration_when_user_confirms(tmp_path, app_module): app, fake_wx = app_module portable_dir = tmp_path / "portable" @@ -31,7 +35,7 @@ def test_on_init_portable_mode_runs_migration_when_user_confirms(tmp_path, app_m dialog = MagicMock() dialog.ShowModal.return_value = fake_wx.ID_OK dialog.get_selected_filenames.return_value = ["sites.json"] - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() site_manager = MagicMock() site_manager.should_offer_keyring_to_vault_migration.return_value = False @@ -50,6 +54,7 @@ def test_on_init_portable_mode_runs_migration_when_user_confirms(tmp_path, app_m migration_dialog_cls.assert_called_once_with(None, candidates) assert result is True + frame._play_sound_event.assert_called_once_with("startup") migrate_files.assert_called_once_with(["sites.json"], tmp_path / ".portkeydrop", portable_dir) dialog.Destroy.assert_called_once() @@ -62,7 +67,7 @@ def test_on_init_portable_mode_skips_migration_when_user_cancels(tmp_path, app_m dialog = MagicMock() dialog.ShowModal.return_value = fake_wx.ID_CANCEL - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() site_manager = MagicMock() site_manager.should_offer_keyring_to_vault_migration.return_value = False @@ -86,7 +91,7 @@ def test_on_init_portable_mode_skips_migration_when_user_cancels(tmp_path, app_m def test_on_init_non_portable_mode_does_not_show_migration_dialog(app_module): app, _ = app_module - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() with ( patch.object(app, "is_portable_mode", return_value=False), @@ -107,7 +112,7 @@ def test_on_init_prompts_for_keyring_to_vault_migration_and_marks_complete(tmp_p app, fake_wx = app_module portable_dir = tmp_path / "portable" portable_dir.mkdir() - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() site_manager = MagicMock() site_manager.should_offer_keyring_to_vault_migration.return_value = True @@ -132,7 +137,7 @@ def test_on_init_decline_keyring_to_vault_migration_still_writes_marker(tmp_path app, fake_wx = app_module portable_dir = tmp_path / "portable" portable_dir.mkdir() - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() site_manager = MagicMock() site_manager.should_offer_keyring_to_vault_migration.return_value = True @@ -157,7 +162,7 @@ def test_on_init_skips_keyring_prompt_when_marker_exists(tmp_path, app_module): portable_dir = tmp_path / "portable" portable_dir.mkdir() (portable_dir / ".keyring_migrated").touch() - frame = SimpleNamespace(Show=MagicMock()) + frame = _frame() with ( patch.object(app, "is_portable_mode", return_value=True), diff --git a/tests/test_settings.py b/tests/test_settings.py index b32127a..6aaa44c 100644 --- a/tests/test_settings.py +++ b/tests/test_settings.py @@ -6,6 +6,7 @@ from portkeydrop.settings import ( AppSettings, + AudioSettings, ConnectionDefaults, DisplaySettings, Settings, @@ -62,6 +63,14 @@ def test_defaults(self): assert s.verbosity == "normal" +class TestAudioSettings: + def test_defaults(self): + s = AudioSettings() + assert s.sound_enabled is True + assert s.sound_pack == "default" + assert s.muted_sound_events == [] + + class TestAppSettings: def test_defaults(self): s = AppSettings() @@ -81,6 +90,7 @@ def test_defaults(self): assert isinstance(s.display, DisplaySettings) assert isinstance(s.connection, ConnectionDefaults) assert isinstance(s.speech, SpeechSettings) + assert isinstance(s.audio, AudioSettings) assert isinstance(s.app, AppSettings) @@ -96,6 +106,9 @@ def test_save_and_load(self, tmp_path): settings.display.show_hidden_files = True settings.connection.timeout = 60 settings.speech.rate = 75 + settings.audio.sound_enabled = False + settings.audio.sound_pack = "custom" + settings.audio.muted_sound_events = ["transfer_complete"] settings.app.auto_update_enabled = False settings.app.update_check_interval_hours = 12 settings.app.update_channel = "nightly" @@ -109,6 +122,9 @@ def test_save_and_load(self, tmp_path): assert loaded.display.show_hidden_files is True assert loaded.connection.timeout == 60 assert loaded.speech.rate == 75 + assert loaded.audio.sound_enabled is False + assert loaded.audio.sound_pack == "custom" + assert loaded.audio.muted_sound_events == ["transfer_complete"] assert loaded.app.auto_update_enabled is False assert loaded.app.update_check_interval_hours == 12 assert loaded.app.update_channel == "nightly" @@ -128,6 +144,21 @@ def test_load_partial_settings(self, tmp_path): assert settings.transfer.concurrent_transfers == 10 assert settings.display.sort_by == "name" # default preserved + def test_load_audio_settings_drops_unknown_muted_events(self, tmp_path): + data = { + "audio": { + "sound_enabled": True, + "sound_pack": "my_pack", + "muted_sound_events": ["transfer_failed", "unknown_event"], + } + } + (tmp_path / "settings.json").write_text(json.dumps(data), encoding="utf-8") + + settings = load_settings(tmp_path) + + assert settings.audio.sound_pack == "my_pack" + assert settings.audio.muted_sound_events == ["transfer_failed"] + def test_load_ignores_unknown_keys(self, tmp_path): data = {"transfer": {"concurrent_transfers": 3, "unknown_key": True}} (tmp_path / "settings.json").write_text(json.dumps(data), encoding="utf-8") diff --git a/tests/test_settings_dialog_a11y.py b/tests/test_settings_dialog_a11y.py index b4c3155..586026e 100644 --- a/tests/test_settings_dialog_a11y.py +++ b/tests/test_settings_dialog_a11y.py @@ -111,9 +111,19 @@ def __init__(self, parent=None, choices=None, **_kw): def SetSelection(self, idx: int): self._selection = idx + def GetSelection(self) -> int: + return self._selection + def GetStringSelection(self) -> str: return self._choices[self._selection] + def Clear(self): + self._choices = [] + self._selection = 0 + + def Append(self, value: str): + self._choices.append(value) + class _CheckBox(_Control): pass @@ -223,6 +233,10 @@ def test_all_controls_have_unambiguous_accessible_names(monkeypatch): "update_interval_spin": "Update check interval", "update_channel_choice": "Update channel", "check_updates_button": "Check for updates now", + # Audio + "sound_enabled_check": "Enable sound notifications", + "sound_pack_choice": "Sound pack", + "manage_soundpacks_button": "Manage sound packs", # Speech "speech_rate_spin": "Speech rate", "speech_volume_spin": "Speech volume", @@ -254,6 +268,8 @@ def test_labeled_controls_have_label_for_links(monkeypatch): "verify_keys_choice", "update_interval_spin", "update_channel_choice", + "sound_pack_choice", + "manage_soundpacks_button", "speech_rate_spin", "speech_volume_spin", "verbosity_choice", @@ -343,6 +359,7 @@ def test_notebook_includes_dedicated_updates_tab(monkeypatch): "Display", "Connection", "Updates", + "Audio", "Speech", ] @@ -368,6 +385,9 @@ def test_get_settings_persists_updater_fields(monkeypatch): dlg.minimize_to_tray_check.SetValue(True) dlg.update_interval_spin.SetValue(12) dlg.update_channel_choice.SetSelection(1) + dlg.sound_enabled_check.SetValue(False) + if dlg._audio_event_checks: + dlg._audio_event_checks[0][1].SetValue(True) dlg.remember_local_folder_check.SetValue(False) dlg.speech_rate_spin.SetValue(80) @@ -378,6 +398,9 @@ def test_get_settings_persists_updater_fields(monkeypatch): assert settings.app.minimize_to_notification_area_on_close is True assert settings.app.update_check_interval_hours == 12 assert settings.app.update_channel == "nightly" + assert settings.audio.sound_enabled is False + assert settings.audio.sound_pack == "default" + assert settings.audio.muted_sound_events == [dlg._audio_event_checks[0][0]] assert settings.app.remember_last_local_folder_on_startup is False assert settings.speech.rate == 80 diff --git a/tests/test_soundpacks.py b/tests/test_soundpacks.py new file mode 100644 index 0000000..36a1366 --- /dev/null +++ b/tests/test_soundpacks.py @@ -0,0 +1,434 @@ +"""Tests for sound pack helpers.""" + +from __future__ import annotations + +import json +import sys +import types +import zipfile + +import pytest + +import portkeydrop.soundpacks as soundpacks_module +from portkeydrop.soundpack_paths import ensure_default_soundpack +from portkeydrop.soundpacks import ( + SoundPackInstaller, + get_available_sound_packs, + get_sound_entry, + parse_sound_entry, + play_sound_file, + safe_extractall, + slugify_pack_name, + validate_sound_pack, +) + + +def test_ensure_default_soundpack_installs_packaged_default(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + + pack_json = soundpacks_dir / "default" / "pack.json" + pack_data = json.loads(pack_json.read_text(encoding="utf-8")) + + assert pack_json.exists() + assert pack_data["sounds"]["transfer_complete"] == "transfers/transfer_complete.ogg" + assert (soundpacks_dir / "default" / "transfers" / "transfer_complete.ogg").exists() + + +def test_ensure_default_soundpack_upgrades_placeholder_default(tmp_path): + soundpacks_dir = tmp_path / "soundpacks" + default_dir = soundpacks_dir / "default" + default_dir.mkdir(parents=True) + (default_dir / "pack.json").write_text( + json.dumps({"name": "Default", "sounds": {}}), + encoding="utf-8", + ) + + ensure_default_soundpack(soundpacks_dir) + + pack_data = json.loads((default_dir / "pack.json").read_text(encoding="utf-8")) + assert pack_data["sounds"]["connect_success"] == "connections/connect_success.ogg" + assert (default_dir / "connections" / "connect_success.ogg").exists() + + +def test_ensure_default_soundpack_preserves_custom_default_manifest(tmp_path): + soundpacks_dir = tmp_path / "soundpacks" + default_dir = soundpacks_dir / "default" + default_dir.mkdir(parents=True) + (default_dir / "custom.wav").write_bytes(b"RIFF") + (default_dir / "pack.json").write_text( + json.dumps({"name": "My Default", "sounds": {"success": "custom.wav"}}), + encoding="utf-8", + ) + + ensure_default_soundpack(soundpacks_dir) + + pack_data = json.loads((default_dir / "pack.json").read_text(encoding="utf-8")) + assert pack_data == {"name": "My Default", "sounds": {"success": "custom.wav"}} + assert (default_dir / "transfers" / "transfer_complete.ogg").exists() + + +def test_validate_sound_pack_accepts_inline_volume_format(tmp_path): + pack_dir = tmp_path / "pack" + pack_dir.mkdir() + (pack_dir / "complete.wav").write_bytes(b"RIFF") + (pack_dir / "pack.json").write_text( + json.dumps( + { + "name": "Transfers", + "sounds": {"transfer_complete": {"file": "complete.wav", "volume": 0.5}}, + } + ), + encoding="utf-8", + ) + + valid, message = validate_sound_pack(pack_dir) + + assert valid is True + assert message == "Sound pack is valid" + + +def test_validate_sound_pack_rejects_missing_mapped_file(tmp_path): + pack_dir = tmp_path / "pack" + pack_dir.mkdir() + (pack_dir / "pack.json").write_text( + json.dumps({"name": "Broken", "sounds": {"transfer_failed": "missing.wav"}}), + encoding="utf-8", + ) + + valid, message = validate_sound_pack(pack_dir) + + assert valid is False + assert "Missing sound files" in message + + +def test_validate_sound_pack_rejects_missing_directory(tmp_path): + valid, message = validate_sound_pack(tmp_path / "missing") + + assert valid is False + assert message == "Sound pack directory does not exist" + + +def test_validate_sound_pack_rejects_non_directory(tmp_path): + pack_path = tmp_path / "pack.zip" + pack_path.write_text("not a directory", encoding="utf-8") + + valid, message = validate_sound_pack(pack_path) + + assert valid is False + assert message == "Sound pack path is not a directory" + + +def test_validate_sound_pack_rejects_missing_pack_json(tmp_path): + pack_dir = tmp_path / "pack" + pack_dir.mkdir() + + valid, message = validate_sound_pack(pack_dir) + + assert valid is False + assert message == "Missing pack.json file" + + +def test_validate_sound_pack_rejects_invalid_manifest_shapes(tmp_path): + pack_dir = tmp_path / "pack" + pack_dir.mkdir() + pack_json = pack_dir / "pack.json" + + pack_json.write_text(json.dumps({"sounds": {}}), encoding="utf-8") + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert message == "Missing 'name' field in pack.json" + + pack_json.write_text(json.dumps({"name": "Broken"}), encoding="utf-8") + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert message == "Missing 'sounds' field in pack.json" + + pack_json.write_text(json.dumps({"name": "Broken", "sounds": []}), encoding="utf-8") + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert message == "'sounds' field must be a dictionary" + + +def test_validate_sound_pack_rejects_invalid_volume_data(tmp_path): + pack_dir = tmp_path / "pack" + pack_dir.mkdir() + (pack_dir / "cue.wav").write_bytes(b"RIFF") + pack_json = pack_dir / "pack.json" + + pack_json.write_text( + json.dumps({"name": "Broken", "sounds": {"success": "cue.wav"}, "volumes": []}), + encoding="utf-8", + ) + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert message == "'volumes' field must be a dictionary" + + pack_json.write_text( + json.dumps( + {"name": "Broken", "sounds": {"success": "cue.wav"}, "volumes": {"success": "loud"}} + ), + encoding="utf-8", + ) + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert "Invalid volume value" in message + + pack_json.write_text( + json.dumps( + {"name": "Broken", "sounds": {"success": "cue.wav"}, "volumes": {"success": 1.5}} + ), + encoding="utf-8", + ) + valid, message = validate_sound_pack(pack_dir) + assert valid is False + assert "must be between 0.0 and 1.0" in message + + +def test_get_sound_entry_falls_back_to_default_pack(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + default_dir = soundpacks_dir / "default" + (default_dir / "error.wav").write_bytes(b"RIFF") + (default_dir / "pack.json").write_text( + json.dumps({"name": "Default", "sounds": {"transfer_failed": "error.wav"}}), + encoding="utf-8", + ) + custom_dir = soundpacks_dir / "custom" + custom_dir.mkdir() + (custom_dir / "pack.json").write_text( + json.dumps({"name": "Custom", "sounds": {}}), + encoding="utf-8", + ) + + sound_file, volume = get_sound_entry( + "transfer_failed", + "custom", + soundpacks_dir=soundpacks_dir, + ) + + assert sound_file == default_dir / "error.wav" + assert volume == 1.0 + + +def test_get_sound_entry_ignores_unreadable_pack_manifest(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + broken_dir = soundpacks_dir / "broken" + broken_dir.mkdir() + (broken_dir / "pack.json").write_text("{", encoding="utf-8") + + sound_file, volume = get_sound_entry( + "transfer_failed", + "broken", + soundpacks_dir=soundpacks_dir, + ) + + assert sound_file is not None + assert sound_file.name == "transfer_failed.ogg" + assert volume == 1.0 + + +def test_installer_exports_pack_zip(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + pack_dir = soundpacks_dir / "custom" + pack_dir.mkdir() + (pack_dir / "done.wav").write_bytes(b"RIFF") + (pack_dir / "pack.json").write_text( + json.dumps({"name": "Custom", "sounds": {"transfer_complete": "done.wav"}}), + encoding="utf-8", + ) + output = tmp_path / "custom.zip" + + ok, message = SoundPackInstaller(soundpacks_dir).export_pack("custom", output) + + assert ok is True + assert "Successfully exported" in message + with zipfile.ZipFile(output) as zf: + assert sorted(zf.namelist()) == ["done.wav", "pack.json"] + + +def test_installer_installs_pack_zip_from_nested_directory(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + archive = tmp_path / "new-pack.zip" + with zipfile.ZipFile(archive, "w") as zf: + zf.writestr( + "nested/pack.json", + json.dumps({"name": "Fancy Pack", "sounds": {"success": "done.wav"}}), + ) + zf.writestr("nested/done.wav", b"RIFF") + + ok, message = SoundPackInstaller(soundpacks_dir).install_from_zip(archive) + + assert ok is True + assert "Successfully installed" in message + assert (soundpacks_dir / "fancy_pack" / "pack.json").exists() + + +def test_installer_rejects_invalid_zip_inputs(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + installer = SoundPackInstaller(soundpacks_dir) + + ok, message = installer.install_from_zip(tmp_path / "missing.zip") + assert ok is False + assert "ZIP file not found" in message + + archive = tmp_path / "not-a-pack.zip" + archive.write_text("not a zip", encoding="utf-8") + ok, message = installer.install_from_zip(archive) + assert ok is False + assert message == "Invalid ZIP file" + + empty_archive = tmp_path / "empty.zip" + with zipfile.ZipFile(empty_archive, "w") as zf: + zf.writestr("readme.txt", "hello") + ok, message = installer.install_from_zip(empty_archive) + assert ok is False + assert message == "No pack.json file found in ZIP archive" + + +def test_installer_rejects_invalid_or_duplicate_pack_zip(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + archive = tmp_path / "broken-pack.zip" + with zipfile.ZipFile(archive, "w") as zf: + zf.writestr( + "pack.json", json.dumps({"name": "Broken", "sounds": {"success": "missing.wav"}}) + ) + + ok, message = SoundPackInstaller(soundpacks_dir).install_from_zip(archive) + + assert ok is False + assert "Invalid sound pack" in message + + duplicate_archive = tmp_path / "duplicate-pack.zip" + with zipfile.ZipFile(duplicate_archive, "w") as zf: + zf.writestr("pack.json", json.dumps({"name": "Default", "sounds": {"success": "done.wav"}})) + zf.writestr("done.wav", b"RIFF") + ok, message = SoundPackInstaller(soundpacks_dir).install_from_zip(duplicate_archive) + assert ok is False + assert "already exists" in message + + +def test_installer_uninstalls_custom_pack_only(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + pack_dir = soundpacks_dir / "custom" + pack_dir.mkdir() + (pack_dir / "pack.json").write_text( + json.dumps({"name": "Custom", "sounds": {}}), + encoding="utf-8", + ) + installer = SoundPackInstaller(soundpacks_dir) + + ok, message = installer.uninstall_pack("default") + assert ok is False + assert message == "Cannot uninstall the default sound pack" + + ok, message = installer.uninstall_pack("missing") + assert ok is False + assert "not found" in message + + ok, message = installer.uninstall_pack("custom") + assert ok is True + assert "Successfully uninstalled" in message + assert not pack_dir.exists() + + +def test_safe_extractall_rejects_zip_slip(tmp_path): + archive = tmp_path / "bad.zip" + with zipfile.ZipFile(archive, "w") as zf: + zf.writestr("../evil.txt", "bad") + + with zipfile.ZipFile(archive) as zf: + with pytest.raises(ValueError, match="Zip Slip"): + safe_extractall(zf, tmp_path / "out") + + +def test_slugify_pack_name_has_safe_fallback(): + assert slugify_pack_name("My Pack!") == "my_pack" + assert slugify_pack_name("!!!") == "sound_pack" + + +def test_get_available_sound_packs_includes_default(tmp_path): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + + packs = get_available_sound_packs(soundpacks_dir) + + assert "default" in packs + + +def test_parse_sound_entry_clamps_volume(): + assert parse_sound_entry({"file": "x.wav", "volume": 2}, "event") == ("x.wav", 1.0) + + +def test_parse_sound_entry_uses_volume_mapping_and_fallbacks(): + assert parse_sound_entry("", "notify", {"notify": 0.5}) == ("notify.wav", 0.5) + assert parse_sound_entry({"volume": "quiet"}, "notify") == ("notify.wav", 1.0) + + +def test_sound_player_respects_disabled_and_muted_events(tmp_path, monkeypatch): + soundpacks_dir = ensure_default_soundpack(tmp_path / "soundpacks") + player = soundpacks_module.SoundPlayer(soundpacks_dir) + calls: list[tuple[object, float]] = [] + monkeypatch.setattr( + soundpacks_module, + "play_sound_file", + lambda path, volume=1.0: calls.append((path, volume)) or True, + ) + + assert player.play_event("success", enabled=False) is False + assert player.play_event("success", muted={"success"}) is False + assert player.play_event("success") is True + assert calls + + +def test_play_sound_file_handles_missing_backend_and_errors(tmp_path, monkeypatch): + sound_file = tmp_path / "cue.ogg" + sound_file.write_bytes(b"OggS") + + monkeypatch.setattr(soundpacks_module, "SOUND_LIB_AVAILABLE", False) + assert play_sound_file(sound_file) is False + assert play_sound_file(tmp_path / "missing.ogg") is False + assert play_sound_file(sound_file, volume=0) is True + + class BrokenFileStream: + is_playing = False + + def __init__(self, *, file: str) -> None: + raise RuntimeError(file) + + stream_module = types.ModuleType("sound_lib.stream") + stream_module.FileStream = BrokenFileStream + monkeypatch.setitem(sys.modules, "sound_lib", types.ModuleType("sound_lib")) + monkeypatch.setitem(sys.modules, "sound_lib.stream", stream_module) + monkeypatch.setattr(soundpacks_module, "SOUND_LIB_AVAILABLE", True) + assert play_sound_file(sound_file) is False + + +def test_play_sound_file_uses_sound_lib_only(tmp_path, monkeypatch): + sound_file = tmp_path / "cue.ogg" + sound_file.write_bytes(b"OggS") + calls: dict[str, object] = {} + + stream_module = types.ModuleType("sound_lib.stream") + + class FakeFileStream: + is_playing = True + + def __init__(self, *, file: str) -> None: + calls["file"] = file + self.volume = 0 + + def play(self) -> None: + calls["volume"] = self.volume + calls["played"] = True + + stream_module.FileStream = FakeFileStream + monkeypatch.setitem(sys.modules, "sound_lib", types.ModuleType("sound_lib")) + monkeypatch.setitem(sys.modules, "sound_lib.stream", stream_module) + monkeypatch.setattr(soundpacks_module, "SOUND_LIB_AVAILABLE", True) + monkeypatch.setattr(soundpacks_module, "_active_streams", []) + + assert play_sound_file(sound_file, volume=0.25) is True + assert calls == { + "file": str(sound_file), + "volume": 0.25, + "played": True, + } + assert len(soundpacks_module._active_streams) == 1 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..255fc9d --- /dev/null +++ b/uv.lock @@ -0,0 +1,1014 @@ +version = 1 +revision = 1 +requires-python = ">=3.11, <3.13" + +[[package]] +name = "asyncssh" +version = "2.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/d5/957886c316466349d55c4de6a688a10a98295c0b4429deb8db1a17f3eb19/asyncssh-2.22.0.tar.gz", hash = "sha256:c3ce72b01be4f97b40e62844dd384227e5ff5a401a3793007c42f86a5c8eb537", size = 540523 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/ae/0da2f2214fc183338af1afe5a103a2052fd03464e8eafbd827abff58a4d0/asyncssh-2.22.0-py3-none-any.whl", hash = "sha256:d16465ccdf1ed20eba1131b14415b155e047f6f5be0d19f39c2e0b61331ee0e7", size = 374938 }, +] + +[[package]] +name = "backports-tarfile" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/86/72/cd9b395f25e290e633655a100af28cb253e4393396264a98bd5f5951d50f/backports_tarfile-1.2.0.tar.gz", hash = "sha256:d75e02c268746e1b8144c278978b6e98e85de6ad16f8e4b0844a154557eca991", size = 86406 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/fa/123043af240e49752f1c4bd24da5053b6bd00cad78c2be53c0d1e8b975bc/backports.tarfile-1.2.0-py3-none-any.whl", hash = "sha256:77e284d754527b01fb1e6fa8a1afe577858ebe4e9dad8919e34c862cb399bc34", size = 30181 }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.14.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/b0/1c6a16426d389813b48d95e26898aff79abbde42ad353958ad95cc8c9b21/beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86", size = 627737 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/39/47f9197bdd44df24d67ac8893641e16f386c984a0619ef2ee4c51fbbc019/beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb", size = 107721 }, +] + +[[package]] +name = "certifi" +version = "2026.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900 }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344 }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560 }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613 }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476 }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374 }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597 }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574 }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971 }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972 }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078 }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076 }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820 }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635 }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271 }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048 }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529 }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097 }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519 }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572 }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963 }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361 }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932 }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557 }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762 }, +] + +[[package]] +name = "chardet" +version = "6.0.0.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7f/42/fb9436c103a881a377e34b9f58d77b5f503461c702ff654ebe86151bcfe9/chardet-6.0.0.post1.tar.gz", hash = "sha256:6b78048c3c97c7b2ed1fbad7a18f76f5a6547f7d34dbab536cc13887c9a92fa4", size = 12521798 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/66/42/5de54f632c2de53cd3415b3703383d5fff43a94cbc0567ef362515261a21/chardet-6.0.0.post1-py3-none-any.whl", hash = "sha256:c894a36800549adf7bb5f2af47033281b75fdfcd2aa0f0243be0ad22a52e2dcb", size = 627245 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988 }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324 }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742 }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863 }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837 }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550 }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162 }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019 }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310 }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022 }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098 }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991 }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456 }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978 }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969 }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425 }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162 }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558 }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497 }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240 }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471 }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864 }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647 }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110 }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839 }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667 }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535 }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816 }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694 }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131 }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390 }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "coverage" +version = "7.13.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/56/95b7e30fa389756cb56630faa728da46a27b8c6eb46f9d557c68fff12b65/coverage-7.13.4.tar.gz", hash = "sha256:e5c8f6ed1e61a8b2dcdf31eb0b9bbf0130750ca79c1c49eb898e2ad86f5ccc91", size = 827239 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/ad/b59e5b451cf7172b8d1043dc0fa718f23aab379bc1521ee13d4bd9bfa960/coverage-7.13.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d490ba50c3f35dd7c17953c68f3270e7ccd1c6642e2d2afe2d8e720b98f5a053", size = 219278 }, + { url = "https://files.pythonhosted.org/packages/f1/17/0cb7ca3de72e5f4ef2ec2fa0089beafbcaaaead1844e8b8a63d35173d77d/coverage-7.13.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:19bc3c88078789f8ef36acb014d7241961dbf883fd2533d18cb1e7a5b4e28b11", size = 219783 }, + { url = "https://files.pythonhosted.org/packages/ab/63/325d8e5b11e0eaf6d0f6a44fad444ae58820929a9b0de943fa377fe73e85/coverage-7.13.4-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3998e5a32e62fdf410c0dbd3115df86297995d6e3429af80b8798aad894ca7aa", size = 250200 }, + { url = "https://files.pythonhosted.org/packages/76/53/c16972708cbb79f2942922571a687c52bd109a7bd51175aeb7558dff2236/coverage-7.13.4-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8e264226ec98e01a8e1054314af91ee6cde0eacac4f465cc93b03dbe0bce2fd7", size = 252114 }, + { url = "https://files.pythonhosted.org/packages/eb/c2/7ab36d8b8cc412bec9ea2d07c83c48930eb4ba649634ba00cb7e4e0f9017/coverage-7.13.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a3aa4e7b9e416774b21797365b358a6e827ffadaaca81b69ee02946852449f00", size = 254220 }, + { url = "https://files.pythonhosted.org/packages/d6/4d/cf52c9a3322c89a0e6febdfbc83bb45c0ed3c64ad14081b9503adee702e7/coverage-7.13.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:71ca20079dd8f27fcf808817e281e90220475cd75115162218d0e27549f95fef", size = 256164 }, + { url = "https://files.pythonhosted.org/packages/78/e9/eb1dd17bd6de8289df3580e967e78294f352a5df8a57ff4671ee5fc3dcd0/coverage-7.13.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e2f25215f1a359ab17320b47bcdaca3e6e6356652e8256f2441e4ef972052903", size = 250325 }, + { url = "https://files.pythonhosted.org/packages/71/07/8c1542aa873728f72267c07278c5cc0ec91356daf974df21335ccdb46368/coverage-7.13.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d65b2d373032411e86960604dc4edac91fdfb5dca539461cf2cbe78327d1e64f", size = 251913 }, + { url = "https://files.pythonhosted.org/packages/74/d7/c62e2c5e4483a748e27868e4c32ad3daa9bdddbba58e1bc7a15e252baa74/coverage-7.13.4-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94eb63f9b363180aff17de3e7c8760c3ba94664ea2695c52f10111244d16a299", size = 249974 }, + { url = "https://files.pythonhosted.org/packages/98/9f/4c5c015a6e98ced54efd0f5cf8d31b88e5504ecb6857585fc0161bb1e600/coverage-7.13.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e856bf6616714c3a9fbc270ab54103f4e685ba236fa98c054e8f87f266c93505", size = 253741 }, + { url = "https://files.pythonhosted.org/packages/bd/59/0f4eef89b9f0fcd9633b5d350016f54126ab49426a70ff4c4e87446cabdc/coverage-7.13.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:65dfcbe305c3dfe658492df2d85259e0d79ead4177f9ae724b6fb245198f55d6", size = 249695 }, + { url = "https://files.pythonhosted.org/packages/b5/2c/b7476f938deb07166f3eb281a385c262675d688ff4659ad56c6c6b8e2e70/coverage-7.13.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b507778ae8a4c915436ed5c2e05b4a6cecfa70f734e19c22a005152a11c7b6a9", size = 250599 }, + { url = "https://files.pythonhosted.org/packages/b8/34/c3420709d9846ee3785b9f2831b4d94f276f38884032dca1457fa83f7476/coverage-7.13.4-cp311-cp311-win32.whl", hash = "sha256:784fc3cf8be001197b652d51d3fd259b1e2262888693a4636e18879f613a62a9", size = 221780 }, + { url = "https://files.pythonhosted.org/packages/61/08/3d9c8613079d2b11c185b865de9a4c1a68850cfda2b357fae365cf609f29/coverage-7.13.4-cp311-cp311-win_amd64.whl", hash = "sha256:2421d591f8ca05b308cf0092807308b2facbefe54af7c02ac22548b88b95c98f", size = 222715 }, + { url = "https://files.pythonhosted.org/packages/18/1a/54c3c80b2f056164cc0a6cdcb040733760c7c4be9d780fe655f356f433e4/coverage-7.13.4-cp311-cp311-win_arm64.whl", hash = "sha256:79e73a76b854d9c6088fe5d8b2ebe745f8681c55f7397c3c0a016192d681045f", size = 221385 }, + { url = "https://files.pythonhosted.org/packages/d1/81/4ce2fdd909c5a0ed1f6dedb88aa57ab79b6d1fbd9b588c1ac7ef45659566/coverage-7.13.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:02231499b08dabbe2b96612993e5fc34217cdae907a51b906ac7fca8027a4459", size = 219449 }, + { url = "https://files.pythonhosted.org/packages/5d/96/5238b1efc5922ddbdc9b0db9243152c09777804fb7c02ad1741eb18a11c0/coverage-7.13.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40aa8808140e55dc022b15d8aa7f651b6b3d68b365ea0398f1441e0b04d859c3", size = 219810 }, + { url = "https://files.pythonhosted.org/packages/78/72/2f372b726d433c9c35e56377cf1d513b4c16fe51841060d826b95caacec1/coverage-7.13.4-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5b856a8ccf749480024ff3bd7310adaef57bf31fd17e1bfc404b7940b6986634", size = 251308 }, + { url = "https://files.pythonhosted.org/packages/5d/a0/2ea570925524ef4e00bb6c82649f5682a77fac5ab910a65c9284de422600/coverage-7.13.4-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2c048ea43875fbf8b45d476ad79f179809c590ec7b79e2035c662e7afa3192e3", size = 254052 }, + { url = "https://files.pythonhosted.org/packages/e8/ac/45dc2e19a1939098d783c846e130b8f862fbb50d09e0af663988f2f21973/coverage-7.13.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b7b38448866e83176e28086674fe7368ab8590e4610fb662b44e345b86d63ffa", size = 255165 }, + { url = "https://files.pythonhosted.org/packages/2d/4d/26d236ff35abc3b5e63540d3386e4c3b192168c1d96da5cb2f43c640970f/coverage-7.13.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:de6defc1c9badbf8b9e67ae90fd00519186d6ab64e5cc5f3d21359c2a9b2c1d3", size = 257432 }, + { url = "https://files.pythonhosted.org/packages/ec/55/14a966c757d1348b2e19caf699415a2a4c4f7feaa4bbc6326a51f5c7dd1b/coverage-7.13.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7eda778067ad7ffccd23ecffce537dface96212576a07924cbf0d8799d2ded5a", size = 251716 }, + { url = "https://files.pythonhosted.org/packages/77/33/50116647905837c66d28b2af1321b845d5f5d19be9655cb84d4a0ea806b4/coverage-7.13.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e87f6c587c3f34356c3759f0420693e35e7eb0e2e41e4c011cb6ec6ecbbf1db7", size = 253089 }, + { url = "https://files.pythonhosted.org/packages/c2/b4/8efb11a46e3665d92635a56e4f2d4529de6d33f2cb38afd47d779d15fc99/coverage-7.13.4-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:8248977c2e33aecb2ced42fef99f2d319e9904a36e55a8a68b69207fb7e43edc", size = 251232 }, + { url = "https://files.pythonhosted.org/packages/51/24/8cd73dd399b812cc76bb0ac260e671c4163093441847ffe058ac9fda1e32/coverage-7.13.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:25381386e80ae727608e662474db537d4df1ecd42379b5ba33c84633a2b36d47", size = 255299 }, + { url = "https://files.pythonhosted.org/packages/03/94/0a4b12f1d0e029ce1ccc1c800944a9984cbe7d678e470bb6d3c6bc38a0da/coverage-7.13.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:ee756f00726693e5ba94d6df2bdfd64d4852d23b09bb0bc700e3b30e6f333985", size = 250796 }, + { url = "https://files.pythonhosted.org/packages/73/44/6002fbf88f6698ca034360ce474c406be6d5a985b3fdb3401128031eef6b/coverage-7.13.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdfc1e28e7c7cdce44985b3043bc13bbd9c747520f94a4d7164af8260b3d91f0", size = 252673 }, + { url = "https://files.pythonhosted.org/packages/de/c6/a0279f7c00e786be75a749a5674e6fa267bcbd8209cd10c9a450c655dfa7/coverage-7.13.4-cp312-cp312-win32.whl", hash = "sha256:01d4cbc3c283a17fc1e42d614a119f7f438eabb593391283adca8dc86eff1246", size = 221990 }, + { url = "https://files.pythonhosted.org/packages/77/4e/c0a25a425fcf5557d9abd18419c95b63922e897bc86c1f327f155ef234a9/coverage-7.13.4-cp312-cp312-win_amd64.whl", hash = "sha256:9401ebc7ef522f01d01d45532c68c5ac40fb27113019b6b7d8b208f6e9baa126", size = 222800 }, + { url = "https://files.pythonhosted.org/packages/47/ac/92da44ad9a6f4e3a7debd178949d6f3769bedca33830ce9b1dcdab589a37/coverage-7.13.4-cp312-cp312-win_arm64.whl", hash = "sha256:b1ec7b6b6e93255f952e27ab58fbc68dcc468844b16ecbee881aeb29b6ab4d8d", size = 221415 }, + { url = "https://files.pythonhosted.org/packages/0d/4a/331fe2caf6799d591109bb9c08083080f6de90a823695d412a935622abb2/coverage-7.13.4-py3-none-any.whl", hash = "sha256:1af1641e57cf7ba1bd67d677c9abdbcd6cc2ab7da3bca7fa1e2b7e50e65f2ad0", size = 211242 }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", marker = "python_full_version <= '3.11'" }, +] + +[[package]] +name = "cryptography" +version = "46.0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/60/04/ee2a9e8542e4fa2773b81771ff8349ff19cdd56b7258a0cc442639052edb/cryptography-46.0.5.tar.gz", hash = "sha256:abace499247268e3757271b2f1e244b36b06f8515cf27c4d49468fc9eb16e93d", size = 750064 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/81/b0bb27f2ba931a65409c6b8a8b358a7f03c0e46eceacddff55f7c84b1f3b/cryptography-46.0.5-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:351695ada9ea9618b3500b490ad54c739860883df6c1f555e088eaf25b1bbaad", size = 7176289 }, + { url = "https://files.pythonhosted.org/packages/ff/9e/6b4397a3e3d15123de3b1806ef342522393d50736c13b20ec4c9ea6693a6/cryptography-46.0.5-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c18ff11e86df2e28854939acde2d003f7984f721eba450b56a200ad90eeb0e6b", size = 4275637 }, + { url = "https://files.pythonhosted.org/packages/63/e7/471ab61099a3920b0c77852ea3f0ea611c9702f651600397ac567848b897/cryptography-46.0.5-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d7e3d356b8cd4ea5aff04f129d5f66ebdc7b6f8eae802b93739ed520c47c79b", size = 4424742 }, + { url = "https://files.pythonhosted.org/packages/37/53/a18500f270342d66bf7e4d9f091114e31e5ee9e7375a5aba2e85a91e0044/cryptography-46.0.5-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:50bfb6925eff619c9c023b967d5b77a54e04256c4281b0e21336a130cd7fc263", size = 4277528 }, + { url = "https://files.pythonhosted.org/packages/22/29/c2e812ebc38c57b40e7c583895e73c8c5adb4d1e4a0cc4c5a4fdab2b1acc/cryptography-46.0.5-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:803812e111e75d1aa73690d2facc295eaefd4439be1023fefc4995eaea2af90d", size = 4947993 }, + { url = "https://files.pythonhosted.org/packages/6b/e7/237155ae19a9023de7e30ec64e5d99a9431a567407ac21170a046d22a5a3/cryptography-46.0.5-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ee190460e2fbe447175cda91b88b84ae8322a104fc27766ad09428754a618ed", size = 4456855 }, + { url = "https://files.pythonhosted.org/packages/2d/87/fc628a7ad85b81206738abbd213b07702bcbdada1dd43f72236ef3cffbb5/cryptography-46.0.5-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:f145bba11b878005c496e93e257c1e88f154d278d2638e6450d17e0f31e558d2", size = 3984635 }, + { url = "https://files.pythonhosted.org/packages/84/29/65b55622bde135aedf4565dc509d99b560ee4095e56989e815f8fd2aa910/cryptography-46.0.5-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e9251e3be159d1020c4030bd2e5f84d6a43fe54b6c19c12f51cde9542a2817b2", size = 4277038 }, + { url = "https://files.pythonhosted.org/packages/bc/36/45e76c68d7311432741faf1fbf7fac8a196a0a735ca21f504c75d37e2558/cryptography-46.0.5-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:47fb8a66058b80e509c47118ef8a75d14c455e81ac369050f20ba0d23e77fee0", size = 4912181 }, + { url = "https://files.pythonhosted.org/packages/6d/1a/c1ba8fead184d6e3d5afcf03d569acac5ad063f3ac9fb7258af158f7e378/cryptography-46.0.5-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:4c3341037c136030cb46e4b1e17b7418ea4cbd9dd207e4a6f3b2b24e0d4ac731", size = 4456482 }, + { url = "https://files.pythonhosted.org/packages/f9/e5/3fb22e37f66827ced3b902cf895e6a6bc1d095b5b26be26bd13c441fdf19/cryptography-46.0.5-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:890bcb4abd5a2d3f852196437129eb3667d62630333aacc13dfd470fad3aaa82", size = 4405497 }, + { url = "https://files.pythonhosted.org/packages/1a/df/9d58bb32b1121a8a2f27383fabae4d63080c7ca60b9b5c88be742be04ee7/cryptography-46.0.5-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:80a8d7bfdf38f87ca30a5391c0c9ce4ed2926918e017c29ddf643d0ed2778ea1", size = 4667819 }, + { url = "https://files.pythonhosted.org/packages/ea/ed/325d2a490c5e94038cdb0117da9397ece1f11201f425c4e9c57fe5b9f08b/cryptography-46.0.5-cp311-abi3-win32.whl", hash = "sha256:60ee7e19e95104d4c03871d7d7dfb3d22ef8a9b9c6778c94e1c8fcc8365afd48", size = 3028230 }, + { url = "https://files.pythonhosted.org/packages/e9/5a/ac0f49e48063ab4255d9e3b79f5def51697fce1a95ea1370f03dc9db76f6/cryptography-46.0.5-cp311-abi3-win_amd64.whl", hash = "sha256:38946c54b16c885c72c4f59846be9743d699eee2b69b6988e0a00a01f46a61a4", size = 3480909 }, + { url = "https://files.pythonhosted.org/packages/e2/fa/a66aa722105ad6a458bebd64086ca2b72cdd361fed31763d20390f6f1389/cryptography-46.0.5-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:4108d4c09fbbf2789d0c926eb4152ae1760d5a2d97612b92d508d96c861e4d31", size = 7170514 }, + { url = "https://files.pythonhosted.org/packages/0f/04/c85bdeab78c8bc77b701bf0d9bdcf514c044e18a46dcff330df5448631b0/cryptography-46.0.5-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1f30a86d2757199cb2d56e48cce14deddf1f9c95f1ef1b64ee91ea43fe2e18", size = 4275349 }, + { url = "https://files.pythonhosted.org/packages/5c/32/9b87132a2f91ee7f5223b091dc963055503e9b442c98fc0b8a5ca765fab0/cryptography-46.0.5-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:039917b0dc418bb9f6edce8a906572d69e74bd330b0b3fea4f79dab7f8ddd235", size = 4420667 }, + { url = "https://files.pythonhosted.org/packages/a1/a6/a7cb7010bec4b7c5692ca6f024150371b295ee1c108bdc1c400e4c44562b/cryptography-46.0.5-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:ba2a27ff02f48193fc4daeadf8ad2590516fa3d0adeeb34336b96f7fa64c1e3a", size = 4276980 }, + { url = "https://files.pythonhosted.org/packages/8e/7c/c4f45e0eeff9b91e3f12dbd0e165fcf2a38847288fcfd889deea99fb7b6d/cryptography-46.0.5-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:61aa400dce22cb001a98014f647dc21cda08f7915ceb95df0c9eaf84b4b6af76", size = 4939143 }, + { url = "https://files.pythonhosted.org/packages/37/19/e1b8f964a834eddb44fa1b9a9976f4e414cbb7aa62809b6760c8803d22d1/cryptography-46.0.5-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:3ce58ba46e1bc2aac4f7d9290223cead56743fa6ab94a5d53292ffaac6a91614", size = 4453674 }, + { url = "https://files.pythonhosted.org/packages/db/ed/db15d3956f65264ca204625597c410d420e26530c4e2943e05a0d2f24d51/cryptography-46.0.5-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:420d0e909050490d04359e7fdb5ed7e667ca5c3c402b809ae2563d7e66a92229", size = 3978801 }, + { url = "https://files.pythonhosted.org/packages/41/e2/df40a31d82df0a70a0daf69791f91dbb70e47644c58581d654879b382d11/cryptography-46.0.5-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:582f5fcd2afa31622f317f80426a027f30dc792e9c80ffee87b993200ea115f1", size = 4276755 }, + { url = "https://files.pythonhosted.org/packages/33/45/726809d1176959f4a896b86907b98ff4391a8aa29c0aaaf9450a8a10630e/cryptography-46.0.5-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:bfd56bb4b37ed4f330b82402f6f435845a5f5648edf1ad497da51a8452d5d62d", size = 4901539 }, + { url = "https://files.pythonhosted.org/packages/99/0f/a3076874e9c88ecb2ecc31382f6e7c21b428ede6f55aafa1aa272613e3cd/cryptography-46.0.5-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:a3d507bb6a513ca96ba84443226af944b0f7f47dcc9a399d110cd6146481d24c", size = 4452794 }, + { url = "https://files.pythonhosted.org/packages/02/ef/ffeb542d3683d24194a38f66ca17c0a4b8bf10631feef44a7ef64e631b1a/cryptography-46.0.5-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9f16fbdf4da055efb21c22d81b89f155f02ba420558db21288b3d0035bafd5f4", size = 4404160 }, + { url = "https://files.pythonhosted.org/packages/96/93/682d2b43c1d5f1406ed048f377c0fc9fc8f7b0447a478d5c65ab3d3a66eb/cryptography-46.0.5-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:ced80795227d70549a411a4ab66e8ce307899fad2220ce5ab2f296e687eacde9", size = 4667123 }, + { url = "https://files.pythonhosted.org/packages/45/2d/9c5f2926cb5300a8eefc3f4f0b3f3df39db7f7ce40c8365444c49363cbda/cryptography-46.0.5-cp38-abi3-win32.whl", hash = "sha256:02f547fce831f5096c9a567fd41bc12ca8f11df260959ecc7c3202555cc47a72", size = 3010220 }, + { url = "https://files.pythonhosted.org/packages/48/ef/0c2f4a8e31018a986949d34a01115dd057bf536905dca38897bacd21fac3/cryptography-46.0.5-cp38-abi3-win_amd64.whl", hash = "sha256:556e106ee01aa13484ce9b0239bca667be5004efb0aabbed28d353df86445595", size = 3467050 }, + { url = "https://files.pythonhosted.org/packages/eb/dd/2d9fdb07cebdf3d51179730afb7d5e576153c6744c3ff8fded23030c204e/cryptography-46.0.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:3b4995dc971c9fb83c25aa44cf45f02ba86f71ee600d81091c2f0cbae116b06c", size = 3476964 }, + { url = "https://files.pythonhosted.org/packages/e9/6f/6cc6cc9955caa6eaf83660b0da2b077c7fe8ff9950a3c5e45d605038d439/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:bc84e875994c3b445871ea7181d424588171efec3e185dced958dad9e001950a", size = 4218321 }, + { url = "https://files.pythonhosted.org/packages/3e/5d/c4da701939eeee699566a6c1367427ab91a8b7088cc2328c09dbee940415/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:2ae6971afd6246710480e3f15824ed3029a60fc16991db250034efd0b9fb4356", size = 4381786 }, + { url = "https://files.pythonhosted.org/packages/ac/97/a538654732974a94ff96c1db621fa464f455c02d4bb7d2652f4edc21d600/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:d861ee9e76ace6cf36a6a89b959ec08e7bc2493ee39d07ffe5acb23ef46d27da", size = 4217990 }, + { url = "https://files.pythonhosted.org/packages/ae/11/7e500d2dd3ba891197b9efd2da5454b74336d64a7cc419aa7327ab74e5f6/cryptography-46.0.5-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:2b7a67c9cd56372f3249b39699f2ad479f6991e62ea15800973b956f4b73e257", size = 4381252 }, + { url = "https://files.pythonhosted.org/packages/bc/58/6b3d24e6b9bc474a2dcdee65dfd1f008867015408a271562e4b690561a4d/cryptography-46.0.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8456928655f856c6e1533ff59d5be76578a7157224dbd9ce6872f25055ab9ab7", size = 3407605 }, +] + +[[package]] +name = "diff-cover" +version = "10.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, + { name = "jinja2" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/b4/eee71d1e338bc1f9bd3539b46b70e303dac061324b759c9a80fa3c96d90d/diff_cover-10.2.0.tar.gz", hash = "sha256:61bf83025f10510c76ef6a5820680cf61b9b974e8f81de70c57ac926fa63872a", size = 102473 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2c/61eeb887055a37150db824b6bf830e821a736580769ac2fea4eadb0d613f/diff_cover-10.2.0-py3-none-any.whl", hash = "sha256:59c328595e0b8948617cc5269af9e484c86462e2844bfcafa3fb37f8fca0af87", size = 56748 }, +] + +[[package]] +name = "execnet" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/bf/89/780e11f9588d9e7128a3f87788354c7946a9cbb1401ad38a48c4db9a4f07/execnet-2.1.2.tar.gz", hash = "sha256:63d83bfdd9a23e35b9c6a3261412324f964c2ec8dcd8d3c6916ee9373e0befcd", size = 166622 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/84/02fc1827e8cdded4aa65baef11296a9bbe595c474f0d6d758af082d849fd/execnet-2.1.2-py3-none-any.whl", hash = "sha256:67fba928dd5a544b783f6056f449e5e3931a5c378b128bc18501f7ea79e296ec", size = 40708 }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, +] + +[[package]] +name = "importlib-metadata" +version = "8.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zipp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865 }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484 }, +] + +[[package]] +name = "jaraco-classes" +version = "3.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/c0/ed4a27bc5571b99e3cff68f8a9fa5b56ff7df1c2251cc715a652ddd26402/jaraco.classes-3.4.0.tar.gz", hash = "sha256:47a024b51d0239c0dd8c8540c6c7f484be3b8fcf0b2d85c13825780d3b3f3acd", size = 11780 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/66/b15ce62552d84bbfcec9a4873ab79d993a1dd4edb922cbfccae192bd5b5f/jaraco.classes-3.4.0-py3-none-any.whl", hash = "sha256:f662826b6bed8cace05e7ff873ce0f9283b5c924470fe664fff1c2f00f581790", size = 6777 }, +] + +[[package]] +name = "jaraco-context" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-tarfile", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/9c/a788f5bb29c61e456b8ee52ce76dbdd32fd72cd73dd67bc95f42c7a8d13c/jaraco_context-6.1.0.tar.gz", hash = "sha256:129a341b0a85a7db7879e22acd66902fda67882db771754574338898b2d5d86f", size = 15850 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/48/aa685dbf1024c7bd82bede569e3a85f82c32fd3d79ba5fea578f0159571a/jaraco_context-6.1.0-py3-none-any.whl", hash = "sha256:a43b5ed85815223d0d3cfdb6d7ca0d2bc8946f28f30b6f3216bda070f68badda", size = 7065 }, +] + +[[package]] +name = "jaraco-functools" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/27/056e0638a86749374d6f57d0b0db39f29509cce9313cf91bdc0ac4d91084/jaraco_functools-4.4.0.tar.gz", hash = "sha256:da21933b0417b89515562656547a77b4931f98176eb173644c0d35032a33d6bb", size = 19943 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/c4/813bb09f0985cb21e959f21f2464169eca882656849adf727ac7bb7e1767/jaraco_functools-4.4.0-py3-none-any.whl", hash = "sha256:9eec1e36f45c818d9bf307c8948eb03b2b56cd44087b3cdc989abca1f20b9176", size = 10481 }, +] + +[[package]] +name = "jeepney" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7b/6f/357efd7602486741aa73ffc0617fb310a29b588ed0fd69c2399acbb85b0c/jeepney-0.9.0.tar.gz", hash = "sha256:cf0e9e845622b81e4a28df94c40345400256ec608d0e55bb8a3feaa9163f5732", size = 106758 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/a3/e137168c9c44d18eff0376253da9f1e9234d0239e0ee230d2fee6cea8e55/jeepney-0.9.0-py3-none-any.whl", hash = "sha256:97e5714520c16fc0a45695e5365a2e11b81ea79bba796e26f9f1d178cb182683", size = 49010 }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + +[[package]] +name = "keyring" +version = "25.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.12'" }, + { name = "jaraco-classes" }, + { name = "jaraco-context" }, + { name = "jaraco-functools" }, + { name = "jeepney", marker = "sys_platform == 'linux'" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "secretstorage", marker = "sys_platform == 'linux'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/4b/674af6ef2f97d56f0ab5153bf0bfa28ccb6c3ed4d1babf4305449668807b/keyring-25.7.0.tar.gz", hash = "sha256:fe01bd85eb3f8fb3dd0405defdeac9a5b4f6f0439edbb3149577f244a2e8245b", size = 63516 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/db/e655086b7f3a705df045bf0933bdd9c2f79bb3c97bfef1384598bb79a217/keyring-25.7.0-py3-none-any.whl", hash = "sha256:be4a0b195f149690c166e850609a477c532ddbfbaed96a404d4e43f8d5e2689f", size = 39160 }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365 }, + { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793 }, + { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362 }, + { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152 }, + { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539 }, + { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853 }, + { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133 }, + { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944 }, + { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535 }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343 }, + { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419 }, + { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008 }, + { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906 }, + { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357 }, + { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583 }, + { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591 }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887 }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818 }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807 }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179 }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044 }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685 }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127 }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958 }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541 }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426 }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917 }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795 }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759 }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666 }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989 }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456 }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793 }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836 }, + { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829 }, + { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277 }, + { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433 }, + { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119 }, + { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314 }, + { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631 }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058 }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287 }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940 }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887 }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692 }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471 }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923 }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572 }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077 }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876 }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615 }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020 }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332 }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947 }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962 }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760 }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529 }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015 }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540 }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105 }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906 }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667 }, +] + +[[package]] +name = "numpy" +version = "2.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/fd/0005efbd0af48e55eb3c7208af93f2862d4b1a56cd78e84309a2d959208d/numpy-2.4.2.tar.gz", hash = "sha256:659a6107e31a83c4e33f763942275fd278b21d095094044eb35569e86a21ddae", size = 20723651 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d3/44/71852273146957899753e69986246d6a176061ea183407e95418c2aa4d9a/numpy-2.4.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e7e88598032542bd49af7c4747541422884219056c268823ef6e5e89851c8825", size = 16955478 }, + { url = "https://files.pythonhosted.org/packages/74/41/5d17d4058bd0cd96bcbd4d9ff0fb2e21f52702aab9a72e4a594efa18692f/numpy-2.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7edc794af8b36ca37ef5fcb5e0d128c7e0595c7b96a2318d1badb6fcd8ee86b1", size = 14965467 }, + { url = "https://files.pythonhosted.org/packages/49/48/fb1ce8136c19452ed15f033f8aee91d5defe515094e330ce368a0647846f/numpy-2.4.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:6e9f61981ace1360e42737e2bae58b27bf28a1b27e781721047d84bd754d32e7", size = 5475172 }, + { url = "https://files.pythonhosted.org/packages/40/a9/3feb49f17bbd1300dd2570432961f5c8a4ffeff1db6f02c7273bd020a4c9/numpy-2.4.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:cb7bbb88aa74908950d979eeaa24dbdf1a865e3c7e45ff0121d8f70387b55f73", size = 6805145 }, + { url = "https://files.pythonhosted.org/packages/3f/39/fdf35cbd6d6e2fcad42fcf85ac04a85a0d0fbfbf34b30721c98d602fd70a/numpy-2.4.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f069069931240b3fc703f1e23df63443dbd6390614c8c44a87d96cd0ec81eb1", size = 15966084 }, + { url = "https://files.pythonhosted.org/packages/1b/46/6fa4ea94f1ddf969b2ee941290cca6f1bfac92b53c76ae5f44afe17ceb69/numpy-2.4.2-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c02ef4401a506fb60b411467ad501e1429a3487abca4664871d9ae0b46c8ba32", size = 16899477 }, + { url = "https://files.pythonhosted.org/packages/09/a1/2a424e162b1a14a5bd860a464ab4e07513916a64ab1683fae262f735ccd2/numpy-2.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2653de5c24910e49c2b106499803124dde62a5a1fe0eedeaecf4309a5f639390", size = 17323429 }, + { url = "https://files.pythonhosted.org/packages/ce/a2/73014149ff250628df72c58204822ac01d768697913881aacf839ff78680/numpy-2.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1ae241bbfc6ae276f94a170b14785e561cb5e7f626b6688cf076af4110887413", size = 18635109 }, + { url = "https://files.pythonhosted.org/packages/6c/0c/73e8be2f1accd56df74abc1c5e18527822067dced5ec0861b5bb882c2ce0/numpy-2.4.2-cp311-cp311-win32.whl", hash = "sha256:df1b10187212b198dd45fa943d8985a3c8cf854aed4923796e0e019e113a1bda", size = 6237915 }, + { url = "https://files.pythonhosted.org/packages/76/ae/e0265e0163cf127c24c3969d29f1c4c64551a1e375d95a13d32eab25d364/numpy-2.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:b9c618d56a29c9cb1c4da979e9899be7578d2e0b3c24d52079c166324c9e8695", size = 12607972 }, + { url = "https://files.pythonhosted.org/packages/29/a5/c43029af9b8014d6ea157f192652c50042e8911f4300f8f6ed3336bf437f/numpy-2.4.2-cp311-cp311-win_arm64.whl", hash = "sha256:47c5a6ed21d9452b10227e5e8a0e1c22979811cad7dcc19d8e3e2fb8fa03f1a3", size = 10485763 }, + { url = "https://files.pythonhosted.org/packages/51/6e/6f394c9c77668153e14d4da83bcc247beb5952f6ead7699a1a2992613bea/numpy-2.4.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:21982668592194c609de53ba4933a7471880ccbaadcc52352694a59ecc860b3a", size = 16667963 }, + { url = "https://files.pythonhosted.org/packages/1f/f8/55483431f2b2fd015ae6ed4fe62288823ce908437ed49db5a03d15151678/numpy-2.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40397bda92382fcec844066efb11f13e1c9a3e2a8e8f318fb72ed8b6db9f60f1", size = 14693571 }, + { url = "https://files.pythonhosted.org/packages/2f/20/18026832b1845cdc82248208dd929ca14c9d8f2bac391f67440707fff27c/numpy-2.4.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:b3a24467af63c67829bfaa61eecf18d5432d4f11992688537be59ecd6ad32f5e", size = 5203469 }, + { url = "https://files.pythonhosted.org/packages/7d/33/2eb97c8a77daaba34eaa3fa7241a14ac5f51c46a6bd5911361b644c4a1e2/numpy-2.4.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:805cc8de9fd6e7a22da5aed858e0ab16be5a4db6c873dde1d7451c541553aa27", size = 6550820 }, + { url = "https://files.pythonhosted.org/packages/b1/91/b97fdfd12dc75b02c44e26c6638241cc004d4079a0321a69c62f51470c4c/numpy-2.4.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d82351358ffbcdcd7b686b90742a9b86632d6c1c051016484fa0b326a0a1548", size = 15663067 }, + { url = "https://files.pythonhosted.org/packages/f5/c6/a18e59f3f0b8071cc85cbc8d80cd02d68aa9710170b2553a117203d46936/numpy-2.4.2-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9e35d3e0144137d9fdae62912e869136164534d64a169f86438bc9561b6ad49f", size = 16619782 }, + { url = "https://files.pythonhosted.org/packages/b7/83/9751502164601a79e18847309f5ceec0b1446d7b6aa12305759b72cf98b2/numpy-2.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adb6ed2ad29b9e15321d167d152ee909ec73395901b70936f029c3bc6d7f4460", size = 17013128 }, + { url = "https://files.pythonhosted.org/packages/61/c4/c4066322256ec740acc1c8923a10047818691d2f8aec254798f3dd90f5f2/numpy-2.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8906e71fd8afcb76580404e2a950caef2685df3d2a57fe82a86ac8d33cc007ba", size = 18345324 }, + { url = "https://files.pythonhosted.org/packages/ab/af/6157aa6da728fa4525a755bfad486ae7e3f76d4c1864138003eb84328497/numpy-2.4.2-cp312-cp312-win32.whl", hash = "sha256:ec055f6dae239a6299cace477b479cca2fc125c5675482daf1dd886933a1076f", size = 5960282 }, + { url = "https://files.pythonhosted.org/packages/92/0f/7ceaaeaacb40567071e94dbf2c9480c0ae453d5bb4f52bea3892c39dc83c/numpy-2.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:209fae046e62d0ce6435fcfe3b1a10537e858249b3d9b05829e2a05218296a85", size = 12314210 }, + { url = "https://files.pythonhosted.org/packages/2f/a3/56c5c604fae6dd40fa2ed3040d005fca97e91bd320d232ac9931d77ba13c/numpy-2.4.2-cp312-cp312-win_arm64.whl", hash = "sha256:fbde1b0c6e81d56f5dccd95dd4a711d9b95df1ae4009a60887e56b27e8d903fa", size = 10220171 }, + { url = "https://files.pythonhosted.org/packages/f4/f8/50e14d36d915ef64d8f8bc4a087fc8264d82c785eda6711f80ab7e620335/numpy-2.4.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:89f7268c009bc492f506abd6f5265defa7cb3f7487dc21d357c3d290add45082", size = 16833179 }, + { url = "https://files.pythonhosted.org/packages/17/17/809b5cad63812058a8189e91a1e2d55a5a18fd04611dbad244e8aeae465c/numpy-2.4.2-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6dee3bb76aa4009d5a912180bf5b2de012532998d094acee25d9cb8dee3e44a", size = 14889755 }, + { url = "https://files.pythonhosted.org/packages/3e/ea/181b9bcf7627fc8371720316c24db888dcb9829b1c0270abf3d288b2e29b/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:cd2bd2bbed13e213d6b55dc1d035a4f91748a7d3edc9480c13898b0353708920", size = 5399500 }, + { url = "https://files.pythonhosted.org/packages/33/9f/413adf3fc955541ff5536b78fcf0754680b3c6d95103230252a2c9408d23/numpy-2.4.2-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:cf28c0c1d4c4bf00f509fa7eb02c58d7caf221b50b467bcb0d9bbf1584d5c821", size = 6714252 }, + { url = "https://files.pythonhosted.org/packages/91/da/643aad274e29ccbdf42ecd94dafe524b81c87bcb56b83872d54827f10543/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e04ae107ac591763a47398bb45b568fc38f02dbc4aa44c063f67a131f99346cb", size = 15797142 }, + { url = "https://files.pythonhosted.org/packages/66/27/965b8525e9cb5dc16481b30a1b3c21e50c7ebf6e9dbd48d0c4d0d5089c7e/numpy-2.4.2-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:602f65afdef699cda27ec0b9224ae5dc43e328f4c24c689deaf77133dbee74d0", size = 16727979 }, + { url = "https://files.pythonhosted.org/packages/de/e5/b7d20451657664b07986c2f6e3be564433f5dcaf3482d68eaecd79afaf03/numpy-2.4.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be71bf1edb48ebbbf7f6337b5bfd2f895d1902f6335a5830b20141fc126ffba0", size = 12502577 }, +] + +[[package]] +name = "packaging" +version = "26.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366 }, +] + +[[package]] +name = "platform-utils" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "pywin32", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/35/1388d9d259b53c4359d79f85afb0cac9ac40efdd8dee360ae18c220d226d/platform_utils-1.6.2.tar.gz", hash = "sha256:649bce9741c2cc99ab8065dc677f16faeb039ed2904a602c89aded8da14cd2c9", size = 14938 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/b0/005ec9008a0fd6c06e789cd8bd73b97b1aadae84b1dfc6ebd15b071ea71d/platform_utils-1.6.2-py3-none-any.whl", hash = "sha256:a040c646eb64152ab8598b6d4997eb857c49d32d0ca115f38920bd006befd195", size = 10200 }, +] + +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348 }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538 }, +] + +[[package]] +name = "portkeydrop" +version = "0.3.0" +source = { editable = "." } +dependencies = [ + { name = "asyncssh" }, + { name = "keyring" }, + { name = "platform-utils" }, + { name = "prismatoid" }, + { name = "puttykeys" }, + { name = "sound-lib" }, + { name = "webdavclient3" }, + { name = "wxpython" }, +] + +[package.optional-dependencies] +dev = [ + { name = "diff-cover" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-xdist" }, + { name = "ruff" }, +] +webdav = [ + { name = "webdavclient3" }, +] + +[package.dev-dependencies] +dev = [ + { name = "diff-cover" }, + { name = "pytest" }, + { name = "pytest-cov" }, + { name = "pytest-xdist" }, + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "asyncssh", specifier = ">=2.14" }, + { name = "diff-cover", marker = "extra == 'dev'", specifier = ">=9.0.0" }, + { name = "keyring", specifier = ">=25.0" }, + { name = "platform-utils", specifier = ">=1.6.0" }, + { name = "prismatoid" }, + { name = "puttykeys" }, + { name = "pytest", marker = "extra == 'dev'", specifier = ">=9.0" }, + { name = "pytest-cov", marker = "extra == 'dev'", specifier = ">=7.0" }, + { name = "pytest-xdist", marker = "extra == 'dev'", specifier = ">=3.0" }, + { name = "ruff", marker = "extra == 'dev'", specifier = ">=0.15.0" }, + { name = "sound-lib", git = "https://github.com/samtupy/sound_lib_macos_fixes.git" }, + { name = "webdavclient3", specifier = ">=3.14" }, + { name = "webdavclient3", marker = "extra == 'webdav'", specifier = ">=3.14" }, + { name = "wxpython", specifier = ">=4.2" }, +] +provides-extras = ["webdav", "dev"] + +[package.metadata.requires-dev] +dev = [ + { name = "diff-cover", specifier = ">=9.0.0" }, + { name = "pytest", specifier = ">=9.0" }, + { name = "pytest-cov", specifier = ">=7.0" }, + { name = "pytest-xdist", specifier = ">=3.0" }, + { name = "ruff", specifier = ">=0.15.0" }, +] + +[[package]] +name = "prismatoid" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, + { name = "win32more", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/f5/39561d6176dceb6a67f27172431a198422cea7aba252b4afef3b42d97426/prismatoid-0.7.1.tar.gz", hash = "sha256:1d4a26c050f2f10dd8e46f2059dce073ae1b59046af7bc213392f28e94779130", size = 989444 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/d1/885a452b78031405ccb2d3d08baf626ba64c9c70da89322eac5d17b0667f/prismatoid-0.7.1-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:51d901413cf7ac9abb2578a60ab8a4e305d422ee7d056575b164ec8d9cf5380e", size = 177332 }, + { url = "https://files.pythonhosted.org/packages/55/88/2ceb30788b7572db353ec86d3455550d03b5fd20fb5552ea7d4a31649456/prismatoid-0.7.1-cp311-cp311-macosx_15_0_x86_64.whl", hash = "sha256:2f9d722ea20ee9cf90c4f3491b36a1c1ea2fb51be12674ce3140929af573414e", size = 294571 }, + { url = "https://files.pythonhosted.org/packages/cc/22/a0a5e9ea7c7026a4a9644ab68bc3c9feb93b629c727619fceb93300dfe73/prismatoid-0.7.1-cp311-cp311-manylinux_2_34_aarch64.whl", hash = "sha256:a61430f4a9f241cf7cd753a838d9bb38d92f2b2c74614253c5490488f6db103e", size = 1553008 }, + { url = "https://files.pythonhosted.org/packages/af/99/99d3401d3767d9d91203c2d0026b048dfb5b8b2475cf910caf09fb117e62/prismatoid-0.7.1-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:cbb457acd7359216976e4f8fbb5588fcfcd7961d82e77759f742bb5c28844e49", size = 1726072 }, + { url = "https://files.pythonhosted.org/packages/11/19/bcbbcd9bd9032b2fe4a802db223bd812b170d3933d57ee955dd8cc12b0eb/prismatoid-0.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0725c75bce984a9d501a1b13dc3f3b0fdc5442c62963695698815a7262b6744c", size = 3239432 }, + { url = "https://files.pythonhosted.org/packages/9e/de/ad80803c24dfd30834c24a5b63abc8c3536ec78c608c3966f9025cd30d35/prismatoid-0.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:82ee642074474c20f7a6ee0e57062f2a2d2f3968badf9ebff329c6ead6ba5505", size = 3500060 }, + { url = "https://files.pythonhosted.org/packages/04/08/98af055c551b4975af9135f9dfbc7919638df4112dc16bb5ff2482d346a5/prismatoid-0.7.1-cp311-cp311-win32.whl", hash = "sha256:824d430ade1cdd32033ffdb538aeff146c5af350c06c77d01e2af409ee392854", size = 2003163 }, + { url = "https://files.pythonhosted.org/packages/2e/d6/a2a538717906fc9d38d3860629c724b62b75700823472a8fffc20bbaedb2/prismatoid-0.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:ba7218e83ba52ca479c64d3d8c37478df88f932b27c16499196c9a8cb8a274cf", size = 2003165 }, + { url = "https://files.pythonhosted.org/packages/45/28/76ee83b3ea7ee61cdf3dfc961569e53a8e29a44a899f2834a969b5abbdc3/prismatoid-0.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:382ce81a1136bd5756a40aae6b9257023939875d41c3507ae697f5820e98c8bb", size = 2003206 }, + { url = "https://files.pythonhosted.org/packages/81/77/5028ff254f1c5dfb78ef5a3aa8748f6432a1240b5cc61603a2e56a562c60/prismatoid-0.7.1-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:729026190b1c8a020e561d07f78e0b3c8ff43f67a8c95a1e68d77a4e665ef822", size = 177331 }, + { url = "https://files.pythonhosted.org/packages/8d/3c/58ed90d2ecb7dc7efbfed3d5eef6c27fd0b941ef6999e57ad1bbb6c341c8/prismatoid-0.7.1-cp312-cp312-macosx_15_0_x86_64.whl", hash = "sha256:4f4ad3370b836be30eb6ec853b2c5a43efced21c484350ce89f750cd9a832f22", size = 294573 }, + { url = "https://files.pythonhosted.org/packages/28/fe/313fadd4f81dc39c09963d617736e803a5fd958ab5548345833f65f5b3b5/prismatoid-0.7.1-cp312-cp312-manylinux_2_34_aarch64.whl", hash = "sha256:95c885c8b7bfef1104bb6b65a3c3038f1fdc2be0a0d584b9a06dbdf365768d83", size = 1553005 }, + { url = "https://files.pythonhosted.org/packages/d8/1d/2e2540ca113adc5018f2644bb08a0971eb16f17bef27de22e5784319dae9/prismatoid-0.7.1-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:5dc4476f78fa60ee571a76219f06407c0f14c4d4e935ccdc88250df3b010fba0", size = 1726072 }, + { url = "https://files.pythonhosted.org/packages/b0/e6/848dd266b992f69c110358d53bdfcf7878dacbd7c3ae8e9b30db995785c7/prismatoid-0.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b2a990ea2f25ac867ee4b5d848dd0532d9a0d5c8d6219108ea91f2653c40fb2d", size = 3239437 }, + { url = "https://files.pythonhosted.org/packages/71/39/369c0dd039a0d23e8762b1649271abc6e7aa381bd11bd997a240803fa859/prismatoid-0.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2ef0086e603ef0e4ae6e06c2dffa2b4c93cb9826c80f519164c79857227a9267", size = 3500064 }, + { url = "https://files.pythonhosted.org/packages/b3/f1/532c076eb0cc7167359927ce7c1b0038146ef6c464098caef09713bccecb/prismatoid-0.7.1-cp312-cp312-win32.whl", hash = "sha256:2263a1160e65b89730b66ef059f353e7e70f9173ef5991b86d2287c5103a22f4", size = 2003161 }, + { url = "https://files.pythonhosted.org/packages/9d/29/34a9bb7bdef3fccf9635ba5c477045ab9d5c6f43e47bd30ed2661e030c1e/prismatoid-0.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:55bb12f959f2789e828f08f09fccf3b6df629691c26e4359cf74a0978b5e1a3a", size = 2003166 }, + { url = "https://files.pythonhosted.org/packages/23/c6/99df138eb1096e735dfec60889f546eedcbafd2c926c3fd8daea7e884a8b/prismatoid-0.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:6edc1f3c9162a2a81e7aa25898ca150701354ef1774c2d2e535ffa9c567aab26", size = 2003206 }, + { url = "https://files.pythonhosted.org/packages/b3/24/f6ecd29f2976b3373f7b1dd5f339413f2fdcb5aa27f8434f68a791b021ae/prismatoid-0.7.1-pp311-pypy311_pp73-macosx_15_0_arm64.whl", hash = "sha256:2b8395f7e3550987a1058284b0b26ad80933fb0e87b2d243d97d4d5e03500365", size = 177338 }, + { url = "https://files.pythonhosted.org/packages/57/66/4b9e852146cc58e2b942faa6d015805046de7703e57ef6d2d54895d98aa8/prismatoid-0.7.1-pp311-pypy311_pp73-macosx_15_0_x86_64.whl", hash = "sha256:02050e340eefec614dffc8195049c07f1e95fb7df1f22109ffd41df53a24183d", size = 294580 }, + { url = "https://files.pythonhosted.org/packages/e9/62/dfebb6512be6f9df677a211b718c5934b5c8f5270e7807469cd385a339ef/prismatoid-0.7.1-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:9f801a177f6751754252847f9a36b887220c81f672985eb2f62f94c4a9fba975", size = 1553003 }, + { url = "https://files.pythonhosted.org/packages/b6/b7/d08f5bae93146f8d09f718d64da91f6bc173fbabb44f3ac3f8331018b3ef/prismatoid-0.7.1-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:a4c6e3bcb99dab12c3c15dfb521db0da1ae85e3803060f95f2060bda4f8abf6a", size = 1726100 }, + { url = "https://files.pythonhosted.org/packages/18/ed/574176ac85fa3eb1d7c1dd883b426abd8ad17addb7dab157e572270f3c4d/prismatoid-0.7.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:92fed4db1fc2d13b2af9b2a2cab3bd745c77bc9dc69ae2e65f5da88bd6211eb8", size = 2003173 }, +] + +[[package]] +name = "puttykeys" +version = "1.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/be/5a/6c90d271492841c73bc6587e1091cd43d1d7b7da5b66fe3b26ccebe6db73/puttykeys-1.0.3.tar.gz", hash = "sha256:c168f70e2ceb7245df9a1e8003854b44e6c6c93282b04bbbf3cd51933d45722d", size = 8091 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/a8/7d28a8308cd2be99f714341d8e092c380792edecc6c7dd15c72a7559a5e4/puttykeys-1.0.3-py2.py3-none-any.whl", hash = "sha256:e634f740f3b0eda2e49d258070445b8b192f8ab272bce799031b80a46d5a5d7e", size = 11927 }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172 }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, +] + +[[package]] +name = "pytest" +version = "9.0.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/db/7ef3487e0fb0049ddb5ce41d3a49c235bf9ad299b6a25d5780a89f19230f/pytest-9.0.2.tar.gz", hash = "sha256:75186651a92bd89611d1d9fc20f0b4345fd827c41ccd5c299a868a05d70edf11", size = 1568901 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/ab/b3226f0bd7cdcf710fbede2b3548584366da3b19b5021e74f5bde2a8fa3f/pytest-9.0.2-py3-none-any.whl", hash = "sha256:711ffd45bf766d5264d487b917733b453d917afd2b0ad65223959f59089f875b", size = 374801 }, +] + +[[package]] +name = "pytest-cov" +version = "7.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "coverage", extra = ["toml"] }, + { name = "pluggy" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5e/f7/c933acc76f5208b3b00089573cf6a2bc26dc80a8aece8f52bb7d6b1855ca/pytest_cov-7.0.0.tar.gz", hash = "sha256:33c97eda2e049a0c5298e91f519302a1334c26ac65c1a483d6206fd458361af1", size = 54328 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/49/1377b49de7d0c1ce41292161ea0f721913fa8722c19fb9c1e3aa0367eecb/pytest_cov-7.0.0-py3-none-any.whl", hash = "sha256:3b8e9558b16cc1479da72058bdecf8073661c7f57f7d3c5f22a1c23507f2d861", size = 22424 }, +] + +[[package]] +name = "pytest-xdist" +version = "3.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "execnet" }, + { name = "pytest" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/78/b4/439b179d1ff526791eb921115fca8e44e596a13efeda518b9d845a619450/pytest_xdist-3.8.0.tar.gz", hash = "sha256:7e578125ec9bc6050861aa93f2d59f1d8d085595d6551c2c90b6f4fad8d3a9f1", size = 88069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/31/d4e37e9e550c2b92a9cbc2e4d0b7420a27224968580b5a447f420847c975/pytest_xdist-3.8.0-py3-none-any.whl", hash = "sha256:202ca578cfeb7370784a8c33d6d05bc6e13b4f25b5053c30a152269fd10f0b88", size = 46396 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031 }, + { url = "https://files.pythonhosted.org/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308 }, + { url = "https://files.pythonhosted.org/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930 }, + { url = "https://files.pythonhosted.org/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, + { url = "https://files.pythonhosted.org/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, + { url = "https://files.pythonhosted.org/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, +] + +[[package]] +name = "ruff" +version = "0.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/dc/4e6ac71b511b141cf626357a3946679abeba4cf67bc7cc5a17920f31e10d/ruff-0.15.1.tar.gz", hash = "sha256:c590fe13fb57c97141ae975c03a1aedb3d3156030cabd740d6ff0b0d601e203f", size = 4540855 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/bf/e6e4324238c17f9d9120a9d60aa99a7daaa21204c07fcd84e2ef03bb5fd1/ruff-0.15.1-py3-none-linux_armv6l.whl", hash = "sha256:b101ed7cf4615bda6ffe65bdb59f964e9f4a0d3f85cbf0e54f0ab76d7b90228a", size = 10367819 }, + { url = "https://files.pythonhosted.org/packages/b3/ea/c8f89d32e7912269d38c58f3649e453ac32c528f93bb7f4219258be2e7ed/ruff-0.15.1-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:939c995e9277e63ea632cc8d3fae17aa758526f49a9a850d2e7e758bfef46602", size = 10798618 }, + { url = "https://files.pythonhosted.org/packages/5e/0f/1d0d88bc862624247d82c20c10d4c0f6bb2f346559d8af281674cf327f15/ruff-0.15.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:1d83466455fdefe60b8d9c8df81d3c1bbb2115cede53549d3b522ce2bc703899", size = 10148518 }, + { url = "https://files.pythonhosted.org/packages/f5/c8/291c49cefaa4a9248e986256df2ade7add79388fe179e0691be06fae6f37/ruff-0.15.1-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a9457e3c3291024866222b96108ab2d8265b477e5b1534c7ddb1810904858d16", size = 10518811 }, + { url = "https://files.pythonhosted.org/packages/c3/1a/f5707440e5ae43ffa5365cac8bbb91e9665f4a883f560893829cf16a606b/ruff-0.15.1-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:92c92b003e9d4f7fbd33b1867bb15a1b785b1735069108dfc23821ba045b29bc", size = 10196169 }, + { url = "https://files.pythonhosted.org/packages/2a/ff/26ddc8c4da04c8fd3ee65a89c9fb99eaa5c30394269d424461467be2271f/ruff-0.15.1-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fe5c41ab43e3a06778844c586251eb5a510f67125427625f9eb2b9526535779", size = 10990491 }, + { url = "https://files.pythonhosted.org/packages/fc/00/50920cb385b89413f7cdb4bb9bc8fc59c1b0f30028d8bccc294189a54955/ruff-0.15.1-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:66a6dd6df4d80dc382c6484f8ce1bcceb55c32e9f27a8b94c32f6c7331bf14fb", size = 11843280 }, + { url = "https://files.pythonhosted.org/packages/5d/6d/2f5cad8380caf5632a15460c323ae326f1e1a2b5b90a6ee7519017a017ca/ruff-0.15.1-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a4a42cbb8af0bda9bcd7606b064d7c0bc311a88d141d02f78920be6acb5aa83", size = 11274336 }, + { url = "https://files.pythonhosted.org/packages/a3/1d/5f56cae1d6c40b8a318513599b35ea4b075d7dc1cd1d04449578c29d1d75/ruff-0.15.1-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ab064052c31dddada35079901592dfba2e05f5b1e43af3954aafcbc1096a5b2", size = 11137288 }, + { url = "https://files.pythonhosted.org/packages/cd/20/6f8d7d8f768c93b0382b33b9306b3b999918816da46537d5a61635514635/ruff-0.15.1-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:5631c940fe9fe91f817a4c2ea4e81f47bee3ca4aa646134a24374f3c19ad9454", size = 11070681 }, + { url = "https://files.pythonhosted.org/packages/9a/67/d640ac76069f64cdea59dba02af2e00b1fa30e2103c7f8d049c0cff4cafd/ruff-0.15.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:68138a4ba184b4691ccdc39f7795c66b3c68160c586519e7e8444cf5a53e1b4c", size = 10486401 }, + { url = "https://files.pythonhosted.org/packages/65/3d/e1429f64a3ff89297497916b88c32a5cc88eeca7e9c787072d0e7f1d3e1e/ruff-0.15.1-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:518f9af03bfc33c03bdb4cb63fabc935341bb7f54af500f92ac309ecfbba6330", size = 10197452 }, + { url = "https://files.pythonhosted.org/packages/78/83/e2c3bade17dad63bf1e1c2ffaf11490603b760be149e1419b07049b36ef2/ruff-0.15.1-py3-none-musllinux_1_2_i686.whl", hash = "sha256:da79f4d6a826caaea95de0237a67e33b81e6ec2e25fc7e1993a4015dffca7c61", size = 10693900 }, + { url = "https://files.pythonhosted.org/packages/a1/27/fdc0e11a813e6338e0706e8b39bb7a1d61ea5b36873b351acee7e524a72a/ruff-0.15.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:3dd86dccb83cd7d4dcfac303ffc277e6048600dfc22e38158afa208e8bf94a1f", size = 11227302 }, + { url = "https://files.pythonhosted.org/packages/f6/58/ac864a75067dcbd3b95be5ab4eb2b601d7fbc3d3d736a27e391a4f92a5c1/ruff-0.15.1-py3-none-win32.whl", hash = "sha256:660975d9cb49b5d5278b12b03bb9951d554543a90b74ed5d366b20e2c57c2098", size = 10462555 }, + { url = "https://files.pythonhosted.org/packages/e0/5e/d4ccc8a27ecdb78116feac4935dfc39d1304536f4296168f91ed3ec00cd2/ruff-0.15.1-py3-none-win_amd64.whl", hash = "sha256:c820fef9dd5d4172a6570e5721704a96c6679b80cf7be41659ed439653f62336", size = 11599956 }, + { url = "https://files.pythonhosted.org/packages/2a/07/5bda6a85b220c64c65686bc85bd0bbb23b29c62b3a9f9433fa55f17cda93/ruff-0.15.1-py3-none-win_arm64.whl", hash = "sha256:5ff7d5f0f88567850f45081fac8f4ec212be8d0b963e385c3f7d0d2eb4899416", size = 10874604 }, +] + +[[package]] +name = "secretstorage" +version = "3.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "jeepney" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1c/03/e834bcd866f2f8a49a85eaff47340affa3bfa391ee9912a952a1faa68c7b/secretstorage-3.5.0.tar.gz", hash = "sha256:f04b8e4689cbce351744d5537bf6b1329c6fc68f91fa666f60a380edddcd11be", size = 19884 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/46/f5af3402b579fd5e11573ce652019a67074317e18c1935cc0b4ba9b35552/secretstorage-3.5.0-py3-none-any.whl", hash = "sha256:0ce65888c0725fcb2c5bc0fdb8e5438eece02c523557ea40ce0703c266248137", size = 15554 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "sound-lib" +version = "0.8.8" +source = { git = "https://github.com/samtupy/sound_lib_macos_fixes.git#2b4f6ee2036928f9b4e9e87df7424014734ab4d3" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "lxml" }, + { name = "requests" }, + { name = "tqdm" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304 }, +] + +[[package]] +name = "tomli" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663 }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469 }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039 }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007 }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875 }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271 }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770 }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626 }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842 }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894 }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053 }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481 }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720 }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014 }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820 }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712 }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296 }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553 }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477 }, +] + +[[package]] +name = "tqdm" +version = "4.67.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/09/a9/6ba95a270c6f1fbcd8dac228323f2777d886cb206987444e4bce66338dd4/tqdm-4.67.3.tar.gz", hash = "sha256:7d825f03f89244ef73f1d4ce193cb1774a8179fd96f31d7e1dcde62092b960bb", size = 169598 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/e1/3079a9ff9b8e11b846c6ac5c8b5bfb7ff225eee721825310c91b3b50304f/tqdm-4.67.3-py3-none-any.whl", hash = "sha256:ee1e4c0e59148062281c49d80b25b67771a127c85fc9676d3be5f243206826bf", size = 78374 }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584 }, +] + +[[package]] +name = "webdavclient3" +version = "3.14.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "lxml" }, + { name = "python-dateutil" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/67/d8/ca3981053ed553363322f71745f543186b93439b6417f5d6ca91d4b4fec7/webdavclient3-3.14.7.tar.gz", hash = "sha256:6c04252b579bc015cec78081480c63eadf1030f382768248777c6203f059b3f5", size = 30836 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/5e/0b1c2f494d03c4acbc44567fa68b954cd0fa3f21eb3f9528011da371f9b1/webdavclient3-3.14.7-py3-none-any.whl", hash = "sha256:a904381da8e3ae77b4ca9e11e05058d91a07704254d71c193c797f7c2fb15025", size = 22887 }, +] + +[[package]] +name = "win32more" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-appsdk" }, + { name = "win32more-core" }, + { name = "win32more-microsoft-graphics-win2d" }, + { name = "win32more-microsoft-web-webview2" }, + { name = "win32more-microsoft-windows-sdk-contracts" }, + { name = "win32more-microsoft-windows-sdk-win32metadata" }, + { name = "win32more-microsoft-windowsappsdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/01/428ea2da9f39b533fdb3705173b4436a83de466242989b3dbedb319beeee/win32more-0.8.0.tar.gz", hash = "sha256:793f19ba9777bdb4f5de36c16702a4f8d340539f466feca7bc247863007de9d6", size = 4837 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/13/9e835fba47b95fb14a9e7b9038f5a30cbe089d19781cbd1c3df3cf97d0f2/win32more-0.8.0-py3-none-any.whl", hash = "sha256:d5a188b5280442b813266a1346761fa880e2250bdd93532dc07751515b21ae9d", size = 3671 }, +] + +[[package]] +name = "win32more-appsdk" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/62/8202755151f8bd4a4597d879474f516732b0b2b6591a21ff9a1fcc1a96e1/win32more_appsdk-0.8.0.tar.gz", hash = "sha256:0bfbd698795d3add19316774e743cf2800835d6d27c6dc26471ebcc614baab45", size = 10827 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/29/bbbfda259e93e8702df63fe8e4d9873ee4a4285185f57a34497cda71218a/win32more_appsdk-0.8.0-py2.py3-none-any.whl", hash = "sha256:f6fe556657bb63d9bb0a7febb30e8011c0b7aaaf408afe40751beaf8385401ef", size = 12140 }, +] + +[[package]] +name = "win32more-core" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/33/eb613b2bab588089ac46d9ff831eecae3165d445299804a1dc9403f52d78/win32more_core-0.8.0.tar.gz", hash = "sha256:04af7281b86f8822be41bd48d4519dcc3445c1f7d0ff9cee29ad386309759585", size = 21598 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/55/6433b9f416b5ab669faf3e2ec0d490b5887250a204c9d4dd26a5dc172e21/win32more_core-0.8.0-py2.py3-none-any.whl", hash = "sha256:1718a785af1ffe481771f8a23d555514e2816752ed6d1020b98f8179d8dfc0c1", size = 25849 }, +] + +[[package]] +name = "win32more-microsoft-graphics-win2d" +version = "0.8.1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, + { name = "win32more-microsoft-windowsappsdk" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/1f/fd8fbd8fab6f31e9745734e87abd77b1cdb1090de3d29520eb9f5f6348ff/win32more_microsoft_graphics_win2d-0.8.1.3.2.tar.gz", hash = "sha256:067fe6b8793607f3116924d115162dd7d158b4761edd304f62a4d063c9b4d115", size = 1906474 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5f/f0/10ec842d00e7e255ac9ae9cbcbe8f2e45e9d7edab83ccdfac4830eaa3214/win32more_microsoft_graphics_win2d-0.8.1.3.2-py2.py3-none-any.whl", hash = "sha256:6f8981ac1e002986a45f7ee1dfeceec375defc353330ca71064bcdb6b5032990", size = 1964022 }, +] + +[[package]] +name = "win32more-microsoft-web-webview2" +version = "0.8.1.0.3719.77" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/f3/c520671c3714de457b63bf132c889499cfbc36c44fecaacbf51ebf3a427f/win32more_microsoft_web_webview2-0.8.1.0.3719.77.tar.gz", hash = "sha256:d4e00c3f6d0db5428c1811c0b3c83b4e8d3a24a5311963b3fbecccd8cd0db366", size = 838738 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/be/9908385b79b50fe6035a174fa838d7e30b62604f0e4050d8c4026e684610/win32more_microsoft_web_webview2-0.8.1.0.3719.77-py2.py3-none-any.whl", hash = "sha256:d9d27475ad33b8f7e0cbd456b296621b3e14a914a919761f9dbe8b44f0173143", size = 860823 }, +] + +[[package]] +name = "win32more-microsoft-windows-sdk-contracts" +version = "0.8.10.0.26100.7705" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/95/126b9cdbc7787731f98b4c342dd1749b56157bf0abff5caec5f22708dfa4/win32more_microsoft_windows_sdk_contracts-0.8.10.0.26100.7705.tar.gz", hash = "sha256:45877a2108cadf24c7a2731478fb4077f9e3519e58d41e35bd6edf3e964bea60", size = 1637805 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/19/0d/ecd52d6a382f1ac1130e560e84e65b7907b7e5e877debc88f489b8477525/win32more_microsoft_windows_sdk_contracts-0.8.10.0.26100.7705-py2.py3-none-any.whl", hash = "sha256:0902a4fc22e645ad4d6862bb413fe4169a793a4f10fc3beb55a0db1f38675e2e", size = 1807772 }, +] + +[[package]] +name = "win32more-microsoft-windows-sdk-win32metadata" +version = "0.8.69.0.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/03/ba/6f878d388485279bd261ee24c7be58b1e5ada7811939959b5abda6d5ee0a/win32more_microsoft_windows_sdk_win32metadata-0.8.69.0.7.tar.gz", hash = "sha256:6bd3dc0dcac629e116d82a3f5108550dcb0280a18b76b9b1db2b5af65b1287fb", size = 3881452 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/aa/a2d087d17ff89e746ae21169583a64ec90ebec93f8091326b2430d2b6df0/win32more_microsoft_windows_sdk_win32metadata-0.8.69.0.7-py2.py3-none-any.whl", hash = "sha256:06be05e3d160828bf4b46edc14baeb8e35aacc16d27dafdea7b5179e59f3baec", size = 4026046 }, +] + +[[package]] +name = "win32more-microsoft-windowsappsdk" +version = "0.8.1.8.260209005" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "win32more-core" }, + { name = "win32more-microsoft-web-webview2" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/af/63/ca74a5617692b576be9df477ba6fb54b0c83b2374c34c8955515c36a3676/win32more_microsoft_windowsappsdk-0.8.1.8.260209005.tar.gz", hash = "sha256:2148dfe0d51ebef8ee1f139f3d5ac4af67e5a4e4a7818f5d54039bbdc23a911a", size = 1157559 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/1a/e2e02f7c9f55639367976f3e406d2f2a4dbafb5b0cd3c46bbbea03e7b94d/win32more_microsoft_windowsappsdk-0.8.1.8.260209005-py2.py3-none-any.whl", hash = "sha256:a073a6c21b3e8946ac25a35c6424855aea7bff08c0356d592b235bcfe3d76d05", size = 1214540 }, +] + +[[package]] +name = "wxpython" +version = "4.2.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/6e/b70e6dbdd7cb4f154b7ca424b4c7799f7b067f7a9f4204b8d16d6464648f/wxpython-4.2.4.tar.gz", hash = "sha256:2eb123979c87bcb329e8a2452269d60ff8f9f651e9bf25c67579e53c4ebbae3c", size = 58583054 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/c0/c2d0e427cc2f071f7426086fc4f5b9d0a41fa379fc60c692bf97a668fbeb/wxpython-4.2.4-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:99478006f60ecf622ba55f8cda9177d3f2933f513589404a1e1c87eb8b0924b6", size = 18730131 }, + { url = "https://files.pythonhosted.org/packages/73/83/6d35eabecaf8856280aa5d0d87f3194bb36733ba0c745989f4bce0aeaebb/wxpython-4.2.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ec7d264dbb2301fdb6ee7bbe722652b06ab1aa4b6e25a76cba99d8a38aea8855", size = 17827962 }, + { url = "https://files.pythonhosted.org/packages/b0/c3/2c34ec1796592f4dc393a7153131a770e117054cd07e7ba1e5594c6078b2/wxpython-4.2.4-cp311-cp311-win32.whl", hash = "sha256:b86b0258074f4ec16b234274fa0c32c42e039124c9f6f36529091c9a00ebff4d", size = 14497499 }, + { url = "https://files.pythonhosted.org/packages/4a/13/20311125881142802ca3f2fc743e82696dee562f26d7e35da649c26de7cc/wxpython-4.2.4-cp311-cp311-win_amd64.whl", hash = "sha256:f48fe7b9f22c7733a06b5901559b5b7e4835fa852cbef0f620ffd0a0030aaf73", size = 16538730 }, + { url = "https://files.pythonhosted.org/packages/0c/35/b25b712097115ba734adafc26ac543840da90dc2f1b0c67257fed3d3ba63/wxpython-4.2.4-cp311-cp311-win_arm64.whl", hash = "sha256:fe83813241dfb94780f18dff1678d1ffd097116a8b8fea0272a332c387f69ef8", size = 15524815 }, + { url = "https://files.pythonhosted.org/packages/eb/83/4359885c6f390235fefffb01bec0c1aa24a61cdcdbba0e857a5dcfbd5042/wxpython-4.2.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a42807f84d504554a78bf7c4d0b8b18ec72de098b578bd4276bf5144b5a698ef", size = 18773068 }, + { url = "https://files.pythonhosted.org/packages/90/d8/9d55ef72e004d70a395402391aa5f9bd362253dd560f4c934efb02abe4f6/wxpython-4.2.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8b1c5f5c173a90c861f4f3453f2e066e29f258472c76d40f8e2ec16b0389971f", size = 17836963 }, + { url = "https://files.pythonhosted.org/packages/ef/1f/ddbb597c3d821d4206f85234736a4f19ef1b8875eefbf8d072ffcc01c1a4/wxpython-4.2.4-cp312-cp312-win32.whl", hash = "sha256:83e45e4d5d139638260c2f23108a94cb8d40bd5eb714d41b1009452e4ec4229a", size = 14507902 }, + { url = "https://files.pythonhosted.org/packages/90/c3/dfe74d7eb046612a3e475dce8ffda70341516129a7cb17fd60c8ae143304/wxpython-4.2.4-cp312-cp312-win_amd64.whl", hash = "sha256:c333113be1fcb4e4252890b3e66af016f03432b2fe15b370f38f2a505f5daa74", size = 16549996 }, + { url = "https://files.pythonhosted.org/packages/bb/29/5286f960de8079264e7a89ca4b4beae86844520b9521a1497c4908a8cae6/wxpython-4.2.4-cp312-cp312-win_arm64.whl", hash = "sha256:88b7e8cbdb141ebb4e361cd6f3d5595160764f0c05d2d7e03506b53860eb01ab", size = 15534326 }, +] + +[[package]] +name = "zipp" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276 }, +]