From b9c2a31a5a526123114cbe4034b60c89b06326c5 Mon Sep 17 00:00:00 2001 From: v_liufushun Date: Wed, 22 Oct 2025 17:26:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=A1=B9=E7=9B=AE=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/DEVELOPER_GUIDE.md | 592 +++ docs/ENVIRONMENT_SETUP.md | 538 +++ docs/README.md | 127 + main.py | 739 ---- poetry.lock | 3567 ----------------- pyproject.toml | 34 +- readme.md | 265 +- requirements.txt | 5 +- aaa.ico => resources/icons/aaa.ico | Bin keyboard.png => resources/images/keyboard.png | Bin resources.qrc => resources/qrc/resources.qrc | 0 .../qrc/resources_rc.py | 0 src/__init__.py | 0 src/core/__init__.py | 0 src/core/admin_check.py | 85 + src/core/constants.py | 76 + src/core/key_sender.py | 269 ++ src/core/window_selector.py | 47 + src/gui/__init__.py | 0 src/gui/about_dialog.py | 29 + src/gui/components/__init__.py | 0 src/gui/main_window.py | 304 ++ src/main.py | 73 + src/utils/__init__.py | 0 src/utils/settings.py | 45 + src/utils/structures.py | 46 + uv.lock | 197 + 27 files changed, 2714 insertions(+), 4324 deletions(-) create mode 100644 docs/DEVELOPER_GUIDE.md create mode 100644 docs/ENVIRONMENT_SETUP.md create mode 100644 docs/README.md delete mode 100644 main.py delete mode 100644 poetry.lock rename aaa.ico => resources/icons/aaa.ico (100%) rename keyboard.png => resources/images/keyboard.png (100%) rename resources.qrc => resources/qrc/resources.qrc (100%) rename resources_rc.py => resources/qrc/resources_rc.py (100%) create mode 100644 src/__init__.py create mode 100644 src/core/__init__.py create mode 100644 src/core/admin_check.py create mode 100644 src/core/constants.py create mode 100644 src/core/key_sender.py create mode 100644 src/core/window_selector.py create mode 100644 src/gui/__init__.py create mode 100644 src/gui/about_dialog.py create mode 100644 src/gui/components/__init__.py create mode 100644 src/gui/main_window.py create mode 100644 src/main.py create mode 100644 src/utils/__init__.py create mode 100644 src/utils/settings.py create mode 100644 src/utils/structures.py create mode 100644 uv.lock diff --git a/docs/DEVELOPER_GUIDE.md b/docs/DEVELOPER_GUIDE.md new file mode 100644 index 0000000..94ec8c3 --- /dev/null +++ b/docs/DEVELOPER_GUIDE.md @@ -0,0 +1,592 @@ +# 开发者指南 + +本文档为 KeyPressRemark 项目的开发者提供详细的技术指导和代码贡献指南。 + +## 📋 目录 + +- [开发环境设置](#开发环境设置) +- [项目架构](#项目架构) +- [核心技术](#核心技术) +- [代码规范](#代码规范) +- [开发流程](#开发流程) +- [测试指南](#测试指南) +- [调试技巧](#调试技巧) +- [性能优化](#性能优化) +- [常见问题](#常见问题) + +## 🛠️ 开发环境设置 + +### 环境要求 + +- **操作系统**: Windows 10/11 (开发和测试) +- **Python**: 3.11+ (推荐 3.11.x) +- **IDE**: PyCharm / VSCode (推荐) +- **版本控制**: Git + +### 开发环境配置 + +1. **克隆项目** + ```bash + git clone + cd KeyPressRemark + ``` + +2. **创建虚拟环境** + ```bash + # 使用 uv (推荐) + uv venv --python 3.11 + .venv\Scripts\activate + + # 或使用 venv + python -m venv .venv + .venv\Scripts\activate + ``` + +3. **安装依赖** + ```bash + # 开发依赖(包含测试工具) + uv pip install -r requirements.txt + uv add --dev pytest pytest-qt black isort flake8 + ``` + +4. **IDE 配置** + - 设置 Python 解释器为虚拟环境中的 Python + - 配置代码格式化工具(Black) + - 启用类型检查(mypy) + +### 调试配置 + +**VSCode launch.json**: +```json +{ + "version": "0.2.0", + "configurations": [ + { + "name": "KeyPressRemark", + "type": "python", + "request": "launch", + "program": "${workspaceFolder}/src/main.py", + "console": "integratedTerminal", + "justMyCode": true + } + ] +} +``` + +## 🏗️ 项目架构 + +### 整体架构 + +``` +KeyPressRemark/ +├── src/ # 源代码 +│ ├── core/ # 核心功能层 +│ ├── gui/ # 用户界面层 +│ ├── utils/ # 工具库层 +│ └── main.py # 应用入口 +├── resources/ # 资源文件 +├── tests/ # 测试代码 +└── docs/ # 文档 +``` + +### 架构原则 + +1. **分层架构**: 核心功能、界面、工具明确分离 +2. **依赖注入**: 通过构造函数传递依赖 +3. **单一职责**: 每个模块只负责一个功能域 +4. **开闭原则**: 对扩展开放,对修改封闭 + +### 模块依赖关系 + +``` +main.py +├── gui.main_window (界面层) +│ ├── core.window_selector (窗口选择) +│ ├── core.key_sender (按键发送) +│ └── utils.settings (设置管理) +├── core.admin_check (权限检查) +└── resources (资源文件) +``` + +## 🔧 核心技术 + +### Windows API 技术 + +本项目大量使用 Windows API,主要包括: + +1. **用户交互 API** + - `win32gui`: 窗口操作、消息发送 + - `win32api`: 系统信息获取 + - `win32con`: 常量定义 + +2. **底层输入 API** + - `SendMessage`: 同步消息发送 + - `PostMessage`: 异步消息发送 + - `SendInput`: 系统级输入模拟 + +3. **系统权限 API** + - UAC 提升检查 + - 进程权限管理 + +### PyQt5 技术 + +1. **界面架构** + - QWidget: 基础窗口组件 + - QLayout: 布局管理 + - QTimer: 定时器功能 + +2. **事件处理** + - 信号槽机制 + - 事件过滤器 + - 自定义事件 + +### 按键发送原理 + +#### 1. PostMessage 模式 +```python +# 异步发送,消息进入目标窗口队列 +win32gui.PostMessage(hwnd, WM_KEYDOWN, key_code, lparam) +win32gui.PostMessage(hwnd, WM_KEYUP, key_code, lparam) +``` + +#### 2. SendMessage 模式 +```python +# 同步发送,等待处理完成 +win32gui.SendMessage(hwnd, WM_KEYDOWN, key_code, lparam) +win32gui.SendMessage(hwnd, WM_KEYUP, key_code, lparam) +``` + +#### 3. SendInput 模式 +```python +# 系统级模拟,最高兼容性 +inputs = (INPUT * 2)() +# 设置输入结构... +ctypes.windll.user32.SendInput(2, ctypes.byref(inputs), ctypes.sizeof(INPUT)) +``` + +## 📝 代码规范 + +### Python 编码规范 + +1. **PEP 8 标准** + - 使用 4 个空格缩进 + - 行长度不超过 88 字符(Black 标准) + - 函数和类之间用两个空行分隔 + +2. **命名规范** + - 类名:`PascalCase` + - 函数/变量:`snake_case` + - 常量:`UPPER_CASE` + - 私有成员:`_underscore_prefix` + +3. **类型注解** + ```python + def send_key(self, key_code: int, mode: str = "post") -> bool: + """发送按键""" + pass + ``` + +### 文档规范 + +1. **模块文档** + ```python + """ + 模块名 - 简短描述 + + 详细说明模块的功能、用途和技术原理。 + + 作者: xiao liu + 版本: v0.1.0 + """ + ``` + +2. **函数文档** + ```python + def function_name(param1: type, param2: type) -> return_type: + """ + 函数简短描述 + + 详细说明函数的功能、算法或注意事项。 + + Args: + param1: 参数1说明 + param2: 参数2说明 + + Returns: + 返回值说明 + + Raises: + Exception: 异常情况说明 + """ + ``` + +3. **行内注释** + ```python + # 检查目标窗口是否有效 + if not self.target_hwnd or not win32gui.IsWindow(self.target_hwnd): + return False + ``` + +### Git 提交规范 + +使用 [Conventional Commits](https://www.conventionalcommits.org/) 规范: + +``` +[optional scope]: + +[optional body] + +[optional footer(s)] +``` + +**类型说明**: +- `feat`: 新功能 +- `fix`: 修复 bug +- `docs`: 文档更新 +- `style`: 代码格式化 +- `refactor`: 代码重构 +- `test`: 测试相关 +- `chore`: 构建过程或辅助工具的变动 + +**示例**: +``` +feat(core): 添加新的按键发送模式 + +- 实现了 SendInput 模式 +- 提高了兼容性 +- 添加了相关测试 + +Closes #123 +``` + +## 🔄 开发流程 + +### 功能开发流程 + +1. **需求分析** + - 在 GitHub Issues 中创建需求 + - 分析技术可行性 + - 设计 API 接口 + +2. **创建分支** + ```bash + git checkout -b feature/new-feature-name + ``` + +3. **开发实现** + - 编写核心逻辑 + - 添加单元测试 + - 更新文档 + +4. **代码检查** + ```bash + # 格式化代码 + black src/ + isort src/ + + # 静态检查 + flake8 src/ + mypy src/ + + # 运行测试 + pytest tests/ + ``` + +5. **提交代码** + ```bash + git add . + git commit -m "feat: 添加新功能" + git push origin feature/new-feature-name + ``` + +6. **创建 Pull Request** + - 填写详细的变更说明 + - 添加测试截图(如适用) + - 等待代码审查 + +### Bug 修复流程 + +1. **复现问题** + - 记录复现步骤 + - 确认影响范围 + - 添加回归测试 + +2. **定位问题** + - 使用调试器定位 + - 查看日志信息 + - 分析堆栈跟踪 + +3. **修复实现** + - 最小化修改范围 + - 确保不引入新问题 + - 验证修复效果 + +## 🧪 测试指南 + +### 测试框架 + +项目使用 `pytest` 和 `pytest-qt` 进行测试: + +```python +import pytest +from PyQt5.QtWidgets import QApplication +from src.gui.main_window import KeyPresser + +@pytest.fixture +def app(): + """创建 QApplication 实例""" + app = QApplication([]) + yield app + app.quit() + +def test_window_creation(app): + """测试窗口创建""" + window = KeyPresser() + assert window is not None + assert window.windowTitle() == "KeyPresser(无钩子版)" +``` + +### 测试分类 + +1. **单元测试** (`tests/unit/`) + - 测试单个函数/方法 + - 使用 mock 隔离依赖 + - 覆盖边界条件 + +2. **集成测试** (`tests/integration/`) + - 测试模块间交互 + - 验证 API 契约 + - 测试数据流 + +3. **界面测试** (`tests/gui/`) + - 使用 pytest-qt + - 模拟用户操作 + - 验证界面响应 + +### 运行测试 + +```bash +# 运行所有测试 +pytest + +# 运行特定测试文件 +pytest tests/test_key_sender.py + +# 运行特定测试函数 +pytest tests/test_key_sender.py::test_post_message + +# 生成覆盖率报告 +pytest --cov=src --cov-report=html +``` + +## 🐛 调试技巧 + +### 日志记录 + +使用 Python 标准库 `logging`: + +```python +import logging + +# 配置日志 +logging.basicConfig( + level=logging.DEBUG, + format='%(asctime)s - %(name)s - %(levelname)s - %(message)s', + handlers=[ + logging.FileHandler('keypress.log'), + logging.StreamHandler() + ] +) + +logger = logging.getLogger(__name__) + +def send_key(self, key_code: int) -> bool: + logger.debug(f"发送按键: {key_code}") + try: + # 发送逻辑 + result = self._do_send_key(key_code) + logger.info(f"按键发送成功: {key_code}") + return result + except Exception as e: + logger.error(f"按键发送失败: {key_code}, 错误: {e}") + return False +``` + +### 调试 Windows API + +1. **检查窗口句柄** + ```python + import win32gui + + def debug_window_info(hwnd): + if win32gui.IsWindow(hwnd): + title = win32gui.GetWindowText(hwnd) + class_name = win32gui.GetClassName(hwnd) + print(f"窗口: {title}, 类名: {class_name}") + else: + print("无效的窗口句柄") + ``` + +2. **监控消息发送** + ```python + def send_key_with_debug(self, key_code: int): + print(f"发送按键: {hex(key_code)} 到窗口: {hex(self.target_hwnd)}") + result = win32gui.PostMessage(self.target_hwnd, WM_KEYDOWN, key_code, 0) + print(f"PostMessage 返回值: {result}") + ``` + +### 性能分析 + +使用 `cProfile` 进行性能分析: + +```bash +python -m cProfile -o profile.stats src/main.py +``` + +查看结果: +```python +import pstats +p = pstats.Stats('profile.stats') +p.sort_stats('cumulative').print_stats(10) +``` + +## ⚡ 性能优化 + +### 按键发送优化 + +1. **批量发送** + ```python + def send_keys_batch(self, keys: List[int], mode: str = "post"): + """批量发送按键,减少 API 调用次数""" + for key_code in keys: + self.send_key(key_code, mode) + ``` + +2. **缓存窗口信息** + ```python + class KeySender: + def __init__(self): + self._window_cache = {} + + def get_window_info(self, hwnd): + if hwnd not in self._window_cache: + self._window_cache[hwnd] = { + 'title': win32gui.GetWindowText(hwnd), + 'class': win32gui.GetClassName(hwnd) + } + return self._window_cache[hwnd] + ``` + +### 界面响应优化 + +1. **异步操作** + ```python + from PyQt5.QtCore import QThread, pyqtSignal + + class KeySendThread(QThread): + finished = pyqtSignal() + + def __init__(self, key_sender, key_code): + super().__init__() + self.key_sender = key_sender + self.key_code = key_code + + def run(self): + self.key_sender.send_key(self.key_code) + self.finished.emit() + ``` + +2. **减少重绘** + ```python + # 批量更新界面 + self.setUpdatesEnabled(False) + # 进行多个界面操作... + self.setUpdatesEnabled(True) + ``` + +## ❓ 常见问题 + +### Q1: 按键发送不生效 + +**可能原因**: +1. 目标应用需要管理员权限 +2. 应用使用了低级键盘钩子 +3. 窗口句柄已失效 + +**解决方案**: +```python +# 检查窗口是否有效 +if not win32gui.IsWindow(self.target_hwnd): + print("窗口句柄已失效,需要重新选择") + +# 尝试不同的发送模式 +for mode in ["post", "send_message", "send"]: + if self.send_key(key_code, mode): + print(f"模式 {mode} 发送成功") + break +``` + +### Q2: 界面冻结 + +**原因**: 在主线程执行耗时操作 + +**解决方案**: +```python +# 使用 QTimer 分解操作 +def process_large_task(self): + self.timer = QTimer() + self.timer.timeout.connect(self.process_chunk) + self.timer.start(10) # 每10ms处理一小块 + +def process_chunk(self): + # 处理一小部分数据 + if self.is_finished(): + self.timer.stop() +``` + +### Q3: 内存泄漏 + +**检查点**: +1. Qt 对象是否正确释放 +2. 定时器是否正确停止 +3. 事件监听器是否移除 + +**解决方案**: +```python +def cleanup(self): + # 停止所有定时器 + for timer in self.timers: + timer.stop() + + # 断开信号连接 + self.some_signal.disconnect() + + # 释放资源 + if hasattr(self, 'key_sender'): + del self.key_sender +``` + +### Q4: 依赖安装问题 + +**pyqt5-qt5 版本问题**: +```bash +# 强制安装特定版本 +uv pip install PyQt5==5.15.11 pyqt5-qt5==5.15.2 --force-reinstall +``` + +**权限问题**: +```bash +# 以管理员身份运行命令提示符 +# 或者使用 --user 参数 +pip install --user PyQt5 +``` + +--- + +## 📞 获取帮助 + +- **GitHub Issues**: 报告 bug 和功能请求 +- **讨论区**: 技术讨论和经验分享 +- **Wiki**: 更多技术文档和示例 + +欢迎贡献代码和文档!🎉 \ No newline at end of file diff --git a/docs/ENVIRONMENT_SETUP.md b/docs/ENVIRONMENT_SETUP.md new file mode 100644 index 0000000..f26d2d4 --- /dev/null +++ b/docs/ENVIRONMENT_SETUP.md @@ -0,0 +1,538 @@ +# 环境配置与依赖说明 + +本文档详细说明了 KeyPressRemark 项目的环境配置要求、依赖管理和常见问题解决方案。 + +## 📋 目录 + +- [系统要求](#系统要求) +- [Python 环境](#python-环境) +- [依赖包详解](#依赖包详解) +- [环境配置步骤](#环境配置步骤) +- [常见问题解决](#常见问题解决) +- [依赖管理最佳实践](#依赖管理最佳实践) + +## 🖥️ 系统要求 + +### 操作系统支持 + +| 操作系统 | 版本要求 | 支持状态 | 说明 | +|---------|---------|---------|------| +| Windows 10 | 1909+ | ✅ 完全支持 | 推荐版本 | +| Windows 11 | 所有版本 | ✅ 完全支持 | 推荐版本 | +| Windows 8.1 | 所有版本 | ⚠️ 基本支持 | 部分功能可能受限 | +| Windows 7 | SP1+ | ❌ 不支持 | PyQt5 不再支持 | +| Linux | 任何发行版 | ❌ 不支持 | Windows API 依赖 | +| macOS | 任何版本 | ❌ 不支持 | Windows API 依赖 | + +### 硬件要求 + +| 组件 | 最低要求 | 推荐配置 | +|------|---------|---------| +| CPU | 1GHz 单核 | 2GHz 双核+ | +| 内存 | 512MB | 2GB+ | +| 硬盘 | 100MB 可用空间 | 500MB+ | +| 显示器 | 800x600 | 1920x1080+ | + +### 权限要求 + +- **管理员权限**: 必需(用于按键模拟功能) +- **UAC 设置**: 建议设置为最低级别,减少弹窗干扰 +- **防火墙**: 无特殊要求 +- **杀毒软件**: 可能需要将程序添加到白名单 + +## 🐍 Python 环境 + +### Python 版本要求 + +```yaml +最低版本: Python 3.11.0 +推荐版本: Python 3.11.7+ +测试版本: + - Python 3.11.7 ✅ + - Python 3.12.x ✅ + - Python 3.10.x ⚠️ (可能存在兼容性问题) +``` + +### Python 安装建议 + +1. **官方安装器** (推荐) + ```bash + # 下载 Python 3.11.7 from python.org + # 安装时勾选 "Add Python to PATH" + # 安装时勾选 "Install for all users" + ``` + +2. **通过 Microsoft Store** (简单) + ```bash + # 搜索 "Python 3.11" 并安装 + # 自动配置环境变量 + ``` + +3. **通过 pyenv-win** (高级用户) + ```bash + # 安装 pyenv-win + git clone https://github.com/pyenv-win/pyenv-win.git %USERPROFILE%\.pyenv + + # 安装指定版本 + pyenv install 3.11.7 + pyenv global 3.11.7 + ``` + +### 验证 Python 安装 + +```bash +# 检查 Python 版本 +python --version +# 输出: Python 3.11.7 + +# 检查 pip 版本 +pip --version +# 输出: pip 23.3.1 from ... + +# 检查环境变量 +echo %PATH% +# 应该包含 Python 安装路径 +``` + +## 📦 依赖包详解 + +### 核心依赖 + +#### PyQt5 (5.15.11) +```yaml +用途: 图形用户界面框架 +重要性: 核心依赖 +安装大小: ~50MB +许可证: GPL v3 / Commercial +``` + +**功能说明**: +- 提供完整的 GUI 组件库 +- 支持信号槽机制 +- 跨平台支持(本项目仅用于 Windows) +- 事件循环和定时器功能 + +**安装命令**: +```bash +# 标准安装 +pip install PyQt5==5.15.11 + +# 使用 uv (推荐) +uv pip install PyQt5==5.15.11 +``` + +#### pyqt5-qt5 (5.15.2) +```yaml +用途: Qt5 运行时库 +重要性: 核心依赖 +安装大小: ~100MB +许可证: LGPL v3 +``` + +**重要说明**: +⚠️ **版本锁定原因**: +- Windows 平台必须使用 `5.15.2` 版本 +- 更新的 `5.15.17` 版本不提供 Windows wheel 文件 +- 这是 PyQt5 在 Windows 平台的已知限制 + +**安装命令**: +```bash +# 必须指定确切版本 +pip install pyqt5-qt5==5.15.2 + +# 使用 uv +uv pip install pyqt5-qt5==5.15.2 +``` + +#### pywin32 (311) +```yaml +用途: Windows API 访问库 +重要性: 核心依赖 +安装大小: ~10MB +许可证: PSF License +``` + +**功能说明**: +- 提供 Python 访问 Windows API 的能力 +- 包含 win32gui, win32api, win32con 等模块 +- 支持窗口操作、消息发送、系统信息获取 +- 版本号与 Windows 构建号相关 + +**安装命令**: +```bash +pip install pywin32==311 +``` + +### 开发依赖 + +#### PyInstaller (6.16.0+) +```yaml +用途: Python 程序打包工具 +重要性: 打包依赖 +安装大小: ~15MB +许可证: GPL v2 +``` + +**功能说明**: +- 将 Python 程序打包为独立的可执行文件 +- 支持单文件和目录两种打包方式 +- 自动处理依赖关系 +- 支持自定义图标和版本信息 + +**安装命令**: +```bash +# 开发环境安装 +uv add --dev pyinstaller>=6.0.0 +``` + +### 依赖关系图 + +```mermaid +graph TD + A[KeyPressRemark] --> B[PyQt5] + A --> C[pywin32] + B --> D[pyqt5-qt5] + B --> E[pyqt5-sip] + + A --> F[PyInstaller] + F --> G[altgraph] + F --> H[pefile] + F --> I[pyinstaller-hooks-contrib] + + style A fill:#e1f5fe + style B fill:#f3e5f5 + style C fill:#f3e5f5 + style D fill:#fff3e0 + style F fill:#e8f5e8 +``` + +## 🔧 环境配置步骤 + +### 方案一:使用 uv (推荐) + +uv 是新一代 Python 包管理器,速度比 pip 快 10-100 倍。 + +```bash +# 1. 安装 uv +pip install uv + +# 2. 克隆项目 +git clone +cd KeyPressRemark + +# 3. 创建虚拟环境 +uv venv --python 3.11 + +# 4. 激活虚拟环境 +.venv\Scripts\activate + +# 5. 安装依赖 +uv pip install PyQt5==5.15.11 pyqt5-qt5==5.15.2 pywin32==311 + +# 6. 安装开发依赖(可选) +uv add --dev pyinstaller pytest pytest-qt black isort flake8 + +# 7. 验证安装 +python -c "import PyQt5; print('PyQt5 安装成功')" +python -c "import win32gui; print('pywin32 安装成功')" +``` + +### 方案二:使用传统 pip + +```bash +# 1. 克隆项目 +git clone +cd KeyPressRemark + +# 2. 创建虚拟环境 +python -m venv .venv + +# 3. 激活虚拟环境 +.venv\Scripts\activate + +# 4. 升级 pip +python -m pip install --upgrade pip + +# 5. 安装依赖 +pip install -r requirements.txt + +# 6. 验证安装 +python src/main.py +``` + +### 方案三:使用 conda/mamba + +```bash +# 1. 创建 conda 环境 +conda create -n keypressremark python=3.11 + +# 2. 激活环境 +conda activate keypressremark + +# 3. 安装依赖 +# 注意:PyQt5 通过 conda-forge 安装可能版本不匹配 +pip install PyQt5==5.15.11 pyqt5-qt5==5.15.2 pywin32==311 + +# 4. 验证安装 +python src/main.py +``` + +### Docker 环境 (实验性) + +```dockerfile +# Dockerfile (仅用于开发,不能运行GUI) +FROM python:3.11-windowsservercore + +WORKDIR /app +COPY requirements.txt . +RUN pip install -r requirements.txt + +COPY src/ ./src/ +CMD ["python", "src/main.py"] +``` + +注意:由于 Windows API 依赖,Docker 环境主要用于代码检查,无法运行完整功能。 + +## 🔍 常见问题解决 + +### 问题 1: PyQt5 安装失败 + +**错误信息**: +``` +ERROR: Could not find a version that satisfies the requirement PyQt5 +``` + +**解决方案**: +```bash +# 方案 A: 使用官方索引 +pip install -i https://pypi.org/simple/ PyQt5==5.15.11 + +# 方案 B: 手动下载 wheel 文件 +# 从 https://pypi.org/project/PyQt5/#files 下载对应版本 +pip install PyQt5-5.15.11-cp311-cp311-win_amd64.whl + +# 方案 C: 清理缓存重试 +pip cache purge +pip install PyQt5==5.15.11 +``` + +### 问题 2: pyqt5-qt5 版本冲突 + +**错误信息**: +``` +Distribution pyqt5-qt5==5.15.17 can't be installed because it doesn't have a wheel for the current platform +``` + +**解决方案**: +```bash +# 强制安装兼容版本 +uv pip install pyqt5-qt5==5.15.2 --force-reinstall + +# 或者手动指定约束 +echo "pyqt5-qt5==5.15.2" > constraints.txt +pip install PyQt5==5.15.11 -c constraints.txt +``` + +### 问题 3: pywin32 权限问题 + +**错误信息**: +``` +Access is denied +``` + +**解决方案**: +```bash +# 方案 A: 管理员权限安装 +# 以管理员身份运行命令提示符 +pip install pywin32==311 + +# 方案 B: 用户级安装 +pip install --user pywin32==311 + +# 方案 C: 安装后手动注册 +python Scripts/pywin32_postinstall.py -install +``` + +### 问题 4: 虚拟环境激活失败 + +**错误信息**: +``` +cannot be loaded because running scripts is disabled on this system +``` + +**解决方案**: +```powershell +# 在 PowerShell 中执行(管理员权限) +Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser + +# 然后重新激活虚拟环境 +.venv\Scripts\activate +``` + +### 问题 5: 中文路径问题 + +**错误信息**: +``` +UnicodeDecodeError: 'gbk' codec can't decode byte +``` + +**解决方案**: +```bash +# 方案 A: 设置环境变量 +set PYTHONIOENCODING=utf-8 + +# 方案 B: 避免中文路径 +# 将项目移动到英文路径下 + +# 方案 C: 修改系统区域设置 +# 控制面板 -> 区域 -> 管理 -> 更改系统区域设置 -> Beta: 使用 Unicode UTF-8 +``` + +### 问题 6: 防火墙/杀毒软件拦截 + +**现象**: +- 程序无法启动 +- 按键发送功能异常 +- 弹出安全警告 + +**解决方案**: +```bash +# 1. 添加到防火墙例外 +# Windows Defender 防火墙 -> 允许应用通过防火墙 + +# 2. 添加到杀毒软件白名单 +# 各杀毒软件设置方法不同,需要将以下路径添加到白名单: +# - Python.exe 路径 +# - 项目文件夹路径 +# - 生成的 exe 文件路径 + +# 3. 临时关闭实时保护(仅测试用) +# Windows 安全中心 -> 病毒和威胁防护 -> 实时保护 +``` + +## 📚 依赖管理最佳实践 + +### 版本锁定策略 + +1. **精确版本锁定** (推荐用于生产) + ``` + PyQt5==5.15.11 + pyqt5-qt5==5.15.2 + pywin32==311 + ``` + +2. **兼容版本范围** (用于开发) + ``` + PyQt5>=5.15.10,<5.16.0 + pyqt5-qt5>=5.15.2,<5.16.0 + pywin32>=311 + ``` + +3. **主版本锁定** (用于扩展性) + ``` + PyQt5~=5.15.11 # 等同于 >=5.15.11, <5.16.0 + ``` + +### requirements.txt 管理 + +创建多个需求文件: + +```bash +# requirements/base.txt - 基础依赖 +PyQt5==5.15.11 +pyqt5-qt5==5.15.2 +pywin32==311 + +# requirements/dev.txt - 开发依赖 +-r base.txt +pytest>=7.0.0 +pytest-qt>=4.0.0 +black>=22.0.0 +isort>=5.0.0 +flake8>=4.0.0 + +# requirements/build.txt - 打包依赖 +-r base.txt +pyinstaller>=6.0.0 +``` + +### 依赖安全检查 + +```bash +# 使用 pip-audit 检查安全漏洞 +pip install pip-audit +pip-audit + +# 使用 safety 检查 +pip install safety +safety check + +# 检查依赖许可证 +pip install pip-licenses +pip-licenses +``` + +### 依赖更新策略 + +```bash +# 1. 检查过时的包 +pip list --outdated + +# 2. 生成当前环境的精确依赖 +pip freeze > requirements-lock.txt + +# 3. 测试更新(在独立环境中) +python -m venv test-env +test-env\Scripts\activate +pip install -r requirements.txt +python src/main.py # 测试功能 + +# 4. 逐步更新(推荐) +# 一次只更新一个包,测试后再更新下一个 +``` + +### 环境隔离最佳实践 + +1. **项目级隔离** + ```bash + # 每个项目使用独立的虚拟环境 + python -m venv .venv-keypressremark + ``` + +2. **功能级隔离** + ```bash + # 开发环境 + python -m venv .venv-dev + + # 测试环境 + python -m venv .venv-test + + # 打包环境 + python -m venv .venv-build + ``` + +3. **版本级隔离** + ```bash + # Python 3.11 环境 + python3.11 -m venv .venv-py311 + + # Python 3.12 测试环境 + python3.12 -m venv .venv-py312 + ``` + +--- + +## 🆘 获取支持 + +如果遇到环境配置问题,可以通过以下方式获取帮助: + +1. **查看 Issues**: [GitHub Issues](https://github.com/your-repo/issues) +2. **提交问题**: 使用问题模板提供详细信息 +3. **社区讨论**: [GitHub Discussions](https://github.com/your-repo/discussions) + +提交问题时,请包含以下信息: +- 操作系统版本 +- Python 版本 +- 完整的错误信息 +- 尝试的解决方案 +- 环境信息 (`pip list` 输出) \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..14aa742 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,127 @@ +# 项目文档索引 + +本目录包含 KeyPressRemark 项目的完整技术文档,为开发者、用户和维护者提供全面的参考资料。 + +## 📚 文档导航 + +### 用户文档 + +- **[README.md](../README.md)** - 项目概述和快速入门指南 + - 功能特性介绍 + - 安装和使用说明 + - 基本操作指南 + - 打包部署说明 + +### 开发者文档 + +- **[开发者指南 (DEVELOPER_GUIDE.md)](./DEVELOPER_GUIDE.md)** - 完整的开发指导 + - 开发环境设置 + - 项目架构详解 + - 代码规范和最佳实践 + - 测试和调试指南 + - 性能优化建议 + +- **[环境配置指南 (ENVIRONMENT_SETUP.md)](./ENVIRONMENT_SETUP.md)** - 详细的环境配置说明 + - 系统要求详解 + - Python 环境配置 + - 依赖包详细说明 + - 常见问题解决方案 + - 依赖管理最佳实践 + +### 技术文档 + +- **[API 参考](./API_REFERENCE.md)** (计划中) + - 核心类和方法文档 + - 使用示例 + - 参数说明 + +- **[架构设计](./ARCHITECTURE.md)** (计划中) + - 系统架构图 + - 模块设计原理 + - 技术选型说明 + +## 🔍 快速查找 + +### 按使用场景查找 + +| 我想要... | 参考文档 | +|----------|----------| +| 了解项目功能 | [README.md](../README.md) | +| 快速使用程序 | [README.md - 使用指南](../README.md#使用指南) | +| 设置开发环境 | [环境配置指南](./ENVIRONMENT_SETUP.md) | +| 参与代码开发 | [开发者指南](./DEVELOPER_GUIDE.md) | +| 解决安装问题 | [环境配置指南 - 常见问题](./ENVIRONMENT_SETUP.md#常见问题解决) | +| 了解代码架构 | [开发者指南 - 项目架构](./DEVELOPER_GUIDE.md#项目架构) | +| 学习按键原理 | [开发者指南 - 核心技术](./DEVELOPER_GUIDE.md#核心技术) | + +### 按技术领域查找 + +| 技术领域 | 相关文档 | +|---------|----------| +| Python 环境 | [环境配置指南 - Python 环境](./ENVIRONMENT_SETUP.md#python-环境) | +| PyQt5 界面 | [开发者指南 - PyQt5 技术](./DEVELOPER_GUIDE.md#pyqt5-技术) | +| Windows API | [开发者指南 - Windows API 技术](./DEVELOPER_GUIDE.md#windows-api-技术) | +| 按键模拟 | [开发者指南 - 按键发送原理](./DEVELOPER_GUIDE.md#按键发送原理) | +| 依赖管理 | [环境配置指南 - 依赖管理](./ENVIRONMENT_SETUP.md#依赖管理最佳实践) | +| 测试调试 | [开发者指南 - 测试指南](./DEVELOPER_GUIDE.md#测试指南) | + +### 按问题类型查找 + +| 问题类型 | 解决方案文档 | +|---------|-------------| +| 安装失败 | [环境配置指南 - 常见问题](./ENVIRONMENT_SETUP.md#常见问题解决) | +| 权限问题 | [开发者指南 - 调试技巧](./DEVELOPER_GUIDE.md#调试技巧) | +| 按键无效 | [开发者指南 - 常见问题 Q1](./DEVELOPER_GUIDE.md#q1-按键发送不生效) | +| 界面卡顿 | [开发者指南 - 常见问题 Q2](./DEVELOPER_GUIDE.md#q2-界面冻结) | +| 版本冲突 | [环境配置指南 - 问题2](./ENVIRONMENT_SETUP.md#问题-2-pyqt5-qt5-版本冲突) | + +## 📝 文档贡献 + +### 文档规范 + +- 使用 Markdown 格式 +- 遵循中文技术文档规范 +- 包含完整的目录结构 +- 提供实用的代码示例 +- 及时更新版本信息 + +### 贡献流程 + +1. **发现问题**: 在使用过程中发现文档问题或缺失 +2. **创建 Issue**: 在 GitHub 上创建文档改进建议 +3. **编写内容**: 按照现有格式编写或修改文档 +4. **提交 PR**: 提交 Pull Request 进行审查 +5. **合并更新**: 审查通过后合并到主分支 + +### 文档维护 + +- **定期更新**: 随代码变更同步更新文档 +- **版本标记**: 重要变更需要标记版本号 +- **链接检查**: 定期检查文档内链接有效性 +- **示例验证**: 确保代码示例能正常运行 + +## 🔗 相关资源 + +### 官方资源 + +- **项目仓库**: [GitHub Repository](https://github.com/your-repo) +- **问题反馈**: [GitHub Issues](https://github.com/your-repo/issues) +- **功能讨论**: [GitHub Discussions](https://github.com/your-repo/discussions) + +### 技术参考 + +- **PyQt5 官方文档**: [https://doc.qt.io/qtforpython/](https://doc.qt.io/qtforpython/) +- **Windows API 参考**: [https://docs.microsoft.com/en-us/windows/win32/api/](https://docs.microsoft.com/en-us/windows/win32/api/) +- **Python 官方文档**: [https://docs.python.org/3/](https://docs.python.org/3/) + +### 社区资源 + +- **PyQt5 中文教程**: 各大技术博客和教程网站 +- **Windows 编程资源**: MSDN 和相关技术社区 +- **Python 包管理**: pip 和 uv 官方文档 + +--- + +**最后更新**: 2024-01-01 +**文档版本**: v1.0 +**维护者**: xiao liu \ No newline at end of file diff --git a/main.py b/main.py deleted file mode 100644 index 928d534..0000000 --- a/main.py +++ /dev/null @@ -1,739 +0,0 @@ -import sys -import time -import os -import resources_rc - -from PyQt5.QtGui import QIcon -from PyQt5.QtWidgets import (QApplication, QWidget, QVBoxLayout, QHBoxLayout, - QPushButton, QLabel, QLineEdit, QCheckBox, QComboBox, - QGridLayout, QMessageBox, QDialog) -from PyQt5.QtCore import QTimer, Qt, QSettings -import win32gui -import win32con -import win32api -import win32process -import ctypes -from ctypes import wintypes - - -# 检查并请求管理员权限 -def is_admin(): - try: - return ctypes.windll.shell32.IsUserAnAdmin() - except: - return False - - -if not is_admin(): - # 如果不是管理员权限,则重新以管理员身份启动程序 - ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, " ".join(sys.argv), None, 1) - sys.exit(0) - -# Constants for virtual keys -VK_SPACE = 0x20 -VK_RETURN = 0x0D -VK_TAB = 0x09 -VK_ESCAPE = 0x1B -VK_BACK = 0x08 -VK_INSERT = 0x2D -VK_DELETE = 0x2E -VK_HOME = 0x24 -VK_END = 0x23 -VK_PRIOR = 0x21 # Page Up -VK_NEXT = 0x22 # Page Down -VK_LEFT = 0x25 -VK_RIGHT = 0x27 -VK_UP = 0x26 -VK_DOWN = 0x28 -VK_F1 = 0x70 -VK_F2 = 0x71 -VK_F3 = 0x72 -VK_F4 = 0x73 -VK_F5 = 0x74 -VK_F6 = 0x75 -VK_F7 = 0x76 -VK_F8 = 0x77 -VK_F9 = 0x78 -VK_F10 = 0x79 -VK_F11 = 0x7A -VK_F12 = 0x7B - -VK_SCROLL = 0x91 - -WM_KEYDOWN = 0x0100 -WM_KEYUP = 0x0101 -WM_CHAR = 0x0102 - -# Constants for SendInput -INPUT_KEYBOARD = 1 -KEYEVENTF_KEYUP = 0x0002 -KEYEVENTF_UNICODE = 0x0004 - - -# 鼠标事件常量 -MOUSEEVENTF_MOVE = 0x0001 -MOUSEEVENTF_LEFTDOWN = 0x0002 -MOUSEEVENTF_LEFTUP = 0x0004 -MOUSEEVENTF_RIGHTDOWN = 0x0008 -MOUSEEVENTF_RIGHTUP = 0x0010 -MOUSEEVENTF_MIDDLEDOWN = 0x0020 -MOUSEEVENTF_MIDDLEUP = 0x0040 -MOUSEEVENTF_ABSOLUTE = 0x8000 -# SendInput常量 -INPUT_MOUSE = 0 -INPUT_KEYBOARD = 1 - -# Define required structures for SendInput -class MOUSEINPUT(ctypes.Structure): - _fields_ = [ - ("dx", wintypes.LONG), - ("dy", wintypes.LONG), - ("mouseData", wintypes.DWORD), - ("dwFlags", wintypes.DWORD), - ("time", wintypes.DWORD), - ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG)), - ] - - -class KEYBDINPUT(ctypes.Structure): - _fields_ = [ - ("wVk", wintypes.WORD), - ("wScan", wintypes.WORD), - ("dwFlags", wintypes.DWORD), - ("time", wintypes.DWORD), - ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG)), - ] - - -class HARDWAREINPUT(ctypes.Structure): - _fields_ = [ - ("uMsg", wintypes.DWORD), - ("wParamL", wintypes.WORD), - ("wParamH", wintypes.WORD), - ] - - -class INPUT_union(ctypes.Union): - _fields_ = [ - ("mi", MOUSEINPUT), - ("ki", KEYBDINPUT), - ("hi", HARDWAREINPUT), - ] - - -class INPUT(ctypes.Structure): - _fields_ = [ - ("type", wintypes.DWORD), - ("u", INPUT_union), - ] - - -class AboutMeDlg(QDialog): # 从 QWidget 改为 QDialog - def __init__(self, parent=None): - super().__init__(parent) - self.setWindowTitle("关于") - self.setFixedSize(400, 200) - - layout = QVBoxLayout() - - title = QLabel("KeyPresser", self) - title.setStyleSheet("font-size: 18pt; font-weight: bold;") - layout.addWidget(title) - - desc = QLabel("一个简单的按键模拟工具", self) - layout.addWidget(desc) - - version = QLabel("版本: 专业版 (Python 无钩子版)", self) - layout.addWidget(version) - - author = QLabel("作者: xiao liu", self) - layout.addWidget(author) - - ok_button = QPushButton("确定", self) - ok_button.clicked.connect(self.accept) # 从 self.close 改为 self.accept - layout.addWidget(ok_button) - - self.setLayout(layout) - - - -class KeyPresser(QWidget): - def __init__(self, parent=None): - super().__init__(parent) - - self.target_hwnd = None - self.timers = [] - - # 设置应用程序和窗口图标 - self.setWindowIcon(QIcon(':/aaa.ico')) # 添加这行代码 - - self.init_ui() - self.load_settings() - - # Add a timer to poll for hotkey - self.hotkeyTimer = QTimer(self) - self.hotkeyTimer.timeout.connect(self.check_hotkey) - self.hotkeyTimer.start(50) # Check every 50ms for more responsive hotkey - - # 添加到__init__或init_ui方法中 - self.mouseTimer = QTimer(self) - self.mouseTimer.timeout.connect(self.click_mouse) - - # Last key state - self.lastKeyState = False - - def init_ui(self): - self.setWindowTitle("KeyPresser(无钩子版)") - self.setFixedWidth(300) - - layout = QVBoxLayout(self) - - # Window selection - label = QLabel("选择窗口:", self) - layout.addWidget(label) - - self.selectedWindowLabel = QLabel("未选择窗口", self) - self.selectedWindowLabel.setStyleSheet("color: green;") - layout.addWidget(self.selectedWindowLabel) - - selectButton = QPushButton("选择窗口", self) - layout.addWidget(selectButton) - - # Mode selection for key pressing - modeLayout = QHBoxLayout() - modeLabel = QLabel("按键模式:", self) - modeLayout.addWidget(modeLabel) - - self.modeComboBox = QComboBox(self) - self.modeComboBox.addItem("PostMessage (常规模式)", "post") - self.modeComboBox.addItem("SendInput (后台模式)", "send") - self.modeComboBox.addItem("SendMessage (直接模式)", "send_message") - modeLayout.addWidget(self.modeComboBox) - - layout.addLayout(modeLayout) - - # Space key settings - spaceLayout = QHBoxLayout() - self.spaceCheckBox = QCheckBox(self) - spaceLayout.addWidget(self.spaceCheckBox) - - spaceLabel = QLabel("空格键时间间隔 (毫秒):", self) - spaceLayout.addWidget(spaceLabel) - - self.spaceIntervalLineEdit = QLineEdit(self) - self.spaceIntervalLineEdit.setText("1000") - spaceLayout.addWidget(self.spaceIntervalLineEdit) - - layout.addLayout(spaceLayout) - - # 鼠标左键设置 - 修复布局 - mouseLayout = QHBoxLayout() - self.mouseCheckBox = QCheckBox(self) - mouseLayout.addWidget(self.mouseCheckBox) - - mouseLabel = QLabel("鼠标左键时间间隔 (毫秒):", self) - mouseLayout.addWidget(mouseLabel) # 修复:将mouseLabel.addWidget(mouseLabel)改为mouseLayout.addWidget(mouseLabel) - - self.mouseIntervalLineEdit = QLineEdit(self) - self.mouseIntervalLineEdit.setText("1000") - mouseLayout.addWidget(self.mouseIntervalLineEdit) - - layout.addLayout(mouseLayout) - - - # Custom keys - keysLabel = QLabel("自定义按键和时间间隔 (毫秒):", self) - layout.addWidget(keysLabel) - - keysLayout = QGridLayout() - self.keyCheckBoxes = [] - self.keyCombos = [] - self.intervalLineEdits = [] - - for i in range(10): - checkbox = QCheckBox(self) - keysLayout.addWidget(checkbox, i, 0) - self.keyCheckBoxes.append(checkbox) - - combobox = QComboBox(self) - self.populate_key_combos(combobox) - keysLayout.addWidget(combobox, i, 1) - self.keyCombos.append(combobox) - - lineEdit = QLineEdit(self) - lineEdit.setText("1000") - keysLayout.addWidget(lineEdit, i, 2) - self.intervalLineEdits.append(lineEdit) - - # Create timer for this key - timer = QTimer(self) - timer.timeout.connect(lambda checked=False, index=i: self.press_keys(index)) - self.timers.append(timer) - - layout.addLayout(keysLayout) - - # Start/Stop buttons - startButton = QPushButton("开始", self) - layout.addWidget(startButton) - - stopButton = QPushButton("停止", self) - layout.addWidget(stopButton) - - labelPrompt = QLabel("修改配置后需点击开始按钮以使更改生效。", self) - labelPrompt.setStyleSheet("color: red;") - layout.addWidget(labelPrompt) - - self.instructionLabel = QLabel("停止中", self) - self.instructionLabel.setStyleSheet("color: green;") - layout.addWidget(self.instructionLabel) - - # Hotkey selection - hotkeyLayout = QHBoxLayout() - hotkeyLabel = QLabel("开始/停止快捷键:", self) - hotkeyLayout.addWidget(hotkeyLabel) - - self.hotkeyComboBox = QComboBox(self) - self.populate_key_combos(self.hotkeyComboBox) - self.hotkeyComboBox.setCurrentText("Home") # Default to Home key - hotkeyLayout.addWidget(self.hotkeyComboBox) - - layout.addLayout(hotkeyLayout) - - # Debug info - self.debugLabel = QLabel("状态: 管理员模式 (使用轮询检测热键)", self) - self.debugLabel.setStyleSheet("color: blue;") - layout.addWidget(self.debugLabel) - - # Thread input settings - threadLayout = QHBoxLayout() - self.attachThreadCheckBox = QCheckBox("关联线程输入", self) - self.attachThreadCheckBox.setChecked(True) - threadLayout.addWidget(self.attachThreadCheckBox) - - layout.addLayout(threadLayout) - - aboutButton = QPushButton("关于", self) - layout.addWidget(aboutButton) - - # Connect signals - selectButton.clicked.connect(self.select_window) - startButton.clicked.connect(self.start_pressing) - stopButton.clicked.connect(self.stop_pressing) - aboutButton.clicked.connect(self.about_me) - - self.spaceTimer = QTimer(self) - self.spaceTimer.timeout.connect(self.press_space) - - self.setLayout(layout) - - def populate_key_combos(self, comboBox): - keys = [ - ("F1", VK_F1), ("F2", VK_F2), ("F3", VK_F3), ("F4", VK_F4), - ("F5", VK_F5), ("F6", VK_F6), ("F7", VK_F7), ("F8", VK_F8), - ("F9", VK_F9), ("F10", VK_F10), ("F11", VK_F11), ("F12", VK_F12), - ("A", ord('A')), ("B", ord('B')), ("C", ord('C')), ("D", ord('D')), - ("E", ord('E')), ("F", ord('F')), ("G", ord('G')), ("H", ord('H')), - ("I", ord('I')), ("J", ord('J')), ("K", ord('K')), ("L", ord('L')), - ("M", ord('M')), ("N", ord('N')), ("O", ord('O')), ("P", ord('P')), - ("Q", ord('Q')), ("R", ord('R')), ("S", ord('S')), ("T", ord('T')), - ("U", ord('U')), ("V", ord('V')), ("W", ord('W')), ("X", ord('X')), - ("Y", ord('Y')), ("Z", ord('Z')), - ("0", ord('0')), ("1", ord('1')), ("2", ord('2')), ("3", ord('3')), - ("4", ord('4')), ("5", ord('5')), ("6", ord('6')), ("7", ord('7')), - ("8", ord('8')), ("9", ord('9')), - ("Space", VK_SPACE), ("Enter", VK_RETURN), ("Tab", VK_TAB), - ("Esc", VK_ESCAPE), ("Backspace", VK_BACK), ("Insert", VK_INSERT), - ("Delete", VK_DELETE), ("Home", VK_HOME), ("End", VK_END), - ("Page Up", VK_PRIOR), ("Page Down", VK_NEXT), - ("Left Arrow", VK_LEFT), ("Right Arrow", VK_RIGHT), - ("Up Arrow", VK_UP), ("Down Arrow", VK_DOWN),("Scroll", VK_SCROLL) - ] - - for text, value in keys: - comboBox.addItem(text, value) - - def check_hotkey(self): - """Check if the selected hotkey is pressed""" - # Get the selected hotkey - key_code = self.hotkeyComboBox.currentData() - - # Check if key is pressed - key_state = win32api.GetAsyncKeyState(key_code) & 0x8000 != 0 - - # Detect key press (transition from not pressed to pressed) - if key_state and not self.lastKeyState: - if self.instructionLabel.text() == "运行中": - self.stop_pressing() - else: - self.start_pressing() - - self.lastKeyState = key_state - - def select_window(self): - """Allow user to select a target window by clicking on it""" - self.selectedWindowLabel.setText("请点击目标窗口...") - - # Hide our window temporarily - self.hide() - QApplication.processEvents() - time.sleep(0.2) # Give a small delay for user to see the message - - # Poll for mouse click - while True: - if win32api.GetAsyncKeyState(0x01) & 0x8000: # Left mouse button pressed - cursor_pos = win32gui.GetCursorPos() - window_handle = win32gui.WindowFromPoint(cursor_pos) - if window_handle: - window_text = win32gui.GetWindowText(window_handle) - self.target_hwnd = window_handle - - # Get process ID for debugging - try: - _, process_id = win32process.GetWindowThreadProcessId(window_handle) - self.debugLabel.setText(f"状态: 已选择窗口 (PID: {process_id})") - except: - pass - - self.selectedWindowLabel.setText(window_text) - break - QApplication.processEvents() - time.sleep(0.1) - - # Show our window again - time.sleep(0.2) # Wait for mouse release - self.show() - - def start_pressing(self): - """Start sending keystrokes to the target window""" - if not self.target_hwnd: - QMessageBox.warning(self, "警告", "请选择窗口后,再点击开始!") - return - - self.instructionLabel.setText("运行中") - self.stop_all_timers() - - # Check if target window still exists - if not win32gui.IsWindow(self.target_hwnd): - QMessageBox.warning(self, "警告", "目标窗口已关闭,请重新选择!") - self.target_hwnd = None - self.selectedWindowLabel.setText("未选择窗口") - self.instructionLabel.setText("停止中") - return - - # Try to attach to target window thread if option is checked - if self.attachThreadCheckBox.isChecked(): - try: - target_thread_id = win32process.GetWindowThreadProcessId(self.target_hwnd)[0] - current_thread_id = win32api.GetCurrentThreadId() - win32process.AttachThreadInput(current_thread_id, target_thread_id, True) - self.debugLabel.setText("状态: 已关联线程输入") - except Exception as e: - self.debugLabel.setText(f"状态: 线程关联失败 ({str(e)})") - - # Start the space key timer if checked - if self.spaceCheckBox.isChecked(): - self.press_space() - interval = int(self.spaceIntervalLineEdit.text()) - self.spaceTimer.start(interval) - - # 如果选中,启动鼠标点击定时器 - if self.mouseCheckBox.isChecked(): - self.click_mouse() # 立即执行 - interval = int(self.mouseIntervalLineEdit.text()) - self.mouseTimer.start(interval) - - # Start the custom key timers if checked - for i in range(10): - if self.keyCheckBoxes[i].isChecked() and self.keyCombos[i].currentIndex() != -1: - self.press_keys(i) - interval = int(self.intervalLineEdits[i].text()) - self.timers[i].start(interval) - - def stop_pressing(self): - """Stop sending keystrokes""" - self.instructionLabel.setText("停止中") - self.stop_all_timers() - - # Try to detach from target window thread if option is checked - if self.attachThreadCheckBox.isChecked() and self.target_hwnd: - try: - target_thread_id = win32process.GetWindowThreadProcessId(self.target_hwnd)[0] - current_thread_id = win32api.GetCurrentThreadId() - win32process.AttachThreadInput(current_thread_id, target_thread_id, False) - self.debugLabel.setText("状态: 已解除线程关联") - except: - pass - - def about_me(self): - """Show the about dialog""" - about_dialog = AboutMeDlg(self) - about_dialog.exec_() - - def stop_all_timers(self): - """Stop all key press timers""" - self.spaceTimer.stop() - self.mouseTimer.stop() # 添加鼠标定时器停止 - for timer in self.timers: - timer.stop() - - def press_space(self): - """Send space key to target window""" - if self.target_hwnd and win32gui.IsWindow(self.target_hwnd): - key_mode = self.modeComboBox.currentData() - key_code = VK_SPACE - - if key_mode == "post": - # Use PostMessage method (original method) - scan_code = win32api.MapVirtualKey(key_code, 0) - - # Key down - lparam = (scan_code << 16) | 1 - win32gui.PostMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) - - # Key up - lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) - win32gui.PostMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) - - elif key_mode == "send_message": - # Use SendMessage method (synchronous, might work better for some apps) - scan_code = win32api.MapVirtualKey(key_code, 0) - - # Key down - lparam = (scan_code << 16) | 1 - win32gui.SendMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) - - # Send WM_CHAR message (important for text input) - win32gui.SendMessage(self.target_hwnd, WM_CHAR, ord(' '), lparam) - - # Key up - lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) - win32gui.SendMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) - - else: # send mode - uses SendInput - # Use SendInput method (works for background windows sometimes) - self.send_key(key_code) - - def press_keys(self, index): - """Send keys to target window""" - if self.target_hwnd and win32gui.IsWindow(self.target_hwnd): - key_code = self.keyCombos[index].currentData() - key_mode = self.modeComboBox.currentData() - - if key_mode == "post": - # Use PostMessage method (original method) - scan_code = win32api.MapVirtualKey(key_code, 0) - - # Key down - lparam = (scan_code << 16) | 1 - win32gui.PostMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) - - # Send WM_CHAR for regular keys - if key_code >= ord('A') and key_code <= ord('Z'): - # Convert to lowercase for character input - char_code = key_code + 32 # ASCII difference between uppercase and lowercase - win32gui.PostMessage(self.target_hwnd, WM_CHAR, char_code, lparam) - elif key_code >= ord('0') and key_code <= ord('9') or key_code == VK_SPACE: - win32gui.PostMessage(self.target_hwnd, WM_CHAR, key_code, lparam) - - # Key up - lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) - win32gui.PostMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) - - elif key_mode == "send_message": - # Use SendMessage method (synchronous, might work better for some apps) - scan_code = win32api.MapVirtualKey(key_code, 0) - - # Key down - lparam = (scan_code << 16) | 1 - win32gui.SendMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) - - # Send WM_CHAR for regular keys - if key_code >= ord('A') and key_code <= ord('Z'): - # Convert to lowercase for character input - char_code = key_code + 32 # ASCII difference between uppercase and lowercase - win32gui.SendMessage(self.target_hwnd, WM_CHAR, char_code, lparam) - elif key_code >= ord('0') and key_code <= ord('9') or key_code == VK_SPACE: - win32gui.SendMessage(self.target_hwnd, WM_CHAR, key_code, lparam) - - # Key up - lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) - win32gui.SendMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) - - else: # send mode - uses SendInput - # Use SendInput method (works for background windows sometimes) - self.send_key(key_code) - - def send_key(self, key_code): - """Send a key press using SendInput (works for background windows sometimes)""" - # Try to set target window to foreground (optional, may help in some cases) - try: - if self.target_hwnd: - win32gui.SetForegroundWindow(self.target_hwnd) - except: - pass # Ignore if activation fails - - # Create Input structure for key down - inputs = (INPUT * 2)() - - # Key down event - inputs[0].type = INPUT_KEYBOARD - inputs[0].u.ki.wVk = key_code - inputs[0].u.ki.wScan = win32api.MapVirtualKey(key_code, 0) - inputs[0].u.ki.dwFlags = 0 - inputs[0].u.ki.time = 0 - inputs[0].u.ki.dwExtraInfo = None - - # Key up event - inputs[1].type = INPUT_KEYBOARD - inputs[1].u.ki.wVk = key_code - inputs[1].u.ki.wScan = win32api.MapVirtualKey(key_code, 0) - inputs[1].u.ki.dwFlags = KEYEVENTF_KEYUP - inputs[1].u.ki.time = 0 - inputs[1].u.ki.dwExtraInfo = None - - # Send input - ctypes.windll.user32.SendInput(2, ctypes.byref(inputs), ctypes.sizeof(INPUT)) - - def click_mouse(self): - """向目标窗口发送鼠标点击""" - if self.target_hwnd and win32gui.IsWindow(self.target_hwnd): - key_mode = self.modeComboBox.currentData() - - # 获取窗口客户区坐标 - try: - # 获取窗口矩形和客户区矩形 - #window_rect = win32gui.GetWindowRect(self.target_hwnd) - #client_rect = win32gui.GetClientRect(self.target_hwnd) - - # 计算客户区中心 - #client_center_x = client_rect[2] // 2 - #client_center_y = client_rect[3] // 2 - - # 将客户区坐标映射到屏幕坐标 - #pt = win32gui.ClientToScreen(self.target_hwnd, (client_center_x, client_center_y)) - - if key_mode == "post" or key_mode == "send_message": - # 使用PostMessage/SendMessage进行鼠标点击 - # 将屏幕坐标转换为客户区坐标 - #client_pt = win32gui.ScreenToClient(self.target_hwnd, pt) - lparam = 0 #client_pt[0] | (client_pt[1] << 16) - - if key_mode == "post": - # 鼠标按下 - win32gui.PostMessage(self.target_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lparam) - # 鼠标抬起 - win32gui.PostMessage(self.target_hwnd, win32con.WM_LBUTTONUP, 0, lparam) - else: # send_message - # 鼠标按下 - win32gui.SendMessage(self.target_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lparam) - # 鼠标抬起 - win32gui.SendMessage(self.target_hwnd, win32con.WM_LBUTTONUP, 0, lparam) - - else: # send模式 - 使用SendInput - # 移动光标到目标位置(可选,某些应用程序可能需要) - #try: - # win32api.SetCursorPos(pt) - #except: - # pass - - # 初始化鼠标输入结构 - inputs = (INPUT * 2)() - - # 鼠标按下事件 - inputs[0].type = INPUT_MOUSE - inputs[0].u.mi.dx = 0 #pt[0] - inputs[0].u.mi.dy = 0 #pt[1] - inputs[0].u.mi.mouseData = 0 - inputs[0].u.mi.dwFlags = MOUSEEVENTF_LEFTDOWN - inputs[0].u.mi.time = 0 - inputs[0].u.mi.dwExtraInfo = None - - # 鼠标抬起事件 - inputs[1].type = INPUT_MOUSE - inputs[1].u.mi.dx = 0 #pt[0] - inputs[1].u.mi.dy = 0 #pt[1] - inputs[1].u.mi.mouseData = 0 - inputs[1].u.mi.dwFlags = MOUSEEVENTF_LEFTUP - inputs[1].u.mi.time = 0 - inputs[1].u.mi.dwExtraInfo = None - - # 发送输入 - ctypes.windll.user32.SendInput(2, ctypes.byref(inputs), ctypes.sizeof(INPUT)) - - except Exception as e: - print(f"发送鼠标点击时出错: {str(e)}") - - def load_settings(self): - """Load saved settings""" - settings = QSettings("FinnSoft", "KeyPresser") - - # 在load_settings方法中添加: - self.mouseCheckBox.setChecked(settings.value("mouseCheckBox", False, type=bool)) - self.mouseIntervalLineEdit.setText(settings.value("mouseIntervalLineEdit", "1000")) - - self.spaceCheckBox.setChecked(settings.value("spaceCheckBox", False, type=bool)) - self.spaceIntervalLineEdit.setText(settings.value("spaceIntervalLineEdit", "1000")) - - # Mode selection - mode_index = settings.value("modeIndex", 0, type=int) - if 0 <= mode_index < self.modeComboBox.count(): - self.modeComboBox.setCurrentIndex(mode_index) - - # Thread attachment option - self.attachThreadCheckBox.setChecked(settings.value("attachThread", True, type=bool)) - - for i in range(10): - self.keyCheckBoxes[i].setChecked(settings.value(f"keyCheckBox{i}", False, type=bool)) - combo_index = settings.value(f"keyCombo{i}", 0, type=int) - if 0 <= combo_index < self.keyCombos[i].count(): - self.keyCombos[i].setCurrentIndex(combo_index) - self.intervalLineEdits[i].setText(settings.value(f"intervalLineEdit{i}", "1000")) - - # Hotkey - hotkey_index = settings.value("hotkeyIndex", 47, type=int) # Default to Home key - if 0 <= hotkey_index < self.hotkeyComboBox.count(): - self.hotkeyComboBox.setCurrentIndex(hotkey_index) - - def save_settings(self): - """Save current settings""" - settings = QSettings("FinnSoft", "KeyPresser") - - settings.setValue("spaceCheckBox", self.spaceCheckBox.isChecked()) - settings.setValue("spaceIntervalLineEdit", self.spaceIntervalLineEdit.text()) - - # 在save_settings方法中添加: - settings.setValue("mouseCheckBox", self.mouseCheckBox.isChecked()) - settings.setValue("mouseIntervalLineEdit", self.mouseIntervalLineEdit.text()) - - # Mode selection - settings.setValue("modeIndex", self.modeComboBox.currentIndex()) - - # Thread attachment option - settings.setValue("attachThread", self.attachThreadCheckBox.isChecked()) - - for i in range(10): - settings.setValue(f"keyCheckBox{i}", self.keyCheckBoxes[i].isChecked()) - settings.setValue(f"keyCombo{i}", self.keyCombos[i].currentIndex()) - settings.setValue(f"intervalLineEdit{i}", self.intervalLineEdits[i].text()) - - # Hotkey - settings.setValue("hotkeyIndex", self.hotkeyComboBox.currentIndex()) - - def closeEvent(self, event): - """Handle window close event""" - self.save_settings() - super().closeEvent(event) - - -if __name__ == '__main__': - # 启用高DPI缩放支持 - if hasattr(Qt, 'AA_EnableHighDpiScaling'): - QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) - if hasattr(Qt, 'AA_UseHighDpiPixmaps'): - QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) - - app = QApplication(sys.argv) - app.setWindowIcon(QIcon(':/aaa.ico')) - window = KeyPresser() - window.show() - sys.exit(app.exec_()) \ No newline at end of file diff --git a/poetry.lock b/poetry.lock deleted file mode 100644 index 3f56cdd..0000000 --- a/poetry.lock +++ /dev/null @@ -1,3567 +0,0 @@ -# This file is automatically @generated by Poetry 2.1.1 and should not be changed by hand. - -[[package]] -name = "future" -version = "1.0.0" -description = "Clean single-source support for Python 3 and 2" -optional = false -python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" -groups = ["main"] -files = [ - {file = "future-1.0.0-py3-none-any.whl", hash = "sha256:929292d34f5872e70396626ef385ec22355a1fae8ad29e1a734c3e43f9fbc216"}, - {file = "future-1.0.0.tar.gz", hash = "sha256:bd2968309307861edae1458a4f8a4f3598c03be43b97521076aebf5d94c07b05"}, -] - -[[package]] -name = "iso8601" -version = "0.1.16" -description = "Simple module to parse ISO 8601 dates" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "iso8601-0.1.16-py2.py3-none-any.whl", hash = "sha256:906714829fedbc89955d52806c903f2332e3948ed94e31e85037f9e0226b8376"}, - {file = "iso8601-0.1.16.tar.gz", hash = "sha256:36532f77cc800594e8f16641edae7f1baf7932f05d8e508545b95fc53c6dc85b"}, -] - -[[package]] -name = "keyboard" -version = "0.13.5" -description = "Hook and simulate keyboard events on Windows and Linux" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "keyboard-0.13.5-py3-none-any.whl", hash = "sha256:8e9c2422f1217e0bd84489b9ecd361027cc78415828f4fe4f88dd4acd587947b"}, - {file = "keyboard-0.13.5.zip", hash = "sha256:63ed83305955939ca5c9a73755e5cc43e8242263f5ad5fd3bb7e0b032f3d308b"}, -] - -[package.dependencies] -pyobjc = {version = "*", markers = "sys_platform == \"darwin\""} - -[[package]] -name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." -optional = false -python-versions = ">=3.6" -groups = ["main"] -files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, -] - -[package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] - -[[package]] -name = "pyobjc" -version = "11.0" -description = "Python<->ObjC Interoperability Module" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc-11.0-py3-none-any.whl", hash = "sha256:3ed5e4e993192fd7fadd42a4148d266a3587af7453ea3b240bab724d02e34e64"}, - {file = "pyobjc-11.0.tar.gz", hash = "sha256:a8f7baed65797f67afd46290b02f652c23f4b158ddf960bce0441b78f6803418"}, -] - -[package.dependencies] -pyobjc-core = "11.0" -pyobjc-framework-Accessibility = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Accounts = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AddressBook = "11.0" -pyobjc-framework-AdServices = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AdSupport = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-AppleScriptKit = "11.0" -pyobjc-framework-AppleScriptObjC = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-ApplicationServices = "11.0" -pyobjc-framework-AppTrackingTransparency = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-AudioVideoBridging = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-AuthenticationServices = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-AutomaticAssessmentConfiguration = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Automator = "11.0" -pyobjc-framework-AVFoundation = {version = "11.0", markers = "platform_release >= \"11.0\""} -pyobjc-framework-AVKit = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-AVRouting = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BackgroundAssets = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-BrowserEngineKit = {version = "11.0", markers = "platform_release >= \"23.4\""} -pyobjc-framework-BusinessChat = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-CalendarStore = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-CallKit = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Carbon = "11.0" -pyobjc-framework-CFNetwork = "11.0" -pyobjc-framework-Cinematic = {version = "11.0", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ClassKit = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-CloudKit = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-Cocoa = "11.0" -pyobjc-framework-Collaboration = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-ColorSync = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-Contacts = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-ContactsUI = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-CoreAudio = "11.0" -pyobjc-framework-CoreAudioKit = "11.0" -pyobjc-framework-CoreBluetooth = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-CoreData = "11.0" -pyobjc-framework-CoreHaptics = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreLocation = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CoreMedia = {version = "11.0", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMediaIO = {version = "11.0", markers = "platform_release >= \"11.0\""} -pyobjc-framework-CoreMIDI = "11.0" -pyobjc-framework-CoreML = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreMotion = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-CoreServices = "11.0" -pyobjc-framework-CoreSpotlight = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-CoreText = "11.0" -pyobjc-framework-CoreWLAN = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-CryptoTokenKit = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-DataDetection = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-DeviceCheck = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-DeviceDiscoveryExtension = {version = "11.0", markers = "platform_release >= \"24.0\""} -pyobjc-framework-DictionaryServices = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-DiscRecording = "11.0" -pyobjc-framework-DiscRecordingUI = "11.0" -pyobjc-framework-DiskArbitration = "11.0" -pyobjc-framework-DVDPlayback = "11.0" -pyobjc-framework-EventKit = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-ExceptionHandling = "11.0" -pyobjc-framework-ExecutionPolicy = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ExtensionKit = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ExternalAccessory = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-FileProvider = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FileProviderUI = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-FinderSync = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-FSEvents = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-GameCenter = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameController = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-GameKit = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-GameplayKit = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-HealthKit = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ImageCaptureCore = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-InputMethodKit = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-InstallerPlugins = "11.0" -pyobjc-framework-InstantMessage = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-Intents = {version = "11.0", markers = "platform_release >= \"16.0\""} -pyobjc-framework-IntentsUI = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-IOBluetooth = "11.0" -pyobjc-framework-IOBluetoothUI = "11.0" -pyobjc-framework-IOSurface = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-iTunesLibrary = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-KernelManagement = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-LatentSemanticMapping = "11.0" -pyobjc-framework-LaunchServices = "11.0" -pyobjc-framework-libdispatch = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-libxpc = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-LinkPresentation = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-LocalAuthentication = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-LocalAuthenticationEmbeddedUI = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MailKit = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MapKit = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaAccessibility = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaExtension = {version = "11.0", markers = "platform_release >= \"24.0\""} -pyobjc-framework-MediaLibrary = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-MediaPlayer = {version = "11.0", markers = "platform_release >= \"16.0\""} -pyobjc-framework-MediaToolbox = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-Metal = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalFX = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-MetalKit = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MetalPerformanceShaders = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-MetalPerformanceShadersGraph = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-MetricKit = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-MLCompute = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ModelIO = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-MultipeerConnectivity = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-NaturalLanguage = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetFS = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-Network = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-NetworkExtension = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-NotificationCenter = {version = "11.0", markers = "platform_release >= \"14.0\""} -pyobjc-framework-OpenDirectory = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-OSAKit = "11.0" -pyobjc-framework-OSLog = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PassKit = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-PencilKit = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-PHASE = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Photos = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PhotosUI = {version = "11.0", markers = "platform_release >= \"15.0\""} -pyobjc-framework-PreferencePanes = "11.0" -pyobjc-framework-PubSub = {version = "11.0", markers = "platform_release >= \"9.0\" and platform_release < \"18.0\""} -pyobjc-framework-PushKit = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Quartz = "11.0" -pyobjc-framework-QuickLookThumbnailing = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ReplayKit = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-SafariServices = {version = "11.0", markers = "platform_release >= \"16.0\""} -pyobjc-framework-SafetyKit = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SceneKit = {version = "11.0", markers = "platform_release >= \"11.0\""} -pyobjc-framework-ScreenCaptureKit = {version = "11.0", markers = "platform_release >= \"21.4\""} -pyobjc-framework-ScreenSaver = "11.0" -pyobjc-framework-ScreenTime = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-ScriptingBridge = {version = "11.0", markers = "platform_release >= \"9.0\""} -pyobjc-framework-SearchKit = "11.0" -pyobjc-framework-Security = "11.0" -pyobjc-framework-SecurityFoundation = "11.0" -pyobjc-framework-SecurityInterface = "11.0" -pyobjc-framework-SensitiveContentAnalysis = {version = "11.0", markers = "platform_release >= \"23.0\""} -pyobjc-framework-ServiceManagement = {version = "11.0", markers = "platform_release >= \"10.0\""} -pyobjc-framework-SharedWithYou = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-SharedWithYouCore = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-ShazamKit = {version = "11.0", markers = "platform_release >= \"21.0\""} -pyobjc-framework-Social = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-SoundAnalysis = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-Speech = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-SpriteKit = {version = "11.0", markers = "platform_release >= \"13.0\""} -pyobjc-framework-StoreKit = {version = "11.0", markers = "platform_release >= \"11.0\""} -pyobjc-framework-Symbols = {version = "11.0", markers = "platform_release >= \"23.0\""} -pyobjc-framework-SyncServices = "11.0" -pyobjc-framework-SystemConfiguration = "11.0" -pyobjc-framework-SystemExtensions = {version = "11.0", markers = "platform_release >= \"19.0\""} -pyobjc-framework-ThreadNetwork = {version = "11.0", markers = "platform_release >= \"22.0\""} -pyobjc-framework-UniformTypeIdentifiers = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-UserNotifications = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-UserNotificationsUI = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-VideoSubscriberAccount = {version = "11.0", markers = "platform_release >= \"18.0\""} -pyobjc-framework-VideoToolbox = {version = "11.0", markers = "platform_release >= \"12.0\""} -pyobjc-framework-Virtualization = {version = "11.0", markers = "platform_release >= \"20.0\""} -pyobjc-framework-Vision = {version = "11.0", markers = "platform_release >= \"17.0\""} -pyobjc-framework-WebKit = "11.0" - -[package.extras] -allbindings = ["pyobjc-core (==11.0)", "pyobjc-framework-AVFoundation (==11.0)", "pyobjc-framework-AVKit (==11.0)", "pyobjc-framework-AVRouting (==11.0)", "pyobjc-framework-Accessibility (==11.0)", "pyobjc-framework-Accounts (==11.0)", "pyobjc-framework-AdServices (==11.0)", "pyobjc-framework-AdSupport (==11.0)", "pyobjc-framework-AddressBook (==11.0)", "pyobjc-framework-AppTrackingTransparency (==11.0)", "pyobjc-framework-AppleScriptKit (==11.0)", "pyobjc-framework-AppleScriptObjC (==11.0)", "pyobjc-framework-ApplicationServices (==11.0)", "pyobjc-framework-AudioVideoBridging (==11.0)", "pyobjc-framework-AuthenticationServices (==11.0)", "pyobjc-framework-AutomaticAssessmentConfiguration (==11.0)", "pyobjc-framework-Automator (==11.0)", "pyobjc-framework-BackgroundAssets (==11.0)", "pyobjc-framework-BrowserEngineKit (==11.0)", "pyobjc-framework-BusinessChat (==11.0)", "pyobjc-framework-CFNetwork (==11.0)", "pyobjc-framework-CalendarStore (==11.0)", "pyobjc-framework-CallKit (==11.0)", "pyobjc-framework-Carbon (==11.0)", "pyobjc-framework-Cinematic (==11.0)", "pyobjc-framework-ClassKit (==11.0)", "pyobjc-framework-CloudKit (==11.0)", "pyobjc-framework-Cocoa (==11.0)", "pyobjc-framework-Collaboration (==11.0)", "pyobjc-framework-ColorSync (==11.0)", "pyobjc-framework-Contacts (==11.0)", "pyobjc-framework-ContactsUI (==11.0)", "pyobjc-framework-CoreAudio (==11.0)", "pyobjc-framework-CoreAudioKit (==11.0)", "pyobjc-framework-CoreBluetooth (==11.0)", "pyobjc-framework-CoreData (==11.0)", "pyobjc-framework-CoreHaptics (==11.0)", "pyobjc-framework-CoreLocation (==11.0)", "pyobjc-framework-CoreMIDI (==11.0)", "pyobjc-framework-CoreML (==11.0)", "pyobjc-framework-CoreMedia (==11.0)", "pyobjc-framework-CoreMediaIO (==11.0)", "pyobjc-framework-CoreMotion (==11.0)", "pyobjc-framework-CoreServices (==11.0)", "pyobjc-framework-CoreSpotlight (==11.0)", "pyobjc-framework-CoreText (==11.0)", "pyobjc-framework-CoreWLAN (==11.0)", "pyobjc-framework-CryptoTokenKit (==11.0)", "pyobjc-framework-DVDPlayback (==11.0)", "pyobjc-framework-DataDetection (==11.0)", "pyobjc-framework-DeviceCheck (==11.0)", "pyobjc-framework-DeviceDiscoveryExtension (==11.0)", "pyobjc-framework-DictionaryServices (==11.0)", "pyobjc-framework-DiscRecording (==11.0)", "pyobjc-framework-DiscRecordingUI (==11.0)", "pyobjc-framework-DiskArbitration (==11.0)", "pyobjc-framework-EventKit (==11.0)", "pyobjc-framework-ExceptionHandling (==11.0)", "pyobjc-framework-ExecutionPolicy (==11.0)", "pyobjc-framework-ExtensionKit (==11.0)", "pyobjc-framework-ExternalAccessory (==11.0)", "pyobjc-framework-FSEvents (==11.0)", "pyobjc-framework-FileProvider (==11.0)", "pyobjc-framework-FileProviderUI (==11.0)", "pyobjc-framework-FinderSync (==11.0)", "pyobjc-framework-GameCenter (==11.0)", "pyobjc-framework-GameController (==11.0)", "pyobjc-framework-GameKit (==11.0)", "pyobjc-framework-GameplayKit (==11.0)", "pyobjc-framework-HealthKit (==11.0)", "pyobjc-framework-IOBluetooth (==11.0)", "pyobjc-framework-IOBluetoothUI (==11.0)", "pyobjc-framework-IOSurface (==11.0)", "pyobjc-framework-ImageCaptureCore (==11.0)", "pyobjc-framework-InputMethodKit (==11.0)", "pyobjc-framework-InstallerPlugins (==11.0)", "pyobjc-framework-InstantMessage (==11.0)", "pyobjc-framework-Intents (==11.0)", "pyobjc-framework-IntentsUI (==11.0)", "pyobjc-framework-KernelManagement (==11.0)", "pyobjc-framework-LatentSemanticMapping (==11.0)", "pyobjc-framework-LaunchServices (==11.0)", "pyobjc-framework-LinkPresentation (==11.0)", "pyobjc-framework-LocalAuthentication (==11.0)", "pyobjc-framework-LocalAuthenticationEmbeddedUI (==11.0)", "pyobjc-framework-MLCompute (==11.0)", "pyobjc-framework-MailKit (==11.0)", "pyobjc-framework-MapKit (==11.0)", "pyobjc-framework-MediaAccessibility (==11.0)", "pyobjc-framework-MediaExtension (==11.0)", "pyobjc-framework-MediaLibrary (==11.0)", "pyobjc-framework-MediaPlayer (==11.0)", "pyobjc-framework-MediaToolbox (==11.0)", "pyobjc-framework-Metal (==11.0)", "pyobjc-framework-MetalFX (==11.0)", "pyobjc-framework-MetalKit (==11.0)", "pyobjc-framework-MetalPerformanceShaders (==11.0)", "pyobjc-framework-MetalPerformanceShadersGraph (==11.0)", "pyobjc-framework-MetricKit (==11.0)", "pyobjc-framework-ModelIO (==11.0)", "pyobjc-framework-MultipeerConnectivity (==11.0)", "pyobjc-framework-NaturalLanguage (==11.0)", "pyobjc-framework-NetFS (==11.0)", "pyobjc-framework-Network (==11.0)", "pyobjc-framework-NetworkExtension (==11.0)", "pyobjc-framework-NotificationCenter (==11.0)", "pyobjc-framework-OSAKit (==11.0)", "pyobjc-framework-OSLog (==11.0)", "pyobjc-framework-OpenDirectory (==11.0)", "pyobjc-framework-PHASE (==11.0)", "pyobjc-framework-PassKit (==11.0)", "pyobjc-framework-PencilKit (==11.0)", "pyobjc-framework-Photos (==11.0)", "pyobjc-framework-PhotosUI (==11.0)", "pyobjc-framework-PreferencePanes (==11.0)", "pyobjc-framework-PubSub (==11.0)", "pyobjc-framework-PushKit (==11.0)", "pyobjc-framework-Quartz (==11.0)", "pyobjc-framework-QuickLookThumbnailing (==11.0)", "pyobjc-framework-ReplayKit (==11.0)", "pyobjc-framework-SafariServices (==11.0)", "pyobjc-framework-SafetyKit (==11.0)", "pyobjc-framework-SceneKit (==11.0)", "pyobjc-framework-ScreenCaptureKit (==11.0)", "pyobjc-framework-ScreenSaver (==11.0)", "pyobjc-framework-ScreenTime (==11.0)", "pyobjc-framework-ScriptingBridge (==11.0)", "pyobjc-framework-SearchKit (==11.0)", "pyobjc-framework-Security (==11.0)", "pyobjc-framework-SecurityFoundation (==11.0)", "pyobjc-framework-SecurityInterface (==11.0)", "pyobjc-framework-SensitiveContentAnalysis (==11.0)", "pyobjc-framework-ServiceManagement (==11.0)", "pyobjc-framework-SharedWithYou (==11.0)", "pyobjc-framework-SharedWithYouCore (==11.0)", "pyobjc-framework-ShazamKit (==11.0)", "pyobjc-framework-Social (==11.0)", "pyobjc-framework-SoundAnalysis (==11.0)", "pyobjc-framework-Speech (==11.0)", "pyobjc-framework-SpriteKit (==11.0)", "pyobjc-framework-StoreKit (==11.0)", "pyobjc-framework-Symbols (==11.0)", "pyobjc-framework-SyncServices (==11.0)", "pyobjc-framework-SystemConfiguration (==11.0)", "pyobjc-framework-SystemExtensions (==11.0)", "pyobjc-framework-ThreadNetwork (==11.0)", "pyobjc-framework-UniformTypeIdentifiers (==11.0)", "pyobjc-framework-UserNotifications (==11.0)", "pyobjc-framework-UserNotificationsUI (==11.0)", "pyobjc-framework-VideoSubscriberAccount (==11.0)", "pyobjc-framework-VideoToolbox (==11.0)", "pyobjc-framework-Virtualization (==11.0)", "pyobjc-framework-Vision (==11.0)", "pyobjc-framework-WebKit (==11.0)", "pyobjc-framework-iTunesLibrary (==11.0)", "pyobjc-framework-libdispatch (==11.0)", "pyobjc-framework-libxpc (==11.0)"] - -[[package]] -name = "pyobjc-core" -version = "11.0" -description = "Python<->ObjC Interoperability Module" -optional = false -python-versions = ">=3.8" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_core-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:10866b3a734d47caf48e456eea0d4815c2c9b21856157db5917b61dee06893a1"}, - {file = "pyobjc_core-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:50675c0bb8696fe960a28466f9baf6943df2928a1fd85625d678fa2f428bd0bd"}, - {file = "pyobjc_core-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a03061d4955c62ddd7754224a80cdadfdf17b6b5f60df1d9169a3b1b02923f0b"}, - {file = "pyobjc_core-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c338c1deb7ab2e9436d4175d1127da2eeed4a1b564b3d83b9f3ae4844ba97e86"}, - {file = "pyobjc_core-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b4e9dc4296110f251a4033ff3f40320b35873ea7f876bd29a1c9705bb5e08c59"}, - {file = "pyobjc_core-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:02406ece449d0f41b31e579e47ca77ced3eb57533df955281bfcecc99da74fba"}, - {file = "pyobjc_core-11.0.tar.gz", hash = "sha256:63bced211cb8a8fb5c8ff46473603da30e51112861bd02c438fbbbc8578d9a70"}, -] - -[[package]] -name = "pyobjc-framework-accessibility" -version = "11.0" -description = "Wrappers for the framework Accessibility on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_Accessibility-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:429122cc8822aff514ff220316c047cc079b8e6cb2e78afc531ba76ae624f8b5"}, - {file = "pyobjc_framework_Accessibility-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c3a751d17b288bb56a98a10b52b253b3002c885fe686b604788acac1e9739437"}, - {file = "pyobjc_framework_Accessibility-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:34536f3d60aeda618b384b1207a8c6f9978de278ce229c3469ef14fd27a3befa"}, - {file = "pyobjc_framework_Accessibility-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:015dd93ef92a135ef916b27362f608898be059b16dc434decc0bb00c0f183632"}, - {file = "pyobjc_framework_Accessibility-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b91e80179ebc32b2f1bbac53c6b6756c063abd4f34160d863223ab7af5d29c8c"}, - {file = "pyobjc_framework_Accessibility-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:333fb98b255e17b33026469f3fc6ebe935ab2b7cc1a523f014b8804d544cf3a6"}, - {file = "pyobjc_framework_accessibility-11.0.tar.gz", hash = "sha256:097450c641fa9ac665199762e77867f2a82775be2f749b8fa69223b828f60656"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-accounts" -version = "11.0" -description = "Wrappers for the framework Accounts on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_Accounts-11.0-py2.py3-none-any.whl", hash = "sha256:3e4b494e1158e3250e4b4a09e9ff33b38f82d31aefe50dd47152c4a20ecdeec4"}, - {file = "pyobjc_framework_Accounts-11.0-py3-none-any.whl", hash = "sha256:ad0e378bd07ca7c88b45cda63b85424bc344e81ea44c0ae7327872d91cad311a"}, - {file = "pyobjc_framework_accounts-11.0.tar.gz", hash = "sha256:afc4ae277be1e3e1f90269001c2fd886093a5465e365d7f9a3a0af3e17f06210"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-addressbook" -version = "11.0" -description = "Wrappers for the framework AddressBook on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_AddressBook-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8daa1eb6883089e7ab8366bb809b28bbca7a1dca751b0c7bb235107eaa3f43a3"}, - {file = "pyobjc_framework_AddressBook-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:af7de23aac7571a3b9dad5b2881d8f186653aa72903db8d7dbfd2c7b993156b9"}, - {file = "pyobjc_framework_AddressBook-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3b634ef80920ab9208f2937527e4a498e7afa6e2ceb639ebb483387ab5b9accc"}, - {file = "pyobjc_framework_AddressBook-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1037e3c80ef501c78cfd1586e628ef5fb1acad611fe8b7a201142369ab242a8b"}, - {file = "pyobjc_framework_AddressBook-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:faec97a6d06d4c468b2e6a4143e117dc56387a96aa72c91c6976985e108df358"}, - {file = "pyobjc_framework_AddressBook-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7fef82569157d6e24d5b25e39f5bdba21eae8f14fa35467abb8a093577432aa2"}, - {file = "pyobjc_framework_addressbook-11.0.tar.gz", hash = "sha256:87073c85bb342eb27faa6eceb7a0e8a4c1e32ad1f2b62bb12dafb5e7b9f15837"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-adservices" -version = "11.0" -description = "Wrappers for the framework AdServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_AdServices-11.0-py2.py3-none-any.whl", hash = "sha256:7cd1458f60175cd46bd88061c20e82f04b2576fc00bc5d54d67c18dcb870e27f"}, - {file = "pyobjc_framework_AdServices-11.0-py3-none-any.whl", hash = "sha256:6426d4e4a43f5ee5ce7bab44d85647dbded3e17c0c62d8923cebaf927c4162ca"}, - {file = "pyobjc_framework_adservices-11.0.tar.gz", hash = "sha256:d2e1a2f395e93e1bbe754ab0d76ce1d64c0d3928472634437e0382eafc6765cd"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-adsupport" -version = "11.0" -description = "Wrappers for the framework AdSupport on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_AdSupport-11.0-py2.py3-none-any.whl", hash = "sha256:59161f5046def176d3aa6fdd6a05916029ca69ac69f836c67e0dd780a5efcf0f"}, - {file = "pyobjc_framework_AdSupport-11.0-py3-none-any.whl", hash = "sha256:91ba05eb5602911287bd04b0efefb7a485f9af255095b87c3e77bb7d1d1242ed"}, - {file = "pyobjc_framework_adsupport-11.0.tar.gz", hash = "sha256:20eb8a683d34fb7a6efeceaf964a24b88c3434875c44f66db5e1b609e678043a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-applescriptkit" -version = "11.0" -description = "Wrappers for the framework AppleScriptKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_AppleScriptKit-11.0-py2.py3-none-any.whl", hash = "sha256:e8acc5ca99f5123ec4e60cb356c7cc407d5fe533ca53e5fa341b51f65495973b"}, - {file = "pyobjc_framework_AppleScriptKit-11.0-py3-none-any.whl", hash = "sha256:92cffd943a4d17f684bb51245744e9d0bb8992b2967125845dfeab09d26fc624"}, - {file = "pyobjc_framework_applescriptkit-11.0.tar.gz", hash = "sha256:4bafac4a036f0fb8ba01488b8e91d3ac861ce6e61154ffbd0b26f82b99779b50"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-applescriptobjc" -version = "11.0" -description = "Wrappers for the framework AppleScriptObjC on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_AppleScriptObjC-11.0-py2.py3-none-any.whl", hash = "sha256:a4c8d417fdb64180a283eadf8ddb804ba7f9e3cef149216a11b65e1d3509c55b"}, - {file = "pyobjc_framework_AppleScriptObjC-11.0-py3-none-any.whl", hash = "sha256:681006b0cdf0279cd06b6d0f62b542b7f3b3b9b5d2391f7aa3798d8b355d67bf"}, - {file = "pyobjc_framework_applescriptobjc-11.0.tar.gz", hash = "sha256:baff9988b6e886aed0e76441358417707de9088be5733f22055fed7904ca1001"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-applicationservices" -version = "11.0" -description = "Wrappers for the framework ApplicationServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_ApplicationServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc8f34b5b59ffd3c210ae883d794345c1197558ff3da0f5800669cf16435271e"}, - {file = "pyobjc_framework_ApplicationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:61a99eef23abb704257310db4f5271137707e184768f6407030c01de4731b67b"}, - {file = "pyobjc_framework_ApplicationServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5fbeb425897d6129471d451ec61a29ddd5b1386eb26b1dd49cb313e34616ee21"}, - {file = "pyobjc_framework_ApplicationServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:59becf3cd87a4f4cedf4be02ff6cf46ed736f5c1123ce629f788aaafad91eff0"}, - {file = "pyobjc_framework_ApplicationServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:44b466e8745fb49e8ac20f29f2ffd7895b45e97aa63a844b2a80a97c3a34346f"}, - {file = "pyobjc_framework_ApplicationServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:74963e15a751d1454c1b8060914f116956e3a68f6a117c2163f491609125283b"}, - {file = "pyobjc_framework_applicationservices-11.0.tar.gz", hash = "sha256:d6ea18dfc7d5626a3ecf4ac72d510405c0d3a648ca38cae8db841acdebecf4d2"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreText = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-apptrackingtransparency" -version = "11.0" -description = "Wrappers for the framework AppTrackingTransparency on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_AppTrackingTransparency-11.0-py2.py3-none-any.whl", hash = "sha256:1bf6d4f148d9f5d5befe90fcfd88ce988458a52719d53d5989b08e4fbed58864"}, - {file = "pyobjc_framework_AppTrackingTransparency-11.0-py3-none-any.whl", hash = "sha256:347f876aea9d9f47d9fbf6dfa6d3f250ecd46f56a7c4616386327061e2ecc4e9"}, - {file = "pyobjc_framework_apptrackingtransparency-11.0.tar.gz", hash = "sha256:cd5c834b5b19c21ad6c317ba5d29f30a8d0ae5d14e7cf557da22abc0850f1e91"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-audiovideobridging" -version = "11.0" -description = "Wrappers for the framework AudioVideoBridging on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:224c311d01466ecfba44c2dde3c4f17d4a54d214686d58501c97280a28a9890f"}, - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d025e49ca6238be96d0a1c22942b548a8d445ef8eb71259b4769e119810f42c6"}, - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d414ecffeb23cddc8e64262af170e663c93e8d462d18aa7067d4584069967859"}, - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e2f7a951dd7e6521a745cdd0256a14758bd6f2d878d654eb36c31e2256d7b872"}, - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66f93d00081c48ec2d0b2a5ce8fd1eb18c5aa35bfa598f2a1d2950dcdcee6184"}, - {file = "pyobjc_framework_AudioVideoBridging-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:74118a6a37ce422e63960523fb16b23d92326cefabf4bb93d973fe42928d999a"}, - {file = "pyobjc_framework_audiovideobridging-11.0.tar.gz", hash = "sha256:dbc45b06418dd780c365956fdfd69d007436b5ee54c51e671196562eb8290ba6"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-authenticationservices" -version = "11.0" -description = "Wrappers for the framework AuthenticationServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_AuthenticationServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cd4d3d94cdeb75305cc7239efd17ca89f7b7076e7d279d6b40b6305c40a37f2"}, - {file = "pyobjc_framework_AuthenticationServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84e3b23478cf8995883acfe6c1a24503c84caf2f8dbe540377fe19fb787ce9b2"}, - {file = "pyobjc_framework_AuthenticationServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1779f72c264f749946fcbfba0575a985c1e297d426617739a533554dbf172f9a"}, - {file = "pyobjc_framework_AuthenticationServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ff992eb992d9a012ddc2199813f07fa93d3a0bc6aaff10868aa7d78f27973957"}, - {file = "pyobjc_framework_AuthenticationServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:aacea81274d1860eca1253cad7e57ed50484e73bda4b16002d1651343e4a014f"}, - {file = "pyobjc_framework_AuthenticationServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e70439bcdedce5bcc9a8c138b46dc7b8122c45c1598e229a06ad6121b9ae17d6"}, - {file = "pyobjc_framework_authenticationservices-11.0.tar.gz", hash = "sha256:6a060ce651df142e8923d1383449bc6f2c7f5eb0b517152dac609bde3901064e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-automaticassessmentconfiguration" -version = "11.0" -description = "Wrappers for the framework AutomaticAssessmentConfiguration on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b74262d376ce3eda53c8d7d822d5d59e33141e51c1ed9b224389dd2bf235dc35"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:25f2db399eb0a47e345d0471c7af930f5a3be899ba6edb40bd9125719e4b526f"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b6433452d2c4cdb0eef16cc78a24ba9c61efb5bb04709ee10ca94b69119e889c"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:288bb82674eec04b4eabda8e835aa85cad535feea8845789c1b039a86b662e2b"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4b3839404ca21b1cad7139e708efd7a314e7773bbfbededc8621aea0381b2496"}, - {file = "pyobjc_framework_AutomaticAssessmentConfiguration-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0fccb936592da0ab8e2269a329de7e5d0fd10ecdb151b91f1634a6b39d611fff"}, - {file = "pyobjc_framework_automaticassessmentconfiguration-11.0.tar.gz", hash = "sha256:5d3691af2b94e44ca594b6791556e15a9f0a3f9432df51cb891f5f859a65e467"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-automator" -version = "11.0" -description = "Wrappers for the framework Automator on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_Automator-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8e7366d78206d028312675a9466a80084baecad1950144ddd7fc3c0f10c125ef"}, - {file = "pyobjc_framework_Automator-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:850f9641a54cc8d9a3d02c2d87a4e80aed2413b37aa6c26a7046088b77da5b42"}, - {file = "pyobjc_framework_Automator-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eb1b9b16873ec1d2f8af9a04ca1b2fcaa324ce4a1fada0d02fa239f6fecf773b"}, - {file = "pyobjc_framework_Automator-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ebd8aad30913ff698761b27475764ed8c66314aa1524d636096ee3828a6ae08"}, - {file = "pyobjc_framework_Automator-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:999a1864db68cff47fb1ddd5c3353c5efb2805a9829392dcfc0a11da632e5764"}, - {file = "pyobjc_framework_Automator-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34dba2a86fa1a9b10fafabaa19adb538d798b9fb740a43af063f2eb81006d18f"}, - {file = "pyobjc_framework_automator-11.0.tar.gz", hash = "sha256:412d330f8c6f30066cad15e1bdecdc865510bbce469cc7d9477384c4e9f2550f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-avfoundation" -version = "11.0" -description = "Wrappers for the framework AVFoundation on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"11.0\"" -files = [ - {file = "pyobjc_framework_AVFoundation-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:effb2d8eac6b9ad42008043bd31e69423885c78a11e4e414dc01dd03fff79876"}, - {file = "pyobjc_framework_AVFoundation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:87db350311c1d7e07d68036cdde3d01c09d97b8ba502241c0c1699d7a9c6f2e4"}, - {file = "pyobjc_framework_AVFoundation-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6bb6f4be53c0fb42bee3f46cf0bb5396a8fd13f92d47a01f6b77037a1134f26b"}, - {file = "pyobjc_framework_AVFoundation-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d9d2497acf3e7c5ae4a8175832af249754847b415494422727ac43efe14cc776"}, - {file = "pyobjc_framework_AVFoundation-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:da932d77e29e3f4112d0526918a47c978381d00af23133cb06e0a5f76e92a9b6"}, - {file = "pyobjc_framework_AVFoundation-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8509f0322d27be4eb20007fca3b0497dc420852cfd2467b68100d0102a9a051f"}, - {file = "pyobjc_framework_avfoundation-11.0.tar.gz", hash = "sha256:269a592bdaf8a16948d8935f0cf7c8cb9a53e7ea609a963ada0e55f749ddb530"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreAudio = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-avkit" -version = "11.0" -description = "Wrappers for the framework AVKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_AVKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b5509a4e54965f48fa20b9bb37783905afe0c0893e793910041af0e06fb6fd3e"}, - {file = "pyobjc_framework_AVKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:16b5560860c1e13e692c677ad04d8e194d0b9931dd3f15e3df4dbd7217cc8ab1"}, - {file = "pyobjc_framework_AVKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f4da468b97bb7f356024e31647619cd1cd435b543e467209da0ee0abdfdc7121"}, - {file = "pyobjc_framework_AVKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ce222b1808d19a7d5c2d00e707388dbdca6becf7be172a820ae0270e4fbfc020"}, - {file = "pyobjc_framework_AVKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:f8ccc7314bbbd4df1427706e80493365f5c7884f2c334e1587f6b1cea4066786"}, - {file = "pyobjc_framework_AVKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:475e7a457519761037474203c465556ec08d67bad4ccd5c97e03a95fc10945ed"}, - {file = "pyobjc_framework_avkit-11.0.tar.gz", hash = "sha256:5fa40919320277b820df3e4c6e84cba91ef7221a28f4eb5374e3dbd80d1e521a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-avrouting" -version = "11.0" -description = "Wrappers for the framework AVRouting on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_AVRouting-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:96a1a12b83de8d8b75252e6616a79426c98488af47fe2dc3a49f4dd689dc581d"}, - {file = "pyobjc_framework_AVRouting-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:54e58cd0292f734aba035599f37a0c00f03761e9ff5cf53a0857cec7949bb39c"}, - {file = "pyobjc_framework_AVRouting-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:779db3fb0048b22c5dcf5871930025c0fd93068f87946e8053f31a3366fa6fb0"}, - {file = "pyobjc_framework_AVRouting-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4202f79cd1eaece357941f25f026760bf05bf4b269344d5dabd00e2bfa1bb1ed"}, - {file = "pyobjc_framework_AVRouting-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a338c7d59fd4232babb9ff70f2fd809d2934a60b761a906ae78341a54316bc1f"}, - {file = "pyobjc_framework_AVRouting-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8df64a3074d26aeef8ed41372d0cd4b4d78862776caaa9ebcf19e0c7a5e0adac"}, - {file = "pyobjc_framework_avrouting-11.0.tar.gz", hash = "sha256:54ec9ea0b5adb5149b554e23c07c6b4f4bdb2892ca2ed7b3e88a5de936313025"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-backgroundassets" -version = "11.0" -description = "Wrappers for the framework BackgroundAssets on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_BackgroundAssets-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1bdcef4c0d0149d827a307de1426aeb93eb0507d8ba43686adab300977c943bb"}, - {file = "pyobjc_framework_BackgroundAssets-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:812bcc4eaf71c1cc42e94edc2b5ad0414d16cfe1da5c421edd9382417d625f06"}, - {file = "pyobjc_framework_BackgroundAssets-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:96b3fc40c514867d4a0b3ad4d256bc5134d789e22fa306a6b21e49ecadc51698"}, - {file = "pyobjc_framework_BackgroundAssets-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7ead62c5201e48df340c978d0cf7805813a3b35dfbb4bb45b9a9e34c972e5a70"}, - {file = "pyobjc_framework_BackgroundAssets-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c954b4aa7ece1670bd129d98d779c4a534a10182350a1809341166a4e2cfa893"}, - {file = "pyobjc_framework_BackgroundAssets-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fe7c350b1bde594241485b67d06a7370f2a676267fc6eca3a99ee31f76d19bec"}, - {file = "pyobjc_framework_backgroundassets-11.0.tar.gz", hash = "sha256:9488c3f86bf427898a88b7100e77200c08a487a35c75c1b5735bd69c57ba38cb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-browserenginekit" -version = "11.0" -description = "Wrappers for the framework BrowserEngineKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"23.4\"" -files = [ - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b519e5f1441c12e4df0042bfee7f743dd9dc93972190b1f2d65cad71013f753d"}, - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:58494bc3ccc21a63751b7c9f8788d0240c3f1aad84cf221c0e42c9764a069ba4"}, - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0925edfd60a24f53819cfd11f07926fd42bc0fbeb7a4982998a08742e859dbff"}, - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f65b21e18cdec37cb9531179007f03db654cb320b62f3f51e2f5a28d8355a355"}, - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a3dbea0ce37404030b0fbd9a1387cef0fef90f4f7865b8c628175d74dcaa3e40"}, - {file = "pyobjc_framework_BrowserEngineKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9503aac83931662c6823c635b90ef18d5e45fc77c657db01edc4941dbbf30b32"}, - {file = "pyobjc_framework_browserenginekit-11.0.tar.gz", hash = "sha256:51971527f5103c0e09a4ef438c352ebb037fcad8971f8420a781c72ee421f758"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreAudio = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-businesschat" -version = "11.0" -description = "Wrappers for the framework BusinessChat on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_BusinessChat-11.0-py2.py3-none-any.whl", hash = "sha256:1f732fdace31d2abdd14b3054f27a5e0f4591c7e1bef069b6aeb4f9c8d9ec487"}, - {file = "pyobjc_framework_BusinessChat-11.0-py3-none-any.whl", hash = "sha256:47a2e4da9b061daa89a6367cb0e6bb8cdea0627379dd6d5095a8fd20243d8613"}, - {file = "pyobjc_framework_businesschat-11.0.tar.gz", hash = "sha256:20fe1c8c848ef3c2e132172d9a007a8aa65b08875a9ca5c27afbfc4396b16dbb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-calendarstore" -version = "11.0" -description = "Wrappers for the framework CalendarStore on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_CalendarStore-11.0-py2.py3-none-any.whl", hash = "sha256:67ddc18c96bba42118fc92f1117b053c58c8888edb74193f0be67a10051cc9e2"}, - {file = "pyobjc_framework_CalendarStore-11.0-py3-none-any.whl", hash = "sha256:9b310fe66ac12e0feb7c8e3166034bec357a45f7f8b8916e93eddc6f199d08c8"}, - {file = "pyobjc_framework_calendarstore-11.0.tar.gz", hash = "sha256:40173f729df56b70ec14f9680962a248c3ce7b4babb46e8b0d760a13975ef174"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-callkit" -version = "11.0" -description = "Wrappers for the framework CallKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_CallKit-11.0-py2.py3-none-any.whl", hash = "sha256:f19d94b61ecd981f4691fd244f536f947687b872ac793ccc2b3122b3854e887a"}, - {file = "pyobjc_framework_CallKit-11.0-py3-none-any.whl", hash = "sha256:95394b7f7a50916debe4f7a884ce9135d11733a14e07a8c502171e77bd0087a4"}, - {file = "pyobjc_framework_callkit-11.0.tar.gz", hash = "sha256:52e44a05d0357558e1479977ed2bcb325fabc8d337f641f0249178b5b491fc59"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-carbon" -version = "11.0" -description = "Wrappers for the framework Carbon on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_Carbon-11.0-py2.py3-none-any.whl", hash = "sha256:beef5095269d8e5427e09f9687963515c1b79fbf6927ff756a8414445892987d"}, - {file = "pyobjc_framework_Carbon-11.0-py3-none-any.whl", hash = "sha256:9a269042e8f5705897ac64d2b48515ba055462c88460cf140f5d8d4b8c806a42"}, - {file = "pyobjc_framework_carbon-11.0.tar.gz", hash = "sha256:476f690f0b34aa9e4cb3923e61481aefdcf33e38ec6087b530a94871eee2b914"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-cfnetwork" -version = "11.0" -description = "Wrappers for the framework CFNetwork on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CFNetwork-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9f6c2508d6daf2e8777b29a77f93e39517e8617def7fe5f6f31952897f8e9ed2"}, - {file = "pyobjc_framework_CFNetwork-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e6905c86ccb5608f4153aacb931758ad39af8b708fcebb497431f9741f39e6d"}, - {file = "pyobjc_framework_CFNetwork-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5f61010503073e3518e29d440079a7c0b40aef91be6d3c2032e492c21bada80b"}, - {file = "pyobjc_framework_CFNetwork-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ec543393cc00e3282d1df9348275935e05a52666eabe8118a5aad2d5d98e9896"}, - {file = "pyobjc_framework_CFNetwork-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8b12df20b05884eff42f92fea3d736ff6907e4b824523decb5a9fb48a6a6b745"}, - {file = "pyobjc_framework_CFNetwork-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8a0615a76b68315d1e71fb28ad42c187a3b9b212678b2d3640937ecdd33d4a3b"}, - {file = "pyobjc_framework_cfnetwork-11.0.tar.gz", hash = "sha256:eb742fc6a42b248886ff09c3cf247d56e65236864bbea4264e70af8377948d96"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-cinematic" -version = "11.0" -description = "Wrappers for the framework Cinematic on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"23.0\"" -files = [ - {file = "pyobjc_framework_Cinematic-11.0-py2.py3-none-any.whl", hash = "sha256:281721969978d726ded9bae38c4acd6713495c399025ff2b4179fc02ec68b336"}, - {file = "pyobjc_framework_Cinematic-11.0-py3-none-any.whl", hash = "sha256:3a24f3528d7f77637f51fd1862cc8c79e4d0da4ba6fd3dd02b54adddec365826"}, - {file = "pyobjc_framework_cinematic-11.0.tar.gz", hash = "sha256:94a2de8bf3f38bd190311b6bf98d1e2cea7888840b3ce3aa92e464c0216a5cdb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-AVFoundation = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" -pyobjc-framework-Metal = ">=11.0" - -[[package]] -name = "pyobjc-framework-classkit" -version = "11.0" -description = "Wrappers for the framework ClassKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_ClassKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1cb0554218dfd22c61f51b108a286ad17696d5cd7349b5309233c9c9edaee0ed"}, - {file = "pyobjc_framework_ClassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:723a07591e1e40380c339b58033e8491e58be4080c0f77a26be0728f1c5025c8"}, - {file = "pyobjc_framework_ClassKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7c7ff2eb8a9d87cb69618668e96c41ed9467fd4b4a8fef517c49923c0f6418e6"}, - {file = "pyobjc_framework_ClassKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4e959290652c818bd4dbcd27414ce2da4080bffe1e5ca990494944facb4a272c"}, - {file = "pyobjc_framework_ClassKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4c2e98f878ec7f20a8401df599ae5abaed2213e5a08fd2fc73d07aa89c338ad8"}, - {file = "pyobjc_framework_ClassKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:77697228c5a3f039dbe4a315bfc6f82ca647b3e497bb03e9d6f3215826f6a3db"}, - {file = "pyobjc_framework_classkit-11.0.tar.gz", hash = "sha256:dc5b3856612cafdc7071fbebc252b8908dbf2433e0e5ddb15a0bcd1ee282d27c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-cloudkit" -version = "11.0" -description = "Wrappers for the framework CloudKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_CloudKit-11.0-py2.py3-none-any.whl", hash = "sha256:10cb153d7185dd260d21596f75fca8502236f6afd8e72e866cff8acd9c025f14"}, - {file = "pyobjc_framework_CloudKit-11.0-py3-none-any.whl", hash = "sha256:b2376d92d5822ce7e4feefcffdc3f4d1d230929f1735793da6d36b52b161b552"}, - {file = "pyobjc_framework_cloudkit-11.0.tar.gz", hash = "sha256:e3f6bf2c3358dd394174b1e69fcec6859951fcd15f6433c6fa3082e3b7e2656d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Accounts = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreData = ">=11.0" -pyobjc-framework-CoreLocation = ">=11.0" - -[[package]] -name = "pyobjc-framework-cocoa" -version = "11.0" -description = "Wrappers for the Cocoa frameworks on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_Cocoa-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fbc65f260d617d5463c7fb9dbaaffc23c9a4fabfe3b1a50b039b61870b8daefd"}, - {file = "pyobjc_framework_Cocoa-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3ea7be6e6dd801b297440de02d312ba3fa7fd3c322db747ae1cb237e975f5d33"}, - {file = "pyobjc_framework_Cocoa-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:280a577b83c68175a28b2b7138d1d2d3111f2b2b66c30e86f81a19c2b02eae71"}, - {file = "pyobjc_framework_Cocoa-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:15b2bd977ed340074f930f1330f03d42912d5882b697d78bd06f8ebe263ef92e"}, - {file = "pyobjc_framework_Cocoa-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5750001db544e67f2b66f02067d8f0da96bb2ef71732bde104f01b8628f9d7ea"}, - {file = "pyobjc_framework_Cocoa-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ddff25b0755d59873d186e1e07d6aaddb19d55e3ae890d69ff2d9babf8627657"}, - {file = "pyobjc_framework_cocoa-11.0.tar.gz", hash = "sha256:00346a8cb81ad7b017b32ff7bf596000f9faa905807b1bd234644ebd47f692c5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" - -[[package]] -name = "pyobjc-framework-collaboration" -version = "11.0" -description = "Wrappers for the framework Collaboration on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_Collaboration-11.0-py2.py3-none-any.whl", hash = "sha256:acf11e584e21f6342e6d7be1675f36c92804082c29d2f373d1ca623a63959e76"}, - {file = "pyobjc_framework_Collaboration-11.0-py3-none-any.whl", hash = "sha256:e7789503ea9280ba365ce2c4e6c7c8b13dfa9174b2ecf9d174bbf9773f25f97a"}, - {file = "pyobjc_framework_collaboration-11.0.tar.gz", hash = "sha256:9f53929dd6d5b1a5511494432bf83807041c6f8b9ab6cf6ff184eee0b6f8226f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-colorsync" -version = "11.0" -description = "Wrappers for the framework ColorSync on Mac OS X" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_ColorSync-11.0-py2.py3-none-any.whl", hash = "sha256:24f5c3e0987bfdfe6a0de36f2f908e30ea52000eb649db7b0373928140518163"}, - {file = "pyobjc_framework_ColorSync-11.0-py3-none-any.whl", hash = "sha256:cbee2211f64be927eb4e4717bf6e275bf28954ed86e4a4655d367c30f856494d"}, - {file = "pyobjc_framework_colorsync-11.0.tar.gz", hash = "sha256:4f531f6075d9cc4b9d426620a1b04d3aaeb56b5ff178d0a6b0e93d068a5db0d2"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-contacts" -version = "11.0" -description = "Wrappers for the framework Contacts on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_Contacts-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:562b284c44366eaacfbc4bd65d541888e12e21e888acb6bcbf721beaeb69d411"}, - {file = "pyobjc_framework_Contacts-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b16758fc1edc40f0ec288d67b7e39b59609fb1df2523f4362c958d150619dbe5"}, - {file = "pyobjc_framework_Contacts-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:80972851e2163b94d82fd4b0d9801790ad420dffa91a37c90fa2949031881c02"}, - {file = "pyobjc_framework_Contacts-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:39c616e7cd0188b24b061fe7f9d289dc7c909eccc74684e553f80f66d54e6b34"}, - {file = "pyobjc_framework_Contacts-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4d5308498b24e525c8d902a061ad249d3600d60778be5441243fddced21751d5"}, - {file = "pyobjc_framework_Contacts-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:71ce63f364a3bedb065a3c34ad40157e34e84b0fe3d648b6944cace2958c23b9"}, - {file = "pyobjc_framework_contacts-11.0.tar.gz", hash = "sha256:fc215baa9f66dbf9ffa1cb8170d102a3546cfd708b2b42de4e9d43645aec03d9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-contactsui" -version = "11.0" -description = "Wrappers for the framework ContactsUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_ContactsUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:415bc82c0e995197b10f2638d56519383cbdf3b087a0126014ebf241b6ab212e"}, - {file = "pyobjc_framework_ContactsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fd3efaf3f67e92704f41927c5de06ccc4aa9daa09865cba7ac476da9c6e1c3c2"}, - {file = "pyobjc_framework_ContactsUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:da9c85dccdf518a0ac80c627daca32d56a4636e3f118359579de51a428e85ba7"}, - {file = "pyobjc_framework_ContactsUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8b0323c19400d0f7ea53abc3c1cdcdf03e7ffa0ade271caa916242d4352471a9"}, - {file = "pyobjc_framework_ContactsUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b50d25ce8faf0306dd97b7c0b26c01786683d9d0af9fc1ae45642da590a7fbe6"}, - {file = "pyobjc_framework_ContactsUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:dfa32df15da9b4ebb77ce09ac3bea7765f7402cedfb7e489f4d44a056cfd1fd6"}, - {file = "pyobjc_framework_contactsui-11.0.tar.gz", hash = "sha256:d0f2a4afea807fbe4db1518c4f81f0dc9aa1817fe7cb16115308fc00375a70db"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Contacts = ">=11.0" - -[[package]] -name = "pyobjc-framework-coreaudio" -version = "11.0" -description = "Wrappers for the framework CoreAudio on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreAudio-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e0d8c2c6850f75718a7c8999d78ada52c57acfae5001437823761fc72f6fa1d5"}, - {file = "pyobjc_framework_CoreAudio-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:143cd44d5c069aee1abc5a88794e9531250b9fe70a98f6a08e493184dcf64b3e"}, - {file = "pyobjc_framework_CoreAudio-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d26eac5bc325bf046fc0bfdaa3322ddc828690dab726275f1c4c118bb888cc00"}, - {file = "pyobjc_framework_CoreAudio-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:272388af86809f7a81250d931e99f650f62878410d4e1cfcd8adf0bbfb0d4581"}, - {file = "pyobjc_framework_CoreAudio-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:764873ec0724e42844ed2f0ca95ab4654c5ba59f883799207a3eecd4f5b444df"}, - {file = "pyobjc_framework_CoreAudio-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:861d210d54b2cf44824e0d74634558f38acc504d30b61e52b22f528bdc8df658"}, - {file = "pyobjc_framework_coreaudio-11.0.tar.gz", hash = "sha256:38b6b531381119be6998cf704d04c9ea475aaa33f6dd460e0584351475acd0ae"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coreaudiokit" -version = "11.0" -description = "Wrappers for the framework CoreAudioKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreAudioKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f33ea1a67497a5492340f885e1eede5ba3f96d6cf41be71735ef8bb7280815c1"}, - {file = "pyobjc_framework_CoreAudioKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dbf01f2625689b392c2ba02f3ab8186c914d84d6bd896bdef5181a15a9463df"}, - {file = "pyobjc_framework_CoreAudioKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8ccf2d92052a446d1d38bfd7eaa1dcd2451d59c37e73070a9a1fee394a532d9d"}, - {file = "pyobjc_framework_CoreAudioKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5c2f61535c27d8dd84a00ce34ce556b5b31b4aa6399881ddc596e9e281c832eb"}, - {file = "pyobjc_framework_CoreAudioKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:64f4928a4e7eae08f27650ec03a932ab7f350ba623089c4ff169968ca8f03cef"}, - {file = "pyobjc_framework_CoreAudioKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cc72362a34e3d88b571d5a6e1a4949a350c5478f7e9f338bf9df0b16fb58d57e"}, - {file = "pyobjc_framework_coreaudiokit-11.0.tar.gz", hash = "sha256:1a4c3de4a02b0dfa7410c012c7f0939edd2e127d439fb934aeafc68450615f1d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreAudio = ">=11.0" - -[[package]] -name = "pyobjc-framework-corebluetooth" -version = "11.0" -description = "Wrappers for the framework CoreBluetooth on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_CoreBluetooth-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3dd55feb3b03b7aa5695b8c9f16c5ec0c59bff89e731fc3275272d115079ed79"}, - {file = "pyobjc_framework_CoreBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:044069d63447554ba2c65cb1bf58d489d14ea279344810386392e583a2e611ef"}, - {file = "pyobjc_framework_CoreBluetooth-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bae8f909512d014eed85f80deae671185af4bb5a671fba19f85c7b4c973b61bb"}, - {file = "pyobjc_framework_CoreBluetooth-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:decea3e8177f4c1e543e70b73663c31d1f77e19ec32ca57be7a8f48cd64000aa"}, - {file = "pyobjc_framework_CoreBluetooth-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4f8a2def00fac1535a39df633939a895f004649f3ae80f04ed5037256ca17e7e"}, - {file = "pyobjc_framework_CoreBluetooth-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55c05e19f8f71eecfa45a33b215ceaab1040db4a08e9b3d30ab71cdef341e78e"}, - {file = "pyobjc_framework_corebluetooth-11.0.tar.gz", hash = "sha256:1dcb7c039c2efa7c72dc14cdda80e677240b49fa38999941a77ee02ca142998d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coredata" -version = "11.0" -description = "Wrappers for the framework CoreData on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreData-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6c2a081b19fce6ef14b3873d74840717c5aee8991e6d38181b5c442a4f138bbc"}, - {file = "pyobjc_framework_CoreData-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74ac5e7658df10544708f6017a8823a100fbe41dc3aa9f61bf2fd4f8773c3dd7"}, - {file = "pyobjc_framework_CoreData-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c23b8c9106b0ec6f43aca80d2b2e0b0cc8fcb4ba78db4ae3c1f39a67464357d7"}, - {file = "pyobjc_framework_CoreData-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:51e27c316de5da89159b033fe48c95892f2a85e1d3caea02a6a949ad4d52b14c"}, - {file = "pyobjc_framework_CoreData-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0453eb20b6f367b5c339ca42bd80031bf694e0c3422c892b28b1b02585f863cd"}, - {file = "pyobjc_framework_CoreData-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:71988fa045f6401ea980a79701a18a1b8c134b8852ecba16152beb6a9d95b016"}, - {file = "pyobjc_framework_coredata-11.0.tar.gz", hash = "sha256:b11acb51ff31cfb69a53f4e127996bf194bcac770e8fa67cb5ba3fb16a496058"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-corehaptics" -version = "11.0" -description = "Wrappers for the framework CoreHaptics on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_CoreHaptics-11.0-py2.py3-none-any.whl", hash = "sha256:ff1d8f58dd3b29287dfad16a60bb45706c91f1910e400b632cb664eb2e56588b"}, - {file = "pyobjc_framework_CoreHaptics-11.0-py3-none-any.whl", hash = "sha256:33f7a767efe6867fa6821ad73872ea88aec44650a22217bcdc9c1ec7c41fd9dc"}, - {file = "pyobjc_framework_corehaptics-11.0.tar.gz", hash = "sha256:1949b56ac0bd4219eb04c466cdd0f7f93d6826ed92ee61f01a4b5e98139ee039"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-corelocation" -version = "11.0" -description = "Wrappers for the framework CoreLocation on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_CoreLocation-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:aacfe9f048c9cdc328ebae6619fa74987961a5428dd8d3ab27bac3816daf49d3"}, - {file = "pyobjc_framework_CoreLocation-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:046f211a23de55364c8553cfd660dc5adeff28af4d25f5ed9b5a8bfa83266b4d"}, - {file = "pyobjc_framework_CoreLocation-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9bca9974f143bc9e93bd7ec4ef91655964d8ad0ca5ffccc8404fb6f098fa08dc"}, - {file = "pyobjc_framework_CoreLocation-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6d204014175ae21250bc289cbfe76eaf1a6c4938cfbb17b2c810ae1c548312cd"}, - {file = "pyobjc_framework_CoreLocation-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cf3c92b30662e72204a841b2efecc6faf26a58e091c8f46999aa3bbd102ca59d"}, - {file = "pyobjc_framework_CoreLocation-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72421f2a5cae04d996744250432c39df2cfbf1a71d55dd06efd6b1fe426ca9e4"}, - {file = "pyobjc_framework_corelocation-11.0.tar.gz", hash = "sha256:05055c3b567f7f8f796845da43fb755d84d630909b927a39f25cf706ef52687d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coremedia" -version = "11.0" -description = "Wrappers for the framework CoreMedia on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"11.0\"" -files = [ - {file = "pyobjc_framework_CoreMedia-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0c0613bea009f206a5584a828cbb56699cf3d00e7332e2dcbf2708536adca08e"}, - {file = "pyobjc_framework_CoreMedia-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:057e63e533577fe5d764a5a9d307f60e8d9c58803112951ace42183abe9437e3"}, - {file = "pyobjc_framework_CoreMedia-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:afd8eb59f5ce0730ff15476ad3989aa84ffb8d8d02c9b8b2c9c1248b0541dbff"}, - {file = "pyobjc_framework_CoreMedia-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:88b26ca9a1333ddbe2a6dfa9a8c2d2be712cb717c3e9e1174fed66bf8d7af067"}, - {file = "pyobjc_framework_CoreMedia-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ab18a7fbc5003e0929fc8380f371bb580e6ecd6be26333bf88b4a7f51a9c0789"}, - {file = "pyobjc_framework_CoreMedia-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:26bec528d75ea699519ee3d9739488ecdf8cbe178b3a35f515a1da88e7969092"}, - {file = "pyobjc_framework_coremedia-11.0.tar.gz", hash = "sha256:a414db97ba30b43c9dd96213459d6efb169f9e92ce1ad7a75516a679b181ddfb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coremediaio" -version = "11.0" -description = "Wrappers for the framework CoreMediaIO on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"11.0\"" -files = [ - {file = "pyobjc_framework_CoreMediaIO-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:183bba91cd2cb0a4f0cfecc377d1203d30f845d1b690cd33976d6e8ebb638f69"}, - {file = "pyobjc_framework_CoreMediaIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4182b91c72923d5c4d52eca3c221cc6f149d80a96242c0caab1d5bc9ccbcbbb"}, - {file = "pyobjc_framework_CoreMediaIO-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1ad1e0f74126b6c6d25017e4ba08f66fe5422c902060d64b69e06a0c10214355"}, - {file = "pyobjc_framework_CoreMediaIO-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80375bcddf98ac1affba62731e8f6036a5881a9fad881ada4dffa30650ba4ac3"}, - {file = "pyobjc_framework_CoreMediaIO-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3afe4318488cc88843ae4f3914317aede9b9e274c5336fdb733a6a22868a0aa4"}, - {file = "pyobjc_framework_CoreMediaIO-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:06b9d0cbb50d68ddd278750303e2a68ae11f81b03b1bdc95c44c1f74c24c5492"}, - {file = "pyobjc_framework_coremediaio-11.0.tar.gz", hash = "sha256:7d652cf1a2a75c78ea6e8dbc7fc8b782bfc0f07eafc84b700598172c82f373d8"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coremidi" -version = "11.0" -description = "Wrappers for the framework CoreMIDI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreMIDI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cc4f042988f6f515f612b0af258c8892b095ccfa722bfeb23efc18e0fa83b74c"}, - {file = "pyobjc_framework_CoreMIDI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:78dec1bcd253a0385ac0b758a455e2a9367fc3cb9e2306d410c61bafa8d4c2eb"}, - {file = "pyobjc_framework_CoreMIDI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:97158830d76b999255d87191f31624d4373ee8ff662af4f4376c584cfb805573"}, - {file = "pyobjc_framework_CoreMIDI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b636bfc7eddd843bdd45dc1445121970d34d4851ef110b8ac138b369eebc3fd5"}, - {file = "pyobjc_framework_CoreMIDI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:140d4b664e2e50c1400e9bc0bdc9fc907d9c3d703c62fe280fad1c4a6b218402"}, - {file = "pyobjc_framework_CoreMIDI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c9ed5d425436e24c0ab429475956af9d65c8ef2fc1b6cc5fb0909d9ee84bea1a"}, - {file = "pyobjc_framework_coremidi-11.0.tar.gz", hash = "sha256:acace4448b3e4802ab5dd75bbf875aae5e1f6c8cab2b2f1d58af20fc8b2a5a7f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coreml" -version = "11.0" -description = "Wrappers for the framework CoreML on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_CoreML-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:87991c6ed2510e9143b5d200a946cb1f1396e321ccd4b8b22a32616333b1cf32"}, - {file = "pyobjc_framework_CoreML-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e290ad9c0ac5f057ce3885d35e33fadc115f59111f2e04f168c45e2890cb86e8"}, - {file = "pyobjc_framework_CoreML-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:48320a57589634c206d659799284a5133aaa006cf4562f772697df5b479043e4"}, - {file = "pyobjc_framework_CoreML-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:cc73c6a2a3dd4181b679c12b83066e3a36e9b4213626821633f87ce5be4ad29d"}, - {file = "pyobjc_framework_CoreML-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:45fd15a483f9c4c408da005e3b2816a71112050de2a666cb9a4de20518eb3aca"}, - {file = "pyobjc_framework_CoreML-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9359e87e7f15c9db418be4a4bbbe2c4e70bf535599e92966432f91bd94ff5154"}, - {file = "pyobjc_framework_coreml-11.0.tar.gz", hash = "sha256:143a1f73a0ea0a0ea103f3175cb87a61bbcb98f70f85320ed4c61302b9156d58"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coremotion" -version = "11.0" -description = "Wrappers for the framework CoreMotion on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_CoreMotion-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:03575381b5e16c6d83c88e79a026ad0ca39cddfc0a629bd8489ef7226bcaba6c"}, - {file = "pyobjc_framework_CoreMotion-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8e32de44e30028500e4d17c114eea69e7e74e5ae7aef6c208edc5bac34dfc21e"}, - {file = "pyobjc_framework_CoreMotion-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:697a3121615e95e56808f388b0882217a50e5ff6b459eccae93f2809d5ea4389"}, - {file = "pyobjc_framework_CoreMotion-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0b4b8c62e330c3d9b25fefc08e0f79b28d3966a0d57dde5b7e664c67db5b6f8"}, - {file = "pyobjc_framework_CoreMotion-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:07c2dc57b96541dc4f2a4ec87d0fc6fc77fc9a0e861335fc84f24d42ccbbbebb"}, - {file = "pyobjc_framework_CoreMotion-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:9c3766a917d5ddb1fa6dcbb7adfc6acf4538d96e0947276a133936d7117c9c2b"}, - {file = "pyobjc_framework_coremotion-11.0.tar.gz", hash = "sha256:d1e7ca418897e35365d07c6fd5b5d625a3c44261b6ce46dcf80787f634ad6fa5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coreservices" -version = "11.0" -description = "Wrappers for the framework CoreServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7570bcfe23c327c0055df42bdf03604dcbb4a9b413311c7c15b3209657a4f84"}, - {file = "pyobjc_framework_CoreServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7538ca6e22f4da0c3a70ddd9781f9240a3fe2fd7a7aa4dfb31c31f2532f008e"}, - {file = "pyobjc_framework_CoreServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3b175b5aa7a78484fd07b93533174b125901a6b791df2c51e05df1ea5d5badab"}, - {file = "pyobjc_framework_CoreServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:29ce564e55411f78a27d004eeec2abe7a278e3577511dca2bb54351df8d62312"}, - {file = "pyobjc_framework_CoreServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:eee78170f1bf89bfde6f9765a21c4a0347d88cfc964d1600f486a0bbf8c6b1ba"}, - {file = "pyobjc_framework_CoreServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1f4dd7665d2e4bddb1ed21135f4bc7eba4b016e64e8a1c7d78a6e24b95a33a21"}, - {file = "pyobjc_framework_coreservices-11.0.tar.gz", hash = "sha256:ac96954f1945a1153bdfef685611665749eaa8016b5af6f34bd56a274952b03a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-FSEvents = ">=11.0" - -[[package]] -name = "pyobjc-framework-corespotlight" -version = "11.0" -description = "Wrappers for the framework CoreSpotlight on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_CoreSpotlight-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4ea85b770a6ed36f3edf29e8e2c1dd380839b9d250a251217f2e83e5f674cfc0"}, - {file = "pyobjc_framework_CoreSpotlight-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:551878bfb9cc815fe2532fdf455f500dda44f8cd203dd836a6f1eb5cc0d49a9a"}, - {file = "pyobjc_framework_CoreSpotlight-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b0c595d0a422a0f81008df93a0a2b38a1fd62434c6f61e31f1dceec927803b80"}, - {file = "pyobjc_framework_CoreSpotlight-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c4538bf053bf3fefa0dd4d572dbcf7b55e4a651b29859a10a51b5e83841621cf"}, - {file = "pyobjc_framework_CoreSpotlight-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:7377286386e6b81ba8d92d9abf96fa5053d6136c8283b80620ecff2738c47ef5"}, - {file = "pyobjc_framework_CoreSpotlight-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8fda442469783fd82651823924758897a79ecdf3f14001c9608fda84b971480a"}, - {file = "pyobjc_framework_corespotlight-11.0.tar.gz", hash = "sha256:a96c9b4ba473bc3ee19afa01a9af989458e6a56e9656c2cdea1850d2b13720e6"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-coretext" -version = "11.0" -description = "Wrappers for the framework CoreText on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_CoreText-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6939b4ea745b349b5c964823a2071f155f5defdc9b9fc3a13f036d859d7d0439"}, - {file = "pyobjc_framework_CoreText-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:56a4889858308b0d9f147d568b4d91c441cc0ffd332497cb4f709bb1990450c1"}, - {file = "pyobjc_framework_CoreText-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb90e7f370b3fd7cb2fb442e3dc63fedf0b4af6908db1c18df694d10dc94669d"}, - {file = "pyobjc_framework_CoreText-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7947f755782456bd663e0b00c7905eeffd10f839f0bf2af031f68ded6a1ea360"}, - {file = "pyobjc_framework_CoreText-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5356116bae33ec49f1f212c301378a7d08000440a2d6a7281aab351945528ab9"}, - {file = "pyobjc_framework_CoreText-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4a76e1307747f2ee8180d38844cd62b8bb1701b4203d9234cc41f6603d4ae654"}, - {file = "pyobjc_framework_coretext-11.0.tar.gz", hash = "sha256:a68437153e627847e3898754dd3f13ae0cb852246b016a91f9c9cbccb9f91a43"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-corewlan" -version = "11.0" -description = "Wrappers for the framework CoreWLAN on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_CoreWLAN-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d0319bb3605a2c4001eb42dad2f20685da538f0f170fbfa60ec13b7216e1e40e"}, - {file = "pyobjc_framework_CoreWLAN-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4384ba68d4beb4d610ca0d661593e16efe541faf1790222b898b3f4dd389c98a"}, - {file = "pyobjc_framework_CoreWLAN-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5f5c365f6ebdae4a87d534cf8af877a57d2aabe50fe5949a9334e75173291898"}, - {file = "pyobjc_framework_CoreWLAN-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1724a36219ff649da11aa5dffd93a604cef121df2ce24026a885065973f123d5"}, - {file = "pyobjc_framework_CoreWLAN-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:89e3a27291c5cb61d31adff970a46b34b33d7cf6d9ce6c7c55e3b5e8a170081c"}, - {file = "pyobjc_framework_CoreWLAN-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b900aa2b261d1a08a2c6ea1c9b3e61c5eca9812b2570237934b3631aadfa4574"}, - {file = "pyobjc_framework_corewlan-11.0.tar.gz", hash = "sha256:8803981d64e3eb4fa0ea56657a9b98e4004de5a84d56e32e5444815d8ed6fa6f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-cryptotokenkit" -version = "11.0" -description = "Wrappers for the framework CryptoTokenKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b075264b65f095f8a1cd370f1058cda9e181b9753f93a808cfc6b258f84397d8"}, - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3c42620047cc75a749fbed045d181dc76284bc27edea904b97df1ad82c2fdafc"}, - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:95b05efb06b09987e23fb62dc3af378f38cfd0bd5872940cd95cf0f39dac6a57"}, - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:94dad5e8ec40a8d36edcb0e6a63e0311041c151fd7457a0995ef4512b1fc2a52"}, - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1814fe5612e03ce797ca1400f44c6ae0619725c51ad0096e392896e0af4606ec"}, - {file = "pyobjc_framework_CryptoTokenKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:3a2a09a1b82c2c18a60248302a8a1e9cd9fd05fdf05080d65a8291d9910fc64b"}, - {file = "pyobjc_framework_cryptotokenkit-11.0.tar.gz", hash = "sha256:a1bbfe9170c35cb427d39167af55aefea651c5c8a45c0de60226dae04b61a6b1"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-datadetection" -version = "11.0" -description = "Wrappers for the framework DataDetection on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_DataDetection-11.0-py2.py3-none-any.whl", hash = "sha256:0fd191ddee9bc6a491e05dfb7de780c0266fd6c90ca783e168786c4b0b5d7d7c"}, - {file = "pyobjc_framework_DataDetection-11.0-py3-none-any.whl", hash = "sha256:21b4a1dbf6cb56fdc971224476453dd1a7a4bb72d2c670444e81ae96fde97cb2"}, - {file = "pyobjc_framework_datadetection-11.0.tar.gz", hash = "sha256:9967555151892f8400cffac86e8656f2cb8d7866963fdee255e0747fa1386533"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-devicecheck" -version = "11.0" -description = "Wrappers for the framework DeviceCheck on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_DeviceCheck-11.0-py2.py3-none-any.whl", hash = "sha256:d9252173a57dfba09ae37ccc3049f4b4990c1cbdcde338622b42c66296a8740e"}, - {file = "pyobjc_framework_DeviceCheck-11.0-py3-none-any.whl", hash = "sha256:e8ed3965808963b2f0a7e069537d752bc659b75db1901cc24e5138925b9a7052"}, - {file = "pyobjc_framework_devicecheck-11.0.tar.gz", hash = "sha256:66cff0323dc8eef1b76d60f9c9752684f11e534ebda60ecbf6858a9c73553f64"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-devicediscoveryextension" -version = "11.0" -description = "Wrappers for the framework DeviceDiscoveryExtension on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"24.0\"" -files = [ - {file = "pyobjc_framework_DeviceDiscoveryExtension-11.0-py2.py3-none-any.whl", hash = "sha256:82032e567d0031839d626947368d6d3d4ca97c915f15d2779a444cf4b2ffa4a3"}, - {file = "pyobjc_framework_DeviceDiscoveryExtension-11.0-py3-none-any.whl", hash = "sha256:9c94057173f13472089d561b780d93b5aa244d048b4760a0e1ab54fe7c2253c5"}, - {file = "pyobjc_framework_devicediscoveryextension-11.0.tar.gz", hash = "sha256:576dac3f418cfc4f71020a45f06231d14e4b2a8e182ef0020dd9da3cf238d02f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-dictionaryservices" -version = "11.0" -description = "Wrappers for the framework DictionaryServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_DictionaryServices-11.0-py2.py3-none-any.whl", hash = "sha256:7c081371855240ac8e22783a71f32393c0f1e0b94d2fd193e8fef0a8be007080"}, - {file = "pyobjc_framework_DictionaryServices-11.0-py3-none-any.whl", hash = "sha256:15cdc3b64cb73713ee928cdcc0a12c845729f117bb8e73c7511f6e3f256d9d39"}, - {file = "pyobjc_framework_dictionaryservices-11.0.tar.gz", hash = "sha256:6b5f27c75424860f169e7c7e182fabffdba22854fedb8023de180e8770661dce"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-CoreServices = ">=11.0" - -[[package]] -name = "pyobjc-framework-discrecording" -version = "11.0" -description = "Wrappers for the framework DiscRecording on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_DiscRecording-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:249c50bc16e54b5a46ccb9346084f7324c102bcdd9e0a1cd2e95da9b523ded87"}, - {file = "pyobjc_framework_DiscRecording-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eab79d83c2d974aa5564f3f6f4415218573dca69010026d2d000d232494a9d81"}, - {file = "pyobjc_framework_DiscRecording-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e309e7394aed23d6ccce2e035f23c0c015d029c2ad531c6b1dce820b7eea8512"}, - {file = "pyobjc_framework_DiscRecording-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:30cb13dfa363de900f53a675b8700d81433602ab42f2850b6122d67445349735"}, - {file = "pyobjc_framework_DiscRecording-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:de401e471aa99cb253b905d81a27054d9bc0a935647dc5451bf0565ab040dd97"}, - {file = "pyobjc_framework_DiscRecording-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:ea2edecc7f4d39d7b1232e304367659e7c93d6da76c75addee117e4077f39426"}, - {file = "pyobjc_framework_discrecording-11.0.tar.gz", hash = "sha256:6bdc533f067d049ea5032f65af70b5cdab68673574ac32dacb46509a9411d256"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-discrecordingui" -version = "11.0" -description = "Wrappers for the framework DiscRecordingUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_DiscRecordingUI-11.0-py2.py3-none-any.whl", hash = "sha256:1af226c9350bb1d49960c02505e1e2f286e9377040dc2777a3f9a318925e081b"}, - {file = "pyobjc_framework_DiscRecordingUI-11.0-py3-none-any.whl", hash = "sha256:943df030f497a5ab73e969a04df8a653138fb67ebcf2380fedb4b4886d4ffba0"}, - {file = "pyobjc_framework_discrecordingui-11.0.tar.gz", hash = "sha256:bec8a252fd2022dce6c58b1f3366a7295efb0c7c77817f11f9efcce70527d7a2"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-DiscRecording = ">=11.0" - -[[package]] -name = "pyobjc-framework-diskarbitration" -version = "11.0" -description = "Wrappers for the framework DiskArbitration on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_DiskArbitration-11.0-py2.py3-none-any.whl", hash = "sha256:58823297eb09ff020ee156649170ab824fec32825bd32f2814c32e005920a72c"}, - {file = "pyobjc_framework_DiskArbitration-11.0-py3-none-any.whl", hash = "sha256:7d41189a2d82045a7195c4661d8ec16195b6325a2f68f9d960e9a9f6649d1131"}, - {file = "pyobjc_framework_diskarbitration-11.0.tar.gz", hash = "sha256:1c3e21398b366a1ce96cf68501a2e415f5ccad4b43a3e7cc901e09e896dfb545"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-dvdplayback" -version = "11.0" -description = "Wrappers for the framework DVDPlayback on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_DVDPlayback-11.0-py2.py3-none-any.whl", hash = "sha256:2013289aa38166d81bcbf25d6600ead1996e50de2bc689e5cf36f36a45346424"}, - {file = "pyobjc_framework_DVDPlayback-11.0-py3-none-any.whl", hash = "sha256:c6be6ae410d8dce7179d6ee8c9bc421468d4b9c19af3ff0e59c93ae71cfc33e0"}, - {file = "pyobjc_framework_dvdplayback-11.0.tar.gz", hash = "sha256:9a005f441afbc34aea301857e166fd650d82762a75d024253e18d1102b21b2f8"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-eventkit" -version = "11.0" -description = "Wrappers for the framework Accounts on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_EventKit-11.0-py2.py3-none-any.whl", hash = "sha256:934e31f4c82f887e1bf01f96d33de4c7c6727de3fdb55bc739e1c686c10cc151"}, - {file = "pyobjc_framework_EventKit-11.0-py3-none-any.whl", hash = "sha256:5467977c79649dac9e0183dc72511f7dd49aab0260b67c2cfa25079a5a303f11"}, - {file = "pyobjc_framework_eventkit-11.0.tar.gz", hash = "sha256:3d412203a510b3d62a5eb0987406e0951b13ed39c3351c0ec874afd72496627c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-exceptionhandling" -version = "11.0" -description = "Wrappers for the framework ExceptionHandling on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_ExceptionHandling-11.0-py2.py3-none-any.whl", hash = "sha256:972e0a376fee4d3d4c5161f82a8e5f6305392dbf19e98c4c6486d737759ebd89"}, - {file = "pyobjc_framework_ExceptionHandling-11.0-py3-none-any.whl", hash = "sha256:d7f95fdb60a2636416066d3d12fad06cbf597e038576f8ed46fd3c742cc22252"}, - {file = "pyobjc_framework_exceptionhandling-11.0.tar.gz", hash = "sha256:b11562c6eeaef5d8d43e9d817cf50feceb02396e5eb6a7f61df2c0cec93d912b"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-executionpolicy" -version = "11.0" -description = "Wrappers for the framework ExecutionPolicy on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_ExecutionPolicy-11.0-py2.py3-none-any.whl", hash = "sha256:fdf78bf22fa6ea6f27b574f73856a8a22992d0c0d5a6ed64823e00000c06ffe7"}, - {file = "pyobjc_framework_ExecutionPolicy-11.0-py3-none-any.whl", hash = "sha256:d2dba6f3f7803d1cd0a5608a7ad75085b73097b6c3a935b7f1326c7202249751"}, - {file = "pyobjc_framework_executionpolicy-11.0.tar.gz", hash = "sha256:de953a8acae98079015b19e75ec8154a311ac1a70fb6d885e17fab09464c98a9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-extensionkit" -version = "11.0" -description = "Wrappers for the framework ExtensionKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_ExtensionKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f6815bf25ff17ded53d66543e32fac3c89a20f7138389d291816bef04f85da48"}, - {file = "pyobjc_framework_ExtensionKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98957dd51f0a4e02aa3d9d3a184f37ca5f99f4cb9e11282a2fc793d18de02af8"}, - {file = "pyobjc_framework_ExtensionKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e341979ee4a7fc5978fe44d6d1d461c774411042cac4e119a32704d6c989de6f"}, - {file = "pyobjc_framework_ExtensionKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:13b2120eb4f9456af9c6eebbe9e5b72aa00e5393b818af6195c312b86dc47e85"}, - {file = "pyobjc_framework_ExtensionKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e14f1f262d9b639a96ab700d72c16fe6f4eed084e1122db3404052e225a010bc"}, - {file = "pyobjc_framework_ExtensionKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5724789647b04c058a4a7b081f765939639bb49cd5dd1ad071ee88fcee6111c9"}, - {file = "pyobjc_framework_extensionkit-11.0.tar.gz", hash = "sha256:82d9e79532e5a0ff0eadf1ccac236c5d3dca344e1090a0f3e88519faa24143c7"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-externalaccessory" -version = "11.0" -description = "Wrappers for the framework ExternalAccessory on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_ExternalAccessory-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c176fa6be74d25cd2f01c060fad0924ac0fda1ba54763c2c5fa1199311487a84"}, - {file = "pyobjc_framework_ExternalAccessory-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:319f66edb96505f833fe7fe9ba810cb3b0d0c65605b8674bea52f040e8caebd6"}, - {file = "pyobjc_framework_ExternalAccessory-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:aaae920c9241d1b35a58ba76dba761689b248250d782179526f6dea151b1fda0"}, - {file = "pyobjc_framework_ExternalAccessory-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:38f8865c69b23e2eb69cb61244e79c18e03b70c4c816fed27b47409f1295f38f"}, - {file = "pyobjc_framework_ExternalAccessory-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:67c6873354be1b3bb00c4ff6a68b42b79f114c5625f2cbb2f0a6bbe59f847f01"}, - {file = "pyobjc_framework_ExternalAccessory-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8ebe16f961bd9e62cc8bedc536e57b3df4e33da8f48c960500c4133ab8acea8a"}, - {file = "pyobjc_framework_externalaccessory-11.0.tar.gz", hash = "sha256:39e59331ced75cdcccf23bb5ffe0fa9d67e0c190c1da8887a0e4349b7e27584f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-fileprovider" -version = "11.0" -description = "Wrappers for the framework FileProvider on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_FileProvider-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d95c589f6e1f114b67be82c1933c32d29aa65f8b3f0d97e4b3676517f6f1092d"}, - {file = "pyobjc_framework_FileProvider-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c7e803a37f7327c191a4de7dbb36e5fbf8bd08dadbcc7f626e491451c7a3849"}, - {file = "pyobjc_framework_FileProvider-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d7acdc5e0f4b5488bcbf47d3eea469b22897a4b783fe3f5d4b2b1f3288e82038"}, - {file = "pyobjc_framework_FileProvider-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:97b2899160dddc013083344ae0b6b6955269b96105fa3df18cbe16f83592290e"}, - {file = "pyobjc_framework_FileProvider-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:248f7aaa4985944fac066554041ada3b8561954cd97454707358a8eea44ec238"}, - {file = "pyobjc_framework_FileProvider-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e9ceddc93957840735508c594cb9e1efa34647db65f0d15b469681f83f59a814"}, - {file = "pyobjc_framework_fileprovider-11.0.tar.gz", hash = "sha256:dcc3ac3c90117c1b8027ea5f26dad6fe5045f688ce3e60d07ece12ec56e17ab3"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-fileproviderui" -version = "11.0" -description = "Wrappers for the framework FileProviderUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_FileProviderUI-11.0-py2.py3-none-any.whl", hash = "sha256:5102651febb5a6140f99b116b73d0fd6c9822372a5203506e4904ac0ebb1313c"}, - {file = "pyobjc_framework_FileProviderUI-11.0-py3-none-any.whl", hash = "sha256:b75f70eef2af3696f3cb2e0de88bbb437343b53070078573ae72d64bf56fce9d"}, - {file = "pyobjc_framework_fileproviderui-11.0.tar.gz", hash = "sha256:cf5c7d32b29d344b65217397eea7b1a2913ce52ce923c9e04135a7a298848d04"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-FileProvider = ">=11.0" - -[[package]] -name = "pyobjc-framework-findersync" -version = "11.0" -description = "Wrappers for the framework FinderSync on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_FinderSync-11.0-py2.py3-none-any.whl", hash = "sha256:cafb262d1ad1e3a86af333f673aeda4f9bdcf528ded97c2232fd1cf440d1db5a"}, - {file = "pyobjc_framework_FinderSync-11.0-py3-none-any.whl", hash = "sha256:d00285b85038c5546e8566bec9cd3a4615708f0e6cb774d0ea804c69546ec915"}, - {file = "pyobjc_framework_findersync-11.0.tar.gz", hash = "sha256:8dab3feff5debd6bc3746a21ded991716723d98713d1ba37cec1c5e2ad78ee63"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-fsevents" -version = "11.0" -description = "Wrappers for the framework FSEvents on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_FSEvents-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4a9470216da0be78c07b8b9fe02da050da2bbf968a2d0b723453b167592ae463"}, - {file = "pyobjc_framework_FSEvents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e0b3c7835251a35453e3079cf929b9e5329d02e2f4eaac2ebabbe19e1abd18ab"}, - {file = "pyobjc_framework_FSEvents-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fb8a5a7f7b5a70e15dae80672f10ecc16b5d1c1afe62ad2ccadb17a8098876cd"}, - {file = "pyobjc_framework_FSEvents-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d203f3ca8a86235412d434421f2cec2f98c8379e9091bed9bf28321c6c416693"}, - {file = "pyobjc_framework_FSEvents-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1240e1be678b3bed9ca091935cf922e44399a304cbbbb93967759b404b61d826"}, - {file = "pyobjc_framework_FSEvents-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d0935758429486480c9f667ee5c0a36dccdcdc548075d9579b37acda8738802"}, - {file = "pyobjc_framework_fsevents-11.0.tar.gz", hash = "sha256:e01dab04704a518e4c3e1f7d8722819a4f228d5082978e11618aa7abba3883fe"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-gamecenter" -version = "11.0" -description = "Wrappers for the framework GameCenter on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_GameCenter-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1a92d63b5a6ba7c27c80c13f69fd8aabc84bdacf619ef7da74552cd73ab93581"}, - {file = "pyobjc_framework_GameCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f8bff2a36cf3cb52cbe321203147766e95997f881062143171cdd8ef2fde9e53"}, - {file = "pyobjc_framework_GameCenter-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8de57380e3b51579a6e8bc397c2bb5be5d0f6dcd4bf5abed587700cf7f57afd4"}, - {file = "pyobjc_framework_GameCenter-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b392e06132091bd976926f89ebbeb9c433c344426b288e5fe787d15668983926"}, - {file = "pyobjc_framework_GameCenter-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4282b65e0446e5145b7afa4857856d9aec1b0a7893e0ac471c97b680746329cb"}, - {file = "pyobjc_framework_GameCenter-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:807517f8e6ab27b2fc6fd2d9450df71cd927e2be73097abcb8be073e16e7599e"}, - {file = "pyobjc_framework_gamecenter-11.0.tar.gz", hash = "sha256:18a05500dbcf2cca4a0f05839ec010c76ee08ab65b65020c9538a31feb274483"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-gamecontroller" -version = "11.0" -description = "Wrappers for the framework GameController on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_GameController-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f0d3400fe3ebacdcd52af3ff9de1dc104206bcbc9615d42270b6f997b18af76d"}, - {file = "pyobjc_framework_GameController-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:30e8f251be49ff67491df758c73149e7c7e87bee89919966ed1b2bf56fdaacf7"}, - {file = "pyobjc_framework_GameController-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:46403f23aaaf6a2e1a51e3954c53d6e910b80058117fdcf3a0a8100f25e30f07"}, - {file = "pyobjc_framework_GameController-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:928f5c907080050f19d78dc8c1f4835f73ede8cdf1f3c9fbbcf49236077c8c7a"}, - {file = "pyobjc_framework_GameController-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:0025d04d8121448b3ace0f925f3ed4989ef8ea311304380ffd9346ae53018317"}, - {file = "pyobjc_framework_GameController-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34462baf39568df57567300edb2954d65e788d277abca2e6e59e08c603cd0bce"}, - {file = "pyobjc_framework_gamecontroller-11.0.tar.gz", hash = "sha256:6d62f4493d634eba03a43a14c4d1e4511e1e3a2ca2e9cbefa6ae9278a272c1d0"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-gamekit" -version = "11.0" -description = "Wrappers for the framework GameKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_GameKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e5420b9aa29bb66bc2b9b167929d6f31937f029ee5f3f63a49a14ac226aa4d56"}, - {file = "pyobjc_framework_GameKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:dabe856c8638940d2b346abc7a1828cca12d00b47d2951d0ac9f4e27ecc8d3ec"}, - {file = "pyobjc_framework_GameKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:40d506505f71ed57779c8be9b4e07ec9337c45aebe323b3f8dd8f8c75e6fce50"}, - {file = "pyobjc_framework_GameKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:669bab8e53610d45eb97d2f46833459568231dae6c3811fd5d12a8c6b43b881c"}, - {file = "pyobjc_framework_GameKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3043a84f8ad19fa92facab0ca3872de996ebb9fd746290ea5206d5726a0f19a0"}, - {file = "pyobjc_framework_GameKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:047de8c3aaf1036fd18af846a4793ec8f5224d7da5c38388f682ccf9b4caa326"}, - {file = "pyobjc_framework_gamekit-11.0.tar.gz", hash = "sha256:29b5464ca78f0de62e6b6d56e80bbeccb96dc13820b6d5b4e835ab1cc127e5b9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-gameplaykit" -version = "11.0" -description = "Wrappers for the framework GameplayKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_GameplayKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:6d407e9df8a157c3cd7ed15723f761f10e0354d9d54377e3b5a618435941c586"}, - {file = "pyobjc_framework_GameplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:01f59bbf5beb0cfcfea17011987995f1cccf2ec081d91269f95e71283dd83c67"}, - {file = "pyobjc_framework_GameplayKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f2d56af0a84439b3ddc64cdec90e3fab08b1d43da97bed0fb8d60714f47c4372"}, - {file = "pyobjc_framework_GameplayKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7b9c181babc5cb8b2054bd1243863fb2983bf6e1e5ddb0c00081ce0622ac73dc"}, - {file = "pyobjc_framework_GameplayKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ccba6c8c976dd1887239a15bcfcbf0a31f51e6a83b66eea28482c32de82101ac"}, - {file = "pyobjc_framework_GameplayKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c71926d946040c1d64fde656e28bc6a63dcf567e4a18a8be76f076d75616d4ff"}, - {file = "pyobjc_framework_gameplaykit-11.0.tar.gz", hash = "sha256:90eeec464fba992d75a406ccbddb35ed7420a4f5226f19c018982fa3ba7bf431"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-SpriteKit = ">=11.0" - -[[package]] -name = "pyobjc-framework-healthkit" -version = "11.0" -description = "Wrappers for the framework HealthKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_HealthKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c99393643da1f33310ab7a91ec00e2f787d9855f01d02d8576d973451b6b8452"}, - {file = "pyobjc_framework_HealthKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ee87453c28bd4040b12a3bc834f0ea1989e331400845a14079e8f4a6ede70aa2"}, - {file = "pyobjc_framework_HealthKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:680da6d67b0c79d15e897f1c588a8b02d780573aef3692e982294c43727eecf3"}, - {file = "pyobjc_framework_HealthKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80fd61a01df1a232ecfd3ff6c5546b6ba6d70edeb133255f85847da3a55a49be"}, - {file = "pyobjc_framework_HealthKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:22faf604b95d86de27d0fe57972c26904740a2af139963ce7dc72e9ac8178ede"}, - {file = "pyobjc_framework_HealthKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e2b83399cbd24f095ea870f24093f9d83fa96a0ef2a382e13079eed69311f6ae"}, - {file = "pyobjc_framework_healthkit-11.0.tar.gz", hash = "sha256:e78ccb05f747ae3e70b5d73522030b7ba01ef2d390155fba7d50c1c614ae241f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-imagecapturecore" -version = "11.0" -description = "Wrappers for the framework ImageCaptureCore on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad2066693bfdce17da0cb5370b85213e4a4ae728bfd8360eae542db503205e73"}, - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3fd78aa4a69e24caed38ae17a69b973e505324d966df86b47441318800a52db9"}, - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c5cc6c6acbfca05977adc0e339e1225d5cd314af2fa455a70baebb54f9fb2b64"}, - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0cb3021833c1de8d7fe756e50a194649a5a437287438ecec67e7d9d80f95b739"}, - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ea4373763b1316a1acc174763091b4cc0f934953a954e5645f8f5ea55b73bc3d"}, - {file = "pyobjc_framework_ImageCaptureCore-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f09f4c4e2be3529e01cd78dab7f932cf3d84f2bd649d2ef52263f63ba3b51173"}, - {file = "pyobjc_framework_imagecapturecore-11.0.tar.gz", hash = "sha256:f5d185d8c8b564f8b4a815381bcdb424b10d203ba5bdf0fc887085e007df6f7a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-inputmethodkit" -version = "11.0" -description = "Wrappers for the framework InputMethodKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_InputMethodKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:195a82fcd7282ff39960cb1b63e199b35a33384c0a970608243ec33e0209ff4c"}, - {file = "pyobjc_framework_InputMethodKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1a58273233e236cb9fa2d8d9295017c6bf26d6f47cc3a5dc9ba81f1c1e64a346"}, - {file = "pyobjc_framework_InputMethodKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7869db2b08586e97181ec2b60b8f5b9d3a683097bae4ce4bb29dc3c5709c3f13"}, - {file = "pyobjc_framework_InputMethodKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e136a3d0dbc6e732614cee4836a7eb6eedbb114b99a27e587e36fd1dc4444a4d"}, - {file = "pyobjc_framework_InputMethodKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c6aac278bd85babb77e8e567624bd4a32b645693d0987861968c400806f484fc"}, - {file = "pyobjc_framework_InputMethodKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cfb8e824282f03ddeed2abcef4db0a9f2c63196251d0676f17a5137076092cc1"}, - {file = "pyobjc_framework_inputmethodkit-11.0.tar.gz", hash = "sha256:86cd648bf98c4e777c884b7f69ebcafba84866740430d297645bf388eee6ce52"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-installerplugins" -version = "11.0" -description = "Wrappers for the framework InstallerPlugins on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_InstallerPlugins-11.0-py2.py3-none-any.whl", hash = "sha256:cb21bfd5597233a2de3d8c0a8d50f23cf92c43e8963edf85787430ac3cadf4a3"}, - {file = "pyobjc_framework_InstallerPlugins-11.0-py3-none-any.whl", hash = "sha256:2221301f466d30d6fd32c7317560c85926a3ee93f1de52d320e3b3cd826a8f93"}, - {file = "pyobjc_framework_installerplugins-11.0.tar.gz", hash = "sha256:88ec84e6999e8b2df874758b09878504a4fbfc8471cf3cd589d57e556f5b916e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-instantmessage" -version = "11.0" -description = "Wrappers for the framework InstantMessage on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_InstantMessage-11.0-py2.py3-none-any.whl", hash = "sha256:ce364e4e18ec8551512b7d968c0d950ccf7de4bb470f66fe524f3bc8d23df0d1"}, - {file = "pyobjc_framework_InstantMessage-11.0-py3-none-any.whl", hash = "sha256:a2817353eaf8f37fe6063c28006b2a0889892e3de801b51b059c153a9d3f35f8"}, - {file = "pyobjc_framework_instantmessage-11.0.tar.gz", hash = "sha256:ec5c4c70c9b0e61ae82888067246e4f931e700d625b3c42604e54759d4fbf65c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-intents" -version = "11.0" -description = "Wrappers for the framework Intents on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"16.0\"" -files = [ - {file = "pyobjc_framework_Intents-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9e3e4bc09db930b37b98a545a3e4deb48ffaf15e9a86dca52f53923633fd5a4b"}, - {file = "pyobjc_framework_Intents-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a9a445a3d4a0622ebf96c65b0ac0be7cec1e72cf7fd9900cd5ace6acf4e84bce"}, - {file = "pyobjc_framework_Intents-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1e148accce2c7c9243ff90ab3f1a200f93d93506da9c3a2cd034fd5579cb839a"}, - {file = "pyobjc_framework_Intents-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e80b38b923327e2097007ae56a540ad96635267ff5ed0fbcd2ba47912bde721c"}, - {file = "pyobjc_framework_Intents-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6413c851d9e8297e19c90adff64805a12b206f3d8e49b447b13b444271fce7c0"}, - {file = "pyobjc_framework_Intents-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8422d592fbe4c188216ec18f9c2a253747cd7cb0036f7f8ee0bb74ff7ab31d1e"}, - {file = "pyobjc_framework_intents-11.0.tar.gz", hash = "sha256:6405c816dfed8ffa8b3f8b0fae75f61d64787dbae8db1c475bb4450cf8fdf6b5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-intentsui" -version = "11.0" -description = "Wrappers for the framework Intents on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_IntentsUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9a97eff9239538e5179aba5c3c458ce6686f642b7492704d4a637f226e976e87"}, - {file = "pyobjc_framework_IntentsUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7c677225d38fffc5e00df803f93a6a627c466b35a362ed27173f7901e185882e"}, - {file = "pyobjc_framework_IntentsUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b93a1d9594f471596f255db354c13d67caed7aa020afb9f4e69cde2674f4db71"}, - {file = "pyobjc_framework_IntentsUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:03aed41572c0a3fd1d52d46a76417c2dc41aaf7757c6a21a20e139a99e93a17b"}, - {file = "pyobjc_framework_IntentsUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6a77264fb77f769cbcc9d2d3f38324641bdd941e874f6a324e4289fc0c5c714c"}, - {file = "pyobjc_framework_IntentsUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7ea9d7139d4454cc2f871d6004b0b557fc6b098220ec12079a1fb3843c51b4c"}, - {file = "pyobjc_framework_intentsui-11.0.tar.gz", hash = "sha256:4ce04f926c823fbc1fba7d9c5b33d512b514396719e6bc50ef65b82774e42bc5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Intents = ">=11.0" - -[[package]] -name = "pyobjc-framework-iobluetooth" -version = "11.0" -description = "Wrappers for the framework IOBluetooth on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_IOBluetooth-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:451e8df0042a8bf1fc3810015f1f91f44a154d53d5bfca69a0f8dc06bee7acff"}, - {file = "pyobjc_framework_IOBluetooth-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7d2005d3eff2afed4b5930613ae3c1b50004ebabffb86c0d5dd28d54436e16e6"}, - {file = "pyobjc_framework_IOBluetooth-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f86d2e675ee2a61ba3d2a446322e918e8ef2dc3e242e893ef81abfc480a6f2c2"}, - {file = "pyobjc_framework_IOBluetooth-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7235081bce37a8f0f9436180f596f47713d1e2f8b9676a7de6ec8c42236db410"}, - {file = "pyobjc_framework_IOBluetooth-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b7b72125fcab798f45cbf0b9667acba0d26810b0f7513f13b88d34b925806b17"}, - {file = "pyobjc_framework_IOBluetooth-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:6bd591c920458cda0cd80deae21fea377844b4a14babd6f89478eebce5477f27"}, - {file = "pyobjc_framework_iobluetooth-11.0.tar.gz", hash = "sha256:869f01f573482da92674abbae4a154143e993b1fe4b2c3523f9e0f9c48b798d4"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-iobluetoothui" -version = "11.0" -description = "Wrappers for the framework IOBluetoothUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_IOBluetoothUI-11.0-py2.py3-none-any.whl", hash = "sha256:0f94afeb5ecbde07712ea7658a38d6b0e3558154a6bc29c9a33b633f5952b2c3"}, - {file = "pyobjc_framework_IOBluetoothUI-11.0-py3-none-any.whl", hash = "sha256:5bc366a9904532168ac2c49523e7f090f81b6acbb7b8929ffc7855be0b1d4cf7"}, - {file = "pyobjc_framework_iobluetoothui-11.0.tar.gz", hash = "sha256:a583758d3e54149ee2dcf00374685aa99e8ae407e044f7c378acc002f9f27e63"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-IOBluetooth = ">=11.0" - -[[package]] -name = "pyobjc-framework-iosurface" -version = "11.0" -description = "Wrappers for the framework IOSurface on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_IOSurface-11.0-py2.py3-none-any.whl", hash = "sha256:58c6e79401a00dc63a5797cd3cc067542d4f94fcd2fc8979dc248c3b06c3b829"}, - {file = "pyobjc_framework_IOSurface-11.0-py3-none-any.whl", hash = "sha256:f2bc13cbfd178396bde6e7558b05a49f69cce376885a07f645a5dd69d2b578fc"}, - {file = "pyobjc_framework_iosurface-11.0.tar.gz", hash = "sha256:24da8d1cf9356717b1c7e75a1c61e9a9417b62f051d13423a4a7b0978d3dcda5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-ituneslibrary" -version = "11.0" -description = "Wrappers for the framework iTunesLibrary on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_iTunesLibrary-11.0-py2.py3-none-any.whl", hash = "sha256:3836fccec315f5186e4b029b486fd18d4b1f24a4c2e73f2d9f3e157ee66d294d"}, - {file = "pyobjc_framework_iTunesLibrary-11.0-py3-none-any.whl", hash = "sha256:bfd40fde3f057318329e5fb6e256051eea3f6cd2e2adb9c1f1f51fcb87deb05a"}, - {file = "pyobjc_framework_ituneslibrary-11.0.tar.gz", hash = "sha256:2e15dcfbb9d5e95634ddff153de159a28f5879f1a13fdf95504e011773056c6e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-kernelmanagement" -version = "11.0" -description = "Wrappers for the framework KernelManagement on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_KernelManagement-11.0-py2.py3-none-any.whl", hash = "sha256:e2ad0efd00c0dce90fc05efac296733282c482d54ec7c5fdcb86b4fb8dff1eb8"}, - {file = "pyobjc_framework_KernelManagement-11.0-py3-none-any.whl", hash = "sha256:90baacf8bea2883fd62ffb5d7dc6e6ae43fcc6f444458c884da8d92170fcaa5e"}, - {file = "pyobjc_framework_kernelmanagement-11.0.tar.gz", hash = "sha256:812479d5f85eae27aeeaa22f64c20b926b28b5b9b2bf31c8eab9496d3e038028"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-latentsemanticmapping" -version = "11.0" -description = "Wrappers for the framework LatentSemanticMapping on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_LatentSemanticMapping-11.0-py2.py3-none-any.whl", hash = "sha256:87fd91320fb7ce0b2c482fda41a5c38388f5a694ee2d7208725d22ff75438c00"}, - {file = "pyobjc_framework_LatentSemanticMapping-11.0-py3-none-any.whl", hash = "sha256:073b8a4e7a22e6abd58005b7d7091144aec4fc1d4b519e9f972b3aee9da30009"}, - {file = "pyobjc_framework_latentsemanticmapping-11.0.tar.gz", hash = "sha256:6f578c3e0a171706bdbfcfc2c572a8059bf8039d22c1475df13583749a35cec1"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-launchservices" -version = "11.0" -description = "Wrappers for the framework LaunchServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_LaunchServices-11.0-py2.py3-none-any.whl", hash = "sha256:654572e5f2997d8f802b97f619fc6c7d4f927abb03ce53b3dad89b376517b2d1"}, - {file = "pyobjc_framework_LaunchServices-11.0-py3-none-any.whl", hash = "sha256:dbc169442deae53f881d1d07fc79c9da6459e5f0b411e8dd1cfd1c519b3a99c8"}, - {file = "pyobjc_framework_launchservices-11.0.tar.gz", hash = "sha256:7c5c8a8cec013e2cb3fa82a167ca2d61505c36a79f75c718f3f913e597f9ffee"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-CoreServices = ">=11.0" - -[[package]] -name = "pyobjc-framework-libdispatch" -version = "11.0" -description = "Wrappers for libdispatch on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_libdispatch-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a02e057d72af6a71ad69613c24162ca45e377c918a010889e7c366e035ad23c3"}, - {file = "pyobjc_framework_libdispatch-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:cebdc33a1a771c9ab03fe5c8a2b0ed9698804e7bccdbfcd3cc0045c4b4aad4f3"}, - {file = "pyobjc_framework_libdispatch-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:999815af50ad2216e28d76893023b7839b7f1e8f22bcf7062d81d9a51ade4613"}, - {file = "pyobjc_framework_libdispatch-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3c835fa45044ee9137ae86e377dafbd6fdd7e1b0353bddc321cb1202d1a5f09a"}, - {file = "pyobjc_framework_libdispatch-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ca52baf694725fbcec87c5c7f61e4ace5aa089fbae149b05d86b50cae4ee998d"}, - {file = "pyobjc_framework_libdispatch-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:0d7f9ea0ef2ad093c3c948d4716b9683ad4ebdab85f9cc292fa8cbca2a4de1b4"}, - {file = "pyobjc_framework_libdispatch-11.0.tar.gz", hash = "sha256:d22df11b07b1c3c8e7cfc4ba9e876a95c19f44acd36cf13d40c5cccc1ffda04b"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-libxpc" -version = "11.0" -description = "Wrappers for xpc on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_libxpc-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:38432068d7684bc695f187b54c9cd86b83ba610a26f157e04553b77620778041"}, - {file = "pyobjc_framework_libxpc-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5f05f9eb3662df5832ff09ab788d6f6099f4674cb015200db317ea8c69f8c5e8"}, - {file = "pyobjc_framework_libxpc-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e000cad8588a961a3e6e5016736cd76b5d992b080cfe8b95745691db5a0ce8df"}, - {file = "pyobjc_framework_libxpc-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b569a959f53edef8e05e63ea1998ca7b925568a0d9e181a57ffa2ed213105880"}, - {file = "pyobjc_framework_libxpc-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a7134b64f113382e90369a8627b72cd1a3aef3acc2fc5634640fafdcbada8d6"}, - {file = "pyobjc_framework_libxpc-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:65f750f3a8d2ed342a8f506ae2e67bb858976301c97945114b8e378599f6029b"}, - {file = "pyobjc_framework_libxpc-11.0.tar.gz", hash = "sha256:e0c336913ab6a526b036915aa9038de2a5281e696ac2d3db3347b3040519c11d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-linkpresentation" -version = "11.0" -description = "Wrappers for the framework LinkPresentation on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_LinkPresentation-11.0-py2.py3-none-any.whl", hash = "sha256:c10ee1ac48bb7cd2d67ade7f354ec71af1f4244a8deb8530ba646fd4ba327b21"}, - {file = "pyobjc_framework_LinkPresentation-11.0-py3-none-any.whl", hash = "sha256:5b063900715c5bcf58f533e6c9672473cb07fe3eaa0f0454d93947defa09f13e"}, - {file = "pyobjc_framework_linkpresentation-11.0.tar.gz", hash = "sha256:bc4ace4aab4da4a4e4df10517bd478b6d51ebf00b423268ee8d9f356f9e87be9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-localauthentication" -version = "11.0" -description = "Wrappers for the framework LocalAuthentication on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_LocalAuthentication-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3aa2b161d897a50576d2a05b2ea1095877789116073aaefc52a379d651b7487f"}, - {file = "pyobjc_framework_LocalAuthentication-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8c6500bb5b195799d70f2a622d89a9c2531cb13d6afe30916cf073a195dd86eb"}, - {file = "pyobjc_framework_LocalAuthentication-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c0291e743fb1534c1df900e9adacc809af0651744627ce8ae25cfd021e3db73b"}, - {file = "pyobjc_framework_LocalAuthentication-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c3dca51a68d1c28f304a6bfad5fa2838fcf25f7c97570a503a31642eda042551"}, - {file = "pyobjc_framework_LocalAuthentication-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:bb19e6d5aac03f3dbf668a0daab1dad0f5d638f337f5a4913f143061e9cb969c"}, - {file = "pyobjc_framework_LocalAuthentication-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:23c6074c435c385a47aaf256e5b9054ee81f7a22c403354857c2f3de9fcddf93"}, - {file = "pyobjc_framework_localauthentication-11.0.tar.gz", hash = "sha256:eb55a3de647894092d6ed3f8f13fdc38e5dbf4850be320ea14dd2ac83176b298"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Security = ">=11.0" - -[[package]] -name = "pyobjc-framework-localauthenticationembeddedui" -version = "11.0" -description = "Wrappers for the framework LocalAuthenticationEmbeddedUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-11.0-py2.py3-none-any.whl", hash = "sha256:0ccbbdd8c7142b1670885881c803f684ee356df83a5338be9135f46462caae6c"}, - {file = "pyobjc_framework_LocalAuthenticationEmbeddedUI-11.0-py3-none-any.whl", hash = "sha256:e8da98dc38a88995e344742585d3735af9b5bd9926a29774d77e2aa6dd46b7af"}, - {file = "pyobjc_framework_localauthenticationembeddedui-11.0.tar.gz", hash = "sha256:7e9bf6df77ff12a4e827988d8578c15b4431694b2fcfd5b0dad5d7738757ee6a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-LocalAuthentication = ">=11.0" - -[[package]] -name = "pyobjc-framework-mailkit" -version = "11.0" -description = "Wrappers for the framework MailKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_MailKit-11.0-py2.py3-none-any.whl", hash = "sha256:78e54ff3988fd1af16c06e0c39dea3b7ff522e367d262f58e88962772291c7f9"}, - {file = "pyobjc_framework_MailKit-11.0-py3-none-any.whl", hash = "sha256:0573ee0be66419130774aca36b611d0d07fcf7c756524860acba8fe17eefeec2"}, - {file = "pyobjc_framework_mailkit-11.0.tar.gz", hash = "sha256:d08a2dcc95b5e7955c7c385fe6e018325113d02c007c4178d3fb3c9ab326c163"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-mapkit" -version = "11.0" -description = "Wrappers for the framework MapKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_MapKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d6ebeb4068f226fe865815e5e493995f267eeda66450d3e25a997866aac4b32e"}, - {file = "pyobjc_framework_MapKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83128d79aa7644e5b966b32346f7da749b1dbb110dadba857b93ecf5663e24e6"}, - {file = "pyobjc_framework_MapKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e6aa1d00cfe2e02b301467e24ca51e469e9a8a2ec2a9f097b73adca1a5a2a054"}, - {file = "pyobjc_framework_MapKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:202f5c913f419e315b1a75ba9026c85318cca5b335ead4e6fd7e328e1462227d"}, - {file = "pyobjc_framework_MapKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2583b6206be60f26908275035ad41b7d183545b4fc9b5e7e780f24942f1d275f"}, - {file = "pyobjc_framework_MapKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f67fc5ac978462507a8c7424109dbe26fd4ae954aeb0a609f593bb6a1d02c0d8"}, - {file = "pyobjc_framework_mapkit-11.0.tar.gz", hash = "sha256:cd8a91df4c0b442fcf1b14d735e566a06b21b3f48a2a4afe269fca45bfa49117"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreLocation = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-mediaaccessibility" -version = "11.0" -description = "Wrappers for the framework MediaAccessibility on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_MediaAccessibility-11.0-py2.py3-none-any.whl", hash = "sha256:901961f171f7af184decbf5a3899debfa56dbd1a63a53d0ff3d93eff90f2f464"}, - {file = "pyobjc_framework_MediaAccessibility-11.0-py3-none-any.whl", hash = "sha256:3f4b9e4d1ac8e7f8cdb7a2e9839ab75cb358dead3e6365ccd8d6017d7e93811e"}, - {file = "pyobjc_framework_mediaaccessibility-11.0.tar.gz", hash = "sha256:1298cc0128e1c0724e8f8e63a6167ea6809a985922c67399b997f8243de59ab4"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-mediaextension" -version = "11.0" -description = "Wrappers for the framework MediaExtension on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"24.0\"" -files = [ - {file = "pyobjc_framework_MediaExtension-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bfee87fcd8a696d9c33d2791a57d4c81b4ec6016725fc26e4cbef273414fd94d"}, - {file = "pyobjc_framework_MediaExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9f25d674f381bae800761efe1628959293009d287f7127616f75318a87e4543d"}, - {file = "pyobjc_framework_MediaExtension-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9a167725f7a6921d446084b132505392bb375a5ef91498f7be5d94c0d48d26ae"}, - {file = "pyobjc_framework_MediaExtension-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0423f7a8b4950798a6b49a9d2106679c094f0e107788fef61ee49b4a2a1952eb"}, - {file = "pyobjc_framework_MediaExtension-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2c82fc1e9e0c8cd9f0b767abcc95f618eaac79b6af72e42987e05fc09cf43398"}, - {file = "pyobjc_framework_MediaExtension-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a37abfb6e811f2d6a62da7f8b72c8f784ff631aed8fbc65824f1207ff39142c9"}, - {file = "pyobjc_framework_mediaextension-11.0.tar.gz", hash = "sha256:ecd8a64939e1c16be005690117c21fd406fc04d3036e2adea7600d2a0c53f4ea"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-AVFoundation = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" - -[[package]] -name = "pyobjc-framework-medialibrary" -version = "11.0" -description = "Wrappers for the framework MediaLibrary on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_MediaLibrary-11.0-py2.py3-none-any.whl", hash = "sha256:3d273d4db7e1894fd2a95448c26eeced6e13e33555f727988aeec4b2762246fb"}, - {file = "pyobjc_framework_MediaLibrary-11.0-py3-none-any.whl", hash = "sha256:b8b97bb9067cf81942ce69d3273e2b18d093290c3fd692172a54f012ab64c0b3"}, - {file = "pyobjc_framework_medialibrary-11.0.tar.gz", hash = "sha256:692889fab1e479a9c207f0ff23c900dad5f47caf47c05cc995d9bb7c1e56e8b9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-mediaplayer" -version = "11.0" -description = "Wrappers for the framework MediaPlayer on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"16.0\"" -files = [ - {file = "pyobjc_framework_MediaPlayer-11.0-py2.py3-none-any.whl", hash = "sha256:b124b0f18444b69b64142bad2579287d0b1a4a35cb6b14526523a822066d527d"}, - {file = "pyobjc_framework_MediaPlayer-11.0-py3-none-any.whl", hash = "sha256:1a051624b536666feb5fd1a4bb54000ab45dac0c8aea4cd4707cbde1773acf57"}, - {file = "pyobjc_framework_mediaplayer-11.0.tar.gz", hash = "sha256:c61be0ba6c648db6b1d013a52f9afb8901a8d7fbabd983df2175c1b1fbff81e5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-AVFoundation = ">=11.0" - -[[package]] -name = "pyobjc-framework-mediatoolbox" -version = "11.0" -description = "Wrappers for the framework MediaToolbox on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_MediaToolbox-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:49ce94f1673e2cc1dba802182b9eb7f99694a0a8860079879ba3569befb91e45"}, - {file = "pyobjc_framework_MediaToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:df09e4db52d4efeafe4a324600b9c5062fd87c1d1217ebec2df65c8b6b0ce9ef"}, - {file = "pyobjc_framework_MediaToolbox-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e80e3057f5030fb034ac93c3e891cee346716e1669f280ebbd63ccfa52b2b7ff"}, - {file = "pyobjc_framework_MediaToolbox-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:95d672dab96a4f171a25e77092a18545973cc6c8a2fcb1cbbf290f7fdd8bc23c"}, - {file = "pyobjc_framework_MediaToolbox-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:300af56eb620870af96cebecbac441be4a65e5092d1848fe46e865380171e6c1"}, - {file = "pyobjc_framework_MediaToolbox-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c3ace26066452b0d17828231a46f8a5f43b06f22584df636a6aca481befe9e9"}, - {file = "pyobjc_framework_mediatoolbox-11.0.tar.gz", hash = "sha256:de949a44f10b5a15e5a7131ee53b2806b8cb753fd01a955970ec0f475952ba24"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-metal" -version = "11.0" -description = "Wrappers for the framework Metal on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_Metal-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:00a11acc8a6dc256c70312ba9f197bd36c1176128b30735530a85c6a6a6743ad"}, - {file = "pyobjc_framework_Metal-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ac5f317d52cd7523dea2e172fbe8b03e7452b907da42a0a5e5c5ab427c5e9de"}, - {file = "pyobjc_framework_Metal-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:45802d48d1a35cc66fee08539c8ca9fc6a0dc4ab700cf78a81cf5f8982ed6f5b"}, - {file = "pyobjc_framework_Metal-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:0065909c3bc7b464491fc0ad72c2469c6a1267b87bac5e4b821cf07faa249c18"}, - {file = "pyobjc_framework_Metal-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:124722569e60458e5f64e2b41028a7229679e1358c55fc95ddd297413f0933f6"}, - {file = "pyobjc_framework_Metal-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:41e3d636079e731ed5f3a17da4ec0d3138906d7dab98952b87b7b983f22caf29"}, - {file = "pyobjc_framework_metal-11.0.tar.gz", hash = "sha256:cad390150aa63502d5cfe242026b55ed39ffaf816342ddf51e44a9aead6c24be"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-metalfx" -version = "11.0" -description = "Wrappers for the framework MetalFX on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_MetalFX-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:43cc72ea1dab54e0001a5e87c8f31a21014f70abbc7edb1332b6c2c21b8dddf7"}, - {file = "pyobjc_framework_MetalFX-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a3a3847812d40cb6bb7a5f0e735f9f28cba83a1e1264d4dafc630ce894e98a20"}, - {file = "pyobjc_framework_MetalFX-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a37dc271513b217fcba4a99c6cd92997ee171b49b974e0a9dd1b35feb32b7109"}, - {file = "pyobjc_framework_MetalFX-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:be3772f0f5581ace7b47b10bdf392fe2c1668193a51bfbe0008d620c6ee31d82"}, - {file = "pyobjc_framework_MetalFX-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6769916eb595b7bcf5422064217c242a8df72a5a0c679ae35db45684306d81da"}, - {file = "pyobjc_framework_MetalFX-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1d7184fb3feacfe613257d92dc9242b0db48a63fa369a4e754d9e9a9be392cc2"}, - {file = "pyobjc_framework_metalfx-11.0.tar.gz", hash = "sha256:2ae41991bf7a733c44fcd5b6550cedea3accaaf0f529643975d3da113c9f0caa"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Metal = ">=11.0" - -[[package]] -name = "pyobjc-framework-metalkit" -version = "11.0" -description = "Wrappers for the framework MetalKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_MetalKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:89a3641a56f6bb8e71178a4f796f7f5184e52253815ee9905b6d3c17fc664cd9"}, - {file = "pyobjc_framework_MetalKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f314478a5d772d2f7b4db09957ecb63acd6e3f0cde8c18b1b6b35caa9ea7def2"}, - {file = "pyobjc_framework_MetalKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1f2d93180e7ac5abd906e492165a72f82d308d68101eadd213bba68a4b1dc4a8"}, - {file = "pyobjc_framework_MetalKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fcb411f680485cc7a71838c87154d899ba3d27cde406391a13a054f9dddb8e6"}, - {file = "pyobjc_framework_MetalKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a2169b9dee9c1201d41a950ac5c5e9c89b53aff88df95895f116193c97f74062"}, - {file = "pyobjc_framework_MetalKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:17d289b1b0fc95f96291aa0add4d9657eb86507f3166ebe19d708215eadb4880"}, - {file = "pyobjc_framework_metalkit-11.0.tar.gz", hash = "sha256:1bbbe35c7c6a481383d32f6eaae59a1cd8084319a65c1aa343d63a257d8b4ddb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Metal = ">=11.0" - -[[package]] -name = "pyobjc-framework-metalperformanceshaders" -version = "11.0" -description = "Wrappers for the framework MetalPerformanceShaders on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:97931653b6d1fbde0d177aadd4be41a799940acaa48cf8197d47fe97047e26bf"}, - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:460a30ff31f04bbe82bf3304949171e148e3171ba0c0773dd9bfc42dad766d2e"}, - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:abd4649de32aedfa45f8535d74227ba3e1411b6426f794026e8426feab43ea8e"}, - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:80ae6a6421f37817a7045b547928fd0ff14645970dca867565618d6080b143d0"}, - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:fabae9ba81bfd0e223737ebff97d40766fcad8274eac2597a8aea58bf32e9c86"}, - {file = "pyobjc_framework_MetalPerformanceShaders-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1332cfdf2f355cb0beb92b273d8b0ac46f0487088f92bd2b63dddc4ec71c9381"}, - {file = "pyobjc_framework_metalperformanceshaders-11.0.tar.gz", hash = "sha256:41179e3a11e55325153fffd84f48946d47c1dc1944677febd871a127021e056d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Metal = ">=11.0" - -[[package]] -name = "pyobjc-framework-metalperformanceshadersgraph" -version = "11.0" -description = "Wrappers for the framework MetalPerformanceShadersGraph on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_MetalPerformanceShadersGraph-11.0-py2.py3-none-any.whl", hash = "sha256:d48ffe401fbc8273a23e908685635a51c64d4ebfb5ad32742664ab9fac6c5194"}, - {file = "pyobjc_framework_MetalPerformanceShadersGraph-11.0-py3-none-any.whl", hash = "sha256:f0702a6e91b273e552283ff2782220ce08eb65325aa45ad428e0b7f3b45cf211"}, - {file = "pyobjc_framework_metalperformanceshadersgraph-11.0.tar.gz", hash = "sha256:33077ebbbe1aa7787de2552a83534be6c439d7f4272de17915a85fda8fd3b72d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-MetalPerformanceShaders = ">=11.0" - -[[package]] -name = "pyobjc-framework-metrickit" -version = "11.0" -description = "Wrappers for the framework MetricKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_MetricKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7540a0cb57a319e7625b09ad0e90afff3eab75d9dc9ac676b204f99cb64f9be8"}, - {file = "pyobjc_framework_MetricKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:422b6ca1f082dae864df8cc4aa0bac3829be95675b72ef63cd3ee00d30966b97"}, - {file = "pyobjc_framework_MetricKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b94313601bbf0181c8f75712e82646261ff0e020da5c83d25914952db53a7955"}, - {file = "pyobjc_framework_MetricKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f5e7bc06977d2b84c5f76a32cfbff6d9833f01650efefe9e6848c36b5777040b"}, - {file = "pyobjc_framework_MetricKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8ef7d2c005f0612f2007b597d0963a09d34e082b18e2350f557de859f40d1a1"}, - {file = "pyobjc_framework_MetricKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:121d8ea837e21e22a8c823380cadbe9e3d3696a083dcb1c331065c2d5686cce5"}, - {file = "pyobjc_framework_metrickit-11.0.tar.gz", hash = "sha256:ee3da403863beec181a2d6dc7b7eeb4d07e954b88bbabac58a82523b2f83fdc7"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-mlcompute" -version = "11.0" -description = "Wrappers for the framework MLCompute on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_MLCompute-11.0-py2.py3-none-any.whl", hash = "sha256:16ec2942af9915f931df76b42e7f42348109b599faef955f5bea540735f87677"}, - {file = "pyobjc_framework_MLCompute-11.0-py3-none-any.whl", hash = "sha256:bcdf94fe060fb034aed41db84af1cfcdbf3925e69b2b11df89d4546fac6cf0bf"}, - {file = "pyobjc_framework_mlcompute-11.0.tar.gz", hash = "sha256:1a1ee9ab43d1824300055ff94b042a26f38f1d18f6f0aa08be1c88278e7284d9"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-modelio" -version = "11.0" -description = "Wrappers for the framework ModelIO on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_ModelIO-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bc5dd7403990e5931d72ef486db6fdf8c77b03e14640e8ef51a3b28a4fadbef8"}, - {file = "pyobjc_framework_ModelIO-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c126318b878ffb31c39b0c7c91ca20a3b46c14c18f000e3bfb854e4541fe0147"}, - {file = "pyobjc_framework_ModelIO-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a7357f07b77f3ab0a8107d827acdbc3e1fd458ce396335c057930b6a3f225a93"}, - {file = "pyobjc_framework_ModelIO-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:3e1f3050eaaa34ce5d97d21c08c8df9d58609e5f2ba5d91edd4eb58af727e305"}, - {file = "pyobjc_framework_ModelIO-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cf218295121f5f2bdbb792a5f846fc8d5a3e9cea9341f33909280a1dab2027af"}, - {file = "pyobjc_framework_ModelIO-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:573c1333e7f731b06bf3901df5fbe42b09a95135680822a438d664bca5db71eb"}, - {file = "pyobjc_framework_modelio-11.0.tar.gz", hash = "sha256:c875eb6ff7f94d18362a00faaa3016ae0c28140326338d18aa03c0b62f1c6b9d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-multipeerconnectivity" -version = "11.0" -description = "Wrappers for the framework MultipeerConnectivity on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:668c9adfa55f167c59679b5a23bc3d0ed483beb8941dff3f27b726c6f23c267f"}, - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:e338b22f5b0fcb398e316552398c252bedfc3375c058340861eb205e3cdf994e"}, - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:66bef15f5e5afd6b966cdadf2162082b0171f4a45af6d2cb2644f38431011911"}, - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:653dc69491483f225efd4c4c58de07541e0a08c777c671abf27007ab569bf03b"}, - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ed2b49bd63734fae15932e8d5619be33bc8a602426d24e321277e27992486510"}, - {file = "pyobjc_framework_MultipeerConnectivity-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fbe483c580fba0963ec76c0a49fde687d3333988069d4ca831858486e47fd3d3"}, - {file = "pyobjc_framework_multipeerconnectivity-11.0.tar.gz", hash = "sha256:8278a3483c0b6b88a8888ca76c46fd85808f9df56d45708cbc4e4182a5565cd3"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-naturallanguage" -version = "11.0" -description = "Wrappers for the framework NaturalLanguage on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_NaturalLanguage-11.0-py2.py3-none-any.whl", hash = "sha256:0744a2871690dcc9ec9e7169023b492abdde63ef97abde46013c01477b4d047c"}, - {file = "pyobjc_framework_NaturalLanguage-11.0-py3-none-any.whl", hash = "sha256:7c021b270fda5469b56b9804e860cf5a80a485b817fc5fd3bb002383b2982d94"}, - {file = "pyobjc_framework_naturallanguage-11.0.tar.gz", hash = "sha256:4c9471fa2c48a8fd4899de4406823e66cb0292dbba7b471622017f3647d53fa4"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-netfs" -version = "11.0" -description = "Wrappers for the framework NetFS on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_NetFS-11.0-py2.py3-none-any.whl", hash = "sha256:11e06da73a1d590b8462f3a1412604758d49b5e04d134b6e991282453b76abb8"}, - {file = "pyobjc_framework_NetFS-11.0-py3-none-any.whl", hash = "sha256:9b69a36e3a6782ce37cd3140c584dd7d5c96f7355662d004a2927583b112b4dd"}, - {file = "pyobjc_framework_netfs-11.0.tar.gz", hash = "sha256:3de5f627a62addf4aab8a4d2d07213e9b2b6c8adbe6cc4c332ee868075785a6a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-network" -version = "11.0" -description = "Wrappers for the framework Network on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_Network-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5009c59df2a24412c6e834633447ee4c7c6b584f91c3a69fcb1ecc9442966a46"}, - {file = "pyobjc_framework_Network-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6fc797537690a241b555475923bcee28824efacd501e235457daeb4496b4b700"}, - {file = "pyobjc_framework_Network-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b9bb4a0cbd01cc4acb120ce313662763bca0c5ef11c01a0a0cae64c80b120c5"}, - {file = "pyobjc_framework_Network-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:63cde7c03c12119da7b7130f6805a751d3c08156cd608d34dce6f6b6f1474309"}, - {file = "pyobjc_framework_Network-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8ef9a3c4ea853acfa0bf049088dfa6ffc9bb51cd3e0c6f9011d5f020cd9942d3"}, - {file = "pyobjc_framework_Network-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:40fcac8efa3742c798a3ab56b9a9fc6bafe6e83cefdcc51d5b889bb66cda2fd5"}, - {file = "pyobjc_framework_network-11.0.tar.gz", hash = "sha256:d4dcc02773d7d642a385c7f0d951aeb7361277446c912a49230cddab60a65ab8"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-networkextension" -version = "11.0" -description = "Wrappers for the framework NetworkExtension on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_NetworkExtension-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f42fa3d41e457fa71434b28f8abf83b339893c6896b394255365128977db4117"}, - {file = "pyobjc_framework_NetworkExtension-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bba4f338748c8ad2cb4320c4dd64b64772a863c6b6f991c2636b2a2f4cb839a"}, - {file = "pyobjc_framework_NetworkExtension-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:abf63433992ff1830f42cb813d1575473f0034ca6f62827f43bb2b33cc31e095"}, - {file = "pyobjc_framework_NetworkExtension-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6fa11259ae396411d1ce592b6f3282de9dd9ed0a48001adb69138262c91c7363"}, - {file = "pyobjc_framework_NetworkExtension-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:d55909b121558a81939624839155a0c0dbe41d7512c70d535eed3dd791a510a1"}, - {file = "pyobjc_framework_NetworkExtension-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:66ec0b117aea56cb1fd88f1ebec00a63f775c4c9c1e671d6e111f696145ec557"}, - {file = "pyobjc_framework_networkextension-11.0.tar.gz", hash = "sha256:5ba2254e2c13010b6c4f1e2948047d95eff86bfddfc77716747718fa3a8cb1af"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-notificationcenter" -version = "11.0" -description = "Wrappers for the framework NotificationCenter on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"14.0\"" -files = [ - {file = "pyobjc_framework_NotificationCenter-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7942565c4dd8bc136d40913d7f17b4426db6b73f581b3593d0656553ca425f6a"}, - {file = "pyobjc_framework_NotificationCenter-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:075853f3e36eb4377182589e552226b2207a575035d7e128055cfde9dcad84b7"}, - {file = "pyobjc_framework_NotificationCenter-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:093e50badfbc78edf088f9241cddba7516a58188d401f299e361f1ec85e93fce"}, - {file = "pyobjc_framework_NotificationCenter-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2c5f7ff6b3fc37beb11c3ff0ad73e0c708bc16f105e78548065c02ab9b23ac75"}, - {file = "pyobjc_framework_NotificationCenter-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:94d43c8552f25efdf0d65b10b2a74b5978c77264b392d6b8cc2d55d99b6efd86"}, - {file = "pyobjc_framework_NotificationCenter-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:09af69a327035cdd9c6e3a93cc5152305bbc7db542bf75b6e97f4a7af5387fff"}, - {file = "pyobjc_framework_notificationcenter-11.0.tar.gz", hash = "sha256:f878b318c693d63d6b8bd1c3e2ad4f8097b22872f18f40142e394d84f1ead9f6"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-opendirectory" -version = "11.0" -description = "Wrappers for the framework OpenDirectory on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_OpenDirectory-11.0-py2.py3-none-any.whl", hash = "sha256:8a0feeda5a7f34b25b72c71cd1e4dd57b636cc4103248ff91bcb8571d4915eb4"}, - {file = "pyobjc_framework_OpenDirectory-11.0-py3-none-any.whl", hash = "sha256:bfac495de433a62e3934619e2f5d2254177f960b7d4e905ed4ef359127e23b24"}, - {file = "pyobjc_framework_opendirectory-11.0.tar.gz", hash = "sha256:0c82594f4f0bcf2318c4641527f9243962d7b03e67d4f3fb111b899a299fc7eb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-osakit" -version = "11.0" -description = "Wrappers for the framework OSAKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_OSAKit-11.0-py2.py3-none-any.whl", hash = "sha256:3183414e345af83a2187b00356130909a7c2a41b2227dc579b662737300c3ba4"}, - {file = "pyobjc_framework_OSAKit-11.0-py3-none-any.whl", hash = "sha256:79150c47d2aeffc72fb6551060518ce472275edbad3b56aef5923a6086371c28"}, - {file = "pyobjc_framework_osakit-11.0.tar.gz", hash = "sha256:77ac18e2660133a9eeb01c76ad3df3b4b36fd29005fc36bca00f57cca121aac3"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-oslog" -version = "11.0" -description = "Wrappers for the framework OSLog on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_OSLog-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf497a07b492891b3659078c662221b97e555cbcdbb76beb7b553a0d04792492"}, - {file = "pyobjc_framework_OSLog-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c0131851fca9b741f290ffa727dd30328dd8526b87c8cef623b79239bed99187"}, - {file = "pyobjc_framework_OSLog-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:17d8b49113a476372b24ac8e544d88f6d12f878f1081dd611ab203c4484f2039"}, - {file = "pyobjc_framework_OSLog-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:76d94209b46e3da1668473155b191af9958f415ee18c1cb3d0f35cf9f42e9640"}, - {file = "pyobjc_framework_OSLog-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ddaa84ae8234940a07a22a8b48767011e031e009817de8f22f9625c354de01cf"}, - {file = "pyobjc_framework_OSLog-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c5a200af7314900feef5fda242eee8938154b3cb8e2a7f90e1caaba02235d5b0"}, - {file = "pyobjc_framework_oslog-11.0.tar.gz", hash = "sha256:9d29eb7c89a41d7c702dffb6e2e338a2d5219387c8dae22b67754ddf9e2fcb3f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-passkit" -version = "11.0" -description = "Wrappers for the framework PassKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_PassKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eaaed276dd3763057fbbbb150e6e213b1842bb73fdf7c92cce811cfc6c74b5c4"}, - {file = "pyobjc_framework_PassKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:710372134c3adedb9017bfc2fbc592ef0e94ae916145b58e57234239bf903b90"}, - {file = "pyobjc_framework_PassKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe0144177f7feb96577bea53841d9b9b3f63185735a1bf1b36368ab189fd6282"}, - {file = "pyobjc_framework_PassKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ec60ab6fd143d26ab6aa8103d8eb3bbf41b1d48d8aa89816005ce0a51a14d88e"}, - {file = "pyobjc_framework_PassKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8f7a8af72be7b2f8cef11a7761c255eaad93405c3a752f2f2b91e5d346afb8c2"}, - {file = "pyobjc_framework_PassKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c241fe97ece86d5d6e148b1f6fd4f427a9564fa6c84706012636db89e289eb7b"}, - {file = "pyobjc_framework_passkit-11.0.tar.gz", hash = "sha256:2044d9d634dd98b7b624ee09487b27e5f26a7729f6689abba23a4a011febe19c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-pencilkit" -version = "11.0" -description = "Wrappers for the framework PencilKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_PencilKit-11.0-py2.py3-none-any.whl", hash = "sha256:22cbb6ed2504be4c8d631c4711b00fae48ef731c10c69861b4de1e4fcdc19279"}, - {file = "pyobjc_framework_PencilKit-11.0-py3-none-any.whl", hash = "sha256:a4e606c5b69e6adb80ef30fc95fe0095971735d12ab6fc4fe4d982e4c8a3881a"}, - {file = "pyobjc_framework_pencilkit-11.0.tar.gz", hash = "sha256:9598c28e83f5b7f091592cc1af2b16f7ae94cf00045d8d14ed2c17cb9e4ffd50"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-phase" -version = "11.0" -description = "Wrappers for the framework PHASE on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_PHASE-11.0-py2.py3-none-any.whl", hash = "sha256:d3e41c2b2fdf4b2ce39f558a08762c6864449ff87b618e42747777ad3f821323"}, - {file = "pyobjc_framework_PHASE-11.0-py3-none-any.whl", hash = "sha256:78c0600477ea294304b51f8284a2fb299be284c33ae2c135e1c7cd26fdf4def4"}, - {file = "pyobjc_framework_phase-11.0.tar.gz", hash = "sha256:e06a0f8308ae4f3731f88b3e1239b7bdfdda3eef97023e3ce972e2f386451d80"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-AVFoundation = ">=11.0" - -[[package]] -name = "pyobjc-framework-photos" -version = "11.0" -description = "Wrappers for the framework Photos on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_Photos-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0998ab97ebde4b060d28d57173bb9b9652fddd99999fa7a2f0142f1883a84f81"}, - {file = "pyobjc_framework_Photos-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:71bf849888713e4a00eb44074c5000ed081c905ba35b3a55ee84c6367ce60ce8"}, - {file = "pyobjc_framework_Photos-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ea630c3abf4620b022f23167ef5f3d6b157b38697d7ffc5df0fc507e95bed655"}, - {file = "pyobjc_framework_Photos-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e5e10ba50dd25455fcff47126e67e63be48edfd64e1c4f37e1c059a667b0a19d"}, - {file = "pyobjc_framework_Photos-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1a1a20b6d73cc6cc9ab2eed33072ba8e3da9628c962ccb95a377e59d869a19dc"}, - {file = "pyobjc_framework_Photos-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:80c905577dc6b26dc4880b6642e7e69c5c25b62c0cc4a32acb5e8bf6d2ce5a50"}, - {file = "pyobjc_framework_photos-11.0.tar.gz", hash = "sha256:cfdfdefb0d560b091425227d5c0e24a40b445b5251ff4d37bd326cd8626b80cd"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-photosui" -version = "11.0" -description = "Wrappers for the framework PhotosUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"15.0\"" -files = [ - {file = "pyobjc_framework_PhotosUI-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:200acef81358c5970f075a133ad026be52e7bc19d359fe1430b1be3a48f23faf"}, - {file = "pyobjc_framework_PhotosUI-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b3865d2cc4fad4d34255941fe93ce504b9d2c7a7043bd0f4c715da9f4af1cf1"}, - {file = "pyobjc_framework_PhotosUI-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:66826184121cd15415750d801160721adad80b53cbb315192522229b17252ebb"}, - {file = "pyobjc_framework_PhotosUI-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c438077e03d4c89f3d7f99cc9a2916eea52f2b37690023371fbf2a6d654be9e3"}, - {file = "pyobjc_framework_PhotosUI-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cae57888e20be00c40f1784d49dcc572f195f024f0456d0f0c4a599ee9928c83"}, - {file = "pyobjc_framework_PhotosUI-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a04d10ae8e3d0ab18b9908e1b01e267a39d86d57d97224533b0ddfc01bb350df"}, - {file = "pyobjc_framework_photosui-11.0.tar.gz", hash = "sha256:3c65342e31f6109d8229992b2712b29cab1021475969b55f4f215dd97e2a99db"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-preferencepanes" -version = "11.0" -description = "Wrappers for the framework PreferencePanes on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_PreferencePanes-11.0-py2.py3-none-any.whl", hash = "sha256:2143851549430d6bb951adae44cb65c1986662ac7c8cbe15891ed194cbe283a2"}, - {file = "pyobjc_framework_PreferencePanes-11.0-py3-none-any.whl", hash = "sha256:9f1287716374338fa99445ca13dfcc6c9be5597c8a5ce06680a8ca245b4e0acc"}, - {file = "pyobjc_framework_preferencepanes-11.0.tar.gz", hash = "sha256:ee000c351befeb81f4fa678ada85695ca4af07933b6bd9b1947164e16dd0b3e5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-pubsub" -version = "11.0" -description = "Wrappers for the framework PubSub on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "platform_release >= \"9.0\" and platform_release < \"18.0\" and sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_PubSub-11.0-py2.py3-none-any.whl", hash = "sha256:bac16085127fe4c08ad6d6a47dd96e8e30440b3cf6bb0a5cf220de01587b79e7"}, - {file = "pyobjc_framework_PubSub-11.0-py3-none-any.whl", hash = "sha256:20bd0db73de3a7299d1a0bbd47fdff5bd193169c4bdfe57acfe0d5fc6619867c"}, - {file = "pyobjc_framework_pubsub-11.0.tar.gz", hash = "sha256:e0aed53114d809d4a65836d3e4ab41759f445e415f08052f0581f8ebb8d5662c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-pushkit" -version = "11.0" -description = "Wrappers for the framework PushKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_PushKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a35fe4739d8df2d4c191774acc41b651c49daef5b9486cf212cf3964def41667"}, - {file = "pyobjc_framework_PushKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0185cebcc5aad73aae50804c7a2412da6275717b8f872b830d71c484efcdea7a"}, - {file = "pyobjc_framework_PushKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:43bd1ed31664982e4d8397a7e07e58a7deb85bf9c9866ea966fd7ca25796014c"}, - {file = "pyobjc_framework_PushKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:7bdebcdee592c46f2e8c386d4c46a2443c72c2537e973dc4e8a76e32cf1465dc"}, - {file = "pyobjc_framework_PushKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:2868a62cd57bee9847c6a0fb487bb6d1a3d215de99291748982937f635a5e502"}, - {file = "pyobjc_framework_PushKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bdbddf78e4bb84e044144aa10d06216b49f203ef68e1b6f90102c101b311a0ce"}, - {file = "pyobjc_framework_pushkit-11.0.tar.gz", hash = "sha256:df9854ed4065c50022863b3c11c2a21c4279b36c2b5c8f08b834174aacb44e81"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-quartz" -version = "11.0" -description = "Wrappers for the Quartz frameworks on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_Quartz-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:da3ab13c9f92361959b41b0ad4cdd41ae872f90a6d8c58a9ed699bc08ab1c45c"}, - {file = "pyobjc_framework_Quartz-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:d251696bfd8e8ef72fbc90eb29fec95cb9d1cc409008a183d5cc3246130ae8c2"}, - {file = "pyobjc_framework_Quartz-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:cb4a9f2d9d580ea15e25e6b270f47681afb5689cafc9e25712445ce715bcd18e"}, - {file = "pyobjc_framework_Quartz-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:973b4f9b8ab844574461a038bd5269f425a7368d6e677e3cc81fcc9b27b65498"}, - {file = "pyobjc_framework_Quartz-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:66ab58d65348863b8707e63b2ec5cdc54569ee8189d1af90d52f29f5fdf6272c"}, - {file = "pyobjc_framework_Quartz-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:1032f63f2a4ee98366764e69c249f1d93813821e17d224cf626cf11fb1801fc4"}, - {file = "pyobjc_framework_quartz-11.0.tar.gz", hash = "sha256:3205bf7795fb9ae34747f701486b3db6dfac71924894d1f372977c4d70c3c619"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-quicklookthumbnailing" -version = "11.0" -description = "Wrappers for the framework QuickLookThumbnailing on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_QuickLookThumbnailing-11.0-py2.py3-none-any.whl", hash = "sha256:6e567a764942845ce4db7ccfc0f8a9d091216bd029ecca955e618a43d64a5d84"}, - {file = "pyobjc_framework_QuickLookThumbnailing-11.0-py3-none-any.whl", hash = "sha256:e0f7f62b9a1df55e5f717518baf3260dc2cb8a9722cc5e9c6fffc643f69bda27"}, - {file = "pyobjc_framework_quicklookthumbnailing-11.0.tar.gz", hash = "sha256:40763284bd0f71e6a55803f5234ad9cd8e8dd3aaaf5e1fd204e6c952b3f3530d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-replaykit" -version = "11.0" -description = "Wrappers for the framework ReplayKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_ReplayKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a855949d17cee9eafc06d432d41a5f6ca7b3826e71a9371edf29e7431b82d063"}, - {file = "pyobjc_framework_ReplayKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:262fb834400e8379f4c795e65137763348992f3010284602d876050b8adb9ea4"}, - {file = "pyobjc_framework_ReplayKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:da9db123ee52761a670c6e41e5f9d9a47a2ca5582a9c4a7c8662a8bb56a0f593"}, - {file = "pyobjc_framework_ReplayKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:deb774d2c65f498f9a8311266fb36fddef1d61646a13f7aece1627a18956982d"}, - {file = "pyobjc_framework_ReplayKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:846aaa02e2c81e5bc5f08172592bea84019977bad625ece5934eacaaa53b734c"}, - {file = "pyobjc_framework_ReplayKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:72eec25174f92a5eb05114a545a37c993827743e952883255e35a0cb5b52e628"}, - {file = "pyobjc_framework_replaykit-11.0.tar.gz", hash = "sha256:e5693589423eb9ad99d63a7395169f97b484a58108321877b0fc27c748344593"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-safariservices" -version = "11.0" -description = "Wrappers for the framework SafariServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"16.0\"" -files = [ - {file = "pyobjc_framework_SafariServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:889889e6d252d6156776b7dd87bde55de04d5e4af342441bfd24ac5f6da7252a"}, - {file = "pyobjc_framework_SafariServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:55c02a533073e0a2aaf6db544f087fd861bace6b62035c3bb2e6b20f0b921b2b"}, - {file = "pyobjc_framework_SafariServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:31ba086a39ee06d8622a504e3ea3a1f6dc8fab1d4c4c7930d5af6e989f38ec56"}, - {file = "pyobjc_framework_SafariServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:d037760567baccc452be85ec00fc9350e0403bfea874dc49dc91911440633100"}, - {file = "pyobjc_framework_SafariServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8dc7127a325dab5d37775b474f44f354469a569d68599307e974d201421f885"}, - {file = "pyobjc_framework_SafariServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:696d464ed433c474625d1ecf036f87df7d032e46e25b0776dc7c75d0a025d591"}, - {file = "pyobjc_framework_safariservices-11.0.tar.gz", hash = "sha256:dba416bd0ed5f4481bc400bf56ce57e982c19feaae94bc4eb75d8bda9af15b7e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-safetykit" -version = "11.0" -description = "Wrappers for the framework SafetyKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_SafetyKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:9c7e1ca71d11cbe6118fcaf7d21cd4f6a0cc67ad3cf1c1c01fa42280021b0515"}, - {file = "pyobjc_framework_SafetyKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:83a1f313c9c63ba107a7c543a8300ae225fa5ff17d963b1c499859da45ceaf55"}, - {file = "pyobjc_framework_SafetyKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c6dd23fcaca9c41d6aadf2ca0a6d07c4032a0c4ea8873ee06da6efd1e868f97e"}, - {file = "pyobjc_framework_SafetyKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6937bded126bf76a171b5b91ee777a124c40fcb98497bd3701ae4eb4175d0089"}, - {file = "pyobjc_framework_SafetyKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:54a5b40e94b62e7f1e55d1c25a4b27e8fe4d2b37fa043bf638da31b6b3246eca"}, - {file = "pyobjc_framework_SafetyKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7475a1e2fcc6ace82c8209d432c089797bed3c8d5440e9188ce51aef8e2f2647"}, - {file = "pyobjc_framework_safetykit-11.0.tar.gz", hash = "sha256:9ec996a6a8eecada4b9fd1138244bcffea96a37722531f0ec16566049dfd4cdb"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-scenekit" -version = "11.0" -description = "Wrappers for the framework SceneKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"11.0\"" -files = [ - {file = "pyobjc_framework_SceneKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:016fe80619bacdc5a16d8610f00fded399f3a37ccec65303617e2c1162773b9c"}, - {file = "pyobjc_framework_SceneKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86d23456e4c7a7bb7bb49be2b98647678ac7a39955e6bb242e0ac125d8b770e8"}, - {file = "pyobjc_framework_SceneKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d0a0d557167adddf27a42fb109a1dce29a22ff09aca34558fccd1c22f08ae2b4"}, - {file = "pyobjc_framework_SceneKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:687a9f2fd126d7ebfe80db6096192333e66a01259202a90fe860809fb3697f7d"}, - {file = "pyobjc_framework_SceneKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b8fe4306eb8ed77e253bb0eec493ea0292260897562a147a7f29378650fa6616"}, - {file = "pyobjc_framework_SceneKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:34cb863457ec33ee034b16226ccf64e914076cab5da243375e155c8cb52273d8"}, - {file = "pyobjc_framework_scenekit-11.0.tar.gz", hash = "sha256:c0f37019f8de2a583f66e6d14dfd4ae23c8d8703e93f61c1c91728a21f62cd26"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-screencapturekit" -version = "11.0" -description = "Wrappers for the framework ScreenCaptureKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.4\"" -files = [ - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:557ccd9e4b108158e2847a4635490428b9ae11840a86de5a5237e49171353667"}, - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:38468e833ec1498778bd33ce30578afed2e13ac14c73e8e6290ff06a2e0c50d8"}, - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:7d8a83dcc0950699242677cfefda545b9c0a0567111f8f3d3df1cf6ed75ea480"}, - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a0b4835d96909b5ad5fd2c42c9f15a6cbe5c5f097af8d8f13cbf94599cceaf2d"}, - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:79af2e770b255c68e9f6feffa1e0c9da78496adb2656d15d1d763abde99602f0"}, - {file = "pyobjc_framework_ScreenCaptureKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a34a2569da5b7fddbc7391f6bb0cba010e642462353d8ebf50273639a6891b11"}, - {file = "pyobjc_framework_screencapturekit-11.0.tar.gz", hash = "sha256:ca2c960e28216e56f33e4ca9b9b1eda12d9c17b719bae727181e8b96f0314c4b"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" - -[[package]] -name = "pyobjc-framework-screensaver" -version = "11.0" -description = "Wrappers for the framework ScreenSaver on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_ScreenSaver-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ed715115dcebaacee73b7ba140bf4d0b9bf00c01e36cd4d51d51049fd18b6d95"}, - {file = "pyobjc_framework_ScreenSaver-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:436357c822d87220df64912da04b421e82a5e1e6464d48f2dbccc69529d19cd3"}, - {file = "pyobjc_framework_ScreenSaver-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:03b12e89bc164cb01527ca795f3f590f286d15de6ee0e4ff1d36705740d6d72f"}, - {file = "pyobjc_framework_ScreenSaver-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e4561ae6144bef873362b18913c2751cdc5d6c4922f8523a8504f4214b2df9b6"}, - {file = "pyobjc_framework_ScreenSaver-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:035abb50f05f953ad18ce63218c931df68c0ce5d8f801366fe2073bba1fd6200"}, - {file = "pyobjc_framework_ScreenSaver-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c44d98b51d099e2167ce41041527c7e97bc16b825c81ec8c402781f8e96a01e0"}, - {file = "pyobjc_framework_screensaver-11.0.tar.gz", hash = "sha256:2e4c643624cc0cffeafc535c43faf5f8de8be030307fa8a5bea257845e8af474"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-screentime" -version = "11.0" -description = "Wrappers for the framework ScreenTime on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_ScreenTime-11.0-py2.py3-none-any.whl", hash = "sha256:723938c7d47e3c5c1c0f79010a01139762384bd0c03c51ee7a4736fc3f128fed"}, - {file = "pyobjc_framework_ScreenTime-11.0-py3-none-any.whl", hash = "sha256:45db846ec9249cab90e86cbb31cf70e13800305b7c74819ab681a91854c91df2"}, - {file = "pyobjc_framework_screentime-11.0.tar.gz", hash = "sha256:6dd74dc64be1865346fcff63b8849253697f7ac68d83ee2708019cf3852c1cd7"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-scriptingbridge" -version = "11.0" -description = "Wrappers for the framework ScriptingBridge on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"9.0\"" -files = [ - {file = "pyobjc_framework_ScriptingBridge-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e94becbb7fabaf4e8b3b15c56e297c89300cbb67b4aafccdc5eb497cf51970b9"}, - {file = "pyobjc_framework_ScriptingBridge-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c98d080446aa8ba4074e43eb0be1feed96781dbc0718496f172fcd20e84a9158"}, - {file = "pyobjc_framework_ScriptingBridge-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:23a4b2e2e57b7b4d992777ea9efb15273ccd8e8105385143dab9bd5a10962317"}, - {file = "pyobjc_framework_ScriptingBridge-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f9c4b9b47849b196c88bf57ac857f7ab0090c248275a04afd31375539ad0b09"}, - {file = "pyobjc_framework_ScriptingBridge-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a119111013599932366b4cd1612c93cfb913f69707f81e9f0ed0ddb0de762de2"}, - {file = "pyobjc_framework_ScriptingBridge-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:142601fea52f953e7fde00ad4488be846e51fd808448d5928f11cf2af14ecd0a"}, - {file = "pyobjc_framework_scriptingbridge-11.0.tar.gz", hash = "sha256:65e5edd0ea608ae7f01808b963dfa25743315f563705d75c493c2fa7032f88cc"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-searchkit" -version = "11.0" -description = "Wrappers for the framework SearchKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_SearchKit-11.0-py2.py3-none-any.whl", hash = "sha256:332f9d30ec3b223efaac681fbdd923ba660575e241abb4ed5e03207c97799530"}, - {file = "pyobjc_framework_SearchKit-11.0-py3-none-any.whl", hash = "sha256:5f4304cb77c327b28ac0f7ec9b99313075afd742091d39368eb64f076bb7d141"}, - {file = "pyobjc_framework_searchkit-11.0.tar.gz", hash = "sha256:36f3109e74bc5e6fab60c02be804d5ed1c511ad51ea0d597a6c6a9653573ddf5"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-CoreServices = ">=11.0" - -[[package]] -name = "pyobjc-framework-security" -version = "11.0" -description = "Wrappers for the framework Security on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_Security-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a2db348ba43aff24ae71d239ed585bf061e61f84a50226677049ed220737ffd0"}, - {file = "pyobjc_framework_Security-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:93bc23630563de2551ac49048af010ac9cb40f927cc25c898b7cc48550ccd526"}, - {file = "pyobjc_framework_Security-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:421e03b8560ed296a7f5ee67f42f5f978f8c7959d65c8fec99cd77dc65786355"}, - {file = "pyobjc_framework_Security-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dda83260c5638dd0470c01ca9d37eccedbce15d0642d9c28b357329e4145528f"}, - {file = "pyobjc_framework_Security-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:51dd6fb24235f4623d68a02bda4dabd85f48bce00f9b0b306016cf2c891392c4"}, - {file = "pyobjc_framework_Security-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d550ea972da4a4a4a50b8dc190a3da90095acfffd1a894012d64fb4729e53974"}, - {file = "pyobjc_framework_security-11.0.tar.gz", hash = "sha256:ac078bb9cc6762d6f0f25f68325dcd7fe77acdd8c364bf4378868493f06a0758"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-securityfoundation" -version = "11.0" -description = "Wrappers for the framework SecurityFoundation on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_SecurityFoundation-11.0-py2.py3-none-any.whl", hash = "sha256:8f8e43b91ae7cb45f3251c14c0c6caf5fdcdb93794176c4b118214a108ee2ef3"}, - {file = "pyobjc_framework_SecurityFoundation-11.0-py3-none-any.whl", hash = "sha256:1fa89969fbf7a4fd57214388a43f7ed6b6b1fd0c0ec7aa77752444eb1604143c"}, - {file = "pyobjc_framework_securityfoundation-11.0.tar.gz", hash = "sha256:5ae906ded5dd40046c013a7e0c1f59416abafb4b72bc947b6cd259749745e637"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Security = ">=11.0" - -[[package]] -name = "pyobjc-framework-securityinterface" -version = "11.0" -description = "Wrappers for the framework SecurityInterface on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_SecurityInterface-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:94901d924e15eb8745e06aa44c1ef98dadff02c6fd398eb57b04a8a88cf91c65"}, - {file = "pyobjc_framework_SecurityInterface-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2771dae043c8aa278887f96c7d206957164c7a81a562fa391bf0b9316d6755eb"}, - {file = "pyobjc_framework_SecurityInterface-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6453732f7608d514e8f7005d80d238422cbebc4ab4d6d6fed1e51175f9f7244f"}, - {file = "pyobjc_framework_SecurityInterface-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:13e023109899e2c40ce98e914813ccc8e7f1300fbb9640a675453b612d9dace0"}, - {file = "pyobjc_framework_SecurityInterface-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9df64d339025846a4d5d1c9311359d1ba41ca3850f744a65543bfb3bb7fb2ea0"}, - {file = "pyobjc_framework_SecurityInterface-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2fd774a5ad376d49d14434bff3ee8bb1b2c06764e90ce594c89d452f79e56077"}, - {file = "pyobjc_framework_securityinterface-11.0.tar.gz", hash = "sha256:8843a27cf30a8e4dd6e2cb7702a6d65ad4222429f0ccc6c062537af4683b1c08"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Security = ">=11.0" - -[[package]] -name = "pyobjc-framework-sensitivecontentanalysis" -version = "11.0" -description = "Wrappers for the framework SensitiveContentAnalysis on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"23.0\"" -files = [ - {file = "pyobjc_framework_SensitiveContentAnalysis-11.0-py2.py3-none-any.whl", hash = "sha256:e19d2edc807f98aef31fa4db5472a509cf90523436c971d1095a000b0e357058"}, - {file = "pyobjc_framework_SensitiveContentAnalysis-11.0-py3-none-any.whl", hash = "sha256:027bd0be0785f7aea3bfd56ff7c3496e5d383211122393c599c28ea392675589"}, - {file = "pyobjc_framework_sensitivecontentanalysis-11.0.tar.gz", hash = "sha256:0f09034688f894c0f4409c16adaf857d78714d55472de4aa2ac40fbd7ba233d6"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-servicemanagement" -version = "11.0" -description = "Wrappers for the framework ServiceManagement on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"10.0\"" -files = [ - {file = "pyobjc_framework_ServiceManagement-11.0-py2.py3-none-any.whl", hash = "sha256:35cfd7a369a120fa55e64b719a2dda00295b2cc6ddab16ffa8939f4326d1b37d"}, - {file = "pyobjc_framework_ServiceManagement-11.0-py3-none-any.whl", hash = "sha256:7ec19c9632f67d589ad37815d001e8e443d92e75001c370486a1070a4359e166"}, - {file = "pyobjc_framework_servicemanagement-11.0.tar.gz", hash = "sha256:10b1bbcee3de5bb2b9fc3d6763eb682b7a1d9ddd4bd2c882fece62783cb17885"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-sharedwithyou" -version = "11.0" -description = "Wrappers for the framework SharedWithYou on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_SharedWithYou-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7da997b4a2ae8401591ff293f0feaf9e05389d9c46608e70b7f5728001096105"}, - {file = "pyobjc_framework_SharedWithYou-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6dac74375d3dc18d67cae46f3f16a45cef699b1976a4012827c0f15256da55df"}, - {file = "pyobjc_framework_SharedWithYou-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:6076a0893a3597e054918c136f3391671a225a37fe1b1a070046817e3a232954"}, - {file = "pyobjc_framework_SharedWithYou-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a84995d1009e9a30e1205d293905a35cb8ecb49d7b2fe00d4daee547ac10685c"}, - {file = "pyobjc_framework_SharedWithYou-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:795d99818eb7f86115872529da7427942aab4a22b4b94986ed0354e7d03bb7b4"}, - {file = "pyobjc_framework_SharedWithYou-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b472fe9a8d92d9f6ff2c2392a5aacfcb73a651bdcea452e24d7143e2a18ca33f"}, - {file = "pyobjc_framework_sharedwithyou-11.0.tar.gz", hash = "sha256:a3a03daac77ad7364ed22109ca90c6cd2dcb7611a96cbdf37d30543ef1579399"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-SharedWithYouCore = ">=11.0" - -[[package]] -name = "pyobjc-framework-sharedwithyoucore" -version = "11.0" -description = "Wrappers for the framework SharedWithYouCore on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c5d57def17c6cb14743fee0ad0d447bd9bfa8e5e54027a3f284707a871421fbe"}, - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:46cd00a97c5fec747ef057000daa88495699ea5d5d6fe1f302bfb89b2d431645"}, - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8b5f180371a63da718fe6c3b58e7613c6b2adf9b483cefbf6d9467eb8ac2f0ca"}, - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:77357cf3389d02324d0f4afc19840085f0fe7f21d101d9fee2842687f47f69bb"}, - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:71bbd5d5a54ff745c35c1bb0c241396cf5b5e0da3001213ec1d4bbb1639777e0"}, - {file = "pyobjc_framework_SharedWithYouCore-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:984db8206353b7c5200bf7e4a23664ffc4603c8288c5c35bb37baa16e8367aa2"}, - {file = "pyobjc_framework_sharedwithyoucore-11.0.tar.gz", hash = "sha256:3932452677df5d67ea27845ab26ccaaa1d1779196bf16b62c5655f13d822c82d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-shazamkit" -version = "11.0" -description = "Wrappers for the framework ShazamKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"21.0\"" -files = [ - {file = "pyobjc_framework_ShazamKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ebf7704e50ed9c6c1ca6b48b9350d8d0c59ed0204dd454b32c8a770e58579b44"}, - {file = "pyobjc_framework_ShazamKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ecdc2392d7e8d6e2540c7ad3073a229d08b0818c5dd044a26c93b765ce9868aa"}, - {file = "pyobjc_framework_ShazamKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ef79d863cc7d4023aa552f55d4120653eceed862baf1edba8e08b1af10fab036"}, - {file = "pyobjc_framework_ShazamKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:89cfa01b997042c1e33eb4a670092c501d65c8eed60ce5d489cd08553ec77ba9"}, - {file = "pyobjc_framework_ShazamKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:cc3dba1f3ed60ef3be9c16285120f8739839e194bdf7a55cb60b03c4179d688b"}, - {file = "pyobjc_framework_ShazamKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:85d0098f57ed9372caf78302e39c55393db8d63453a4b02a2cfcb7bc158c595c"}, - {file = "pyobjc_framework_shazamkit-11.0.tar.gz", hash = "sha256:cea736cefe90b6bb989d0a8abdc21ef4b3b431b27657abb09d6deb0b2c1bd37a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-social" -version = "11.0" -description = "Wrappers for the framework Social on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_Social-11.0-py2.py3-none-any.whl", hash = "sha256:aa379009738afb0d6abc0347e8189f7f316109e9dfcb904f7f14e6b7c3d5bad8"}, - {file = "pyobjc_framework_Social-11.0-py3-none-any.whl", hash = "sha256:94db183e8b3ad21272a1ba24e9cda763d603c6021fd80a96d00ce78b6b94e1c2"}, - {file = "pyobjc_framework_social-11.0.tar.gz", hash = "sha256:ccedd6eddb6744049467bce19b4ec4f0667ec60552731c02dcbfa8938a3ac798"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-soundanalysis" -version = "11.0" -description = "Wrappers for the framework SoundAnalysis on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_SoundAnalysis-11.0-py2.py3-none-any.whl", hash = "sha256:5969096cadb07f9ba9855cedf6f53674ddb030a324b4981091834d1b31c8c27e"}, - {file = "pyobjc_framework_SoundAnalysis-11.0-py3-none-any.whl", hash = "sha256:70f70923756e118203cde4ac25083a34ead69a6034baed9c694a36f5fe2325f3"}, - {file = "pyobjc_framework_soundanalysis-11.0.tar.gz", hash = "sha256:f541fcd04ec5d7528dd2ae2d873a92a3092e87fb70b8df229c79defb4d807d1a"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-speech" -version = "11.0" -description = "Wrappers for the framework Speech on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_Speech-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c934ab46a6c934f1543689b3efd31f088be6ae2ca14f72d6d6fccb991f0e897d"}, - {file = "pyobjc_framework_Speech-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:353179210683e38bfbd675df6a35eec46b30ce30b7291bcb07a5cadaf11a3bd7"}, - {file = "pyobjc_framework_Speech-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:134e08025f4638e428602f7e16bbec94b00477eec090316138d758a86e10fd5f"}, - {file = "pyobjc_framework_Speech-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:802a3f77fde47a429c583d670766dfb3822a69a5015039c9865c37f50092ed1f"}, - {file = "pyobjc_framework_Speech-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:56febb163dd342702c5d1de46a3e8504af72d242df4af039e9e564824df2799f"}, - {file = "pyobjc_framework_Speech-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:63248523169d7a4b6a5fa5fa0ce66c845fc3c6d3695f8334f2e000aaae599041"}, - {file = "pyobjc_framework_speech-11.0.tar.gz", hash = "sha256:92a191c3ecfe7032eea2140ab5dda826a59c7bb84b13a2edb0ebc471a76e6d7b"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-spritekit" -version = "11.0" -description = "Wrappers for the framework SpriteKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"13.0\"" -files = [ - {file = "pyobjc_framework_SpriteKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:eac7779dd5fb3ef8dacea764f06ac29e1891982a9840dd1b0b74411aa626f22c"}, - {file = "pyobjc_framework_SpriteKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:3d0971a7a85786edc521ab897bdb0c78696278e6417bf389abdfe2151358e854"}, - {file = "pyobjc_framework_SpriteKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0da5f2b52636a2f04fc38a123fed9d7f8d6fd353df027c51c0bfc91e244a9d2b"}, - {file = "pyobjc_framework_SpriteKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:10d2539813763161c9bc76da9aec756a3626c4e3a3400f616fab298ae000bff1"}, - {file = "pyobjc_framework_SpriteKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:3c6593c6d848ebd59d5c70ee9284d268130e01299f863269877d11d395fc1e13"}, - {file = "pyobjc_framework_SpriteKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:518412f19f219561dc13b17c68cace7b4f7fdf3bfd29dce28d5b9ef44b507bde"}, - {file = "pyobjc_framework_spritekit-11.0.tar.gz", hash = "sha256:aa43927e325d4ac253b7c0ec4df95393b0354bd278ebe9871803419d12d1ef80"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-storekit" -version = "11.0" -description = "Wrappers for the framework StoreKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"11.0\"" -files = [ - {file = "pyobjc_framework_StoreKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7fcbf84469a7d3d2a2f60e00d8a55d521f91e759e73fffb1c61bbedd323a5084"}, - {file = "pyobjc_framework_StoreKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1d51a05a5e0277c542978b1f5a6aa33331359de7c0a2cf0ad922760b36e5066a"}, - {file = "pyobjc_framework_StoreKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:29269183e91043bbfee79851ae712073feba1e10845b8deeb7e6aaa20cfb3cf4"}, - {file = "pyobjc_framework_StoreKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:387b940b3bf4ace5c6fe205bf6adc006d382056d1579a09e15088e57448d826c"}, - {file = "pyobjc_framework_StoreKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c8febba6f938acaaadbf61b267e5c2c8b8c5984b783edcf2c56928025f58e3f5"}, - {file = "pyobjc_framework_StoreKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e38fa0b837bdc3fdb5cd0ed8fa94f0c53f768104a720a1b7a3126079535ac51b"}, - {file = "pyobjc_framework_storekit-11.0.tar.gz", hash = "sha256:ef7e75b28f1fa8b0b6413e64b9d5d78b8ca358fc2477483d2783f688ff8d75e0"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-symbols" -version = "11.0" -description = "Wrappers for the framework Symbols on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"23.0\"" -files = [ - {file = "pyobjc_framework_Symbols-11.0-py2.py3-none-any.whl", hash = "sha256:f1490823f40a8a540ac10628190695f27a717343914fe5db5fafa500f7c7bf44"}, - {file = "pyobjc_framework_Symbols-11.0-py3-none-any.whl", hash = "sha256:0919e85fcf6f420f61d8d9a67cafa2ab4678666441ef4f001b31f5457900b314"}, - {file = "pyobjc_framework_symbols-11.0.tar.gz", hash = "sha256:e3de7736dfb8107f515cfd23f03e874dd9468e88ab076d01d922a73fefb620fa"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-syncservices" -version = "11.0" -description = "Wrappers for the framework SyncServices on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_SyncServices-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5876a0ef8ade01809bc25c99ebf9044745ff84ecd915615cf1dbc4cd9c01c931"}, - {file = "pyobjc_framework_SyncServices-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89a398df6518cff1c63b7cccf3025e388f3ef299645734112c5aa1ac5f7ca30a"}, - {file = "pyobjc_framework_SyncServices-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e870e82ed34c43607cc50dbae57a81dd419b75abc06670630cbbf41ae6e1402c"}, - {file = "pyobjc_framework_SyncServices-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a3af1c26d56e95e84d1d12b620ab53408b889eed3fc00ad0dc02c5c4fbde6774"}, - {file = "pyobjc_framework_SyncServices-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:55c3f4eff005f18891fba13aad848fa9d44169c790fbf104951b98c6b38bd5ae"}, - {file = "pyobjc_framework_SyncServices-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fb74fd05a37895bfb5a02aabb88a0eb17a8b063cc6cd69316d25e2495b6bb633"}, - {file = "pyobjc_framework_syncservices-11.0.tar.gz", hash = "sha256:7867c23895a8289da8d56e962c144c36ed16bd101dc07d05281c55930b142471"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreData = ">=11.0" - -[[package]] -name = "pyobjc-framework-systemconfiguration" -version = "11.0" -description = "Wrappers for the framework SystemConfiguration on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_SystemConfiguration-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2efdc31d50d24cd3d095200f2844bceab96b84f502cbf11af5bc09ec8ab237b3"}, - {file = "pyobjc_framework_SystemConfiguration-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:89d3c54abedcedbc2ce52c31ff4878251ca54a8535407ed6bd6584ce099c148b"}, - {file = "pyobjc_framework_SystemConfiguration-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:8cbcb9662dbb5a034cfc5a44adaf2a0226a2985ae299a4ef4fd75bb49f30f5a0"}, - {file = "pyobjc_framework_SystemConfiguration-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f52b1b39a33c675816ae24bf078a7f9a68fc981ccb707c378edd2d63c8a701eb"}, - {file = "pyobjc_framework_SystemConfiguration-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5781eb985484f90098b252d4e4f5da759575daa4e23bdc1728b393991c0450d5"}, - {file = "pyobjc_framework_SystemConfiguration-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:fbaa3497b66bbfa4877a33cc2bad68ebe1a75129548552642eaa98ffe21b5829"}, - {file = "pyobjc_framework_systemconfiguration-11.0.tar.gz", hash = "sha256:06487f0fdd43c6447b5fd3d7f3f59826178d32bcf74f848c5b3ea597191d471d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-systemextensions" -version = "11.0" -description = "Wrappers for the framework SystemExtensions on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"19.0\"" -files = [ - {file = "pyobjc_framework_SystemExtensions-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5c92a957b04180d3183f8168c1c20fe825b926a41ed355b266aaa59e83005d71"}, - {file = "pyobjc_framework_SystemExtensions-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:f7a2ec417fa0d383cc066bc292541aa78fd2aec9cca83a98d41b7982f185d1f7"}, - {file = "pyobjc_framework_SystemExtensions-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:62b99c6bd88bce642960fc2b9d5903fbfca680d16be9a4565a883eb4ba17ca5e"}, - {file = "pyobjc_framework_SystemExtensions-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:97619be16bfce9fa0634d2b372242191a54dc2e71787b4fc1257be58e67322b4"}, - {file = "pyobjc_framework_SystemExtensions-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:90697b8d3fb74c509db3e237779afa7e71971e54543c592adb15fcf48d45a955"}, - {file = "pyobjc_framework_SystemExtensions-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4369acaca23170cc5aee4e36c7cfb6cbccfcfe78b63f7d7fef0c77550e2b71a2"}, - {file = "pyobjc_framework_systemextensions-11.0.tar.gz", hash = "sha256:da293c99b428fb7f18a7a1d311b17177f73a20c7ffa94de3f72d760df924255e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-threadnetwork" -version = "11.0" -description = "Wrappers for the framework ThreadNetwork on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"22.0\"" -files = [ - {file = "pyobjc_framework_ThreadNetwork-11.0-py2.py3-none-any.whl", hash = "sha256:950d46a009cb992b12dbd8169a0450d8cc101fc982e03e6543078c6d7790e353"}, - {file = "pyobjc_framework_ThreadNetwork-11.0-py3-none-any.whl", hash = "sha256:1218649e4f488ca411af13b74f1dee1e7a178169e0f5963342ba8a7c46037ea7"}, - {file = "pyobjc_framework_threadnetwork-11.0.tar.gz", hash = "sha256:f5713579380f6fb89c877796de86cb4e98428d7a9cbfebe566fb827ba23b2d8e"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-uniformtypeidentifiers" -version = "11.0" -description = "Wrappers for the framework UniformTypeIdentifiers on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_UniformTypeIdentifiers-11.0-py2.py3-none-any.whl", hash = "sha256:acffb86e8b03b66c49274236b3df3a254cacd32b9f25bd7a5bd59baaaf738624"}, - {file = "pyobjc_framework_UniformTypeIdentifiers-11.0-py3-none-any.whl", hash = "sha256:a3097f186c7e231b19218a3ceecb3b70a8f2b2e9e642ef409dc7a195a30c869e"}, - {file = "pyobjc_framework_uniformtypeidentifiers-11.0.tar.gz", hash = "sha256:6ae6927a3ed1f0197a8c472226f11f46ccd5ed398b4449613e1d10346d9ed15d"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-usernotifications" -version = "11.0" -description = "Wrappers for the framework UserNotifications on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_UserNotifications-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:00a19caf247378cef0a6d369667f731251ca463d0bfdae0394b314a6656301f6"}, - {file = "pyobjc_framework_UserNotifications-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:4bf78fa37f574f5b43db9b83ca02e82ab45803589f970042afdcd1cb8c01396d"}, - {file = "pyobjc_framework_UserNotifications-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0b4c06c3862405e103e964327581c28e5390a2d4cd0cef3d8e64afda03c9f431"}, - {file = "pyobjc_framework_UserNotifications-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2f8a03ef6f0abbed0ab1ac28cc33ba4e1c8df9887443b008a3c7837f202cf2c9"}, - {file = "pyobjc_framework_UserNotifications-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ea1ef4ce77a3d534d52f2543a592d40553399557ea040e052bfd7ab16f3279a1"}, - {file = "pyobjc_framework_UserNotifications-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f2fcc2a06f139261635ee281fc685451141ecaf1030aa41e58241bf50ee3904b"}, - {file = "pyobjc_framework_usernotifications-11.0.tar.gz", hash = "sha256:7950a1c6a8297f006c26c3d286705ffc2a07061d6e844f1106290572097b872c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-usernotificationsui" -version = "11.0" -description = "Wrappers for the framework UserNotificationsUI on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_UserNotificationsUI-11.0-py2.py3-none-any.whl", hash = "sha256:6185d9c9513b6a823cd72dcf40d2fb33bbf0f2c9a98528e0e112580b47ac3632"}, - {file = "pyobjc_framework_UserNotificationsUI-11.0-py3-none-any.whl", hash = "sha256:e4439e549265929ddad1feca7b062d00c2d3732470f349cb0d594705e0257919"}, - {file = "pyobjc_framework_usernotificationsui-11.0.tar.gz", hash = "sha256:d0ec597d189b4d228b0b836474aef318652c1c287b33442a1403c49dc59fdb7f"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-UserNotifications = ">=11.0" - -[[package]] -name = "pyobjc-framework-videosubscriberaccount" -version = "11.0" -description = "Wrappers for the framework VideoSubscriberAccount on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"18.0\"" -files = [ - {file = "pyobjc_framework_VideoSubscriberAccount-11.0-py2.py3-none-any.whl", hash = "sha256:1deec8d5a0138ae51b5ca7bfb7f6fe1b0dc3cbb52db3111059708efa5f8a8d04"}, - {file = "pyobjc_framework_VideoSubscriberAccount-11.0-py3-none-any.whl", hash = "sha256:0095eddb5fc942f9e049bc4c683cf28c77ea60c60942552c3c48bf74c8fdca9b"}, - {file = "pyobjc_framework_videosubscriberaccount-11.0.tar.gz", hash = "sha256:163b32f361f48b9d20f317461464abd4427b3242693ae011633fc443c7d5449c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-videotoolbox" -version = "11.0" -description = "Wrappers for the framework VideoToolbox on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"12.0\"" -files = [ - {file = "pyobjc_framework_VideoToolbox-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b9d29d56fad1737f6b9be9143dfec9889bee48db56d6fd0fcbccc5c625ad1cc"}, - {file = "pyobjc_framework_VideoToolbox-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:12af56190e65c3b60c6ca14fe69045e5ffb5908ea1363580506eb32603b80855"}, - {file = "pyobjc_framework_VideoToolbox-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4ed7f073bd8dfecca0da6359d5cd871b2f39144883930bddd41ca818447de608"}, - {file = "pyobjc_framework_VideoToolbox-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:4a9ae5b94376c66b579e7a2a8ada71bfd8c2ad475726fb500d7f498d806dd7bf"}, - {file = "pyobjc_framework_VideoToolbox-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:de2d2a2c81be9e9c77d1f749a350b2f7edc647f498b0715c0b6c710d8e41af02"}, - {file = "pyobjc_framework_VideoToolbox-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:42577645c77333305bdbcf52285e70ae4b7ce73e721ad2e8a24885b0324775ff"}, - {file = "pyobjc_framework_videotoolbox-11.0.tar.gz", hash = "sha256:a54ed8f8bcbdd2bdea2a296dc02a8a7d42f81e2b6ccbf4d1f10cec5e7a09bec0"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreMedia = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-virtualization" -version = "11.0" -description = "Wrappers for the framework Virtualization on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"20.0\"" -files = [ - {file = "pyobjc_framework_Virtualization-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ec094a1798838434cf6a054b87fd8cece9a36e54b720fedbade9246420ae0ba9"}, - {file = "pyobjc_framework_Virtualization-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:334712792136ffcf3c63a63cea01ce33d60309a82721c95e25f0cc26b95f72cc"}, - {file = "pyobjc_framework_Virtualization-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:5b848b1ab365906b11a507c8146e477c27d2bf56159d49d21fda15b93c2811ec"}, - {file = "pyobjc_framework_Virtualization-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9a7bfd870bbe5aa23d29661ea502cefe6cff4e7c32ccf50050f483e650b218d8"}, - {file = "pyobjc_framework_Virtualization-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b7bbd268f722487ec7279459037f87923ff1abcb87d94f8f6a8b9cafaa559a2e"}, - {file = "pyobjc_framework_Virtualization-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:79c625d8e8414b80f06bcbff9d6c28101f9502f671329af7b418f2005db1bccd"}, - {file = "pyobjc_framework_virtualization-11.0.tar.gz", hash = "sha256:03e1c1fa20950aa7c275e5f11f1257108b6d1c6a7403afb86f4e9d5fae87b73c"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyobjc-framework-vision" -version = "11.0" -description = "Wrappers for the framework Vision on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\" and platform_release >= \"17.0\"" -files = [ - {file = "pyobjc_framework_Vision-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a6707adc9df3510686c18d4f2a6d8df234c347329edb12793459867163a61c42"}, - {file = "pyobjc_framework_Vision-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ca7cc48332d804a02b5b17f31bed52dd4b7c323f9e4ff4b4e7ecd35d39cc0759"}, - {file = "pyobjc_framework_Vision-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1b07aa867dda47d2a4883cd969e248039988b49190ba097cbe9747156b5d1f30"}, - {file = "pyobjc_framework_Vision-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:b2fd9088d91d950b2127e98785b3d4c6b55516bf733af7cab4b30950571d32be"}, - {file = "pyobjc_framework_Vision-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:9821d930025d0c084a83ed216751d5b4f022cb4a47d42440b1c6766d8952620d"}, - {file = "pyobjc_framework_Vision-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8b33f365741b92d840820c3fb0ef463a8a384dcc73a85cd6033a8d5bfd158655"}, - {file = "pyobjc_framework_vision-11.0.tar.gz", hash = "sha256:45342e5253c306dbcd056a68bff04ffbfa00e9ac300a02aabf2e81053b771e39"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" -pyobjc-framework-CoreML = ">=11.0" -pyobjc-framework-Quartz = ">=11.0" - -[[package]] -name = "pyobjc-framework-webkit" -version = "11.0" -description = "Wrappers for the framework WebKit on macOS" -optional = false -python-versions = ">=3.9" -groups = ["main"] -markers = "sys_platform == \"darwin\"" -files = [ - {file = "pyobjc_framework_WebKit-11.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e1881d7443f916e49199fd9d4b109c19e3e063ab3a60e6d4d76299a3b9143ef6"}, - {file = "pyobjc_framework_WebKit-11.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:163abaa5a665b59626ef20cdc3dcc5e2e3fcd9830d5fc328507e13f663acd0ed"}, - {file = "pyobjc_framework_WebKit-11.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:2e4911519e94822011d99fdb9addf4a176f45a79808dab18dc303293f4590f7c"}, - {file = "pyobjc_framework_WebKit-11.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:22d09bb22c3c48d9243f300f8264a68ecc0bdfe09d25794ee86ab2239eae7da2"}, - {file = "pyobjc_framework_WebKit-11.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:6141a416f1eb33ded2c6685931d1b4d5f17c83814f2d17b7e2febff03c6f6bee"}, - {file = "pyobjc_framework_WebKit-11.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c7b56baf21d4b4b8fba42e5d62b08bb018be2f00595c3c7e0265b925ba81e505"}, - {file = "pyobjc_framework_webkit-11.0.tar.gz", hash = "sha256:fa6bedf9873786b3376a74ce2ea9dcd311f2a80f61e33dcbd931cc956aa29644"}, -] - -[package.dependencies] -pyobjc-core = ">=11.0" -pyobjc-framework-Cocoa = ">=11.0" - -[[package]] -name = "pyyaml" -version = "6.0.2" -description = "YAML parser and emitter for Python" -optional = false -python-versions = ">=3.8" -groups = ["main"] -files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, -] - -[[package]] -name = "serial" -version = "0.0.97" -description = "A framework for serializing/deserializing JSON/YAML/XML into python class instances and vice versa" -optional = false -python-versions = "*" -groups = ["main"] -files = [ - {file = "serial-0.0.97-py2.py3-none-any.whl", hash = "sha256:e887f06e07e190e39174b694eee6724e3c48bd361be1d97964caef5d5b61c73b"}, - {file = "serial-0.0.97.tar.gz", hash = "sha256:542150a127ddbf5ed2acc3a6ac4ce807cbcdae3b197acf785bbda6565c94f848"}, -] - -[package.dependencies] -future = ">=0.17.1" -iso8601 = ">=0.1.12" -pyyaml = ">=3.13" - -[metadata] -lock-version = "2.1" -python-versions = ">=3.12" -content-hash = "c14552e98e1a02b48d2011016f5d143e6bd282c071f4cb4d1d4ee6aac97032b7" diff --git a/pyproject.toml b/pyproject.toml index 917f71f..64da63b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,19 +1,27 @@ [project] -name = "keypress" +name = "keypressremark" version = "0.1.0" -description = "" -authors = [ - {name = "JianGuo",email = "jianguo.li@outlook.com"} -] +description = "一个简单的按键模拟工具" readme = "README.md" -requires-python = ">=3.12" -dependencies = [ - "psutil (>=7.0.0,<8.0.0)", - "keyboard (>=0.13.5,<0.14.0)", - "serial (>=0.0.97,<0.0.98)" +requires-python = ">=3.11" +authors = [ + {name = "xiao liu", email = ""} +] +dependencies = [ + "PyQt5==5.15.11", + "pyqt5-qt5==5.15.2", + "pywin32==311", ] - [build-system] -requires = ["poetry-core>=2.0.0,<3.0.0"] -build-backend = "poetry.core.masonry.api" +requires = ["hatchling"] +build-backend = "hatchling.build" + +[tool.uv] +dev-dependencies = [ + "pyinstaller>=6.0.0", +] +# index-url = "https://pypi.org/simple/" + +[project.scripts] +keypressremark = "src.main:main" diff --git a/readme.md b/readme.md index 110cf97..4c201aa 100644 --- a/readme.md +++ b/readme.md @@ -1,4 +1,263 @@ -## 自动按键精灵 -1. 使用poetry管理 +# KeyPressRemark -打包命令:pyinstaller --noconsole --onefile -i aaa.ico main.py \ No newline at end of file +一个功能强大的Windows按键模拟工具,支持向指定窗口发送按键和鼠标点击事件。本工具特别适用于游戏辅助、自动化测试、重复性操作等场景。 + +## 🚀 功能特性 + +- **精准窗口选择**:通过点击选择目标窗口,无需手动查找窗口句柄 +- **多种发送模式**: + - **PostMessage**:异步消息发送,适用于大多数应用 + - **SendMessage**:同步消息发送,确保按键顺序 + - **SendInput**:系统级输入模拟,兼容性最佳 +- **自定义按键组合**:支持10个可自定义的按键配置 +- **自动循环功能**: + - 空格键自动发送(可调节间隔) + - 鼠标左键自动点击(可调节间隔) +- **快捷键控制**:F1开始/停止,方便操作 +- **智能设置保存**:自动保存用户配置,下次启动自动恢复 + +## 📋 环境要求 + +- **操作系统**:Windows 7/8/10/11 +- **Python 版本**:3.11+ +- **权限要求**:管理员权限(程序会自动请求) +- **硬件要求**:无特殊要求 + +## 🛠️ 安装与运行 + +### 方式一:使用 uv(推荐) + +uv 是一个快速的 Python 包管理器,安装速度比 pip 更快。 + +1. **安装 uv**: + ```bash + pip install uv + ``` + +2. **克隆项目**: + ```bash + git clone + cd KeyPressRemark + ``` + +3. **创建虚拟环境并安装依赖**: + ```bash + uv venv --python 3.11 + # Windows + .venv\Scripts\activate + # 或者直接使用 uv pip 安装 + uv pip install PyQt5==5.15.11 pyqt5-qt5==5.15.2 pywin32==311 + ``` + +4. **运行程序**: + ```bash + python src/main.py + ``` + +### 方式二:传统 pip 方式 + +1. **克隆项目**: + ```bash + git clone + cd KeyPressRemark + ``` + +2. **创建虚拟环境**: + ```bash + python -m venv .venv + .venv\Scripts\activate + ``` + +3. **安装依赖**: + ```bash + pip install -r requirements.txt + ``` + +4. **运行程序**: + ```bash + python src/main.py + ``` + +### 方式三:使用打包版本 + +从 [Releases](releases) 下载预编译的 exe 文件,双击运行即可。 + +## 📖 使用指南 + +### 基本操作 + +1. **选择目标窗口**: + - 点击"选择窗口"按钮 + - 鼠标变为十字形后,点击要控制的窗口 + - 成功选择后会显示窗口标题和进程信息 + +2. **配置按键**: + - 在"自定义按键"区域,为每个按钮选择对应的按键 + - 支持字母、数字、功能键等 + +3. **选择发送模式**: + - **PostMessage**:适用于大多数游戏和应用 + - **SendMessage**:适用于需要同步响应的应用 + - **SendInput**:适用于对按键检测严格的应用 + +4. **开始使用**: + - 配置完成后,直接点击按键按钮发送 + - 或按 F1 开始自动循环功能 + +### 高级功能 + +#### 自动循环 +- **空格键循环**:勾选后自动按设定间隔发送空格键 +- **鼠标点击循环**:勾选后自动按设定间隔点击鼠标左键 +- **间隔设置**:支持毫秒级精度,最小间隔10ms + +#### 快捷键控制 +- **F1**:开始/停止自动循环功能 +- **ESC**:紧急停止所有自动功能 + +## 🏗️ 项目结构 + +``` +KeyPressRemark/ +├── src/ # 源代码目录 +│ ├── main.py # 程序入口点 +│ ├── core/ # 核心功能模块 +│ │ ├── admin_check.py # 管理员权限检查和申请 +│ │ ├── constants.py # 常量定义(按键码、消息常量等) +│ │ ├── key_sender.py # 按键发送核心逻辑 +│ │ └── window_selector.py # 窗口选择功能实现 +│ ├── gui/ # 图形用户界面模块 +│ │ ├── main_window.py # 主窗口界面和逻辑 +│ │ ├── about_dialog.py # 关于对话框 +│ │ └── components/ # 可复用UI组件 +│ └── utils/ # 工具和辅助模块 +│ ├── settings.py # 设置管理(保存/加载配置) +│ └── structures.py # Windows API结构体定义 +├── resources/ # 资源文件目录 +│ ├── icons/ # 应用图标 +│ ├── images/ # 图片资源 +│ └── qrc/ # Qt资源文件 +├── tests/ # 单元测试文件 +├── docs/ # 项目文档 +├── dist/ # 打包输出目录 +├── pyproject.toml # 项目配置文件 +├── requirements.txt # 依赖列表 +└── README.md # 项目说明文档 +``` + +## 🔧 开发说明 + +### 核心模块详解 + +#### core/key_sender.py +负责实际的按键和鼠标事件发送,实现了三种不同的发送模式: + +- **PostMessage模式**:异步发送,性能最佳 +- **SendMessage模式**:同步发送,响应可靠 +- **SendInput模式**:系统级模拟,兼容性最好 + +#### core/window_selector.py +实现窗口选择功能,通过鼠标点击获取目标窗口句柄。 + +#### gui/main_window.py +主界面实现,包含所有UI组件和事件处理逻辑。 + +#### utils/settings.py +配置管理模块,自动保存和恢复用户设置。 + +### 依赖说明 + +本项目主要依赖以下库: + +- **PyQt5 (5.15.11)**:GUI框架 + - 用于创建图形用户界面 + - 提供丰富的UI组件和事件处理 + +- **pyqt5-qt5 (5.15.2)**:Qt5运行时库 + - 注意:Windows平台需要使用5.15.2版本 + - 新版本5.15.17不支持Windows平台 + +- **pywin32 (311)**:Windows API封装 + - 提供Python访问Windows API的能力 + - 用于窗口操作、消息发送等系统级功能 + +### 依赖版本说明 + +⚠️ **重要提示**:本项目在Windows平台上有特定的依赖版本要求: + +- `pyqt5-qt5` 必须使用 **5.15.2** 版本 +- 不能使用最新的 5.15.17 版本,因为该版本不提供Windows平台的wheel文件 +- 如果遇到依赖安装问题,请使用 `uv pip install` 而不是 `uv add` + +## 📦 打包部署 + +### 使用 PyInstaller 打包 + +1. **安装打包工具**: + ```bash + uv add --dev pyinstaller + ``` + +2. **打包为单个exe文件**: + ```bash + pyinstaller --noconsole --onefile --icon=resources/icons/aaa.ico src/main.py --name=KeyPressRemark + ``` + +3. **打包为目录形式**(推荐,启动更快): + ```bash + pyinstaller --noconsole --icon=resources/icons/aaa.ico src/main.py --name=KeyPressRemark + ``` + +### 打包选项说明 + +- `--noconsole`:不显示控制台窗口 +- `--onefile`:打包为单个exe文件 +- `--icon`:设置应用图标 +- `--name`:设置输出文件名 + +## ⚠️ 注意事项 + +1. **管理员权限**:程序需要管理员权限才能向其他应用发送按键 +2. **杀毒软件**:部分杀毒软件可能将按键模拟程序误报为恶意软件 +3. **兼容性**:不同应用对按键模拟的支持程度不同,建议测试不同的发送模式 +4. **性能**:高频率按键发送可能影响系统性能,建议合理设置间隔时间 + +## 🤝 贡献指南 + +欢迎提交Issue和Pull Request! + +1. Fork本项目 +2. 创建feature分支:`git checkout -b feature/new-feature` +3. 提交更改:`git commit -am 'Add new feature'` +4. 推送分支:`git push origin feature/new-feature` +5. 提交Pull Request + +## 📄 许可证 + +本项目采用 MIT 许可证,详见 [LICENSE](LICENSE) 文件。 + +## 👨‍💻 作者 + +**xiao liu** + +## 📝 更新日志 + +### v0.1.0 (当前版本) +- ✨ 基础功能实现 +- ✨ 支持三种按键发送模式 +- ✨ 窗口选择功能 +- ✨ 自定义按键配置 +- ✨ 自动循环功能 +- ✨ 设置保存和恢复 + +## 🔮 计划功能 + +- [ ] 按键序列录制和回放 +- [ ] 更多快捷键支持 +- [ ] 多窗口同时控制 +- [ ] 定时任务功能 +- [ ] 界面主题切换 + +--- + +如有问题或建议,欢迎提交 [Issue](issues) 或联系作者。 \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 003df4e..0c0d133 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,3 @@ -PyQt5==5.15.6 -pywin32==306 \ No newline at end of file +python-qt5 +PyQt5==5.15.11 +pywin32==311 \ No newline at end of file diff --git a/aaa.ico b/resources/icons/aaa.ico similarity index 100% rename from aaa.ico rename to resources/icons/aaa.ico diff --git a/keyboard.png b/resources/images/keyboard.png similarity index 100% rename from keyboard.png rename to resources/images/keyboard.png diff --git a/resources.qrc b/resources/qrc/resources.qrc similarity index 100% rename from resources.qrc rename to resources/qrc/resources.qrc diff --git a/resources_rc.py b/resources/qrc/resources_rc.py similarity index 100% rename from resources_rc.py rename to resources/qrc/resources_rc.py diff --git a/src/__init__.py b/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/__init__.py b/src/core/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/core/admin_check.py b/src/core/admin_check.py new file mode 100644 index 0000000..8394053 --- /dev/null +++ b/src/core/admin_check.py @@ -0,0 +1,85 @@ +""" +管理员权限检查模块 + +本模块负责检查当前程序是否以管理员权限运行,如果没有则自动请求提升权限。 +按键模拟功能需要管理员权限才能向其他应用程序发送按键事件。 + +技术原理: +- 使用Windows Shell API检查当前用户权限 +- 通过UAC (User Account Control) 机制请求权限提升 +- 使用ShellExecuteW API重新启动程序 + +作者: xiao liu +版本: v0.1.0 +""" + +import sys +import ctypes + + +def is_admin(): + """ + 检查当前程序是否以管理员权限运行 + + 使用Windows Shell32 API的IsUserAnAdmin函数来检查当前进程 + 是否具有管理员权限。这个函数是检查进程权限的标准方法。 + + Returns: + bool: 如果具有管理员权限返回True,否则返回False + + Note: + 此函数仅在Windows系统上有效,其他操作系统会返回False + """ + try: + # 调用Windows API检查管理员权限 + # IsUserAnAdmin() 返回非零值表示具有管理员权限 + return ctypes.windll.shell32.IsUserAnAdmin() + except: + # 如果API调用失败(比如在非Windows系统上),返回False + return False + + +def request_admin_privileges(): + """ + 请求管理员权限,如果当前没有管理员权限则重新启动程序 + + 工作流程: + 1. 检查当前是否已经具有管理员权限 + 2. 如果没有,使用UAC机制请求权限提升 + 3. 以管理员权限重新启动当前程序 + 4. 退出当前进程 + + 技术细节: + - 使用ShellExecuteW API启动新进程 + - "runas" 动词触发UAC权限提升对话框 + - 传递当前的命令行参数确保程序状态一致 + + Note: + 此函数会导致程序重新启动,当前进程会被终止 + """ + if not is_admin(): + # 当前没有管理员权限,需要重新启动程序 + + # 构造命令行参数字符串 + # sys.argv[0] 是程序路径,sys.argv[1:] 是传递的参数 + args = " ".join(sys.argv) + + # 使用ShellExecuteW API以管理员权限启动程序 + # 参数说明: + # - None: 父窗口句柄(无) + # - "runas": 执行动词,表示以管理员身份运行 + # - sys.executable: Python解释器路径 + # - args: 完整的命令行参数 + # - None: 工作目录(使用当前目录) + # - 1: 显示方式(SW_SHOWNORMAL) + ctypes.windll.shell32.ShellExecuteW( + None, # 父窗口 + "runas", # 执行动词(触发UAC) + sys.executable, # 可执行文件路径 + args, # 命令行参数 + None, # 工作目录 + 1 # 显示方式 + ) + + # 退出当前进程,新的管理员权限进程将接管 + sys.exit(0) \ No newline at end of file diff --git a/src/core/constants.py b/src/core/constants.py new file mode 100644 index 0000000..eacc6a5 --- /dev/null +++ b/src/core/constants.py @@ -0,0 +1,76 @@ +# Virtual Key Constants +VK_SPACE = 0x20 +VK_RETURN = 0x0D +VK_TAB = 0x09 +VK_ESCAPE = 0x1B +VK_BACK = 0x08 +VK_INSERT = 0x2D +VK_DELETE = 0x2E +VK_HOME = 0x24 +VK_END = 0x23 +VK_PRIOR = 0x21 # Page Up +VK_NEXT = 0x22 # Page Down +VK_LEFT = 0x25 +VK_RIGHT = 0x27 +VK_UP = 0x26 +VK_DOWN = 0x28 +VK_F1 = 0x70 +VK_F2 = 0x71 +VK_F3 = 0x72 +VK_F4 = 0x73 +VK_F5 = 0x74 +VK_F6 = 0x75 +VK_F7 = 0x76 +VK_F8 = 0x77 +VK_F9 = 0x78 +VK_F10 = 0x79 +VK_F11 = 0x7A +VK_F12 = 0x7B +VK_SCROLL = 0x91 + +# Windows Message Constants +WM_KEYDOWN = 0x0100 +WM_KEYUP = 0x0101 +WM_CHAR = 0x0102 + +# SendInput Constants +INPUT_KEYBOARD = 1 +KEYEVENTF_KEYUP = 0x0002 +KEYEVENTF_UNICODE = 0x0004 + +# Mouse Event Constants +MOUSEEVENTF_MOVE = 0x0001 +MOUSEEVENTF_LEFTDOWN = 0x0002 +MOUSEEVENTF_LEFTUP = 0x0004 +MOUSEEVENTF_RIGHTDOWN = 0x0008 +MOUSEEVENTF_RIGHTUP = 0x0010 +MOUSEEVENTF_MIDDLEDOWN = 0x0020 +MOUSEEVENTF_MIDDLEUP = 0x0040 +MOUSEEVENTF_ABSOLUTE = 0x8000 + +# Input Types +INPUT_MOUSE = 0 +INPUT_KEYBOARD = 1 + +# Key combinations for UI +KEY_COMBINATIONS = [ + ("F1", VK_F1), ("F2", VK_F2), ("F3", VK_F3), ("F4", VK_F4), + ("F5", VK_F5), ("F6", VK_F6), ("F7", VK_F7), ("F8", VK_F8), + ("F9", VK_F9), ("F10", VK_F10), ("F11", VK_F11), ("F12", VK_F12), + ("A", ord('A')), ("B", ord('B')), ("C", ord('C')), ("D", ord('D')), + ("E", ord('E')), ("F", ord('F')), ("G", ord('G')), ("H", ord('H')), + ("I", ord('I')), ("J", ord('J')), ("K", ord('K')), ("L", ord('L')), + ("M", ord('M')), ("N", ord('N')), ("O", ord('O')), ("P", ord('P')), + ("Q", ord('Q')), ("R", ord('R')), ("S", ord('S')), ("T", ord('T')), + ("U", ord('U')), ("V", ord('V')), ("W", ord('W')), ("X", ord('X')), + ("Y", ord('Y')), ("Z", ord('Z')), + ("0", ord('0')), ("1", ord('1')), ("2", ord('2')), ("3", ord('3')), + ("4", ord('4')), ("5", ord('5')), ("6", ord('6')), ("7", ord('7')), + ("8", ord('8')), ("9", ord('9')), + ("Space", VK_SPACE), ("Enter", VK_RETURN), ("Tab", VK_TAB), + ("Esc", VK_ESCAPE), ("Backspace", VK_BACK), ("Insert", VK_INSERT), + ("Delete", VK_DELETE), ("Home", VK_HOME), ("End", VK_END), + ("Page Up", VK_PRIOR), ("Page Down", VK_NEXT), + ("Left Arrow", VK_LEFT), ("Right Arrow", VK_RIGHT), + ("Up Arrow", VK_UP), ("Down Arrow", VK_DOWN), ("Scroll", VK_SCROLL) +] \ No newline at end of file diff --git a/src/core/key_sender.py b/src/core/key_sender.py new file mode 100644 index 0000000..437aa28 --- /dev/null +++ b/src/core/key_sender.py @@ -0,0 +1,269 @@ +""" +KeySender - 按键和鼠标事件发送模块 + +本模块实现了三种不同的按键发送方式: +1. PostMessage - 异步消息发送,性能最佳,适用于大多数应用 +2. SendMessage - 同步消息发送,响应可靠,确保按键顺序 +3. SendInput - 系统级输入模拟,兼容性最好,适用于严格的应用 + +技术原理: +- 使用Windows API进行底层按键模拟 +- 支持向指定窗口发送按键和鼠标事件 +- 自动处理按键扫描码和消息参数 + +作者: xiao liu +版本: v0.1.0 +""" + +import ctypes +import win32gui +import win32api +import win32con +from .constants import * +from utils.structures import INPUT + + +class KeySender: + """ + 按键发送器类 + + 负责向目标窗口发送按键和鼠标事件,支持三种不同的发送模式。 + """ + + def __init__(self, target_hwnd=None): + """ + 初始化按键发送器 + + Args: + target_hwnd (int, optional): 目标窗口句柄. Defaults to None. + """ + self.target_hwnd = target_hwnd + + def set_target_window(self, hwnd): + """ + 设置目标窗口句柄 + + Args: + hwnd (int): 窗口句柄 + """ + self.target_hwnd = hwnd + + def send_key_post_message(self, key_code): + """ + 使用PostMessage方式发送按键 + + PostMessage是异步发送方式,消息会被放入目标窗口的消息队列中, + 然后立即返回,不等待处理完成。这种方式性能最佳,适用于大多数应用。 + + Args: + key_code (int): 按键的虚拟键码 + + Returns: + bool: 发送成功返回True,失败返回False + """ + # 检查目标窗口是否有效 + if not self.target_hwnd or not win32gui.IsWindow(self.target_hwnd): + return False + + # 将虚拟键码转换为扫描码 + # 扫描码是键盘硬件相关的代码,某些应用可能需要 + scan_code = win32api.MapVirtualKey(key_code, 0) + + # 构造按键按下事件的lparam参数 + # lparam包含重复次数、扫描码、扩展键标志等信息 + # 格式:[31] 转换状态 [30] 前一个状态 [29] 上下文代码 [28:25] 保留 + # [24] 扩展键 [23:16] 扫描码 [15:0] 重复次数 + lparam = (scan_code << 16) | 1 + + # 发送按键按下消息 + win32gui.PostMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) + + # 对于可打印字符,还需要发送WM_CHAR消息 + # WM_CHAR消息包含字符的Unicode值,用于文本输入 + if key_code >= ord('A') and key_code <= ord('Z'): + # 大写字母转换为小写 + char_code = key_code + 32 + win32gui.PostMessage(self.target_hwnd, WM_CHAR, char_code, lparam) + elif (key_code >= ord('0') and key_code <= ord('9')) or key_code == VK_SPACE: + # 数字和空格键直接发送 + win32gui.PostMessage(self.target_hwnd, WM_CHAR, key_code, lparam) + + # 构造按键释放事件的lparam参数 + # 设置第30位(前一个状态)和第31位(转换状态)为1,表示按键释放 + lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) + + # 发送按键释放消息 + win32gui.PostMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) + + return True + + def send_key_send_message(self, key_code): + """ + 使用SendMessage方式发送按键 + + SendMessage是同步发送方式,会等待目标窗口处理完消息后才返回。 + 这种方式响应可靠,能确保按键的处理顺序,适用于需要同步响应的应用。 + + Args: + key_code (int): 按键的虚拟键码 + + Returns: + bool: 发送成功返回True,失败返回False + """ + # 检查目标窗口是否有效 + if not self.target_hwnd or not win32gui.IsWindow(self.target_hwnd): + return False + + # 将虚拟键码转换为扫描码 + scan_code = win32api.MapVirtualKey(key_code, 0) + + # 构造按键按下事件的lparam参数 + lparam = (scan_code << 16) | 1 + + # 发送按键按下消息(同步) + win32gui.SendMessage(self.target_hwnd, WM_KEYDOWN, key_code, lparam) + + # 对于可打印字符,发送WM_CHAR消息 + if key_code >= ord('A') and key_code <= ord('Z'): + char_code = key_code + 32 # 转换为小写 + win32gui.SendMessage(self.target_hwnd, WM_CHAR, char_code, lparam) + elif (key_code >= ord('0') and key_code <= ord('9')) or key_code == VK_SPACE: + win32gui.SendMessage(self.target_hwnd, WM_CHAR, key_code, lparam) + + # 构造按键释放事件的lparam参数 + lparam = (scan_code << 16) | (1 | (1 << 30) | (1 << 31)) + + # 发送按键释放消息(同步) + win32gui.SendMessage(self.target_hwnd, WM_KEYUP, key_code, lparam) + + return True + + def send_key_send_input(self, key_code): + """ + 使用SendInput方式发送按键 + + SendInput是系统级的输入模拟方式,通过系统的输入队列发送按键事件。 + 这种方式兼容性最好,能被大多数应用正确识别,适用于对按键检测严格的应用。 + + Args: + key_code (int): 按键的虚拟键码 + + Returns: + bool: 发送成功返回True,失败返回False + """ + # 尝试将目标窗口设置为前台窗口 + # SendInput发送的是全局输入事件,需要目标窗口处于前台才能接收 + try: + if self.target_hwnd: + win32gui.SetForegroundWindow(self.target_hwnd) + except: + # 如果设置前台窗口失败,继续执行(某些情况下可能会被系统阻止) + pass + + # 创建INPUT结构数组,包含按键按下和释放两个事件 + inputs = (INPUT * 2)() + + # 设置按键按下事件 + inputs[0].type = INPUT_KEYBOARD # 输入类型:键盘 + inputs[0].u.ki.wVk = key_code # 虚拟键码 + inputs[0].u.ki.wScan = win32api.MapVirtualKey(key_code, 0) # 扫描码 + inputs[0].u.ki.dwFlags = 0 # 标志:0表示按键按下 + inputs[0].u.ki.time = 0 # 时间戳:0表示系统自动生成 + inputs[0].u.ki.dwExtraInfo = None # 额外信息 + + # 设置按键释放事件 + inputs[1].type = INPUT_KEYBOARD # 输入类型:键盘 + inputs[1].u.ki.wVk = key_code # 虚拟键码 + inputs[1].u.ki.wScan = win32api.MapVirtualKey(key_code, 0) # 扫描码 + inputs[1].u.ki.dwFlags = KEYEVENTF_KEYUP # 标志:KEYEVENTF_KEYUP表示按键释放 + inputs[1].u.ki.time = 0 # 时间戳 + inputs[1].u.ki.dwExtraInfo = None # 额外信息 + + # 调用SendInput API发送输入事件 + # 参数:事件数量、事件数组指针、单个事件结构大小 + ctypes.windll.user32.SendInput(2, ctypes.byref(inputs), ctypes.sizeof(INPUT)) + return True + + def send_key(self, key_code, mode="post"): + """ + 根据指定模式发送按键 + + Args: + key_code (int): 按键的虚拟键码 + mode (str): 发送模式,可选值: + "post" - 使用PostMessage + "send_message" - 使用SendMessage + "send" - 使用SendInput + + Returns: + bool: 发送成功返回True,失败返回False + """ + if mode == "post": + return self.send_key_post_message(key_code) + elif mode == "send_message": + return self.send_key_send_message(key_code) + elif mode == "send": + return self.send_key_send_input(key_code) + return False + + def send_mouse_click(self, mode="post"): + """ + 向目标窗口发送鼠标左键点击事件 + + 支持三种发送模式,与按键发送类似: + - post/send_message: 向目标窗口发送鼠标消息 + - send: 使用SendInput发送系统级鼠标事件 + + Args: + mode (str): 发送模式,可选值:"post", "send_message", "send" + + Returns: + bool: 发送成功返回True,失败返回False + """ + # 检查目标窗口是否有效 + if not self.target_hwnd or not win32gui.IsWindow(self.target_hwnd): + return False + + try: + if mode == "post" or mode == "send_message": + # 使用消息方式发送鼠标点击 + # lparam通常包含鼠标坐标,这里设为0表示窗口左上角 + lparam = 0 + + if mode == "post": + # 异步发送鼠标按下和释放消息 + win32gui.PostMessage(self.target_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lparam) + win32gui.PostMessage(self.target_hwnd, win32con.WM_LBUTTONUP, 0, lparam) + else: # send_message + # 同步发送鼠标按下和释放消息 + win32gui.SendMessage(self.target_hwnd, win32con.WM_LBUTTONDOWN, win32con.MK_LBUTTON, lparam) + win32gui.SendMessage(self.target_hwnd, win32con.WM_LBUTTONUP, 0, lparam) + else: # send mode + # 使用SendInput方式发送系统级鼠标事件 + inputs = (INPUT * 2)() + + # 设置鼠标按下事件 + inputs[0].type = INPUT_MOUSE # 输入类型:鼠标 + inputs[0].u.mi.dx = 0 # X坐标偏移 + inputs[0].u.mi.dy = 0 # Y坐标偏移 + inputs[0].u.mi.mouseData = 0 # 鼠标数据(滚轮等) + inputs[0].u.mi.dwFlags = MOUSEEVENTF_LEFTDOWN # 标志:左键按下 + inputs[0].u.mi.time = 0 # 时间戳 + inputs[0].u.mi.dwExtraInfo = None # 额外信息 + + # 设置鼠标释放事件 + inputs[1].type = INPUT_MOUSE # 输入类型:鼠标 + inputs[1].u.mi.dx = 0 # X坐标偏移 + inputs[1].u.mi.dy = 0 # Y坐标偏移 + inputs[1].u.mi.mouseData = 0 # 鼠标数据 + inputs[1].u.mi.dwFlags = MOUSEEVENTF_LEFTUP # 标志:左键释放 + inputs[1].u.mi.time = 0 # 时间戳 + inputs[1].u.mi.dwExtraInfo = None # 额外信息 + + # 发送鼠标输入事件 + ctypes.windll.user32.SendInput(2, ctypes.byref(inputs), ctypes.sizeof(INPUT)) + + return True + except Exception as e: + print(f"发送鼠标点击时出错: {str(e)}") + return False \ No newline at end of file diff --git a/src/core/window_selector.py b/src/core/window_selector.py new file mode 100644 index 0000000..2473519 --- /dev/null +++ b/src/core/window_selector.py @@ -0,0 +1,47 @@ +import time +import win32gui +import win32api +import win32process +from PyQt5.QtWidgets import QApplication + + +class WindowSelector: + def __init__(self): + self.target_hwnd = None + + def select_window(self, parent_widget=None): + """Allow user to select a target window by clicking on it""" + if parent_widget: + parent_widget.selectedWindowLabel.setText("请点击目标窗口...") + parent_widget.hide() + + QApplication.processEvents() + time.sleep(0.2) + + while True: + if win32api.GetAsyncKeyState(0x01) & 0x8000: # Left mouse button pressed + cursor_pos = win32gui.GetCursorPos() + window_handle = win32gui.WindowFromPoint(cursor_pos) + if window_handle: + window_text = win32gui.GetWindowText(window_handle) + self.target_hwnd = window_handle + + # Get process ID for debugging + if parent_widget: + try: + _, process_id = win32process.GetWindowThreadProcessId(window_handle) + parent_widget.debugLabel.setText(f"状态: 已选择窗口 (PID: {process_id})") + except: + pass + + parent_widget.selectedWindowLabel.setText(window_text) + + break + QApplication.processEvents() + time.sleep(0.1) + + if parent_widget: + time.sleep(0.2) + parent_widget.show() + + return self.target_hwnd, window_text if 'window_text' in locals() else "" \ No newline at end of file diff --git a/src/gui/__init__.py b/src/gui/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gui/about_dialog.py b/src/gui/about_dialog.py new file mode 100644 index 0000000..ff08eb6 --- /dev/null +++ b/src/gui/about_dialog.py @@ -0,0 +1,29 @@ +from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QPushButton + + +class AboutDialog(QDialog): + def __init__(self, parent=None): + super().__init__(parent) + self.setWindowTitle("关于") + self.setFixedSize(400, 200) + + layout = QVBoxLayout() + + title = QLabel("KeyPresser", self) + title.setStyleSheet("font-size: 18pt; font-weight: bold;") + layout.addWidget(title) + + desc = QLabel("一个简单的按键模拟工具", self) + layout.addWidget(desc) + + version = QLabel("版本: 专业版 (Python 无钩子版)", self) + layout.addWidget(version) + + author = QLabel("作者: xiao liu", self) + layout.addWidget(author) + + ok_button = QPushButton("确定", self) + ok_button.clicked.connect(self.accept) + layout.addWidget(ok_button) + + self.setLayout(layout) \ No newline at end of file diff --git a/src/gui/components/__init__.py b/src/gui/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/gui/main_window.py b/src/gui/main_window.py new file mode 100644 index 0000000..ce5ca71 --- /dev/null +++ b/src/gui/main_window.py @@ -0,0 +1,304 @@ +import win32gui +import win32api +import win32process +from PyQt5.QtWidgets import (QWidget, QVBoxLayout, QHBoxLayout, QPushButton, + QLabel, QLineEdit, QCheckBox, QComboBox, + QGridLayout, QMessageBox) +from PyQt5.QtCore import QTimer, Qt +from PyQt5.QtGui import QIcon + +from core.constants import KEY_COMBINATIONS, VK_SPACE +from core.window_selector import WindowSelector +from core.key_sender import KeySender +from utils.settings import SettingsManager +from .about_dialog import AboutDialog + + +class KeyPresser(QWidget): + def __init__(self, parent=None): + super().__init__(parent) + + self.target_hwnd = None + self.timers = [] + self.window_selector = WindowSelector() + self.key_sender = KeySender() + self.settings_manager = SettingsManager() + + # Set application icon + self.setWindowIcon(QIcon('resources/icons/aaa.ico')) + + self.init_ui() + self.settings_manager.load_settings(self) + + # Hotkey timer + self.hotkeyTimer = QTimer(self) + self.hotkeyTimer.timeout.connect(self.check_hotkey) + self.hotkeyTimer.start(50) + + # Mouse timer + self.mouseTimer = QTimer(self) + self.mouseTimer.timeout.connect(self.click_mouse) + + # Space timer + self.spaceTimer = QTimer(self) + self.spaceTimer.timeout.connect(self.press_space) + + # Last key state for hotkey detection + self.lastKeyState = False + + def init_ui(self): + self.setWindowTitle("KeyPresser(无钩子版)") + self.setFixedWidth(300) + + layout = QVBoxLayout(self) + + # Window selection + label = QLabel("选择窗口:", self) + layout.addWidget(label) + + self.selectedWindowLabel = QLabel("未选择窗口", self) + self.selectedWindowLabel.setStyleSheet("color: green;") + layout.addWidget(self.selectedWindowLabel) + + selectButton = QPushButton("选择窗口", self) + layout.addWidget(selectButton) + + # Mode selection + modeLayout = QHBoxLayout() + modeLabel = QLabel("按键模式:", self) + modeLayout.addWidget(modeLabel) + + self.modeComboBox = QComboBox(self) + self.modeComboBox.addItem("PostMessage (常规模式)", "post") + self.modeComboBox.addItem("SendInput (后台模式)", "send") + self.modeComboBox.addItem("SendMessage (直接模式)", "send_message") + modeLayout.addWidget(self.modeComboBox) + + layout.addLayout(modeLayout) + + # Space key settings + spaceLayout = QHBoxLayout() + self.spaceCheckBox = QCheckBox(self) + spaceLayout.addWidget(self.spaceCheckBox) + + spaceLabel = QLabel("空格键时间间隔 (毫秒):", self) + spaceLayout.addWidget(spaceLabel) + + self.spaceIntervalLineEdit = QLineEdit(self) + self.spaceIntervalLineEdit.setText("1000") + spaceLayout.addWidget(self.spaceIntervalLineEdit) + + layout.addLayout(spaceLayout) + + # Mouse settings + mouseLayout = QHBoxLayout() + self.mouseCheckBox = QCheckBox(self) + mouseLayout.addWidget(self.mouseCheckBox) + + mouseLabel = QLabel("鼠标左键时间间隔 (毫秒):", self) + mouseLayout.addWidget(mouseLabel) + + self.mouseIntervalLineEdit = QLineEdit(self) + self.mouseIntervalLineEdit.setText("1000") + mouseLayout.addWidget(self.mouseIntervalLineEdit) + + layout.addLayout(mouseLayout) + + # Custom keys + keysLabel = QLabel("自定义按键和时间间隔 (毫秒):", self) + layout.addWidget(keysLabel) + + keysLayout = QGridLayout() + self.keyCheckBoxes = [] + self.keyCombos = [] + self.intervalLineEdits = [] + + for i in range(10): + checkbox = QCheckBox(self) + keysLayout.addWidget(checkbox, i, 0) + self.keyCheckBoxes.append(checkbox) + + combobox = QComboBox(self) + self.populate_key_combos(combobox) + keysLayout.addWidget(combobox, i, 1) + self.keyCombos.append(combobox) + + lineEdit = QLineEdit(self) + lineEdit.setText("1000") + keysLayout.addWidget(lineEdit, i, 2) + self.intervalLineEdits.append(lineEdit) + + # Create timer for this key + timer = QTimer(self) + timer.timeout.connect(lambda checked=False, index=i: self.press_keys(index)) + self.timers.append(timer) + + layout.addLayout(keysLayout) + + # Control buttons + startButton = QPushButton("开始", self) + layout.addWidget(startButton) + + stopButton = QPushButton("停止", self) + layout.addWidget(stopButton) + + labelPrompt = QLabel("修改配置后需点击开始按钮以使更改生效。", self) + labelPrompt.setStyleSheet("color: red;") + layout.addWidget(labelPrompt) + + self.instructionLabel = QLabel("停止中", self) + self.instructionLabel.setStyleSheet("color: green;") + layout.addWidget(self.instructionLabel) + + # Hotkey selection + hotkeyLayout = QHBoxLayout() + hotkeyLabel = QLabel("开始/停止快捷键:", self) + hotkeyLayout.addWidget(hotkeyLabel) + + self.hotkeyComboBox = QComboBox(self) + self.populate_key_combos(self.hotkeyComboBox) + self.hotkeyComboBox.setCurrentText("Home") + hotkeyLayout.addWidget(self.hotkeyComboBox) + + layout.addLayout(hotkeyLayout) + + # Debug info + self.debugLabel = QLabel("状态: 管理员模式 (使用轮询检测热键)", self) + self.debugLabel.setStyleSheet("color: blue;") + layout.addWidget(self.debugLabel) + + # Thread input settings + threadLayout = QHBoxLayout() + self.attachThreadCheckBox = QCheckBox("关联线程输入", self) + self.attachThreadCheckBox.setChecked(True) + threadLayout.addWidget(self.attachThreadCheckBox) + + layout.addLayout(threadLayout) + + aboutButton = QPushButton("关于", self) + layout.addWidget(aboutButton) + + # Connect signals + selectButton.clicked.connect(self.select_window) + startButton.clicked.connect(self.start_pressing) + stopButton.clicked.connect(self.stop_pressing) + aboutButton.clicked.connect(self.about_me) + + self.setLayout(layout) + + def populate_key_combos(self, comboBox): + """Populate combo box with key combinations""" + for text, value in KEY_COMBINATIONS: + comboBox.addItem(text, value) + + def check_hotkey(self): + """Check if the selected hotkey is pressed""" + key_code = self.hotkeyComboBox.currentData() + key_state = win32api.GetAsyncKeyState(key_code) & 0x8000 != 0 + + if key_state and not self.lastKeyState: + if self.instructionLabel.text() == "运行中": + self.stop_pressing() + else: + self.start_pressing() + + self.lastKeyState = key_state + + def select_window(self): + """Select target window""" + hwnd, window_text = self.window_selector.select_window(self) + if hwnd: + self.target_hwnd = hwnd + self.key_sender.set_target_window(hwnd) + + def start_pressing(self): + """Start sending keystrokes to the target window""" + if not self.target_hwnd: + QMessageBox.warning(self, "警告", "请选择窗口后,再点击开始!") + return + + self.instructionLabel.setText("运行中") + self.stop_all_timers() + + if not win32gui.IsWindow(self.target_hwnd): + QMessageBox.warning(self, "警告", "目标窗口已关闭,请重新选择!") + self.target_hwnd = None + self.selectedWindowLabel.setText("未选择窗口") + self.instructionLabel.setText("停止中") + return + + # Thread attachment + if self.attachThreadCheckBox.isChecked(): + try: + target_thread_id = win32process.GetWindowThreadProcessId(self.target_hwnd)[0] + current_thread_id = win32api.GetCurrentThreadId() + win32process.AttachThreadInput(current_thread_id, target_thread_id, True) + self.debugLabel.setText("状态: 已关联线程输入") + except Exception as e: + self.debugLabel.setText(f"状态: 线程关联失败 ({str(e)})") + + # Start space key timer + if self.spaceCheckBox.isChecked(): + self.press_space() + interval = int(self.spaceIntervalLineEdit.text()) + self.spaceTimer.start(interval) + + # Start mouse click timer + if self.mouseCheckBox.isChecked(): + self.click_mouse() + interval = int(self.mouseIntervalLineEdit.text()) + self.mouseTimer.start(interval) + + # Start custom key timers + for i in range(10): + if self.keyCheckBoxes[i].isChecked() and self.keyCombos[i].currentIndex() != -1: + self.press_keys(i) + interval = int(self.intervalLineEdits[i].text()) + self.timers[i].start(interval) + + def stop_pressing(self): + """Stop sending keystrokes""" + self.instructionLabel.setText("停止中") + self.stop_all_timers() + + if self.attachThreadCheckBox.isChecked() and self.target_hwnd: + try: + target_thread_id = win32process.GetWindowThreadProcessId(self.target_hwnd)[0] + current_thread_id = win32api.GetCurrentThreadId() + win32process.AttachThreadInput(current_thread_id, target_thread_id, False) + self.debugLabel.setText("状态: 已解除线程关联") + except: + pass + + def stop_all_timers(self): + """Stop all timers""" + self.spaceTimer.stop() + self.mouseTimer.stop() + for timer in self.timers: + timer.stop() + + def press_space(self): + """Send space key to target window""" + mode = self.modeComboBox.currentData() + self.key_sender.send_key(VK_SPACE, mode) + + def press_keys(self, index): + """Send custom keys to target window""" + key_code = self.keyCombos[index].currentData() + mode = self.modeComboBox.currentData() + self.key_sender.send_key(key_code, mode) + + def click_mouse(self): + """Send mouse click to target window""" + mode = self.modeComboBox.currentData() + self.key_sender.send_mouse_click(mode) + + def about_me(self): + """Show about dialog""" + about_dialog = AboutDialog(self) + about_dialog.exec_() + + def closeEvent(self, event): + """Handle window close event""" + self.settings_manager.save_settings(self) + super().closeEvent(event) \ No newline at end of file diff --git a/src/main.py b/src/main.py new file mode 100644 index 0000000..45aab22 --- /dev/null +++ b/src/main.py @@ -0,0 +1,73 @@ +""" +KeyPressRemark - Windows 按键模拟工具主入口 + +这是应用程序的主入口点,负责: +1. 初始化应用程序环境 +2. 检查和申请管理员权限 +3. 配置高DPI显示支持 +4. 创建并显示主窗口 + +作者: xiao liu +版本: v0.1.0 +""" + +import sys +from PyQt5.QtWidgets import QApplication +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QIcon + +# 添加项目根目录到Python路径,确保能正确导入模块 +import os +project_root = os.path.dirname(os.path.dirname(__file__)) +sys.path.insert(0, project_root) + +# 导入Qt资源文件(包含图标等资源) +import resources.qrc.resources_rc + +# 导入核心功能模块 +from core.admin_check import request_admin_privileges +from gui.main_window import KeyPresser + + +def main(): + """ + 应用程序主函数 + + 执行流程: + 1. 检查并申请管理员权限(按键模拟需要管理员权限) + 2. 启用高DPI缩放支持(支持高分辨率显示器) + 3. 创建Qt应用程序实例 + 4. 设置应用程序图标 + 5. 创建并显示主窗口 + 6. 启动事件循环 + """ + # 第一步:检查并申请管理员权限 + # 按键模拟功能需要管理员权限才能向其他应用发送按键事件 + request_admin_privileges() + + # 第二步:启用高DPI缩放支持 + # 确保应用在高分辨率显示器上正常显示 + if hasattr(Qt, 'AA_EnableHighDpiScaling'): + QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) + if hasattr(Qt, 'AA_UseHighDpiPixmaps'): + QApplication.setAttribute(Qt.AA_UseHighDpiPixmaps, True) + + # 第三步:创建Qt应用程序实例 + app = QApplication(sys.argv) + + # 第四步:设置应用程序图标 + app.setWindowIcon(QIcon('resources/icons/aaa.ico')) + + # 第五步:创建主窗口实例 + window = KeyPresser() + + # 第六步:显示主窗口 + window.show() + + # 第七步:启动Qt事件循环,直到程序退出 + sys.exit(app.exec_()) + + +if __name__ == '__main__': + # 当作为主程序运行时,调用main函数 + main() \ No newline at end of file diff --git a/src/utils/__init__.py b/src/utils/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/utils/settings.py b/src/utils/settings.py new file mode 100644 index 0000000..1c9601d --- /dev/null +++ b/src/utils/settings.py @@ -0,0 +1,45 @@ +from PyQt5.QtCore import QSettings + + +class SettingsManager: + def __init__(self, company="FinnSoft", application="KeyPresser"): + self.settings = QSettings(company, application) + + def save_settings(self, widget): + """Save current settings from the main widget""" + self.settings.setValue("spaceCheckBox", widget.spaceCheckBox.isChecked()) + self.settings.setValue("spaceIntervalLineEdit", widget.spaceIntervalLineEdit.text()) + self.settings.setValue("mouseCheckBox", widget.mouseCheckBox.isChecked()) + self.settings.setValue("mouseIntervalLineEdit", widget.mouseIntervalLineEdit.text()) + self.settings.setValue("modeIndex", widget.modeComboBox.currentIndex()) + self.settings.setValue("attachThread", widget.attachThreadCheckBox.isChecked()) + self.settings.setValue("hotkeyIndex", widget.hotkeyComboBox.currentIndex()) + + for i in range(10): + self.settings.setValue(f"keyCheckBox{i}", widget.keyCheckBoxes[i].isChecked()) + self.settings.setValue(f"keyCombo{i}", widget.keyCombos[i].currentIndex()) + self.settings.setValue(f"intervalLineEdit{i}", widget.intervalLineEdits[i].text()) + + def load_settings(self, widget): + """Load saved settings into the main widget""" + widget.mouseCheckBox.setChecked(self.settings.value("mouseCheckBox", False, type=bool)) + widget.mouseIntervalLineEdit.setText(self.settings.value("mouseIntervalLineEdit", "1000")) + widget.spaceCheckBox.setChecked(self.settings.value("spaceCheckBox", False, type=bool)) + widget.spaceIntervalLineEdit.setText(self.settings.value("spaceIntervalLineEdit", "1000")) + + mode_index = self.settings.value("modeIndex", 0, type=int) + if 0 <= mode_index < widget.modeComboBox.count(): + widget.modeComboBox.setCurrentIndex(mode_index) + + widget.attachThreadCheckBox.setChecked(self.settings.value("attachThread", True, type=bool)) + + for i in range(10): + widget.keyCheckBoxes[i].setChecked(self.settings.value(f"keyCheckBox{i}", False, type=bool)) + combo_index = self.settings.value(f"keyCombo{i}", 0, type=int) + if 0 <= combo_index < widget.keyCombos[i].count(): + widget.keyCombos[i].setCurrentIndex(combo_index) + widget.intervalLineEdits[i].setText(self.settings.value(f"intervalLineEdit{i}", "1000")) + + hotkey_index = self.settings.value("hotkeyIndex", 47, type=int) # Default to Home key + if 0 <= hotkey_index < widget.hotkeyComboBox.count(): + widget.hotkeyComboBox.setCurrentIndex(hotkey_index) \ No newline at end of file diff --git a/src/utils/structures.py b/src/utils/structures.py new file mode 100644 index 0000000..a0a854c --- /dev/null +++ b/src/utils/structures.py @@ -0,0 +1,46 @@ +import ctypes +from ctypes import wintypes + + +class MOUSEINPUT(ctypes.Structure): + _fields_ = [ + ("dx", wintypes.LONG), + ("dy", wintypes.LONG), + ("mouseData", wintypes.DWORD), + ("dwFlags", wintypes.DWORD), + ("time", wintypes.DWORD), + ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG)), + ] + + +class KEYBDINPUT(ctypes.Structure): + _fields_ = [ + ("wVk", wintypes.WORD), + ("wScan", wintypes.WORD), + ("dwFlags", wintypes.DWORD), + ("time", wintypes.DWORD), + ("dwExtraInfo", ctypes.POINTER(wintypes.ULONG)), + ] + + +class HARDWAREINPUT(ctypes.Structure): + _fields_ = [ + ("uMsg", wintypes.DWORD), + ("wParamL", wintypes.WORD), + ("wParamH", wintypes.WORD), + ] + + +class INPUT_union(ctypes.Union): + _fields_ = [ + ("mi", MOUSEINPUT), + ("ki", KEYBDINPUT), + ("hi", HARDWAREINPUT), + ] + + +class INPUT(ctypes.Structure): + _fields_ = [ + ("type", wintypes.DWORD), + ("u", INPUT_union), + ] \ No newline at end of file diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..61329f9 --- /dev/null +++ b/uv.lock @@ -0,0 +1,197 @@ +version = 1 +revision = 1 +requires-python = ">=3.11" + +[[package]] +name = "altgraph" +version = "0.17.4" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/a8/7145824cf0b9e3c28046520480f207df47e927df83aa9555fb47f8505922/altgraph-0.17.4.tar.gz", hash = "sha256:1b5afbb98f6c4dcadb2e2ae6ab9fa994bbb8c1d75f4fa96d340f9437ae454406" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4d/3f/3bc3f1d83f6e4a7fcb834d3720544ca597590425be5ba9db032b2bf322a2/altgraph-0.17.4-py2.py3-none-any.whl", hash = "sha256:642743b4750de17e655e6711601b077bc6598dbfa3ba5fa2b2a35ce12b508dff" }, +] + +[[package]] +name = "keypressremark" +version = "0.1.0" +source = { editable = "." } +dependencies = [ + { name = "pyqt5" }, + { name = "pyqt5-qt5" }, + { name = "pywin32" }, +] + +[package.dev-dependencies] +dev = [ + { name = "pyinstaller" }, +] + +[package.metadata] +requires-dist = [ + { name = "pyqt5", specifier = "==5.15.11" }, + { name = "pyqt5-qt5", specifier = "==5.15.2" }, + { name = "pywin32", specifier = "==311" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "pyinstaller", specifier = ">=6.0.0" }] + +[[package]] +name = "macholib" +version = "1.16.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "altgraph" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/95/ee/af1a3842bdd5902ce133bd246eb7ffd4375c38642aeb5dc0ae3a0329dfa2/macholib-1.16.3.tar.gz", hash = "sha256:07ae9e15e8e4cd9a788013d81f5908b3609aa76f9b1421bae9c4d7606ec86a30" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/5d/c059c180c84f7962db0aeae7c3b9303ed1d73d76f2bfbc32bc231c8be314/macholib-1.16.3-py2.py3-none-any.whl", hash = "sha256:0e315d7583d38b8c77e815b1ecbdbf504a8258d8b3e17b61165c6feb60d18f2c" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, +] + +[[package]] +name = "pefile" +version = "2023.2.7" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/78/c5/3b3c62223f72e2360737fd2a57c30e5b2adecd85e70276879609a7403334/pefile-2023.2.7.tar.gz", hash = "sha256:82e6114004b3d6911c77c3953e3838654b04511b8b66e8583db70c65998017dc", size = 74854 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/55/26/d0ad8b448476d0a1e8d3ea5622dc77b916db84c6aa3cb1e1c0965af948fc/pefile-2023.2.7-py3-none-any.whl", hash = "sha256:da185cd2af68c08a6cd4481f7325ed600a88f6a813bad9dea07ab3ef73d8d8d6", size = 71791 }, +] + +[[package]] +name = "pyinstaller" +version = "6.16.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "altgraph" }, + { name = "macholib", marker = "sys_platform == 'darwin'" }, + { name = "packaging" }, + { name = "pefile", marker = "sys_platform == 'win32'" }, + { name = "pyinstaller-hooks-contrib" }, + { name = "pywin32-ctypes", marker = "sys_platform == 'win32'" }, + { name = "setuptools" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/94/94/1f62e95e4a28b64cfbb5b922ef3046f968b47170d37a1e1a029f56ac9cb4/pyinstaller-6.16.0.tar.gz", hash = "sha256:53559fe1e041a234f2b4dcc3288ea8bdd57f7cad8a6644e422c27bb407f3edef", size = 4008473 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7b/0a/c42ce6e5d3de287f2e9432a074fb209f1fb72a86a72f3903849fdb5e4829/pyinstaller-6.16.0-py3-none-macosx_10_13_universal2.whl", hash = "sha256:7fd1c785219a87ca747c21fa92f561b0d2926a7edc06d0a0fe37f3736e00bd7a", size = 1027899 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/4e/d0/f18fedde32835d5a758f464c75924e2154065625f09d5456c3c303527654/pyinstaller-6.16.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:b756ddb9007b8141c5476b553351f9d97559b8af5d07f9460869bfae02be26b0", size = 727990 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7a/db/c8bb47514ce857b24bf9294cf1ff74844b6a489fa0ab4ef6f923288c4e38/pyinstaller-6.16.0-py3-none-manylinux2014_i686.whl", hash = "sha256:0a48f55b85ff60f83169e10050f2759019cf1d06773ad1c4da3a411cd8751058", size = 739238 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c6/3e/451dc784a8fcca0fe9f9b6b802d58555364a95b60f253613a2c83fc6b023/pyinstaller-6.16.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:73ba72e04fcece92e32518bbb1e1fb5ac2892677943dfdff38e01a06e8742851", size = 737142 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/37/2f457479ef8fa2821cdb448acee2421dfb19fbe908bf5499d1930c164084/pyinstaller-6.16.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:b1752488248f7899281b17ca3238eefb5410521291371a686a4f5830f29f52b3", size = 734133 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/63/c4/0f7daac4d062a4d1ac2571d8a8b9b5d6812094fcd914d139af591ca5e1ba/pyinstaller-6.16.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ba618a61627ee674d6d68e5de084ba17c707b59a4f2a856084b3999bdffbd3f0", size = 733817 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/e4/b6127265b42bef883e8873d850becadf748bc5652e5a7029b059328f3c31/pyinstaller-6.16.0-py3-none-musllinux_1_1_aarch64.whl", hash = "sha256:c8b7ef536711617e12fef4673806198872033fa06fa92326ad7fd1d84a9fa454", size = 732912 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/2b/00/c6663107bdf814b2916e71563beabd09f693c47712213bc228994cb2cc65/pyinstaller-6.16.0-py3-none-musllinux_1_1_x86_64.whl", hash = "sha256:d1ebf84d02c51fed19b82a8abb4df536923abd55bb684d694e1356e4ae2a0ce5", size = 732773 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/14/cabe9bc5f60b95d2e70e7d045ab94b0015ff8f6c8b16e2142d3597e30749/pyinstaller-6.16.0-py3-none-win32.whl", hash = "sha256:6d5f8617f3650ff9ef893e2ab4ddbf3c0d23d0c602ef74b5df8fbef4607840c8", size = 1313878 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/aa/99/2005efbc297e7813c1d6f18484aa94a1a81ce87b6a5b497c563681f4c4ea/pyinstaller-6.16.0-py3-none-win_amd64.whl", hash = "sha256:bc10eb1a787f99fea613509f55b902fbd2d8b73ff5f51ff245ea29a481d97d41", size = 1374706 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ca/f4/4dfcf69b86d60fcaae05a42bbff1616d48a91e71726e5ed795d773dae9b3/pyinstaller-6.16.0-py3-none-win_arm64.whl", hash = "sha256:d0af8a401de792c233c32c44b16d065ca9ab8262ee0c906835c12bdebc992a64", size = 1315923 }, +] + +[[package]] +name = "pyinstaller-hooks-contrib" +version = "2025.9" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "packaging" }, + { name = "setuptools" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7d/83/be0f57c0b77b66c33c2283ebd4ea341022b5a743e97c5fb3bebab82b38b9/pyinstaller_hooks_contrib-2025.9.tar.gz", hash = "sha256:56e972bdaad4e9af767ed47d132362d162112260cbe488c9da7fee01f228a5a6", size = 165189 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a2/26/23b4cfc77d7f808c69f59070e1e8293a579ec281a547c61562357160b346/pyinstaller_hooks_contrib-2025.9-py3-none-any.whl", hash = "sha256:ccbfaa49399ef6b18486a165810155e5a8d4c59b41f20dc5da81af7482aaf038", size = 444283 }, +] + +[[package]] +name = "pyqt5" +version = "5.15.11" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +dependencies = [ + { name = "pyqt5-qt5" }, + { name = "pyqt5-sip" }, +] +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/0e/07/c9ed0bd428df6f87183fca565a79fee19fa7c88c7f00a7f011ab4379e77a/PyQt5-5.15.11.tar.gz", hash = "sha256:fda45743ebb4a27b4b1a51c6d8ef455c4c1b5d610c90d2934c7802b5c1557c52", size = 3216775 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/11/64/42ec1b0bd72d87f87bde6ceb6869f444d91a2d601f2e67cd05febc0346a1/PyQt5-5.15.11-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:c8b03dd9380bb13c804f0bdb0f4956067f281785b5e12303d529f0462f9afdc2", size = 6579776 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/49/f5/3fb696f4683ea45d68b7e77302eff173493ac81e43d63adb60fa760b9f91/PyQt5-5.15.11-cp38-abi3-macosx_11_0_x86_64.whl", hash = "sha256:6cd75628f6e732b1ffcfe709ab833a0716c0445d7aec8046a48d5843352becb6", size = 7016415 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/8c/4065950f9d013c4b2e588fe33cf04e564c2322842d84dbcbce5ba1dc28b0/PyQt5-5.15.11-cp38-abi3-manylinux_2_17_x86_64.whl", hash = "sha256:cd672a6738d1ae33ef7d9efa8e6cb0a1525ecf53ec86da80a9e1b6ec38c8d0f1", size = 8188103 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/f3/f0/ae5a5b4f9b826b29ea4be841b2f2d951bcf5ae1d802f3732b145b57c5355/PyQt5-5.15.11-cp38-abi3-win32.whl", hash = "sha256:76be0322ceda5deecd1708a8d628e698089a1cea80d1a49d242a6d579a40babd", size = 5433308 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/56/d5/68eb9f3d19ce65df01b6c7b7a577ad3bbc9ab3a5dd3491a4756e71838ec9/PyQt5-5.15.11-cp38-abi3-win_amd64.whl", hash = "sha256:bdde598a3bb95022131a5c9ea62e0a96bd6fb28932cc1619fd7ba211531b7517", size = 6865864 }, +] + +[[package]] +name = "pyqt5-qt5" +version = "5.15.2" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/62/09/99a222b0360616250fb2e6003a54e43a2a06b0774f0f8d5daafb86a2c375/PyQt5_Qt5-5.15.2-py3-none-macosx_10_13_intel.whl", hash = "sha256:76980cd3d7ae87e3c7a33bfebfaee84448fd650bad6840471d6cae199b56e154", size = 40546019 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/83/d4/241a6a518d0bcf0a9fcdcbad5edfed18d43e884317eab8d5230a2b27e206/PyQt5_Qt5-5.15.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:1988f364ec8caf87a6ee5d5a3a5210d57539988bf8e84714c7d60972692e2f4a", size = 59921716 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1c/7e/ce7c66a541a105fa98b41d6405fe84940564695e29fc7dccf6d9e8c5f898/PyQt5_Qt5-5.15.2-py3-none-win32.whl", hash = "sha256:9cc7a768b1921f4b982ebc00a318ccb38578e44e45316c7a4a850e953e1dd327", size = 43447358 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/37/97/5d3b222b924fa2ed4c2488925155cd0b03fd5d09ee1cfcf7c553c11c9f66/PyQt5_Qt5-5.15.2-py3-none-win_amd64.whl", hash = "sha256:750b78e4dba6bdf1607febedc08738e318ea09e9b10aea9ff0d73073f11f6962", size = 50075158 }, +] + +[[package]] +name = "pyqt5-sip" +version = "12.17.1" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ea/08/88a20c862f40b5c178c517cdc7e93767967dec5ac1b994e226d517991c9b/pyqt5_sip-12.17.1.tar.gz", hash = "sha256:0eab72bcb628f1926bf5b9ac51259d4fa18e8b2a81d199071135458f7d087ea8", size = 104136 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/15/e4/451e465c75584a7cbd10e10404317b7443af83f56a64e02080b1f3cda5b5/pyqt5_sip-12.17.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5134d637efadd108a70306bab55b3d7feaa951bf6b8162161a67ae847bea9130", size = 122581 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/dc/b2/330f97434b21fbc99ab16f6ce71358ff5ea1bf1f09ed14dfe6b28b5ed8f5/pyqt5_sip-12.17.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:155cf755266c8bf64428916e2ff720d5efa1aec003d4ccc40c003b147dbdac03", size = 276844 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/3b/fd/53925099d0fc8aaf7adee613b6cebfb3fdfcd1238add64ff9edf6711e5f8/pyqt5_sip-12.17.1-cp311-cp311-win32.whl", hash = "sha256:9dfa7fe4ac93b60004430699c4bf56fef842a356d64dfea7cbc6d580d0427d6d", size = 49099 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/33/f8/f47a849c17676557c4220fbce9fcc24e15736af247c4dddcaf9ff0124b57/pyqt5_sip-12.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:2ddd214cf40119b86942a5da2da5a7345334955ab00026d8dcc56326b30e6d3c", size = 58988 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/15/291f83f336558300626bebb0c403084ec171bbc8a70683e3376234422eb6/pyqt5_sip-12.17.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:c362606de782d2d46374a38523632786f145c517ee62de246a6069e5f2c5f336", size = 124521 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/45/85/ea1ae099260fd1859d71b31f51760b4226abfa778d5796b76d92c8fe6dcd/pyqt5_sip-12.17.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:140cc582151456103ebb149fefc678f3cae803e7720733db51212af5219cd45c", size = 282182 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b4/b3/d5b50c721651a0f2ccbef6f8db3dabf3db296b9ec239ba007f5615f57dd7/pyqt5_sip-12.17.1-cp312-cp312-win32.whl", hash = "sha256:9dc1f1525d4d42c080f6cfdfc70d78239f8f67b0a48ea0745497251d8d848b1d", size = 49447 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/14/b6/474d8b17763683ab45fb364f3a44f25fdc25d97b47b29ad8819b95a15ac8/pyqt5_sip-12.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:d5e2e9e175559017cd161d661e0ee0b551684f824bb90800c5a8c8a3bea9355e", size = 57946 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/1d/58/9ecb688050e79ffe7bbd9fc917aa13f63856a5081ac46bbce87bb11ab971/pyqt5_sip-12.17.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9ebbd7769ccdaaa6295e9c872553b6cde17f38e171056f17300d8af9a14d1fc8", size = 124485 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/b1/9f/ae691360a9f18e3e06fd297e854d7ad175367e35ea184fd2fcf6c79b8c25/pyqt5_sip-12.17.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b023da906a70af2cf5e6fc1932f441ede07530f3e164dd52c6c2bb5ab7c6f424", size = 281923 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d7/31/491c45423174a359a4b8a8d84a7b541c453f48497ae928cbe4006bcd3e01/pyqt5_sip-12.17.1-cp313-cp313-win32.whl", hash = "sha256:36dbef482bd638786b909f3bda65b7b3d5cbd6cbf16797496de38bae542da307", size = 49400 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/64/61/e28681dd5200094f7b2e6671e85c02a4d6693da36d23ad7d39ffbc70b15c/pyqt5_sip-12.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:d04e5551bbc3bcec98acc63b3b0618ddcbf31ff107349225b516fe7e7c0a7c8b", size = 57979 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/71/f9/06c09dc94474ffe3f518f80e47fc69d34abf8e4a971ae7e7c667d6ff30a7/pyqt5_sip-12.17.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c49918287e1ad77956d1589f1d3d432a0be7630c646ea02cf652413a48e14458", size = 124400 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/ae/be6e338ea427deac5cd81a93f51ae3fb6505d99d6d5e5d5341bcc099327e/pyqt5_sip-12.17.1-cp314-cp314-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:944a4bf1e1ee18ad03a54964c1c6433fb6de582313a1f0b17673e7203e22fc83", size = 282291 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/fc/a3/8b758518bd0dd5d1581f7a6d522c9b4d9b58d05087b1d0b4dfaad5376434/pyqt5_sip-12.17.1-cp314-cp314-win32.whl", hash = "sha256:99a2935fd662a67748625b1e6ffa0a2d1f2da068b9df6db04fa59a4a5d4ee613", size = 50578 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/40/8c/e96f9877548810b1e537f46fc21ba74552dd4e8c498658114a8353bdf659/pyqt5_sip-12.17.1-cp314-cp314-win_amd64.whl", hash = "sha256:aaa33232cc80793d14fdb3b149b27eec0855612ed66aad480add5ac49b9cee63", size = 59763 }, +] + +[[package]] +name = "pywin32" +version = "311" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/7c/af/449a6a91e5d6db51420875c54f6aff7c97a86a3b13a0b4f1a5c13b988de3/pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151", size = 8697031 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/51/8f/9bb81dd5bb77d22243d33c8397f09377056d5c687aa6d4042bea7fbf8364/pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503", size = 9508308 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/44/7b/9c2ab54f74a138c491aba1b1cd0795ba61f144c711daea84a88b63dc0f6c/pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2", size = 8703930 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e7/ab/01ea1943d4eba0f850c3c61e78e8dd59757ff815ff3ccd0a84de5f541f42/pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31", size = 8706543 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/d1/a8/a0e8d07d4d051ec7502cd58b291ec98dcc0c3fff027caad0470b72cfcc2f/pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067", size = 9495040 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/ba/3a/2ae996277b4b50f17d61f0603efd8253cb2d79cc7ae159468007b586396d/pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852", size = 8710102 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a5/be/3fd5de0979fcb3994bfee0d65ed8ca9506a8a1260651b86174f6a86f52b3/pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d", size = 8705700 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/e3/28/e0a1909523c6890208295a29e05c2adb2126364e289826c0a8bc7297bd5c/pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d", size = 9494700 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/04/bf/90339ac0f55726dce7d794e6d79a18a91265bdf3aa70b6b9ca52f35e022a/pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a", size = 8709318 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c9/31/097f2e132c4f16d99a22bfb777e0fd88bd8e1c634304e102f313af69ace5/pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee", size = 8840714 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/90/4b/07c77d8ba0e01349358082713400435347df8426208171ce297da32c313d/pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87", size = 9656800 }, + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/c0/d2/21af5c535501a7233e734b8af901574572da66fcc254cb35d0609c9080dd/pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42", size = 8932540 }, +] + +[[package]] +name = "pywin32-ctypes" +version = "0.2.3" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/85/9f/01a1a99704853cb63f253eea009390c88e7131c67e66a0a02099a8c917cb/pywin32-ctypes-0.2.3.tar.gz", hash = "sha256:d162dc04946d704503b2edc4d55f3dba5c1d539ead017afa00142c38b9885755", size = 29471 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/de/3d/8161f7711c017e01ac9f008dfddd9410dff3674334c233bde66e7ba65bbf/pywin32_ctypes-0.2.3-py3-none-any.whl", hash = "sha256:8a1513379d709975552d202d942d9837758905c8d01eb82b8bcc30918929e7b8", size = 30756 }, +] + +[[package]] +name = "setuptools" +version = "80.9.0" +source = { registry = "https://pypi.tuna.tsinghua.edu.cn/simple/" } +sdist = { url = "https://pypi.tuna.tsinghua.edu.cn/packages/18/5d/3bf57dcd21979b887f014ea83c24ae194cfcd12b9e0fda66b957c69d1fca/setuptools-80.9.0.tar.gz", hash = "sha256:f36b47402ecde768dbfafc46e8e4207b4360c654f1f3bb84475f0a28628fb19c", size = 1319958 } +wheels = [ + { url = "https://pypi.tuna.tsinghua.edu.cn/packages/a3/dc/17031897dae0efacfea57dfd3a82fdd2a2aeb58e0ff71b77b87e44edc772/setuptools-80.9.0-py3-none-any.whl", hash = "sha256:062d34222ad13e0cc312a4c02d73f059e86a4acbfbdea8f8f76b28c99f306922", size = 1201486 }, +]