diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 00000000..8bf578e4 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,71 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + test-node: + name: Node ${{ matrix.node-version }} (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + node-version: ["22", "23"] + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + + - name: Install SQLite (Ubuntu) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y libsqlite3-dev + + - name: Install SQLite (macOS) + if: runner.os == 'macOS' + run: brew install sqlite + + - run: npm install + + - name: Tests + run: npx vitest run --reporter=verbose test/ + env: + CI: true + + test-bun: + name: Bun (${{ matrix.os }}) + runs-on: ${{ matrix.os }} + strategy: + fail-fast: false + matrix: + os: [ubuntu-latest, macos-latest] + + steps: + - uses: actions/checkout@v4 + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install SQLite (Ubuntu) + if: runner.os == 'Linux' + run: sudo apt-get update && sudo apt-get install -y libsqlite3-dev + + - name: Install SQLite (macOS) + if: runner.os == 'macOS' + run: brew install sqlite + + - run: bun install + + - name: Tests + run: bun test --timeout 30000 --preload ./src/test-preload.ts test/ + env: + CI: true + DYLD_LIBRARY_PATH: /opt/homebrew/opt/sqlite/lib + LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 00000000..972342d0 --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,55 @@ +name: Publish + +on: + push: + tags: ["v*"] + +jobs: + publish: + runs-on: ubuntu-latest + + permissions: + contents: write + id-token: write + + steps: + - uses: actions/checkout@v4 + + - uses: oven-sh/setup-bun@v2 + with: + bun-version: latest + + - name: Install SQLite + run: sudo apt-get update && sudo apt-get install -y libsqlite3-dev + + - run: bun install + - run: bun test --timeout 30000 --preload ./src/test-preload.ts test/ + env: + CI: true + LD_LIBRARY_PATH: /usr/lib/x86_64-linux-gnu + + - uses: actions/setup-node@v4 + with: + node-version: 22 + registry-url: https://registry.npmjs.org + + - run: npm run build + - run: npm publish --provenance --access public + env: + NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }} + + - name: Extract release notes + id: notes + run: | + VERSION="${GITHUB_REF_NAME#v}" + NOTES=$(./scripts/extract-changelog.sh "$VERSION") + # Write to file for gh release (avoids quoting issues) + echo "$NOTES" > /tmp/release-notes.md + + - name: Create GitHub release + run: | + gh release create "$GITHUB_REF_NAME" \ + --title "$GITHUB_REF_NAME" \ + --notes-file /tmp/release-notes.md + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index 7f83d115..165336e8 100644 --- a/.gitignore +++ b/.gitignore @@ -1,14 +1,20 @@ node_modules/ +dist/ +package-lock.json +.npmrc *.sqlite .DS_Store archive/ texts/ .cursor/ -.github/ +.github/copilot/ *.md !README.md !CLAUDE.md +!CHANGELOG.md !skills/**/*.md !finetune/*.md +!docs/*.md finetune/outputs/ finetune/data/train/ +.claude/ diff --git a/.pi/settings.json b/.pi/settings.json new file mode 100644 index 00000000..05679455 --- /dev/null +++ b/.pi/settings.json @@ -0,0 +1,3 @@ +{ + "skills": ["skills"] +} diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 00000000..f22487a3 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,471 @@ +# Changelog + +## [Unreleased] + +## [1.1.6] - 2026-03-09 + +QMD can now be used as a library. `import { createStore } from '@tobilu/qmd'` +gives you the full search and indexing API — hybrid query, BM25, structured +search, collection/context management — without shelling out to the CLI. + +### Changes + +- **SDK / library mode**: `createStore({ dbPath, config })` returns a + `QMDStore` with `query()`, `search()`, `structuredSearch()`, `get()`, + `multiGet()`, and collection/context management methods. Supports inline + config (no files needed) or a YAML config path. +- **Package exports**: `package.json` now declares `main`, `types`, and + `exports` so bundlers and TypeScript resolve `@tobilu/qmd` correctly. + +## [1.1.5] - 2026-03-07 + +Ambiguous queries like "performance" now produce dramatically better results +when the caller knows what they mean. The new `intent` parameter steers all +five pipeline stages — expansion, strong-signal bypass, chunk selection, +reranking, and snippet extraction — without searching on its own. Design and +original implementation by Ilya Grigorik (@vyalamar) in #180. + +### Changes + +- **Intent parameter**: optional `intent` string disambiguates queries across + the entire search pipeline. Available via CLI (`--intent` flag or `intent:` + line in query documents), MCP (`intent` field on the query tool), and + programmatic API. Adapted from PR #180 (thanks @vyalamar). +- **Query expansion**: when intent is provided, the expansion LLM prompt + includes `Query intent: {intent}`, matching the finetune training data + format for better-aligned expansions. +- **Reranking**: intent is prepended to the rerank query so Qwen3-Reranker + scores with domain context. +- **Chunk selection**: intent terms scored at 0.5× weight alongside query + terms (1.0×) when selecting the best chunk per document for reranking. +- **Snippet extraction**: intent terms scored at 0.3× weight to nudge + snippets toward intent-relevant lines without overriding query anchoring. +- **Strong-signal bypass disabled with intent**: when intent is provided, the + BM25 strong-signal shortcut is skipped — the obvious keyword match may not + be what the caller wants. +- **MCP instructions**: callers are now guided to provide `intent` on every + search call for disambiguation. +- **Query document syntax**: `intent:` recognized as a line type. At most one + per document, cannot appear alone. Grammar updated in `docs/SYNTAX.md`. + +## [1.1.2] - 2026-03-07 + +13 community PRs merged. GPU initialization replaced with node-llama-cpp's +built-in `autoAttempt` — deleting ~220 lines of manual fallback code and +fixing GPU issues reported across 10+ PRs in one shot. Reranking is faster +through chunk deduplication and a parallelism cap that prevents VRAM +exhaustion. + +### Changes + +- **GPU init**: use node-llama-cpp's `build: "autoAttempt"` instead of manual + GPU backend detection. Automatically tries Metal/CUDA/Vulkan and falls back + gracefully. #310 (thanks @giladgd — the node-llama-cpp author) +- **Query `--explain`**: `qmd query --explain` exposes retrieval score traces + — backend scores, per-list RRF contributions, top-rank bonus, reranker + score, and final blended score. Works in JSON and CLI output. #242 + (thanks @vyalamar) +- **Collection ignore patterns**: `ignore: ["Sessions/**", "*.tmp"]` in + collection config to exclude files from indexing. #304 (thanks @sebkouba) +- **Multilingual embeddings**: `QMD_EMBED_MODEL` env var lets you swap in + models like Qwen3-Embedding for non-English collections. #273 (thanks + @daocoding) +- **Configurable expansion context**: `QMD_EXPAND_CONTEXT_SIZE` env var + (default 2048) — previously used the model's full 40960-token window, + wasting VRAM. #313 (thanks @0xble) +- **`candidateLimit` exposed**: `-C` / `--candidate-limit` flag and MCP + parameter to tune how many candidates reach the reranker. #255 (thanks + @pandysp) +- **MCP multi-session**: HTTP transport now supports multiple concurrent + client sessions, each with its own server instance. #286 (thanks @joelev) + +### Fixes + +- **Reranking performance**: cap parallel rerank contexts at 4 to prevent + VRAM exhaustion on high-core machines. Deduplicate identical chunk texts + before reranking — same content from different files now shares a single + reranker call. Cache scores by content hash instead of file path. +- Deactivate stale docs when all files are removed from a collection and + `qmd update` is run. #312 (thanks @0xble) +- Handle emoji-only filenames (`🐘.md` → `1f418.md`) instead of crashing. + #308 (thanks @debugerman) +- Skip unreadable files during indexing (e.g. iCloud-evicted files returning + EAGAIN) instead of crashing. #253 (thanks @jimmynail) +- Suppress progress bar escape sequences when stderr is not a TTY. #230 + (thanks @dgilperez) +- Emit format-appropriate empty output (`[]` for JSON, CSV header for CSV, + etc.) instead of plain text "No results." #228 (thanks @amsminn) +- Correct Windows sqlite-vec package name (`sqlite-vec-windows-x64`) and add + `sqlite-vec-linux-arm64`. #225 (thanks @ilepn) +- Fix claude plugin setup CLI commands in README. #311 (thanks @gi11es) + +## [1.1.1] - 2026-03-06 + +### Fixes + +- Reranker: truncate documents exceeding the 2048-token context window + instead of silently producing garbage scores. Long chunks (e.g. from + PDF ingestion) now get a fair ranking. +- Nix: add python3 and cctools to build dependencies. #214 (thanks + @pcasaretto) + +## [1.1.0] - 2026-02-20 + +QMD now speaks in **query documents** — structured multi-line queries where every line is typed (`lex:`, `vec:`, `hyde:`), combining keyword precision with semantic recall. A single plain query still works exactly as before (it's treated as an implicit `expand:` and auto-expanded by the LLM). Lex now supports quoted phrases and negation (`"C++ performance" -sports -athlete`), making intent-aware disambiguation practical. The formal query grammar is documented in `docs/SYNTAX.md`. + +The npm package now uses the standard `#!/usr/bin/env node` bin convention, replacing the custom bash wrapper. This fixes native module ABI mismatches when installed via bun and works on any platform with node >= 22 on PATH. + +### Changes + +- **Query document format**: multi-line queries with typed sub-queries (`lex:`, `vec:`, `hyde:`). Plain queries remain the default (`expand:` implicit, but not written inside the document). First sub-query gets 2× fusion weight — put your strongest signal first. Formal grammar in `docs/SYNTAX.md`. +- **Lex syntax**: full BM25 operator support. `"exact phrase"` for verbatim matching; `-term` and `-"phrase"` for exclusions. Essential for disambiguation when a term is overloaded across domains (e.g. `performance -sports -athlete`). +- **`expand:` shortcut**: send a single plain query (or start the document with `expand:` on its only line) to auto-expand via the local LLM. Query documents themselves are limited to `lex`, `vec`, and `hyde` lines. +- **MCP `query` tool** (renamed from `structured_search`): rewrote the tool description to fully teach AI agents the query document format, lex syntax, and combination strategy. Includes worked examples with intent-aware lex. +- **HTTP `/query` endpoint** (renamed from `/search`; `/search` kept as silent alias). +- **`collections` array filter**: filter by multiple collections in a single query (`collections: ["notes", "brain"]`). Removed the single `collection` string param — array only. +- **Collection `include`/`exclude`**: `includeByDefault: false` hides a collection from all queries unless explicitly named via `collections`. CLI: `qmd collection exclude ` / `qmd collection include `. +- **Collection `update-cmd`**: attach a shell command that runs before every `qmd update` (e.g. `git stash && git pull --rebase --ff-only && git stash pop`). CLI: `qmd collection update-cmd ''`. +- **`qmd status` tips**: shows actionable tips when collections lack context descriptions or update commands. +- **`qmd collection` subcommands**: `show`, `update-cmd`, `include`, `exclude`. Bare `qmd collection` now prints help. +- **Packaging**: replaced custom bash wrapper with standard `#!/usr/bin/env node` shebang on `dist/qmd.js`. Fixes native module ABI mismatches when installed via bun, and works on any platform where node >= 22 is on PATH. +- **Removed MCP tools** `search`, `vector_search`, `deep_search` — all superseded by `query`. +- **Removed** `qmd context check` command. +- **CLI timing**: each LLM step (expand, embed, rerank) prints elapsed time inline (`Expanding query... (4.2s)`). + +### Fixes + +- `qmd collection list` shows `[excluded]` tag for collections with `includeByDefault: false`. +- Default searches now respect `includeByDefault` — excluded collections are skipped unless explicitly named. +- Fix main module detection when installed globally via npm/bun (symlink resolution). + +## [1.0.7] - 2026-02-18 + +### Changes + +- LLM: add LiquidAI LFM2-1.2B as an alternative base model for query + expansion fine-tuning. LFM2's hybrid architecture (convolutions + attention) + is 2x faster at decode/prefill vs standard transformers — good fit for + on-device inference. +- CLI: support multiple `-c` flags to search across several collections at + once (e.g. `qmd search -c notes -c journals "query"`). #191 (thanks + @openclaw) + +### Fixes + +- Return empty JSON array `[]` instead of no output when `--json` search + finds no results. +- Resolve relative paths passed to `--index` so they don't produce malformed + config entries. +- Respect `XDG_CONFIG_HOME` for collection config path instead of always + using `~/.config`. #190 (thanks @openclaw) +- CLI: empty-collection hint now shows the correct `collection add` command. + #200 (thanks @vincentkoc) + +## [1.0.6] - 2026-02-16 + +### Changes + +- CLI: `qmd status` now shows models with full HuggingFace links instead of + static names in `--help`. Model info is derived from the actual configured + URIs so it stays accurate if models change. +- Release tooling: pre-push hook handles non-interactive shells (CI, editors) + gracefully — warnings auto-proceed instead of hanging on a tty prompt. + Annotated tags now resolve correctly for CI checks. + +## [1.0.5] - 2026-02-16 + +The npm package now ships compiled JavaScript instead of raw TypeScript, +removing the `tsx` runtime dependency. A new `/release` skill automates the +full release workflow with changelog validation and git hook enforcement. + +### Changes + +- Build: compile TypeScript to `dist/` via `tsc` so the npm package no longer + requires `tsx` at runtime. The `qmd` shell wrapper now runs `dist/qmd.js` + directly. +- Release tooling: new `/release` skill that manages the full release + lifecycle — validates changelog, installs git hooks, previews release notes, + and cuts the release. Auto-populates `[Unreleased]` from git history when + empty. +- Release tooling: `scripts/extract-changelog.sh` extracts cumulative notes + for the full minor series (e.g. 1.0.0 through 1.0.5) for GitHub releases. + Includes `[Unreleased]` content in previews. +- Release tooling: `scripts/release.sh` renames `[Unreleased]` to a versioned + heading and inserts a fresh empty `[Unreleased]` section automatically. +- Release tooling: pre-push git hook blocks `v*` tag pushes unless + `package.json` version matches the tag, a changelog entry exists, and CI + passed on GitHub. +- Publish workflow: GitHub Actions now builds TypeScript, creates a GitHub + release with cumulative notes extracted from the changelog, and publishes + to npm with provenance. + +## [1.0.0] - 2026-02-15 + +QMD now runs on both Node.js and Bun, with up to 2.7x faster reranking +through parallel GPU contexts. GPU auto-detection replaces the unreliable +`gpu: "auto"` with explicit CUDA/Metal/Vulkan probing. + +### Changes + +- Runtime: support Node.js (>=22) alongside Bun via a cross-runtime SQLite + abstraction layer (`src/db.ts`). `bun:sqlite` on Bun, `better-sqlite3` on + Node. The `qmd` wrapper auto-detects a suitable Node.js install via PATH, + then falls back to mise, asdf, nvm, and Homebrew locations. +- Performance: parallel embedding & reranking via multiple LlamaContext + instances — up to 2.7x faster on multi-core machines. +- Performance: flash attention for ~20% less VRAM per reranking context, + enabling more parallel contexts on GPU. +- Performance: right-sized reranker context (40960 → 2048 tokens, 17x less + memory) since chunks are capped at ~900 tokens. +- Performance: adaptive parallelism — context count computed from available + VRAM (GPU) or CPU math cores rather than hardcoded. +- GPU: probe for CUDA, Metal, Vulkan explicitly at startup instead of + relying on node-llama-cpp's `gpu: "auto"`. `qmd status` shows device info. +- Tests: reorganized into flat `test/` directory with vitest for Node.js and + bun test for Bun. New `eval-bm25` and `store.helpers.unit` suites. + +### Fixes + +- Prevent VRAM waste from duplicate context creation during concurrent + `embedBatch` calls — initialization lock now covers the full path. +- Collection-aware FTS filtering so scoped keyword search actually restricts + results to the requested collection. + +## [0.9.0] - 2026-02-15 + +First published release on npm as `@tobilu/qmd`. MCP HTTP transport with +daemon mode cuts warm query latency from ~16s to ~10s by keeping models +loaded between requests. + +### Changes + +- MCP: HTTP transport with daemon lifecycle — `qmd mcp --http --daemon` + starts a background server, `qmd mcp stop` shuts it down. Models stay warm + in VRAM between queries. #149 (thanks @igrigorik) +- Search: type-routed query expansion preserves lex/vec/hyde type info and + routes to the appropriate backend. Eliminates ~4 wasted backend calls per + query (10.0 → 6.0 calls, 1278ms → 549ms). #149 (thanks @igrigorik) +- Search: unified pipeline — extracted `hybridQuery()` and + `vectorSearchQuery()` to `store.ts` so CLI and MCP share identical logic. + Fixes a class of bugs where results differed between the two. #149 (thanks + @igrigorik) +- MCP: dynamic instructions generated at startup from actual index state — + LLMs see collection names, doc counts, and content descriptions. #149 + (thanks @igrigorik) +- MCP: tool renames (vsearch → vector_search, query → deep_search) with + rewritten descriptions for better tool selection. #149 (thanks @igrigorik) +- Integration: Claude Code plugin with inline status checks and MCP + integration. #99 (thanks @galligan) + +### Fixes + +- BM25 score normalization — formula was inverted (`1/(1+|x|)` instead of + `|x|/(1+|x|)`), so strong matches scored *lowest*. Broke `--min-score` + filtering and made the "strong signal" short-circuit dead code. #76 (thanks + @dgilperez) +- Normalize Unicode paths to NFC for macOS compatibility. #82 (thanks + @c-stoeckl) +- Handle dense content (code) that tokenizes beyond expected chunk size. +- Proper cleanup of Metal GPU resources on process exit. +- SQLite-vec readiness verification after extension load. +- Reactivate deactivated documents on re-index instead of creating duplicates. +- Bun UTF-8 path corruption workaround for non-ASCII filenames. +- Disable following symlinks in glob.scan to avoid infinite loops. + +## [0.8.0] - 2026-01-28 + +Fine-tuned query expansion model trained with GRPO replaces the stock Qwen3 +0.6B. The training pipeline scores expansions on named entity preservation, +format compliance, and diversity — producing noticeably better lexical +variations and HyDE documents. + +### Changes + +- LLM: deploy GRPO-trained (Group Relative Policy Optimization) query + expansion model, hosted on HuggingFace and auto-downloaded on first use. + Better preservation of proper nouns and technical terms in expansions. +- LLM: `/only:lex` mode for single-type expansions — useful when you know + which search backend will help. +- LLM: HyDE output moved to first position so vector search can start + embedding while other expansions generate. +- LLM: session lifecycle management via `withLLMSession()` pattern — ensures + cleanup even on failure, similar to database transactions. +- Integration: org-mode title extraction support. #50 (thanks @sh54) +- Integration: SQLite extension loading in Nix devshell. #48 (thanks @sh54) +- Integration: AI agent discovery via skills.sh. #64 (thanks @Algiras) + +### Fixes + +- Use sequential embedding on CPU-only systems — parallel contexts caused a + race condition where contexts competed for CPU cores, making things slower. + #54 (thanks @freeman-jiang) +- Fix `collectionName` column in vector search SQL (was still using old + `collectionId` from before YAML migration). #61 (thanks @jdvmi00) +- Fix Qwen3 sampling params to prevent repetition loops — stock + temperature/top-p caused occasional infinite repeat patterns. +- Add `--index` option to CLI argument parser (was documented but not wired + up). #84 (thanks @Tritlo) +- Fix DisposedError during slow batch embedding. #41 (thanks @wuhup) + +## [0.7.0] - 2026-01-09 + +First community contributions. The project gained external contributors, +surfacing bugs that only appear in diverse environments — Homebrew sqlite-vec +paths, case-sensitive model filenames, and sqlite-vec JOIN incompatibilities. + +### Changes + +- Indexing: native `realpathSync()` replaces `readlink -f` subprocess spawn + per file. On a 5000-file collection this eliminates 5000 shell spawns, + ~15% faster. #8 (thanks @burke) +- Indexing: single-pass tokenization — chunking algorithm tokenized each + document twice (count then split); now tokenizes once and reuses. #9 + (thanks @burke) + +### Fixes + +- Fix `vsearch` and `query` hanging — sqlite-vec's virtual table doesn't + support the JOIN pattern used; rewrote to subquery. #23 (thanks @mbrendan) +- Fix MCP server exiting immediately after startup — process had no active + handles keeping the event loop alive. #29 (thanks @mostlydev) +- Fix collection filter SQL to properly restrict vector search results. +- Support non-ASCII filenames in collection filter. +- Skip empty files during indexing instead of crashing on zero-length content. +- Fix case sensitivity in Qwen3 model filename resolution. #15 (thanks + @gavrix) +- Fix sqlite-vec loading on macOS with Homebrew (`BREW_PREFIX` detection). + #42 (thanks @komsit37) +- Fix Nix flake to use correct `src/qmd.ts` path. #7 (thanks @burke) +- Fix docid lookup with quotes support in get command. #36 (thanks + @JoshuaLelon) +- Fix query expansion model size in documentation. #38 (thanks @odysseus0) + +## [0.6.0] - 2025-12-28 + +Replaced Ollama HTTP API with node-llama-cpp for all LLM operations. Ollama +adds convenience but also a running server dependency. node-llama-cpp loads +GGUF models directly in-process — zero external dependencies. Models +auto-download from HuggingFace on first use. + +### Changes + +- LLM: structured query expansion via JSON schema grammar constraints. + Model produces typed expansions — **lexical** (BM25 keywords), **vector** + (semantic rephrasings), **HyDE** (hypothetical document excerpts) — so each + routes to the right backend instead of sending everything everywhere. +- LLM: lazy model loading with 2-minute inactivity auto-unload. Keeps memory + low when idle while avoiding ~3s model load on every query. +- Search: conditional query expansion — when BM25 returns strong results, the + expensive LLM expansion is skipped entirely. +- Search: multi-chunk reranking — documents with multiple relevant chunks + scored by aggregating across all chunks rather than best single chunk. +- Search: cosine distance for vector search (was L2). +- Search: embeddinggemma nomic-style prompt formatting. +- Testing: evaluation harness with synthetic test documents and Hit@K metrics + for BM25, vector, and hybrid RRF. + +## [0.5.0] - 2025-12-13 + +Collections and contexts moved from SQLite tables to YAML at +`~/.config/qmd/index.yml`. SQLite was overkill for config — you can't share +it, and it's opaque. YAML is human-readable and version-controllable. The +migration was extensive (35+ commits) because every part of the system that +touched collections or contexts had to be updated. + +### Changes + +- Config: YAML-based collections and contexts replace SQLite tables. + `collections` and `path_contexts` tables dropped from schema. Collections + support an optional `update:` command (e.g., `git pull`) before re-index. +- CLI: `qmd collection add/list/remove/rename` commands with `--name` and + `--mask` glob pattern support. +- CLI: `qmd ls` virtual file tree — list collections, files in a collection, + or files under a path prefix. +- CLI: `qmd context add/list/check/rm` with hierarchical context inheritance. + A query to `qmd://notes/2024/jan/` inherits context from `notes/`, + `notes/2024/`, and `notes/2024/jan/`. +- CLI: `qmd context add / "text"` for global context across all collections. +- CLI: `qmd context check` audit command to find paths without context. +- Paths: `qmd://` virtual URI scheme for portable document references. + `qmd://notes/ideas.md` works regardless of where the collection lives on + disk. Works in `get`, `multi-get`, `ls`, and context commands. +- CLI: document IDs (docid) — first 6 chars of content hash for stable + references. Shown as `#abc123` in search results, usable with `get` and + `multi-get`. +- CLI: `--line-numbers` flag for get command output. + +## [0.4.0] - 2025-12-10 + +MCP server for AI agent integration. Without it, agents had to shell out to +`qmd search` and parse CLI output. The monolithic `qmd.ts` (1840 lines) was +split into focused modules with the project's first test suite (215 tests). + +### Changes + +- MCP: stdio server with tools for search, vector search, hybrid query, + document retrieval, and status. Runs over stdio transport for Claude + Desktop and MCP clients. +- MCP: spec-compliant with June 2025 MCP specification — removed non-spec + `mimeType`, added `isError: true` to errors, `structuredContent` for + machine-readable results, proper URI encoding. +- MCP: simplified tool naming (`qmd_search` → `search`) since MCP already + namespaces by server. +- Architecture: extract `store.ts` (1221 LOC), `llm.ts` (539 LOC), + `formatter.ts` (359 LOC), `mcp.ts` (503 LOC) from monolithic `qmd.ts`. +- Testing: 215 tests (store: 96, llm: 60, mcp: 59) with mocked Ollama for + fast, deterministic runs. Before this: zero tests. + +## [0.3.0] - 2025-12-08 + +Document chunking for vector search. A 5000-word document about many topics +gets a single embedding that averages everything together, matching poorly for +specific queries. Chunking produces one embedding per ~900-token section with +focused semantic signal. + +### Changes + +- Search: markdown-aware chunking — prefers heading boundaries, then paragraph + breaks, then sentence boundaries. 15% overlap between chunks ensures + cross-boundary queries still match. +- Search: multi-chunk scoring bonus (+0.02 per additional chunk, capped at + +0.1 for 5+ chunks). Documents relevant in multiple sections rank higher. +- CLI: display paths show collection-relative paths and extracted titles + (from H1 headings or YAML frontmatter) instead of raw filesystem paths. +- CLI: `--all` flag returns all matches (use with `--min-score` to filter). +- CLI: byte-based progress bar with ETA for `embed` command. +- CLI: human-readable time formatting ("15m 4s" instead of "904.2s"). +- CLI: documents >64KB truncated with warning during embedding. + +## [0.2.0] - 2025-12-08 + +### Changes + +- CLI: `--json`, `--csv`, `--files`, `--md`, `--xml` output format flags. + `--json` for programmatic access, `--files` for piping, `--md`/`--xml` for + LLM consumption, `--csv` for spreadsheets. +- CLI: `qmd status` shows index health — document count, size, embedding + coverage, time since last update. +- Search: weighted RRF — original query gets 2x weight relative to expanded + queries since the user's actual words are a more reliable signal. + +## [0.1.0] - 2025-12-07 + +Initial implementation. Built in a single day for searching personal markdown +notes, journals, and meeting transcripts. + +### Changes + +- Search: SQLite FTS5 with BM25 ranking. Chose SQLite over Elasticsearch + because QMD is a personal tool — single binary, no server dependencies. +- Search: sqlite-vec for vector similarity. Same rationale: in-process, no + external vector database. +- Search: Reciprocal Rank Fusion to combine BM25 and vector results. RRF is + parameter-free and handles missing signals gracefully. +- LLM: Ollama for embeddings, reranking, and query expansion. Later replaced + with node-llama-cpp in 0.6.0. +- CLI: `qmd add`, `qmd embed`, `qmd search`, `qmd vsearch`, `qmd query`, + `qmd get`. ~1800 lines of TypeScript in a single `qmd.ts` file. + +[Unreleased]: https://github.com/tobi/qmd/compare/v1.0.0...HEAD +[1.0.0]: https://github.com/tobi/qmd/releases/tag/v1.0.0 +[0.9.0]: https://github.com/tobi/qmd/compare/v0.8.0...v0.9.0 diff --git a/CLAUDE.md b/CLAUDE.md index 35d43498..028005b3 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -19,9 +19,13 @@ qmd multi-get # Get multiple docs by glob or comma-separated qmd status # Show index status and collections qmd update [--pull] # Re-index all collections (--pull: git pull first) qmd embed # Generate vector embeddings (uses node-llama-cpp) -qmd search # BM25 full-text search -qmd vsearch # Vector similarity search -qmd query # Hybrid search with reranking (best quality) +qmd query # Search with query expansion + reranking (recommended) +qmd search # Full-text keyword search (BM25, no LLM) +qmd vsearch # Vector similarity search (no reranking) +qmd mcp # Start MCP server (stdio transport) +qmd mcp --http [--port N] # Start MCP server (HTTP, default port 8181) +qmd mcp --http --daemon # Start as background daemon +qmd mcp stop # Stop background MCP daemon ``` ## Collection Management @@ -118,13 +122,22 @@ bun src/qmd.ts # Run from source bun link # Install globally as 'qmd' ``` +## Tests + +All tests live in `test/`. Run everything: + +```sh +npx vitest run --reporter=verbose test/ +bun test --preload ./src/test-preload.ts test/ +``` + ## Architecture - SQLite FTS5 for full-text search (BM25) - sqlite-vec for vector similarity search - node-llama-cpp for embeddings (embeddinggemma), reranking (qwen3-reranker), and query expansion (Qwen3) - Reciprocal Rank Fusion (RRF) for combining results -- Token-based chunking: 800 tokens/chunk with 15% overlap +- Smart chunking: 900 tokens/chunk with 15% overlap, prefers markdown headings as boundaries ## Important: Do NOT run automatically @@ -136,4 +149,17 @@ bun link # Install globally as 'qmd' ## Do NOT compile - Never run `bun build --compile` - it overwrites the shell wrapper and breaks sqlite-vec -- The `qmd` file is a shell script that runs `bun src/qmd.ts` - do not replace it \ No newline at end of file +- The `qmd` file is a shell script that runs compiled JS from `dist/` - do not replace it +- `npm run build` compiles TypeScript to `dist/` via `tsc -p tsconfig.build.json` + +## Releasing + +Use `/release ` to cut a release. Full changelog standards, +release workflow, and git hook setup are documented in the +[release skill](skills/release/SKILL.md). + +Key points: +- Add changelog entries under `## [Unreleased]` **as you make changes** +- The release script renames `[Unreleased]` → `[X.Y.Z] - date` at release time +- Credit external PRs with `#NNN (thanks @username)` +- GitHub releases roll up the full minor series (e.g. 1.2.0 through 1.2.3) diff --git a/LICENSE b/LICENSE new file mode 100644 index 00000000..81652d05 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024-2026 Tobi Lutke + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md index 4ff6138d..2b724228 100644 --- a/README.md +++ b/README.md @@ -4,18 +4,28 @@ An on-device search engine for everything you need to remember. Index your markd QMD combines BM25 full-text search, vector semantic search, and LLM re-ranking—all running locally via node-llama-cpp with GGUF models. +![QMD Architecture](assets/qmd-architecture.png) + +You can read more about QMD's progress in the [CHANGELOG](CHANGELOG.md). + ## Quick Start ```sh -# Install globally -bun install -g https://github.com/tobi/qmd +# Install globally (Node or Bun) +npm install -g @tobilu/qmd +# or +bun install -g @tobilu/qmd + +# Or run directly +npx @tobilu/qmd ... +bunx @tobilu/qmd ... # Create collections for your notes, docs, and meeting transcripts qmd collection add ~/notes --name notes qmd collection add ~/Documents/meetings --name meetings qmd collection add ~/work/docs --name docs -# Add context to help with search results +# Add context to help with search results, each piece of context will be returned when matching sub documents are returned. This works as a tree. This is the key feature of QMD as it allows LLMs to make much better contextual choices when selecting documents. Don't sleep on it! qmd context add qmd://notes "Personal notes and ideas" qmd context add qmd://meetings "Meeting transcripts and notes" qmd context add qmd://docs "Work documentation" @@ -65,8 +75,8 @@ Although the tool works perfectly fine when you just tell your agent to use it o **Tools exposed:** - `qmd_search` - Fast BM25 keyword search (supports collection filter) -- `qmd_vsearch` - Semantic vector search (supports collection filter) -- `qmd_query` - Hybrid search with reranking (supports collection filter) +- `qmd_vector_search` - Semantic vector search (supports collection filter) +- `qmd_deep_search` - Deep search with query expansion and reranking (supports collection filter) - `qmd_get` - Retrieve document by path or docid (with fuzzy matching suggestions) - `qmd_multi_get` - Retrieve multiple documents by glob pattern, list, or docids - `qmd_status` - Index health and collection info @@ -87,8 +97,8 @@ Although the tool works perfectly fine when you just tell your agent to use it o **Claude Code** — Install the plugin (recommended): ```bash -claude marketplace add tobi/qmd -claude plugin add qmd@qmd +claude plugin marketplace add tobi/qmd +claude plugin install qmd@qmd ``` Or configure MCP manually in `~/.claude/settings.json`: @@ -104,6 +114,104 @@ Or configure MCP manually in `~/.claude/settings.json`: } ``` +#### HTTP Transport + +By default, QMD's MCP server uses stdio (launched as a subprocess by each client). For a shared, long-lived server that avoids repeated model loading, use the HTTP transport: + +```sh +# Foreground (Ctrl-C to stop) +qmd mcp --http # localhost:8181 +qmd mcp --http --port 8080 # custom port + +# Background daemon +qmd mcp --http --daemon # start, writes PID to ~/.cache/qmd/mcp.pid +qmd mcp stop # stop via PID file +qmd status # shows "MCP: running (PID ...)" when active +``` + +The HTTP server exposes two endpoints: +- `POST /mcp` — MCP Streamable HTTP (JSON responses, stateless) +- `GET /health` — liveness check with uptime + +LLM models stay loaded in VRAM across requests. Embedding/reranking contexts are disposed after 5 min idle and transparently recreated on the next request (~1s penalty, models remain loaded). + +Point any MCP client at `http://localhost:8181/mcp` to connect. + +### SDK / Library Usage + +Use QMD as a library in your own Node.js or Bun applications: + +```sh +npm install @tobilu/qmd +``` + +```typescript +import { createStore } from '@tobilu/qmd' + +// Create a store with inline config (no config file needed) +const store = createStore({ + dbPath: './my-index.sqlite', + config: { + collections: { + docs: { path: '/path/to/docs', pattern: '**/*.md' }, + notes: { path: '/path/to/notes', pattern: '**/*.md' }, + }, + }, +}) + +// Or reference a YAML config file +const store2 = createStore({ + dbPath: './my-index.sqlite', + configPath: './qmd.yml', +}) +``` + +**Search & retrieval:** + +```typescript +// Hybrid search: BM25 + vector + query expansion + LLM reranking (best quality) +const results = await store.query("authentication flow", { limit: 5 }) + +// Fast BM25 keyword search (no LLM, synchronous) +const keywords = store.search("auth middleware", { limit: 10 }) + +// Structured search with pre-expanded queries (for LLM callers) +const structured = await store.structuredSearch([ + { type: 'lex', query: 'authentication' }, + { type: 'vec', query: 'how users log in' }, +], { limit: 5 }) + +// Get a document by path or docid +const doc = store.get("docs/readme.md") +const byId = store.get("#abc123") + +// Get multiple documents by glob +const { docs, errors } = store.multiGet("docs/**/*.md") +``` + +**Collection & context management:** + +```typescript +// Add a collection +store.addCollection("myapp", { path: "/src/myapp", pattern: "**/*.ts" }) + +// Add context (improves search relevance) +store.addContext("myapp", "/auth", "Authentication and session management") +store.setGlobalContext("Internal engineering documentation") + +// List everything +store.listCollections() +store.listContexts() +``` + +**Lifecycle:** + +```typescript +store.close() +``` + +The SDK requires explicit `dbPath` and config — no defaults are assumed. This makes it safe to embed in any application without side effects. + ## Architecture ``` @@ -206,6 +314,7 @@ The `query` command uses **Reciprocal Rank Fusion (RRF)** with position-aware bl ### System Requirements +- **Node.js** >= 22 - **Bun** >= 1.0.0 - **macOS**: Homebrew SQLite (for extension support) ```sh @@ -218,27 +327,49 @@ QMD uses three local GGUF models (auto-downloaded on first use): | Model | Purpose | Size | |-------|---------|------| -| `embeddinggemma-300M-Q8_0` | Vector embeddings | ~300MB | +| `embeddinggemma-300M-Q8_0` | Vector embeddings (default) | ~300MB | | `qwen3-reranker-0.6b-q8_0` | Re-ranking | ~640MB | | `qmd-query-expansion-1.7B-q4_k_m` | Query expansion (fine-tuned) | ~1.1GB | Models are downloaded from HuggingFace and cached in `~/.cache/qmd/models/`. -## Installation +### Custom Embedding Model + +Override the default embedding model via the `QMD_EMBED_MODEL` environment variable. +This is useful for multilingual corpora (e.g. Chinese, Japanese, Korean) where +`embeddinggemma-300M` has limited coverage. ```sh -bun install -g github:tobi/qmd +# Use Qwen3-Embedding-0.6B for better multilingual (CJK) support +export QMD_EMBED_MODEL="hf:Qwen/Qwen3-Embedding-0.6B-GGUF/qwen3-embedding-0.6b-q8_0.gguf" + +# After changing the model, re-embed all collections: +qmd embed -f ``` -Make sure `~/.bun/bin` is in your PATH. +Supported model families: +- **embeddinggemma** (default) — English-optimized, small footprint +- **Qwen3-Embedding** — Multilingual (119 languages including CJK), MTEB top-ranked + +> **Note:** When switching embedding models, you must re-index with `qmd embed -f` +> since vectors are not cross-compatible between models. The prompt format is +> automatically adjusted for each model family. + +## Installation + +```sh +npm install -g @tobilu/qmd +# or +bun install -g @tobilu/qmd +``` ### Development ```sh git clone https://github.com/tobi/qmd cd qmd -bun install -bun link +npm install +npm link ``` ## Usage @@ -269,7 +400,7 @@ qmd ls notes/subfolder ### Generate Vector Embeddings ```sh -# Embed all indexed documents (800 tokens/chunk, 15% overlap) +# Embed all indexed documents (900 tokens/chunk, 15% overlap) qmd embed # Force re-embed everything @@ -332,6 +463,7 @@ qmd query "user authentication" --min-score # Minimum score threshold (default: 0) --full # Show full document content --line-numbers # Add line numbers to output +--explain # Include retrieval score traces (query, JSON/CLI output) --index # Use named index # Output formats (for search and multi-get) @@ -394,6 +526,9 @@ qmd search --md --full "error handling" # JSON output for scripting qmd query --json "quarterly reports" +# Inspect how each result was scored (RRF + rerank blend) +qmd query --json --explain "quarterly reports" + # Use separate index for different knowledge base qmd --index work search "quarterly reports" ``` @@ -446,7 +581,7 @@ collections -- Indexed directories with name and glob patterns path_contexts -- Context descriptions by virtual path (qmd://...) documents -- Markdown content with metadata and docid (6-char hash) documents_fts -- FTS5 full-text index -content_vectors -- Embedding chunks (hash, seq, pos, 800 tokens each) +content_vectors -- Embedding chunks (hash, seq, pos, 900 tokens each) vectors_vec -- sqlite-vec vector index (hash_seq key) llm_cache -- Cached LLM responses (query expansion, rerank scores) ``` @@ -476,11 +611,11 @@ Collection ──► Glob Pattern ──► Markdown Files ──► Parse Title ### Embedding Flow -Documents are chunked into 800-token pieces with 15% overlap: +Documents are chunked into ~900-token pieces with 15% overlap using smart boundary detection: ``` -Document ──► Chunk (800 tokens) ──► Format each chunk ──► node-llama-cpp ──► Store Vectors - │ "title | text" embedBatch() +Document ──► Smart Chunk (~900 tokens) ──► Format each chunk ──► node-llama-cpp ──► Store Vectors + │ "title | text" embedBatch() │ └─► Chunks stored with: - hash: document hash @@ -488,6 +623,37 @@ Document ──► Chunk (800 tokens) ──► Format each chunk ──► node - pos: character position in original ``` +### Smart Chunking + +Instead of cutting at hard token boundaries, QMD uses a scoring algorithm to find natural markdown break points. This keeps semantic units (sections, paragraphs, code blocks) together. + +**Break Point Scores:** + +| Pattern | Score | Description | +|---------|-------|-------------| +| `# Heading` | 100 | H1 - major section | +| `## Heading` | 90 | H2 - subsection | +| `### Heading` | 80 | H3 | +| `#### Heading` | 70 | H4 | +| `##### Heading` | 60 | H5 | +| `###### Heading` | 50 | H6 | +| ` ``` ` | 80 | Code block boundary | +| `---` / `***` | 60 | Horizontal rule | +| Blank line | 20 | Paragraph boundary | +| `- item` / `1. item` | 5 | List item | +| Line break | 1 | Minimal break | + +**Algorithm:** + +1. Scan document for all break points with scores +2. When approaching the 900-token target, search a 200-token window before the cutoff +3. Score each break point: `finalScore = baseScore × (1 - (distance/window)² × 0.7)` +4. Cut at the highest-scoring break point + +The squared distance decay means a heading 200 tokens back (score ~30) still beats a simple line break at the target (score 1), but a closer heading wins over a distant one. + +**Code Fence Protection:** Break points inside code blocks are ignored—code stays together. If a code block exceeds the chunk size, it's kept whole when possible. + ### Query Flow (Hybrid) ``` diff --git a/assets/qmd-architecture.png b/assets/qmd-architecture.png new file mode 100644 index 00000000..291c942a Binary files /dev/null and b/assets/qmd-architecture.png differ diff --git a/bun.lock b/bun.lock index f5d7aa5d..da8f9dc6 100644 --- a/bun.lock +++ b/bun.lock @@ -6,19 +6,25 @@ "name": "2025-12-07-bm25-q", "dependencies": { "@modelcontextprotocol/sdk": "^1.25.1", - "node-llama-cpp": "^3.14.5", + "better-sqlite3": "^11.0.0", + "fast-glob": "^3.3.0", + "node-llama-cpp": "^3.17.1", + "picomatch": "^4.0.0", "sqlite-vec": "^0.1.7-alpha.2", "yaml": "^2.8.2", "zod": "^4.2.1", }, "devDependencies": { - "@types/bun": "latest", + "@types/better-sqlite3": "^7.6.0", + "tsx": "^4.0.0", + "vitest": "^3.0.0", }, "optionalDependencies": { "sqlite-vec-darwin-arm64": "^0.1.7-alpha.2", "sqlite-vec-darwin-x64": "^0.1.7-alpha.2", + "sqlite-vec-linux-arm64": "^0.1.7-alpha.2", "sqlite-vec-linux-x64": "^0.1.7-alpha.2", - "sqlite-vec-win32-x64": "^0.1.7-alpha.2", + "sqlite-vec-windows-x64": "^0.1.7-alpha.2", }, "peerDependencies": { "typescript": "^5.9.3", @@ -26,91 +32,103 @@ }, }, "packages": { - "@hono/node-server": ["@hono/node-server@1.19.7", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw=="], + "@esbuild/aix-ppc64": ["@esbuild/aix-ppc64@0.27.3", "", { "os": "aix", "cpu": "ppc64" }, "sha512-9fJMTNFTWZMh5qwrBItuziu834eOCUcEqymSH7pY+zoMVEZg3gcPuBNxH1EvfVYe9h0x/Ptw8KBzv7qxb7l8dg=="], - "@huggingface/jinja": ["@huggingface/jinja@0.5.3", "", {}, "sha512-asqfZ4GQS0hD876Uw4qiUb7Tr/V5Q+JZuo2L+BtdrD4U40QU58nIRq3ZSgAzJgT874VLjhGVacaYfrdpXtEvtA=="], + "@esbuild/android-arm": ["@esbuild/android-arm@0.27.3", "", { "os": "android", "cpu": "arm" }, "sha512-i5D1hPY7GIQmXlXhs2w8AWHhenb00+GxjxRncS2ZM7YNVGNfaMxgzSGuO8o8SJzRc/oZwU2bcScvVERk03QhzA=="], - "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], + "@esbuild/android-arm64": ["@esbuild/android-arm64@0.27.3", "", { "os": "android", "cpu": "arm64" }, "sha512-YdghPYUmj/FX2SYKJ0OZxf+iaKgMsKHVPF1MAq/P8WirnSpCStzKJFjOjzsW0QQ7oIAiccHdcqjbHmJxRb/dmg=="], - "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], + "@esbuild/android-x64": ["@esbuild/android-x64@0.27.3", "", { "os": "android", "cpu": "x64" }, "sha512-IN/0BNTkHtk8lkOM8JWAYFg4ORxBkZQf9zXiEOfERX/CzxW3Vg1ewAhU7QSWQpVIzTW+b8Xy+lGzdYXV6UZObQ=="], - "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], + "@esbuild/darwin-arm64": ["@esbuild/darwin-arm64@0.27.3", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Re491k7ByTVRy0t3EKWajdLIr0gz2kKKfzafkth4Q8A5n1xTHrkqZgLLjFEHVD+AXdUGgQMq+Godfq45mGpCKg=="], + + "@esbuild/darwin-x64": ["@esbuild/darwin-x64@0.27.3", "", { "os": "darwin", "cpu": "x64" }, "sha512-vHk/hA7/1AckjGzRqi6wbo+jaShzRowYip6rt6q7VYEDX4LEy1pZfDpdxCBnGtl+A5zq8iXDcyuxwtv3hNtHFg=="], + + "@esbuild/freebsd-arm64": ["@esbuild/freebsd-arm64@0.27.3", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-ipTYM2fjt3kQAYOvo6vcxJx3nBYAzPjgTCk7QEgZG8AUO3ydUhvelmhrbOheMnGOlaSFUoHXB6un+A7q4ygY9w=="], + + "@esbuild/freebsd-x64": ["@esbuild/freebsd-x64@0.27.3", "", { "os": "freebsd", "cpu": "x64" }, "sha512-dDk0X87T7mI6U3K9VjWtHOXqwAMJBNN2r7bejDsc+j03SEjtD9HrOl8gVFByeM0aJksoUuUVU9TBaZa2rgj0oA=="], + + "@esbuild/linux-arm": ["@esbuild/linux-arm@0.27.3", "", { "os": "linux", "cpu": "arm" }, "sha512-s6nPv2QkSupJwLYyfS+gwdirm0ukyTFNl3KTgZEAiJDd+iHZcbTPPcWCcRYH+WlNbwChgH2QkE9NSlNrMT8Gfw=="], + + "@esbuild/linux-arm64": ["@esbuild/linux-arm64@0.27.3", "", { "os": "linux", "cpu": "arm64" }, "sha512-sZOuFz/xWnZ4KH3YfFrKCf1WyPZHakVzTiqji3WDc0BCl2kBwiJLCXpzLzUBLgmp4veFZdvN5ChW4Eq/8Fc2Fg=="], - "@node-llama-cpp/linux-arm64": ["@node-llama-cpp/linux-arm64@3.14.5", "", { "os": "linux", "cpu": [ "x64", "arm64", ] }, "sha512-58IcWW7EOqc/66mYWXRsoMCy1MR3pTX/YaC0HYF9Rg5XeAPKhUP7NHrglbqgjO62CkcuFZaSEiX2AtG972GQYQ=="], + "@esbuild/linux-ia32": ["@esbuild/linux-ia32@0.27.3", "", { "os": "linux", "cpu": "ia32" }, "sha512-yGlQYjdxtLdh0a3jHjuwOrxQjOZYD/C9PfdbgJJF3TIZWnm/tMd/RcNiLngiu4iwcBAOezdnSLAwQDPqTmtTYg=="], - "@node-llama-cpp/linux-armv7l": ["@node-llama-cpp/linux-armv7l@3.14.5", "", { "os": "linux", "cpu": [ "arm", "x64", ] }, "sha512-mJWN0qWsn8y+r/34DC3XlSiXjjKs6wX1BTx0wwJ37fWefS/qfzuBJwQGqpfqe5xpfafib/RgQX44fsvE/9yb1w=="], + "@esbuild/linux-loong64": ["@esbuild/linux-loong64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-WO60Sn8ly3gtzhyjATDgieJNet/KqsDlX5nRC5Y3oTFcS1l0KWba+SEa9Ja1GfDqSF1z6hif/SkpQJbL63cgOA=="], - "@node-llama-cpp/linux-x64": ["@node-llama-cpp/linux-x64@3.14.5", "", { "os": "linux", "cpu": "x64" }, "sha512-f6xCqlSqSxMP9Iwm3CpaTzFybbHrzpLkNzA18v21PwhMN8u4DP44euLoxe+BMbOpyzx4iMxU1AUsPsgcHD1Y4w=="], + "@esbuild/linux-mips64el": ["@esbuild/linux-mips64el@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-APsymYA6sGcZ4pD6k+UxbDjOFSvPWyZhjaiPyl/f79xKxwTnrn5QUnXR5prvetuaSMsb4jgeHewIDCIWljrSxw=="], - "@node-llama-cpp/linux-x64-cuda": ["@node-llama-cpp/linux-x64-cuda@3.14.5", "", { "os": "linux", "cpu": "x64" }, "sha512-yk0EGnAJ+m/paSaItigmxcqC8nNjZlkx9yZgQE51CsTip7tmnqqlj60pW1fWmhrjOJ9XnRlVVTP81fa9B+O1Hg=="], + "@esbuild/linux-ppc64": ["@esbuild/linux-ppc64@0.27.3", "", { "os": "linux", "cpu": "ppc64" }, "sha512-eizBnTeBefojtDb9nSh4vvVQ3V9Qf9Df01PfawPcRzJH4gFSgrObw+LveUyDoKU3kxi5+9RJTCWlj4FjYXVPEA=="], - "@node-llama-cpp/linux-x64-cuda-ext": ["@node-llama-cpp/linux-x64-cuda-ext@3.14.5", "", { "os": "linux", "cpu": "x64" }, "sha512-AACXmXjqvAppoC6Z20UI7yeSZaFb6uP9x/2lzctVwlm42ef76SN6DNXaX1yzH7DTyzK5zYhoH4ycJUe+zOeGzw=="], + "@esbuild/linux-riscv64": ["@esbuild/linux-riscv64@0.27.3", "", { "os": "linux", "cpu": "none" }, "sha512-3Emwh0r5wmfm3ssTWRQSyVhbOHvqegUDRd0WhmXKX2mkHJe1SFCMJhagUleMq+Uci34wLSipf8Lagt4LlpRFWQ=="], - "@node-llama-cpp/linux-x64-vulkan": ["@node-llama-cpp/linux-x64-vulkan@3.14.5", "", { "os": "linux", "cpu": "x64" }, "sha512-9wZG90CUyyO8EsqfDEh03/fK0ctbQFbKaAFa6Goh+jFLOtqPL+plLqAsW3jDFdLRF5+oAPTKt9/4Y7vHTajQbQ=="], + "@esbuild/linux-s390x": ["@esbuild/linux-s390x@0.27.3", "", { "os": "linux", "cpu": "s390x" }, "sha512-pBHUx9LzXWBc7MFIEEL0yD/ZVtNgLytvx60gES28GcWMqil8ElCYR4kvbV2BDqsHOvVDRrOxGySBM9Fcv744hw=="], - "@node-llama-cpp/mac-arm64-metal": ["@node-llama-cpp/mac-arm64-metal@3.14.5", "", { "os": "darwin", "cpu": [ "x64", "arm64", ] }, "sha512-7pclj/nbQyx7gPVbyqkCn+ftlGcnw7YrewxBv1/BWWAMzBrMt2+qkjtUcUhwXH7mT5WN/+eWsszhIMXH3Uf6vQ=="], + "@esbuild/linux-x64": ["@esbuild/linux-x64@0.27.3", "", { "os": "linux", "cpu": "x64" }, "sha512-Czi8yzXUWIQYAtL/2y6vogER8pvcsOsk5cpwL4Gk5nJqH5UZiVByIY8Eorm5R13gq+DQKYg0+JyQoytLQas4dA=="], - "@node-llama-cpp/mac-x64": ["@node-llama-cpp/mac-x64@3.14.5", "", { "os": "darwin", "cpu": "x64" }, "sha512-iZBmLgPkLKiKS0lYAuqq8i85etGeQ9L+AjEJUhG5N6T/vCF4XSOkUTsEFMEX+iJLV3VxvY/C8R1e/UF7InUjUg=="], + "@esbuild/netbsd-arm64": ["@esbuild/netbsd-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-sDpk0RgmTCR/5HguIZa9n9u+HVKf40fbEUt+iTzSnCaGvY9kFP0YKBWZtJaraonFnqef5SlJ8/TiPAxzyS+UoA=="], - "@node-llama-cpp/win-arm64": ["@node-llama-cpp/win-arm64@3.14.5", "", { "os": "win32", "cpu": [ "x64", "arm64", ] }, "sha512-WTZJeb2JZo/qPNHf++xA2YeMXB46G7G4WsKEnHVyCpAhhslHAhe/LPgSQfNfk9rYusbsRiy9QMxeGNSOowZMVQ=="], + "@esbuild/netbsd-x64": ["@esbuild/netbsd-x64@0.27.3", "", { "os": "none", "cpu": "x64" }, "sha512-P14lFKJl/DdaE00LItAukUdZO5iqNH7+PjoBm+fLQjtxfcfFE20Xf5CrLsmZdq5LFFZzb5JMZ9grUwvtVYzjiA=="], - "@node-llama-cpp/win-x64": ["@node-llama-cpp/win-x64@3.14.5", "", { "os": "win32", "cpu": "x64" }, "sha512-cEuhb1iLTodM+V8xc1mWKeWRYkX9tlnl0+9jUjwsv2kgnAjEob3WlTYsCXewvEe2ShSyk8AsLsBPZxv7IQaBsw=="], + "@esbuild/openbsd-arm64": ["@esbuild/openbsd-arm64@0.27.3", "", { "os": "openbsd", "cpu": "arm64" }, "sha512-AIcMP77AvirGbRl/UZFTq5hjXK+2wC7qFRGoHSDrZ5v5b8DK/GYpXW3CPRL53NkvDqb9D+alBiC/dV0Fb7eJcw=="], - "@node-llama-cpp/win-x64-cuda": ["@node-llama-cpp/win-x64-cuda@3.14.5", "", { "os": "win32", "cpu": "x64" }, "sha512-gwBMSzUteLD765Gq/hYQ4UC21vggR7oG+DU4zAg0Mt3i34PqKJC+tBop5jsTN5Hq8RaM9+nTNrVbF/x228TLvg=="], + "@esbuild/openbsd-x64": ["@esbuild/openbsd-x64@0.27.3", "", { "os": "openbsd", "cpu": "x64" }, "sha512-DnW2sRrBzA+YnE70LKqnM3P+z8vehfJWHXECbwBmH/CU51z6FiqTQTHFenPlHmo3a8UgpLyH3PT+87OViOh1AQ=="], - "@node-llama-cpp/win-x64-cuda-ext": ["@node-llama-cpp/win-x64-cuda-ext@3.14.5", "", { "os": "win32", "cpu": "x64" }, "sha512-kBHnUmodr+n8N+sKTh1c6aNNEmvXBWM5AtaLWIEfkCb00bVHNFeqYPmLuPNtMX3dIUtD9PHdA4Jsn0RJmNZJfA=="], + "@esbuild/openharmony-arm64": ["@esbuild/openharmony-arm64@0.27.3", "", { "os": "none", "cpu": "arm64" }, "sha512-NinAEgr/etERPTsZJ7aEZQvvg/A6IsZG/LgZy+81wON2huV7SrK3e63dU0XhyZP4RKGyTm7aOgmQk0bGp0fy2g=="], - "@node-llama-cpp/win-x64-vulkan": ["@node-llama-cpp/win-x64-vulkan@3.14.5", "", { "os": "win32", "cpu": "x64" }, "sha512-rY+vr5RaGSCWEe22WZMkhUu16o9zpeqTZO/nD5G27Y0bb+xBRDLmXbxYMp2dDQTfpkNWIZ0ia3PGWwl5yhYw7A=="], + "@esbuild/sunos-x64": ["@esbuild/sunos-x64@0.27.3", "", { "os": "sunos", "cpu": "x64" }, "sha512-PanZ+nEz+eWoBJ8/f8HKxTTD172SKwdXebZ0ndd953gt1HRBbhMsaNqjTyYLGLPdoWHy4zLU7bDVJztF5f3BHA=="], - "@octokit/app": ["@octokit/app@16.1.2", "", { "dependencies": { "@octokit/auth-app": "^8.1.2", "@octokit/auth-unauthenticated": "^7.0.3", "@octokit/core": "^7.0.6", "@octokit/oauth-app": "^8.0.3", "@octokit/plugin-paginate-rest": "^14.0.0", "@octokit/types": "^16.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-8j7sEpUYVj18dxvh0KWj6W/l6uAiVRBl1JBDVRqH1VHKAO/G5eRVl4yEoYACjakWers1DjUkcCHyJNQK47JqyQ=="], + "@esbuild/win32-arm64": ["@esbuild/win32-arm64@0.27.3", "", { "os": "win32", "cpu": "arm64" }, "sha512-B2t59lWWYrbRDw/tjiWOuzSsFh1Y/E95ofKz7rIVYSQkUYBjfSgf6oeYPNWHToFRr2zx52JKApIcAS/D5TUBnA=="], - "@octokit/auth-app": ["@octokit/auth-app@8.1.2", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.3", "@octokit/auth-oauth-user": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "toad-cache": "^3.7.0", "universal-github-app-jwt": "^2.2.0", "universal-user-agent": "^7.0.0" } }, "sha512-db8VO0PqXxfzI6GdjtgEFHY9tzqUql5xMFXYA12juq8TeTgPAuiiP3zid4h50lwlIP457p5+56PnJOgd2GGBuw=="], + "@esbuild/win32-ia32": ["@esbuild/win32-ia32@0.27.3", "", { "os": "win32", "cpu": "ia32" }, "sha512-QLKSFeXNS8+tHW7tZpMtjlNb7HKau0QDpwm49u0vUp9y1WOF+PEzkU84y9GqYaAVW8aH8f3GcBck26jh54cX4Q=="], - "@octokit/auth-oauth-app": ["@octokit/auth-oauth-app@9.0.3", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/auth-oauth-user": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-+yoFQquaF8OxJSxTb7rnytBIC2ZLbLqA/yb71I4ZXT9+Slw4TziV9j/kyGhUFRRTF2+7WlnIWsePZCWHs+OGjg=="], + "@esbuild/win32-x64": ["@esbuild/win32-x64@0.27.3", "", { "os": "win32", "cpu": "x64" }, "sha512-4uJGhsxuptu3OcpVAzli+/gWusVGwZZHTlS63hh++ehExkVT8SgiEf7/uC/PclrPPkLhZqGgCTjd0VWLo6xMqA=="], - "@octokit/auth-oauth-device": ["@octokit/auth-oauth-device@8.0.3", "", { "dependencies": { "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-zh2W0mKKMh/VWZhSqlaCzY7qFyrgd9oTWmTmHaXnHNeQRCZr/CXy2jCgHo4e4dJVTiuxP5dLa0YM5p5QVhJHbw=="], + "@hono/node-server": ["@hono/node-server@1.19.7", "", { "peerDependencies": { "hono": "^4" } }, "sha512-vUcD0uauS7EU2caukW8z5lJKtoGMokxNbJtBiwHgpqxEXokaHCBkQUmCHhjFB1VUTWdqj25QoMkMKzgjq+uhrw=="], - "@octokit/auth-oauth-user": ["@octokit/auth-oauth-user@6.0.2", "", { "dependencies": { "@octokit/auth-oauth-device": "^8.0.3", "@octokit/oauth-methods": "^6.0.2", "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-qLoPPc6E6GJoz3XeDG/pnDhJpTkODTGG4kY0/Py154i/I003O9NazkrwJwRuzgCalhzyIeWQ+6MDvkUmKXjg/A=="], + "@huggingface/jinja": ["@huggingface/jinja@0.5.5", "", {}, "sha512-xRlzazC+QZwr6z4ixEqYHo9fgwhTZ3xNSdljlKfUFGZSdlvt166DljRELFUfFytlYOYvo3vTisA/AFOuOAzFQQ=="], - "@octokit/auth-token": ["@octokit/auth-token@6.0.0", "", {}, "sha512-P4YJBPdPSpWTQ1NU4XYdvHvXJJDxM6YwpS0FZHRgP7YFkdVxsWcpWGy/NVqlAA7PcPCnMacXlRm1y2PFZRWL/w=="], + "@isaacs/fs-minipass": ["@isaacs/fs-minipass@4.0.1", "", { "dependencies": { "minipass": "^7.0.4" } }, "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w=="], - "@octokit/auth-unauthenticated": ["@octokit/auth-unauthenticated@7.0.3", "", { "dependencies": { "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0" } }, "sha512-8Jb1mtUdmBHL7lGmop9mU9ArMRUTRhg8vp0T1VtZ4yd9vEm3zcLwmjQkhNEduKawOOORie61xhtYIhTDN+ZQ3g=="], + "@jridgewell/sourcemap-codec": ["@jridgewell/sourcemap-codec@1.5.5", "", {}, "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="], - "@octokit/core": ["@octokit/core@7.0.6", "", { "dependencies": { "@octokit/auth-token": "^6.0.0", "@octokit/graphql": "^9.0.3", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "before-after-hook": "^4.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-DhGl4xMVFGVIyMwswXeyzdL4uXD5OGILGX5N8Y+f6W7LhC1Ze2poSNrkF/fedpVDHEEZ+PHFW0vL14I+mm8K3Q=="], + "@kwsites/file-exists": ["@kwsites/file-exists@1.1.1", "", { "dependencies": { "debug": "^4.1.1" } }, "sha512-m9/5YGR18lIwxSFDwfE3oA7bWuq9kdau6ugN4H2rJeyhFQZcG9AgSHkQtSD15a8WvTgfz9aikZMrKPHvbpqFiw=="], - "@octokit/endpoint": ["@octokit/endpoint@11.0.2", "", { "dependencies": { "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-4zCpzP1fWc7QlqunZ5bSEjxc6yLAlRTnDwKtgXfcI/FxxGoqedDG8V2+xJ60bV2kODqcGB+nATdtap/XYq2NZQ=="], + "@kwsites/promise-deferred": ["@kwsites/promise-deferred@1.1.1", "", {}, "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw=="], + + "@modelcontextprotocol/sdk": ["@modelcontextprotocol/sdk@1.25.1", "", { "dependencies": { "@hono/node-server": "^1.19.7", "ajv": "^8.17.1", "ajv-formats": "^3.0.1", "content-type": "^1.0.5", "cors": "^2.8.5", "cross-spawn": "^7.0.5", "eventsource": "^3.0.2", "eventsource-parser": "^3.0.0", "express": "^5.0.1", "express-rate-limit": "^7.5.0", "jose": "^6.1.1", "json-schema-typed": "^8.0.2", "pkce-challenge": "^5.0.0", "raw-body": "^3.0.0", "zod": "^3.25 || ^4.0", "zod-to-json-schema": "^3.25.0" }, "peerDependencies": { "@cfworker/json-schema": "^4.1.1" }, "optionalPeers": ["@cfworker/json-schema"] }, "sha512-yO28oVFFC7EBoiKdAn+VqRm+plcfv4v0xp6osG/VsCB0NlPZWi87ajbCZZ8f/RvOFLEu7//rSRmuZZ7lMoe3gQ=="], - "@octokit/graphql": ["@octokit/graphql@9.0.3", "", { "dependencies": { "@octokit/request": "^10.0.6", "@octokit/types": "^16.0.0", "universal-user-agent": "^7.0.0" } }, "sha512-grAEuupr/C1rALFnXTv6ZQhFuL1D8G5y8CN04RgrO4FIPMrtm+mcZzFG7dcBm+nq+1ppNixu+Jd78aeJOYxlGA=="], + "@node-llama-cpp/linux-arm64": ["@node-llama-cpp/linux-arm64@3.17.1", "", { "os": "linux", "cpu": [ "x64", "arm64", ] }, "sha512-QK8opgd/AnGHvSQwIDXukrMNa760PLOxcu4OrxJn/CsHxiKucch0L4bDfu17XvlKiMoK41lXa6CKFm1kjVaGIQ=="], - "@octokit/oauth-app": ["@octokit/oauth-app@8.0.3", "", { "dependencies": { "@octokit/auth-oauth-app": "^9.0.2", "@octokit/auth-oauth-user": "^6.0.1", "@octokit/auth-unauthenticated": "^7.0.2", "@octokit/core": "^7.0.5", "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/oauth-methods": "^6.0.1", "@types/aws-lambda": "^8.10.83", "universal-user-agent": "^7.0.0" } }, "sha512-jnAjvTsPepyUaMu9e69hYBuozEPgYqP4Z3UnpmvoIzHDpf8EXDGvTY1l1jK0RsZ194oRd+k6Hm13oRU8EoDFwg=="], + "@node-llama-cpp/linux-armv7l": ["@node-llama-cpp/linux-armv7l@3.17.1", "", { "os": "linux", "cpu": [ "arm", "x64", ] }, "sha512-KCLDVR1hayo/kSDUq6msT4BkBaEiudFsaT14EWFMw7V7JdEX/qBcHnthPa0eAtX0SVfKG7e2TafGuKpvr54GAw=="], - "@octokit/oauth-authorization-url": ["@octokit/oauth-authorization-url@8.0.0", "", {}, "sha512-7QoLPRh/ssEA/HuHBHdVdSgF8xNLz/Bc5m9fZkArJE5bb6NmVkDm3anKxXPmN1zh6b5WKZPRr3697xKT/yM3qQ=="], + "@node-llama-cpp/linux-x64": ["@node-llama-cpp/linux-x64@3.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-/o/UoqAdslg4ExdKYyYPqbw+21Dr4cQ2JgouXg8Ji3opRKoTMrlUNfrMwIsYZfbDDJ8l7xFnwfGIwdlQ5RPwJg=="], - "@octokit/oauth-methods": ["@octokit/oauth-methods@6.0.2", "", { "dependencies": { "@octokit/oauth-authorization-url": "^8.0.0", "@octokit/request": "^10.0.6", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0" } }, "sha512-HiNOO3MqLxlt5Da5bZbLV8Zarnphi4y9XehrbaFMkcoJ+FL7sMxH/UlUsCVxpddVu4qvNDrBdaTVE2o4ITK8ng=="], + "@node-llama-cpp/linux-x64-cuda": ["@node-llama-cpp/linux-x64-cuda@3.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-DNTlf/x4y7eOodLrGIk2q8LL3lLrMZOG8ztUCVi802vXm3oyIO5x+ZqoRT8zbDx90wVdo3sSZhf8jvNli+JSEQ=="], - "@octokit/openapi-types": ["@octokit/openapi-types@27.0.0", "", {}, "sha512-whrdktVs1h6gtR+09+QsNk2+FO+49j6ga1c55YZudfEG+oKJVvJLQi3zkOm5JjiUXAagWK2tI2kTGKJ2Ys7MGA=="], + "@node-llama-cpp/linux-x64-cuda-ext": ["@node-llama-cpp/linux-x64-cuda-ext@3.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-wlGASJIqs6yLIUd++d7KVQvrCsJrGgWKsA87wzOkkJsWEtWqtu1qCL5Pbvja5yv7OK4B4UJ/oruzccAyuBFeqQ=="], - "@octokit/openapi-webhooks-types": ["@octokit/openapi-webhooks-types@12.1.0", "", {}, "sha512-WiuzhOsiOvb7W3Pvmhf8d2C6qaLHXrWiLBP4nJ/4kydu+wpagV5Fkz9RfQwV2afYzv3PB+3xYgp4mAdNGjDprA=="], + "@node-llama-cpp/linux-x64-vulkan": ["@node-llama-cpp/linux-x64-vulkan@3.17.1", "", { "os": "linux", "cpu": "x64" }, "sha512-M14roGcHYVHBNuPI6v3eNQkoBp2BsGYbyNoks6arAX5Tstl9XqJr8Zg5cEzRcYf0h5a54Ec99uM4T871j46wxg=="], - "@octokit/plugin-paginate-graphql": ["@octokit/plugin-paginate-graphql@6.0.0", "", { "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-crfpnIoFiBtRkvPqOyLOsw12XsveYuY2ieP6uYDosoUegBJpSVxGwut9sxUgFFcll3VTOTqpUf8yGd8x1OmAkQ=="], + "@node-llama-cpp/mac-arm64-metal": ["@node-llama-cpp/mac-arm64-metal@3.17.1", "", { "os": "darwin", "cpu": [ "x64", "arm64", ] }, "sha512-oRq6/7qCMsazO2Cw0oCyiILZmMvejKJgLAIG60E00WOZWhpJGjh71JGnOybRycKA015mFPNDHzT3SDdUZtZBew=="], - "@octokit/plugin-paginate-rest": ["@octokit/plugin-paginate-rest@14.0.0", "", { "dependencies": { "@octokit/types": "^16.0.0" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-fNVRE7ufJiAA3XUrha2omTA39M6IXIc6GIZLvlbsm8QOQCYvpq/LkMNGyFlB1d8hTDzsAXa3OKtybdMAYsV/fw=="], + "@node-llama-cpp/mac-x64": ["@node-llama-cpp/mac-x64@3.17.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-3L0nFVi70j+Qk7Xb8p/RQVMU0E28G0xXX0YL6Vzkirq3DazPYhWOLWUUs9MtGW2FrBg/6PLqyddmxwBfCpjm3w=="], - "@octokit/plugin-rest-endpoint-methods": ["@octokit/plugin-rest-endpoint-methods@17.0.0", "", { "dependencies": { "@octokit/types": "^16.0.0" }, "peerDependencies": { "@octokit/core": ">=6" } }, "sha512-B5yCyIlOJFPqUUeiD0cnBJwWJO8lkJs5d8+ze9QDP6SvfiXSz1BF+91+0MeI1d2yxgOhU/O+CvtiZ9jSkHhFAw=="], + "@node-llama-cpp/win-arm64": ["@node-llama-cpp/win-arm64@3.17.1", "", { "os": "win32", "cpu": [ "x64", "arm64", ] }, "sha512-AStvEtvpwQoCFr6lc0OQgOs//WOS0288AN9WTTmhb4FloRj8HvGeKqlLEdhQBtIES8CXpuDXHcbYfFu4v+BXVQ=="], - "@octokit/plugin-retry": ["@octokit/plugin-retry@8.0.3", "", { "dependencies": { "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "peerDependencies": { "@octokit/core": ">=7" } }, "sha512-vKGx1i3MC0za53IzYBSBXcrhmd+daQDzuZfYDd52X5S0M2otf3kVZTVP8bLA3EkU0lTvd1WEC2OlNNa4G+dohA=="], + "@node-llama-cpp/win-x64": ["@node-llama-cpp/win-x64@3.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-XDES1ublhDzw+so2ujg3qbxBopyPDJnYAr/nPyjA7Eu/HIlt2+qo682qapUXcyhV5U8wkfeMShMLzolwZ801Nw=="], - "@octokit/plugin-throttling": ["@octokit/plugin-throttling@11.0.3", "", { "dependencies": { "@octokit/types": "^16.0.0", "bottleneck": "^2.15.3" }, "peerDependencies": { "@octokit/core": "^7.0.0" } }, "sha512-34eE0RkFCKycLl2D2kq7W+LovheM/ex3AwZCYN8udpi6bxsyjZidb2McXs69hZhLmJlDqTSP8cH+jSRpiaijBg=="], + "@node-llama-cpp/win-x64-cuda": ["@node-llama-cpp/win-x64-cuda@3.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-Gn08t64l3GHANoYwOnDzTA8Zp9BXZCQnTXHWIyc9pZ6pkDB4LAvZZIPgGuWTGSCipSk6Oi/hartehsRCin7Mhg=="], - "@octokit/request": ["@octokit/request@10.0.7", "", { "dependencies": { "@octokit/endpoint": "^11.0.2", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "fast-content-type-parse": "^3.0.0", "universal-user-agent": "^7.0.2" } }, "sha512-v93h0i1yu4idj8qFPZwjehoJx4j3Ntn+JhXsdJrG9pYaX6j/XRz2RmasMUHtNgQD39nrv/VwTWSqK0RNXR8upA=="], + "@node-llama-cpp/win-x64-cuda-ext": ["@node-llama-cpp/win-x64-cuda-ext@3.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-8ypciTUj1m1AYUbQehIj408a4w9hxNb6ddaW7dMiPH0Cqq9TFCspY/Pj2uXmJOH22VcijGNIvIQe5MPoAmYoUA=="], - "@octokit/request-error": ["@octokit/request-error@7.1.0", "", { "dependencies": { "@octokit/types": "^16.0.0" } }, "sha512-KMQIfq5sOPpkQYajXHwnhjCC0slzCNScLHs9JafXc4RAJI+9f+jNDlBNaIMTvazOPLgb4BnlhGJOTbnN0wIjPw=="], + "@node-llama-cpp/win-x64-vulkan": ["@node-llama-cpp/win-x64-vulkan@3.17.1", "", { "os": "win32", "cpu": "x64" }, "sha512-HleDjYiJjL761U64eGo8Xe/U43zQ+xwzNSPw6Z82JCTnHjZ7tci33dmhJZHDl9NraG8hO15UnrDwgXzHwucDdw=="], - "@octokit/types": ["@octokit/types@16.0.0", "", { "dependencies": { "@octokit/openapi-types": "^27.0.0" } }, "sha512-sKq+9r1Mm4efXW1FCk7hFSeJo4QKreL/tTbR0rz/qx/r1Oa2VV83LTA/H/MuCOX7uCIJmQVRKBcbmWoySjAnSg=="], + "@nodelib/fs.scandir": ["@nodelib/fs.scandir@2.1.5", "", { "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" } }, "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g=="], - "@octokit/webhooks": ["@octokit/webhooks@14.2.0", "", { "dependencies": { "@octokit/openapi-webhooks-types": "12.1.0", "@octokit/request-error": "^7.0.0", "@octokit/webhooks-methods": "^6.0.0" } }, "sha512-da6KbdNCV5sr1/txD896V+6W0iamFWrvVl8cHkBSPT+YlvmT3DwXa4jxZnQc+gnuTEqSWbBeoSZYTayXH9wXcw=="], + "@nodelib/fs.stat": ["@nodelib/fs.stat@2.0.5", "", {}, "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A=="], - "@octokit/webhooks-methods": ["@octokit/webhooks-methods@6.0.0", "", {}, "sha512-MFlzzoDJVw/GcbfzVC1RLR36QqkTLUf79vLVO3D+xn7r0QgxnFoLZgtrzxiQErAjFUOdH6fas2KeQJ1yr/qaXQ=="], + "@nodelib/fs.walk": ["@nodelib/fs.walk@1.2.8", "", { "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" } }, "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg=="], "@reflink/reflink": ["@reflink/reflink@0.1.19", "", { "optionalDependencies": { "@reflink/reflink-darwin-arm64": "0.1.19", "@reflink/reflink-darwin-x64": "0.1.19", "@reflink/reflink-linux-arm64-gnu": "0.1.19", "@reflink/reflink-linux-arm64-musl": "0.1.19", "@reflink/reflink-linux-x64-gnu": "0.1.19", "@reflink/reflink-linux-x64-musl": "0.1.19", "@reflink/reflink-win32-arm64-msvc": "0.1.19", "@reflink/reflink-win32-x64-msvc": "0.1.19" } }, "sha512-DmCG8GzysnCZ15bres3N5AHCmwBwYgp0As6xjhQ47rAUTUXxJiK+lLUxaGsX3hd/30qUpVElh05PbGuxRPgJwA=="], @@ -130,14 +148,82 @@ "@reflink/reflink-win32-x64-msvc": ["@reflink/reflink-win32-x64-msvc@0.1.19", "", { "os": "win32", "cpu": "x64" }, "sha512-E//yT4ni2SyhwP8JRjVGWr3cbnhWDiPLgnQ66qqaanjjnMiu3O/2tjCPQXlcGc/DEYofpDc9fvhv6tALQsMV9w=="], + "@rollup/rollup-android-arm-eabi": ["@rollup/rollup-android-arm-eabi@4.57.1", "", { "os": "android", "cpu": "arm" }, "sha512-A6ehUVSiSaaliTxai040ZpZ2zTevHYbvu/lDoeAteHI8QnaosIzm4qwtezfRg1jOYaUmnzLX1AOD6Z+UJjtifg=="], + + "@rollup/rollup-android-arm64": ["@rollup/rollup-android-arm64@4.57.1", "", { "os": "android", "cpu": "arm64" }, "sha512-dQaAddCY9YgkFHZcFNS/606Exo8vcLHwArFZ7vxXq4rigo2bb494/xKMMwRRQW6ug7Js6yXmBZhSBRuBvCCQ3w=="], + + "@rollup/rollup-darwin-arm64": ["@rollup/rollup-darwin-arm64@4.57.1", "", { "os": "darwin", "cpu": "arm64" }, "sha512-crNPrwJOrRxagUYeMn/DZwqN88SDmwaJ8Cvi/TN1HnWBU7GwknckyosC2gd0IqYRsHDEnXf328o9/HC6OkPgOg=="], + + "@rollup/rollup-darwin-x64": ["@rollup/rollup-darwin-x64@4.57.1", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ji8g8ChVbKrhFtig5QBV7iMaJrGtpHelkB3lsaKzadFBe58gmjfGXAOfI5FV0lYMH8wiqsxKQ1C9B0YTRXVy4w=="], + + "@rollup/rollup-freebsd-arm64": ["@rollup/rollup-freebsd-arm64@4.57.1", "", { "os": "freebsd", "cpu": "arm64" }, "sha512-R+/WwhsjmwodAcz65guCGFRkMb4gKWTcIeLy60JJQbXrJ97BOXHxnkPFrP+YwFlaS0m+uWJTstrUA9o+UchFug=="], + + "@rollup/rollup-freebsd-x64": ["@rollup/rollup-freebsd-x64@4.57.1", "", { "os": "freebsd", "cpu": "x64" }, "sha512-IEQTCHeiTOnAUC3IDQdzRAGj3jOAYNr9kBguI7MQAAZK3caezRrg0GxAb6Hchg4lxdZEI5Oq3iov/w/hnFWY9Q=="], + + "@rollup/rollup-linux-arm-gnueabihf": ["@rollup/rollup-linux-arm-gnueabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-F8sWbhZ7tyuEfsmOxwc2giKDQzN3+kuBLPwwZGyVkLlKGdV1nvnNwYD0fKQ8+XS6hp9nY7B+ZeK01EBUE7aHaw=="], + + "@rollup/rollup-linux-arm-musleabihf": ["@rollup/rollup-linux-arm-musleabihf@4.57.1", "", { "os": "linux", "cpu": "arm" }, "sha512-rGfNUfn0GIeXtBP1wL5MnzSj98+PZe/AXaGBCRmT0ts80lU5CATYGxXukeTX39XBKsxzFpEeK+Mrp9faXOlmrw=="], + + "@rollup/rollup-linux-arm64-gnu": ["@rollup/rollup-linux-arm64-gnu@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-MMtej3YHWeg/0klK2Qodf3yrNzz6CGjo2UntLvk2RSPlhzgLvYEB3frRvbEF2wRKh1Z2fDIg9KRPe1fawv7C+g=="], + + "@rollup/rollup-linux-arm64-musl": ["@rollup/rollup-linux-arm64-musl@4.57.1", "", { "os": "linux", "cpu": "arm64" }, "sha512-1a/qhaaOXhqXGpMFMET9VqwZakkljWHLmZOX48R0I/YLbhdxr1m4gtG1Hq7++VhVUmf+L3sTAf9op4JlhQ5u1Q=="], + + "@rollup/rollup-linux-loong64-gnu": ["@rollup/rollup-linux-loong64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-QWO6RQTZ/cqYtJMtxhkRkidoNGXc7ERPbZN7dVW5SdURuLeVU7lwKMpo18XdcmpWYd0qsP1bwKPf7DNSUinhvA=="], + + "@rollup/rollup-linux-loong64-musl": ["@rollup/rollup-linux-loong64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-xpObYIf+8gprgWaPP32xiN5RVTi/s5FCR+XMXSKmhfoJjrpRAjCuuqQXyxUa/eJTdAE6eJ+KDKaoEqjZQxh3Gw=="], + + "@rollup/rollup-linux-ppc64-gnu": ["@rollup/rollup-linux-ppc64-gnu@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-4BrCgrpZo4hvzMDKRqEaW1zeecScDCR+2nZ86ATLhAoJ5FQ+lbHVD3ttKe74/c7tNT9c6F2viwB3ufwp01Oh2w=="], + + "@rollup/rollup-linux-ppc64-musl": ["@rollup/rollup-linux-ppc64-musl@4.57.1", "", { "os": "linux", "cpu": "ppc64" }, "sha512-NOlUuzesGauESAyEYFSe3QTUguL+lvrN1HtwEEsU2rOwdUDeTMJdO5dUYl/2hKf9jWydJrO9OL/XSSf65R5+Xw=="], + + "@rollup/rollup-linux-riscv64-gnu": ["@rollup/rollup-linux-riscv64-gnu@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-ptA88htVp0AwUUqhVghwDIKlvJMD/fmL/wrQj99PRHFRAG6Z5nbWoWG4o81Nt9FT+IuqUQi+L31ZKAFeJ5Is+A=="], + + "@rollup/rollup-linux-riscv64-musl": ["@rollup/rollup-linux-riscv64-musl@4.57.1", "", { "os": "linux", "cpu": "none" }, "sha512-S51t7aMMTNdmAMPpBg7OOsTdn4tySRQvklmL3RpDRyknk87+Sp3xaumlatU+ppQ+5raY7sSTcC2beGgvhENfuw=="], + + "@rollup/rollup-linux-s390x-gnu": ["@rollup/rollup-linux-s390x-gnu@4.57.1", "", { "os": "linux", "cpu": "s390x" }, "sha512-Bl00OFnVFkL82FHbEqy3k5CUCKH6OEJL54KCyx2oqsmZnFTR8IoNqBF+mjQVcRCT5sB6yOvK8A37LNm/kPJiZg=="], + + "@rollup/rollup-linux-x64-gnu": ["@rollup/rollup-linux-x64-gnu@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-ABca4ceT4N+Tv/GtotnWAeXZUZuM/9AQyCyKYyKnpk4yoA7QIAuBt6Hkgpw8kActYlew2mvckXkvx0FfoInnLg=="], + + "@rollup/rollup-linux-x64-musl": ["@rollup/rollup-linux-x64-musl@4.57.1", "", { "os": "linux", "cpu": "x64" }, "sha512-HFps0JeGtuOR2convgRRkHCekD7j+gdAuXM+/i6kGzQtFhlCtQkpwtNzkNj6QhCDp7DRJ7+qC/1Vg2jt5iSOFw=="], + + "@rollup/rollup-openbsd-x64": ["@rollup/rollup-openbsd-x64@4.57.1", "", { "os": "openbsd", "cpu": "x64" }, "sha512-H+hXEv9gdVQuDTgnqD+SQffoWoc0Of59AStSzTEj/feWTBAnSfSD3+Dql1ZruJQxmykT/JVY0dE8Ka7z0DH1hw=="], + + "@rollup/rollup-openharmony-arm64": ["@rollup/rollup-openharmony-arm64@4.57.1", "", { "os": "none", "cpu": "arm64" }, "sha512-4wYoDpNg6o/oPximyc/NG+mYUejZrCU2q+2w6YZqrAs2UcNUChIZXjtafAiiZSUc7On8v5NyNj34Kzj/Ltk6dQ=="], + + "@rollup/rollup-win32-arm64-msvc": ["@rollup/rollup-win32-arm64-msvc@4.57.1", "", { "os": "win32", "cpu": "arm64" }, "sha512-O54mtsV/6LW3P8qdTcamQmuC990HDfR71lo44oZMZlXU4tzLrbvTii87Ni9opq60ds0YzuAlEr/GNwuNluZyMQ=="], + + "@rollup/rollup-win32-ia32-msvc": ["@rollup/rollup-win32-ia32-msvc@4.57.1", "", { "os": "win32", "cpu": "ia32" }, "sha512-P3dLS+IerxCT/7D2q2FYcRdWRl22dNbrbBEtxdWhXrfIMPP9lQhb5h4Du04mdl5Woq05jVCDPCMF7Ub0NAjIew=="], + + "@rollup/rollup-win32-x64-gnu": ["@rollup/rollup-win32-x64-gnu@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-VMBH2eOOaKGtIJYleXsi2B8CPVADrh+TyNxJ4mWPnKfLB/DBUmzW+5m1xUrcwWoMfSLagIRpjUFeW5CO5hyciQ=="], + + "@rollup/rollup-win32-x64-msvc": ["@rollup/rollup-win32-x64-msvc@4.57.1", "", { "os": "win32", "cpu": "x64" }, "sha512-mxRFDdHIWRxg3UfIIAwCm6NzvxG0jDX/wBN6KsQFTvKFqqg9vTrWUE68qEjHt19A5wwx5X5aUi2zuZT7YR0jrA=="], + "@tinyhttp/content-disposition": ["@tinyhttp/content-disposition@2.2.2", "", {}, "sha512-crXw1txzrS36huQOyQGYFvhTeLeG0Si1xu+/l6kXUVYpE0TjFjEZRqTbuadQLfKGZ0jaI+jJoRyqaWwxOSHW2g=="], - "@types/aws-lambda": ["@types/aws-lambda@8.10.159", "", {}, "sha512-SAP22WSGNN12OQ8PlCzGzRCZ7QDCwI85dQZbmpz7+mAk+L7j+wI7qnvmdKh+o7A5LaOp6QnOZ2NJphAZQTTHQg=="], + "@types/better-sqlite3": ["@types/better-sqlite3@7.6.13", "", { "dependencies": { "@types/node": "*" } }, "sha512-NMv9ASNARoKksWtsq/SHakpYAYnhBrQgGD8zkLYk/jaK8jUGn08CfEdTRgYhMypUQAfzSP8W6gNLe0q19/t4VA=="], + + "@types/chai": ["@types/chai@5.2.3", "", { "dependencies": { "@types/deep-eql": "*", "assertion-error": "^2.0.1" } }, "sha512-Mw558oeA9fFbv65/y4mHtXDs9bPnFMZAL/jxdPFUpOHHIXX91mcgEHbS5Lahr+pwZFR8A7GQleRWeI6cGFC2UA=="], + + "@types/deep-eql": ["@types/deep-eql@4.0.2", "", {}, "sha512-c9h9dVVMigMPc4bwTvC5dxqtqJZwQPePsWjPlpSOnojbor6pGqdk541lfA7AqFQr5pB1BRdq0juY9db81BwyFw=="], - "@types/bun": ["@types/bun@1.3.5", "", { "dependencies": { "bun-types": "1.3.5" } }, "sha512-RnygCqNrd3srIPEWBd5LFeUYG7plCoH2Yw9WaZGyNmdTEei+gWaHqydbaIRkIkcbXwhBT94q78QljxN0Sk838w=="], + "@types/estree": ["@types/estree@1.0.8", "", {}, "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w=="], "@types/node": ["@types/node@24.10.1", "", { "dependencies": { "undici-types": "~7.16.0" } }, "sha512-GNWcUTRBgIRJD5zj+Tq0fKOJ5XZajIiBroOF0yvj2bSU1WvNdYS/dn9UxwsujGW4JX06dnHyjV2y9rRaybH0iQ=="], + "@vitest/expect": ["@vitest/expect@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "tinyrainbow": "^2.0.0" } }, "sha512-Io0yyORnB6sikFlt8QW5K7slY4OjqNX9jmJQ02QDda8lyM6B5oNgVWoSoKPac8/kgnCUzuHQKrSLtu/uOqqrig=="], + + "@vitest/mocker": ["@vitest/mocker@3.2.4", "", { "dependencies": { "@vitest/spy": "3.2.4", "estree-walker": "^3.0.3", "magic-string": "^0.30.17" }, "peerDependencies": { "msw": "^2.4.9", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "optionalPeers": ["msw", "vite"] }, "sha512-46ryTE9RZO/rfDd7pEqFl7etuyzekzEhUbTW3BvmeO/BcCMEgq59BKhek3dXDWgAj4oMK6OZi+vRr1wPW6qjEQ=="], + + "@vitest/pretty-format": ["@vitest/pretty-format@3.2.4", "", { "dependencies": { "tinyrainbow": "^2.0.0" } }, "sha512-IVNZik8IVRJRTr9fxlitMKeJeXFFFN0JaB9PHPGQ8NKQbGpfjlTx9zO4RefN8gp7eqjNy8nyK3NZmBzOPeIxtA=="], + + "@vitest/runner": ["@vitest/runner@3.2.4", "", { "dependencies": { "@vitest/utils": "3.2.4", "pathe": "^2.0.3", "strip-literal": "^3.0.0" } }, "sha512-oukfKT9Mk41LreEW09vt45f8wx7DordoWUZMYdY/cyAk7w5TWkTRCNZYF7sX7n2wB7jyGAl74OxgwhPgKaqDMQ=="], + + "@vitest/snapshot": ["@vitest/snapshot@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "magic-string": "^0.30.17", "pathe": "^2.0.3" } }, "sha512-dEYtS7qQP2CjU27QBC5oUOxLE/v5eLkGqPE0ZKEIDGMs4vKWe7IjgLOeauHsR0D5YuuycGRO5oSRXnwnmA78fQ=="], + + "@vitest/spy": ["@vitest/spy@3.2.4", "", { "dependencies": { "tinyspy": "^4.0.3" } }, "sha512-vAfasCOe6AIK70iP5UD11Ac4siNUNJ9i/9PZ3NKx07sG6sUxeag1LWdNrMWeKKYBLlzuK+Gn65Yd5nyL6ds+nw=="], + + "@vitest/utils": ["@vitest/utils@3.2.4", "", { "dependencies": { "@vitest/pretty-format": "3.2.4", "loupe": "^3.1.4", "tinyrainbow": "^2.0.0" } }, "sha512-fB2V0JFrQSMsCo9HiSq3Ezpdv4iYaXRG1Sx8edX3MwxfyNn83mKiGzOcH+Fkxt4MHxr3y42fQi1oeAInqgX2QA=="], + "accepts": ["accepts@2.0.0", "", { "dependencies": { "mime-types": "^3.0.0", "negotiator": "^1.0.0" } }, "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng=="], "ajv": ["ajv@8.17.1", "", { "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", "json-schema-traverse": "^1.0.0", "require-from-string": "^2.0.2" } }, "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g=="], @@ -150,35 +236,41 @@ "ansi-styles": ["ansi-styles@6.2.3", "", {}, "sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg=="], - "aproba": ["aproba@2.1.0", "", {}, "sha512-tLIEcj5GuR2RSTnxNKdkK0dJ/GrC7P38sUkiDmDuHfsHmbagTFAxDVIBltoklXEVIQ/f14IL8IMJ5pn9Hez1Ew=="], - - "are-we-there-yet": ["are-we-there-yet@3.0.1", "", { "dependencies": { "delegates": "^1.0.0", "readable-stream": "^3.6.0" } }, "sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg=="], + "assertion-error": ["assertion-error@2.0.1", "", {}, "sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA=="], "async-retry": ["async-retry@1.3.3", "", { "dependencies": { "retry": "0.13.1" } }, "sha512-wfr/jstw9xNi/0teMHrRW7dsz3Lt5ARhYNZ2ewpadnhaIp5mbALhOAP+EAdsC7t4Z6wqsDVv9+W6gm1Dk9mEyw=="], - "asynckit": ["asynckit@0.4.0", "", {}, "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="], + "base64-js": ["base64-js@1.5.1", "", {}, "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="], + + "better-sqlite3": ["better-sqlite3@11.10.0", "", { "dependencies": { "bindings": "^1.5.0", "prebuild-install": "^7.1.1" } }, "sha512-EwhOpyXiOEL/lKzHz9AW1msWFNzGc/z+LzeB3/jnFJpxu+th2yqvzsSWas1v9jgs9+xiXJcD5A8CJxAG2TaghQ=="], - "axios": ["axios@1.13.2", "", { "dependencies": { "follow-redirects": "^1.15.6", "form-data": "^4.0.4", "proxy-from-env": "^1.1.0" } }, "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA=="], + "bindings": ["bindings@1.5.0", "", { "dependencies": { "file-uri-to-path": "1.0.0" } }, "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ=="], - "before-after-hook": ["before-after-hook@4.0.0", "", {}, "sha512-q6tR3RPqIB1pMiTRMFcZwuG5T8vwp+vUvEG0vuI6B+Rikh5BfPp2fQ82c925FOs+b0lcFQ8CFrL+KbilfZFhOQ=="], + "bl": ["bl@4.1.0", "", { "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", "readable-stream": "^3.4.0" } }, "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w=="], "body-parser": ["body-parser@2.2.1", "", { "dependencies": { "bytes": "^3.1.2", "content-type": "^1.0.5", "debug": "^4.4.3", "http-errors": "^2.0.0", "iconv-lite": "^0.7.0", "on-finished": "^2.4.1", "qs": "^6.14.0", "raw-body": "^3.0.1", "type-is": "^2.0.1" } }, "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw=="], - "bottleneck": ["bottleneck@2.19.5", "", {}, "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw=="], + "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], - "bun-types": ["bun-types@1.3.5", "", { "dependencies": { "@types/node": "*" } }, "sha512-inmAYe2PFLs0SUbFOWSVD24sg1jFlMPxOjOSSCYqUgn4Hsc3rDc7dFvfVYjFPNHtov6kgUeulV4SxbuIV/stPw=="], + "buffer": ["buffer@5.7.1", "", { "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ=="], "bytes": ["bytes@3.1.2", "", {}, "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg=="], + "cac": ["cac@6.7.14", "", {}, "sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ=="], + "call-bind-apply-helpers": ["call-bind-apply-helpers@1.0.2", "", { "dependencies": { "es-errors": "^1.3.0", "function-bind": "^1.1.2" } }, "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ=="], "call-bound": ["call-bound@1.0.4", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "get-intrinsic": "^1.3.0" } }, "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg=="], + "chai": ["chai@5.3.3", "", { "dependencies": { "assertion-error": "^2.0.1", "check-error": "^2.1.1", "deep-eql": "^5.0.1", "loupe": "^3.1.0", "pathval": "^2.0.0" } }, "sha512-4zNhdJD/iOjSH0A05ea+Ke6MU5mmpQcbQsSOkgdaUMJ9zTlDTD/GYlwohmIE2u0gaxHYiVHEn1Fw9mZ/ktJWgw=="], + "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], + "check-error": ["check-error@2.1.3", "", {}, "sha512-PAJdDJusoxnwm1VwW07VWwUN1sl7smmC3OKggvndJFadxxDRyFJBX/ggnu/KE4kQAB7a3Dp8f/YXC1FlUprWmA=="], + "chmodrp": ["chmodrp@1.0.2", "", {}, "sha512-TdngOlFV1FLTzU0o1w8MB6/BFywhtLC0SzRTGJU7T9lmdjlCWeMRt1iVo0Ki+ldwNk0BqNiKoc8xpLZEQ8mY1w=="], - "chownr": ["chownr@2.0.0", "", {}, "sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ=="], + "chownr": ["chownr@1.1.4", "", {}, "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg=="], "ci-info": ["ci-info@4.3.1", "", {}, "sha512-Wdy2Igu8OcBpI2pZePZ5oWjPC38tmDVx5WKUXKwlLYkA0ozo85sLsLvkBbBn/sZaSCMFOGZJ14fvW9t5/d7kdA=="], @@ -188,20 +280,14 @@ "cliui": ["cliui@8.0.1", "", { "dependencies": { "string-width": "^4.2.0", "strip-ansi": "^6.0.1", "wrap-ansi": "^7.0.0" } }, "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ=="], - "cmake-js": ["cmake-js@7.4.0", "", { "dependencies": { "axios": "^1.6.5", "debug": "^4", "fs-extra": "^11.2.0", "memory-stream": "^1.0.0", "node-api-headers": "^1.1.0", "npmlog": "^6.0.2", "rc": "^1.2.7", "semver": "^7.5.4", "tar": "^6.2.0", "url-join": "^4.0.1", "which": "^2.0.2", "yargs": "^17.7.2" }, "bin": { "cmake-js": "bin/cmake-js" } }, "sha512-Lw0JxEHrmk+qNj1n9W9d4IvkDdYTBn7l2BW6XmtLj7WPpIo2shvxUy+YokfjMxAAOELNonQwX3stkPhM5xSC2Q=="], + "cmake-js": ["cmake-js@8.0.0", "", { "dependencies": { "debug": "^4.4.3", "fs-extra": "^11.3.3", "node-api-headers": "^1.8.0", "rc": "1.2.8", "semver": "^7.7.3", "tar": "^7.5.6", "url-join": "^4.0.1", "which": "^6.0.0", "yargs": "^17.7.2" }, "bin": { "cmake-js": "bin/cmake-js" } }, "sha512-YbUP88RDwCvoQkZhRtGURYm9RIpWdtvZuhT87fKNoLjk8kIFIFeARpKfuZQGdwfH99GZpUmqSfcDrK62X7lTgg=="], "color-convert": ["color-convert@2.0.1", "", { "dependencies": { "color-name": "~1.1.4" } }, "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ=="], "color-name": ["color-name@1.1.4", "", {}, "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="], - "color-support": ["color-support@1.1.3", "", { "bin": { "color-support": "bin.js" } }, "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg=="], - - "combined-stream": ["combined-stream@1.0.8", "", { "dependencies": { "delayed-stream": "~1.0.0" } }, "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg=="], - "commander": ["commander@10.0.1", "", {}, "sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug=="], - "console-control-strings": ["console-control-strings@1.1.0", "", {}, "sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ=="], - "content-disposition": ["content-disposition@1.0.1", "", {}, "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q=="], "content-type": ["content-type@1.0.5", "", {}, "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA=="], @@ -216,14 +302,16 @@ "debug": ["debug@4.4.3", "", { "dependencies": { "ms": "^2.1.3" } }, "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA=="], - "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], + "decompress-response": ["decompress-response@6.0.0", "", { "dependencies": { "mimic-response": "^3.1.0" } }, "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ=="], - "delayed-stream": ["delayed-stream@1.0.0", "", {}, "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="], + "deep-eql": ["deep-eql@5.0.2", "", {}, "sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q=="], - "delegates": ["delegates@1.0.0", "", {}, "sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ=="], + "deep-extend": ["deep-extend@0.6.0", "", {}, "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA=="], "depd": ["depd@2.0.0", "", {}, "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw=="], + "detect-libc": ["detect-libc@2.1.2", "", {}, "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ=="], + "dunder-proto": ["dunder-proto@1.0.1", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.1", "es-errors": "^1.3.0", "gopd": "^1.2.0" } }, "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A=="], "ee-first": ["ee-first@1.1.1", "", {}, "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow=="], @@ -232,20 +320,26 @@ "encodeurl": ["encodeurl@2.0.0", "", {}, "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg=="], + "end-of-stream": ["end-of-stream@1.4.5", "", { "dependencies": { "once": "^1.4.0" } }, "sha512-ooEGc6HP26xXq/N+GCGOT0JKCLDGrq2bQUZrQ7gyrJiZANJ/8YDTxTpQBXGMn+WbIQXNVpyWymm7KYVICQnyOg=="], + "env-var": ["env-var@7.5.0", "", {}, "sha512-mKZOzLRN0ETzau2W2QXefbFjo5EF4yWq28OyKb9ICdeNhHJlOE/pHHnz4hdYJ9cNZXcJHo5xN4OT4pzuSHSNvA=="], "es-define-property": ["es-define-property@1.0.1", "", {}, "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g=="], "es-errors": ["es-errors@1.3.0", "", {}, "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw=="], + "es-module-lexer": ["es-module-lexer@1.7.0", "", {}, "sha512-jEQoCwk8hyb2AZziIOLhDqpm5+2ww5uIE6lkO/6jcOCusfk6LhMHpXXfBLXTZ7Ydyt0j4VoUQv6uGNYbdW+kBA=="], + "es-object-atoms": ["es-object-atoms@1.1.1", "", { "dependencies": { "es-errors": "^1.3.0" } }, "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA=="], - "es-set-tostringtag": ["es-set-tostringtag@2.1.0", "", { "dependencies": { "es-errors": "^1.3.0", "get-intrinsic": "^1.2.6", "has-tostringtag": "^1.0.2", "hasown": "^2.0.2" } }, "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA=="], + "esbuild": ["esbuild@0.27.3", "", { "optionalDependencies": { "@esbuild/aix-ppc64": "0.27.3", "@esbuild/android-arm": "0.27.3", "@esbuild/android-arm64": "0.27.3", "@esbuild/android-x64": "0.27.3", "@esbuild/darwin-arm64": "0.27.3", "@esbuild/darwin-x64": "0.27.3", "@esbuild/freebsd-arm64": "0.27.3", "@esbuild/freebsd-x64": "0.27.3", "@esbuild/linux-arm": "0.27.3", "@esbuild/linux-arm64": "0.27.3", "@esbuild/linux-ia32": "0.27.3", "@esbuild/linux-loong64": "0.27.3", "@esbuild/linux-mips64el": "0.27.3", "@esbuild/linux-ppc64": "0.27.3", "@esbuild/linux-riscv64": "0.27.3", "@esbuild/linux-s390x": "0.27.3", "@esbuild/linux-x64": "0.27.3", "@esbuild/netbsd-arm64": "0.27.3", "@esbuild/netbsd-x64": "0.27.3", "@esbuild/openbsd-arm64": "0.27.3", "@esbuild/openbsd-x64": "0.27.3", "@esbuild/openharmony-arm64": "0.27.3", "@esbuild/sunos-x64": "0.27.3", "@esbuild/win32-arm64": "0.27.3", "@esbuild/win32-ia32": "0.27.3", "@esbuild/win32-x64": "0.27.3" }, "bin": { "esbuild": "bin/esbuild" } }, "sha512-8VwMnyGCONIs6cWue2IdpHxHnAjzxnw2Zr7MkVxB2vjmQ2ivqGFb4LEG3SMnv0Gb2F/G/2yA8zUaiL1gywDCCg=="], "escalade": ["escalade@3.2.0", "", {}, "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA=="], "escape-html": ["escape-html@1.0.3", "", {}, "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow=="], + "estree-walker": ["estree-walker@3.0.3", "", { "dependencies": { "@types/estree": "^1.0.0" } }, "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g=="], + "etag": ["etag@1.8.1", "", {}, "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg=="], "eventemitter3": ["eventemitter3@5.0.1", "", {}, "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA=="], @@ -254,56 +348,66 @@ "eventsource-parser": ["eventsource-parser@3.0.6", "", {}, "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg=="], + "expand-template": ["expand-template@2.0.3", "", {}, "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg=="], + + "expect-type": ["expect-type@1.3.0", "", {}, "sha512-knvyeauYhqjOYvQ66MznSMs83wmHrCycNEN6Ao+2AeYEfxUIkuiVxdEa1qlGEPK+We3n0THiDciYSsCcgW/DoA=="], + "express": ["express@5.2.1", "", { "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", "content-disposition": "^1.0.0", "content-type": "^1.0.5", "cookie": "^0.7.1", "cookie-signature": "^1.2.1", "debug": "^4.4.0", "depd": "^2.0.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "etag": "^1.8.1", "finalhandler": "^2.1.0", "fresh": "^2.0.0", "http-errors": "^2.0.0", "merge-descriptors": "^2.0.0", "mime-types": "^3.0.0", "on-finished": "^2.4.1", "once": "^1.4.0", "parseurl": "^1.3.3", "proxy-addr": "^2.0.7", "qs": "^6.14.0", "range-parser": "^1.2.1", "router": "^2.2.0", "send": "^1.1.0", "serve-static": "^2.2.0", "statuses": "^2.0.1", "type-is": "^2.0.1", "vary": "^1.1.2" } }, "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw=="], "express-rate-limit": ["express-rate-limit@7.5.1", "", { "peerDependencies": { "express": ">= 4.11" } }, "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw=="], - "fast-content-type-parse": ["fast-content-type-parse@3.0.0", "", {}, "sha512-ZvLdcY8P+N8mGQJahJV5G4U88CSvT1rP8ApL6uETe88MBXrBHAkZlSEySdUlyztF7ccb+Znos3TFqaepHxdhBg=="], - "fast-deep-equal": ["fast-deep-equal@3.1.3", "", {}, "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q=="], + "fast-glob": ["fast-glob@3.3.3", "", { "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", "glob-parent": "^5.1.2", "merge2": "^1.3.0", "micromatch": "^4.0.8" } }, "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg=="], + "fast-uri": ["fast-uri@3.1.0", "", {}, "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA=="], + "fastq": ["fastq@1.20.1", "", { "dependencies": { "reusify": "^1.0.4" } }, "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw=="], + + "fdir": ["fdir@6.5.0", "", { "peerDependencies": { "picomatch": "^3 || ^4" }, "optionalPeers": ["picomatch"] }, "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg=="], + + "file-uri-to-path": ["file-uri-to-path@1.0.0", "", {}, "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw=="], + "filename-reserved-regex": ["filename-reserved-regex@3.0.0", "", {}, "sha512-hn4cQfU6GOT/7cFHXBqeBg2TbrMBgdD0kcjLhvSQYYwm3s4B6cjvBfb7nBALJLAXqmU5xajSa7X2NnUud/VCdw=="], "filenamify": ["filenamify@6.0.0", "", { "dependencies": { "filename-reserved-regex": "^3.0.0" } }, "sha512-vqIlNogKeyD3yzrm0yhRMQg8hOVwYcYRfjEoODd49iCprMn4HL85gK3HcykQE53EPIpX3HcAbGA5ELQv216dAQ=="], - "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], - - "follow-redirects": ["follow-redirects@1.15.11", "", {}, "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ=="], + "fill-range": ["fill-range@7.1.1", "", { "dependencies": { "to-regex-range": "^5.0.1" } }, "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg=="], - "form-data": ["form-data@4.0.5", "", { "dependencies": { "asynckit": "^0.4.0", "combined-stream": "^1.0.8", "es-set-tostringtag": "^2.1.0", "hasown": "^2.0.2", "mime-types": "^2.1.12" } }, "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w=="], + "finalhandler": ["finalhandler@2.1.1", "", { "dependencies": { "debug": "^4.4.0", "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "on-finished": "^2.4.1", "parseurl": "^1.3.3", "statuses": "^2.0.1" } }, "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA=="], "forwarded": ["forwarded@0.2.0", "", {}, "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow=="], "fresh": ["fresh@2.0.0", "", {}, "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A=="], + "fs-constants": ["fs-constants@1.0.0", "", {}, "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow=="], + "fs-extra": ["fs-extra@11.3.3", "", { "dependencies": { "graceful-fs": "^4.2.0", "jsonfile": "^6.0.1", "universalify": "^2.0.0" } }, "sha512-VWSRii4t0AFm6ixFFmLLx1t7wS1gh+ckoa84aOeapGum0h+EZd1EhEumSB+ZdDLnEPuucsVB9oB7cxJHap6Afg=="], - "fs-minipass": ["fs-minipass@2.1.0", "", { "dependencies": { "minipass": "^3.0.0" } }, "sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg=="], + "fsevents": ["fsevents@2.3.3", "", { "os": "darwin" }, "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw=="], "function-bind": ["function-bind@1.1.2", "", {}, "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA=="], - "gauge": ["gauge@4.0.4", "", { "dependencies": { "aproba": "^1.0.3 || ^2.0.0", "color-support": "^1.1.3", "console-control-strings": "^1.1.0", "has-unicode": "^2.0.1", "signal-exit": "^3.0.7", "string-width": "^4.2.3", "strip-ansi": "^6.0.1", "wide-align": "^1.1.5" } }, "sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg=="], - "get-caller-file": ["get-caller-file@2.0.5", "", {}, "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg=="], - "get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], + "get-east-asian-width": ["get-east-asian-width@1.5.0", "", {}, "sha512-CQ+bEO+Tva/qlmw24dCejulK5pMzVnUOFOijVogd3KQs07HnRIgp8TGipvCCRT06xeYEbpbgwaCxglFyiuIcmA=="], "get-intrinsic": ["get-intrinsic@1.3.0", "", { "dependencies": { "call-bind-apply-helpers": "^1.0.2", "es-define-property": "^1.0.1", "es-errors": "^1.3.0", "es-object-atoms": "^1.1.1", "function-bind": "^1.1.2", "get-proto": "^1.0.1", "gopd": "^1.2.0", "has-symbols": "^1.1.0", "hasown": "^2.0.2", "math-intrinsics": "^1.1.0" } }, "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ=="], "get-proto": ["get-proto@1.0.1", "", { "dependencies": { "dunder-proto": "^1.0.1", "es-object-atoms": "^1.0.0" } }, "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g=="], + "get-tsconfig": ["get-tsconfig@4.13.6", "", { "dependencies": { "resolve-pkg-maps": "^1.0.0" } }, "sha512-shZT/QMiSHc/YBLxxOkMtgSid5HFoauqCE3/exfsEcwg1WkeqjG+V40yBbBrsD+jW2HDXcs28xOfcbm2jI8Ddw=="], + + "github-from-package": ["github-from-package@0.0.0", "", {}, "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw=="], + + "glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], + "gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="], "graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="], "has-symbols": ["has-symbols@1.1.0", "", {}, "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ=="], - "has-tostringtag": ["has-tostringtag@1.0.2", "", { "dependencies": { "has-symbols": "^1.0.3" } }, "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw=="], - - "has-unicode": ["has-unicode@2.0.1", "", {}, "sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ=="], - "hasown": ["hasown@2.0.2", "", { "dependencies": { "function-bind": "^1.1.2" } }, "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ=="], "hono": ["hono@4.11.1", "", {}, "sha512-KsFcH0xxHes0J4zaQgWbYwmz3UPOOskdqZmItstUG93+Wk1ePBLkLGwbP9zlmh1BFUiL8Qp+Xfu9P7feJWpGNg=="], @@ -312,6 +416,8 @@ "iconv-lite": ["iconv-lite@0.7.0", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-cf6L2Ds3h57VVmkZe+Pn+5APsT7FpqJtEhhieDCvrE2MK5Qk9MyffgQyuxQTm6BChfeZNtcOLHp9IcWRVcIcBQ=="], + "ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="], + "ignore": ["ignore@7.0.5", "", {}, "sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg=="], "inherits": ["inherits@2.0.4", "", {}, "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ=="], @@ -320,83 +426,99 @@ "ipaddr.js": ["ipaddr.js@1.9.1", "", {}, "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g=="], - "ipull": ["ipull@3.9.3", "", { "dependencies": { "@tinyhttp/content-disposition": "^2.2.0", "async-retry": "^1.3.3", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-spinners": "^2.9.2", "commander": "^10.0.0", "eventemitter3": "^5.0.1", "filenamify": "^6.0.0", "fs-extra": "^11.1.1", "is-unicode-supported": "^2.0.0", "lifecycle-utils": "^2.0.1", "lodash.debounce": "^4.0.8", "lowdb": "^7.0.1", "pretty-bytes": "^6.1.0", "pretty-ms": "^8.0.0", "sleep-promise": "^9.1.0", "slice-ansi": "^7.1.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.1.0" }, "optionalDependencies": { "@reflink/reflink": "^0.1.16" }, "bin": { "ipull": "dist/cli/cli.js" } }, "sha512-ZMkxaopfwKHwmEuGDYx7giNBdLxbHbRCWcQVA1D2eqE4crUguupfxej6s7UqbidYEwT69dkyumYkY8DPHIxF9g=="], + "ipull": ["ipull@3.9.5", "", { "dependencies": { "@tinyhttp/content-disposition": "^2.2.0", "async-retry": "^1.3.3", "chalk": "^5.3.0", "ci-info": "^4.0.0", "cli-spinners": "^2.9.2", "commander": "^10.0.0", "eventemitter3": "^5.0.1", "filenamify": "^6.0.0", "fs-extra": "^11.1.1", "is-unicode-supported": "^2.0.0", "lifecycle-utils": "^2.0.1", "lodash.debounce": "^4.0.8", "lowdb": "^7.0.1", "pretty-bytes": "^6.1.0", "pretty-ms": "^8.0.0", "sleep-promise": "^9.1.0", "slice-ansi": "^7.1.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.1.0" }, "optionalDependencies": { "@reflink/reflink": "^0.1.16" }, "bin": { "ipull": "dist/cli/cli.js" } }, "sha512-5w/yZB5lXmTfsvNawmvkCjYo4SJNuKQz/av8TC1UiOyfOHyaM+DReqbpU2XpWYfmY+NIUbRRH8PUAWsxaS+IfA=="], + + "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], "is-fullwidth-code-point": ["is-fullwidth-code-point@5.1.0", "", { "dependencies": { "get-east-asian-width": "^1.3.1" } }, "sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ=="], + "is-glob": ["is-glob@4.0.3", "", { "dependencies": { "is-extglob": "^2.1.1" } }, "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg=="], + "is-interactive": ["is-interactive@2.0.0", "", {}, "sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ=="], + "is-number": ["is-number@7.0.0", "", {}, "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng=="], + "is-promise": ["is-promise@4.0.0", "", {}, "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ=="], "is-unicode-supported": ["is-unicode-supported@2.1.0", "", {}, "sha512-mE00Gnza5EEB3Ds0HfMyllZzbBrmLOX3vfWoj9A9PEnTfratQ/BcaJOuMhnkhjXvb2+FkY3VuHqtAGpTPmglFQ=="], - "isexe": ["isexe@3.1.1", "", {}, "sha512-LpB/54B+/2J5hqQ7imZHfdU31OlgQqx7ZicVlkm9kzg9/w8GKLEcFfJl/t7DCEDueOyBAD6zCCwTO6Fzs0NoEQ=="], + "isexe": ["isexe@4.0.0", "", {}, "sha512-FFUtZMpoZ8RqHS3XeXEmHWLA4thH+ZxCv2lOiPIn1Xc7CxrqhWzNSDzD+/chS/zbYezmiwWLdQC09JdQKmthOw=="], "jose": ["jose@6.1.3", "", {}, "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ=="], + "js-tokens": ["js-tokens@9.0.1", "", {}, "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ=="], + "json-schema-traverse": ["json-schema-traverse@1.0.0", "", {}, "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug=="], "json-schema-typed": ["json-schema-typed@8.0.2", "", {}, "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA=="], "jsonfile": ["jsonfile@6.2.0", "", { "dependencies": { "universalify": "^2.0.0" }, "optionalDependencies": { "graceful-fs": "^4.1.6" } }, "sha512-FGuPw30AdOIUTRMC2OMRtQV+jkVj2cfPqSeWXv1NEAJ1qZ5zb1X6z1mFhbfOB/iy3ssJCD+3KuZ8r8C3uVFlAg=="], - "lifecycle-utils": ["lifecycle-utils@3.0.1", "", {}, "sha512-Qt/Jl5dsNIsyCAZsHB6x3mbwHFn0HJbdmvF49sVX/bHgX2cW7+G+U+I67Zw+TPM1Sr21Gb2nfJMd2g6iUcI1EQ=="], + "lifecycle-utils": ["lifecycle-utils@3.1.1", "", {}, "sha512-gNd3OvhFNjHykJE3uGntz7UuPzWlK9phrIdXxU9Adis0+ExkwnZibfxCJWiWWZ+a6VbKiZrb+9D9hCQWd4vjTg=="], "lodash.debounce": ["lodash.debounce@4.0.8", "", {}, "sha512-FT1yDzDYEoYWhnSGnpE/4Kj1fLZkDFyqRb7fNt6FdYOSxlUWAtp42Eh6Wb0rGIv/m9Bgo7x4GhQbm5Ys4SG5ow=="], "log-symbols": ["log-symbols@7.0.1", "", { "dependencies": { "is-unicode-supported": "^2.0.0", "yoctocolors": "^2.1.1" } }, "sha512-ja1E3yCr9i/0hmBVaM0bfwDjnGy8I/s6PP4DFp+yP+a+mrHO4Rm7DtmnqROTUkHIkqffC84YY7AeqX6oFk0WFg=="], + "loupe": ["loupe@3.2.1", "", {}, "sha512-CdzqowRJCeLU72bHvWqwRBBlLcMEtIvGrlvef74kMnV2AolS9Y8xUv1I0U/MNAWMhBlKIoyuEgoJ0t/bbwHbLQ=="], + "lowdb": ["lowdb@7.0.1", "", { "dependencies": { "steno": "^4.0.2" } }, "sha512-neJAj8GwF0e8EpycYIDFqEPcx9Qz4GUho20jWFR7YiFeXzF1YMLdxB36PypcTSPMA+4+LvgyMacYhlr18Zlymw=="], + "magic-string": ["magic-string@0.30.21", "", { "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.5" } }, "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ=="], + "math-intrinsics": ["math-intrinsics@1.1.0", "", {}, "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g=="], "media-typer": ["media-typer@1.1.0", "", {}, "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw=="], - "memory-stream": ["memory-stream@1.0.0", "", { "dependencies": { "readable-stream": "^3.4.0" } }, "sha512-Wm13VcsPIMdG96dzILfij09PvuS3APtcKNh7M28FsCA/w6+1mjR7hhPmfFNoilX9xU7wTdhsH5lJAm6XNzdtww=="], - "merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="], + "merge2": ["merge2@1.4.1", "", {}, "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg=="], + + "micromatch": ["micromatch@4.0.8", "", { "dependencies": { "braces": "^3.0.3", "picomatch": "^2.3.1" } }, "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA=="], + "mime-db": ["mime-db@1.54.0", "", {}, "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ=="], "mime-types": ["mime-types@3.0.2", "", { "dependencies": { "mime-db": "^1.54.0" } }, "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A=="], "mimic-function": ["mimic-function@5.0.1", "", {}, "sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA=="], + "mimic-response": ["mimic-response@3.1.0", "", {}, "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ=="], + "minimist": ["minimist@1.2.8", "", {}, "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="], - "minipass": ["minipass@5.0.0", "", {}, "sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ=="], + "minipass": ["minipass@7.1.3", "", {}, "sha512-tEBHqDnIoM/1rXME1zgka9g6Q2lcoCkxHLuc7ODJ5BxbP5d4c2Z5cGgtXAku59200Cx7diuHTOYfSBD8n6mm8A=="], - "minizlib": ["minizlib@2.1.2", "", { "dependencies": { "minipass": "^3.0.0", "yallist": "^4.0.0" } }, "sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg=="], + "minizlib": ["minizlib@3.1.0", "", { "dependencies": { "minipass": "^7.1.2" } }, "sha512-KZxYo1BUkWD2TVFLr0MQoM8vUUigWD3LlD83a/75BqC+4qE0Hb1Vo5v1FgcfaNXvfXzr+5EhQ6ing/CaBijTlw=="], - "mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], + "mkdirp-classic": ["mkdirp-classic@0.5.3", "", {}, "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A=="], "ms": ["ms@2.1.3", "", {}, "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="], "nanoid": ["nanoid@5.1.6", "", { "bin": { "nanoid": "bin/nanoid.js" } }, "sha512-c7+7RQ+dMB5dPwwCp4ee1/iV/q2P6aK1mTZcfr1BTuVlyW9hJYiMPybJCcnBlQtuSmTIWNeazm/zqNoZSSElBg=="], + "napi-build-utils": ["napi-build-utils@2.0.0", "", {}, "sha512-GEbrYkbfF7MoNaoh2iGG84Mnf/WZfB0GdGEsM8wz7Expx/LlWf5U8t9nvJKXSp3qr5IsEbK04cBGhol/KwOsWA=="], + "negotiator": ["negotiator@1.0.0", "", {}, "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg=="], - "node-addon-api": ["node-addon-api@8.5.0", "", {}, "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A=="], + "node-abi": ["node-abi@3.87.0", "", { "dependencies": { "semver": "^7.3.5" } }, "sha512-+CGM1L1CgmtheLcBuleyYOn7NWPVu0s0EJH2C4puxgEZb9h8QpR9G2dBfZJOAUhi7VQxuBPMd0hiISWcTyiYyQ=="], - "node-api-headers": ["node-api-headers@1.7.0", "", {}, "sha512-uJMGdkhVwu9+I3UsVvI3KW6ICAy/yDfsu5Br9rSnTtY3WpoaComXvKloiV5wtx0Md2rn0B9n29Ys2WMNwWxj9A=="], + "node-addon-api": ["node-addon-api@8.5.0", "", {}, "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A=="], - "node-llama-cpp": ["node-llama-cpp@3.14.5", "", { "dependencies": { "@huggingface/jinja": "^0.5.3", "async-retry": "^1.3.3", "bytes": "^3.1.2", "chalk": "^5.4.1", "chmodrp": "^1.0.2", "cmake-js": "^7.4.0", "cross-spawn": "^7.0.6", "env-var": "^7.5.0", "filenamify": "^6.0.0", "fs-extra": "^11.3.0", "ignore": "^7.0.4", "ipull": "^3.9.2", "is-unicode-supported": "^2.1.0", "lifecycle-utils": "^3.0.1", "log-symbols": "^7.0.0", "nanoid": "^5.1.5", "node-addon-api": "^8.3.1", "octokit": "^5.0.3", "ora": "^8.2.0", "pretty-ms": "^9.2.0", "proper-lockfile": "^4.1.2", "semver": "^7.7.1", "simple-git": "^3.27.0", "slice-ansi": "^7.1.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.1.0", "validate-npm-package-name": "^6.0.0", "which": "^5.0.0", "yargs": "^17.7.2" }, "optionalDependencies": { "@node-llama-cpp/linux-arm64": "3.14.5", "@node-llama-cpp/linux-armv7l": "3.14.5", "@node-llama-cpp/linux-x64": "3.14.5", "@node-llama-cpp/linux-x64-cuda": "3.14.5", "@node-llama-cpp/linux-x64-cuda-ext": "3.14.5", "@node-llama-cpp/linux-x64-vulkan": "3.14.5", "@node-llama-cpp/mac-arm64-metal": "3.14.5", "@node-llama-cpp/mac-x64": "3.14.5", "@node-llama-cpp/win-arm64": "3.14.5", "@node-llama-cpp/win-x64": "3.14.5", "@node-llama-cpp/win-x64-cuda": "3.14.5", "@node-llama-cpp/win-x64-cuda-ext": "3.14.5", "@node-llama-cpp/win-x64-vulkan": "3.14.5" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "node-llama-cpp": "dist/cli/cli.js", "nlc": "dist/cli/cli.js" } }, "sha512-Db+RFqFMJOOVWprUINq77LVe44FaiJ6JvNiq14r2+DZRgkgyxckSZa6DcZ5Xe5MC+hGA5aqOdnNxsrudUcs74Q=="], + "node-api-headers": ["node-api-headers@1.8.0", "", {}, "sha512-jfnmiKWjRAGbdD1yQS28bknFM1tbHC1oucyuMPjmkEs+kpiu76aRs40WlTmBmyEgzDM76ge1DQ7XJ3R5deiVjQ=="], - "npmlog": ["npmlog@6.0.2", "", { "dependencies": { "are-we-there-yet": "^3.0.0", "console-control-strings": "^1.1.0", "gauge": "^4.0.3", "set-blocking": "^2.0.0" } }, "sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg=="], + "node-llama-cpp": ["node-llama-cpp@3.17.1", "", { "dependencies": { "@huggingface/jinja": "^0.5.5", "async-retry": "^1.3.3", "bytes": "^3.1.2", "chalk": "^5.6.2", "chmodrp": "^1.0.2", "cmake-js": "^8.0.0", "cross-spawn": "^7.0.6", "env-var": "^7.5.0", "filenamify": "^6.0.0", "fs-extra": "^11.3.0", "ignore": "^7.0.4", "ipull": "^3.9.5", "is-unicode-supported": "^2.1.0", "lifecycle-utils": "^3.1.1", "log-symbols": "^7.0.1", "nanoid": "^5.1.6", "node-addon-api": "^8.5.0", "ora": "^9.3.0", "pretty-ms": "^9.3.0", "proper-lockfile": "^4.1.2", "semver": "^7.7.1", "simple-git": "^3.32.2", "slice-ansi": "^8.0.0", "stdout-update": "^4.0.1", "strip-ansi": "^7.1.2", "validate-npm-package-name": "^7.0.2", "which": "^6.0.1", "yargs": "^17.7.2" }, "optionalDependencies": { "@node-llama-cpp/linux-arm64": "3.17.1", "@node-llama-cpp/linux-armv7l": "3.17.1", "@node-llama-cpp/linux-x64": "3.17.1", "@node-llama-cpp/linux-x64-cuda": "3.17.1", "@node-llama-cpp/linux-x64-cuda-ext": "3.17.1", "@node-llama-cpp/linux-x64-vulkan": "3.17.1", "@node-llama-cpp/mac-arm64-metal": "3.17.1", "@node-llama-cpp/mac-x64": "3.17.1", "@node-llama-cpp/win-arm64": "3.17.1", "@node-llama-cpp/win-x64": "3.17.1", "@node-llama-cpp/win-x64-cuda": "3.17.1", "@node-llama-cpp/win-x64-cuda-ext": "3.17.1", "@node-llama-cpp/win-x64-vulkan": "3.17.1" }, "peerDependencies": { "typescript": ">=5.0.0" }, "optionalPeers": ["typescript"], "bin": { "node-llama-cpp": "dist/cli/cli.js", "nlc": "dist/cli/cli.js" } }, "sha512-f+eYXag3kFeMwLrTTSTtyt+4p2etJGvTPXEdipYy7EqSZha9ZFBpGYNftxZwbdTiqh/qyNSe3TeZve5tkq5OPQ=="], "object-assign": ["object-assign@4.1.1", "", {}, "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg=="], "object-inspect": ["object-inspect@1.13.4", "", {}, "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew=="], - "octokit": ["octokit@5.0.5", "", { "dependencies": { "@octokit/app": "^16.1.2", "@octokit/core": "^7.0.6", "@octokit/oauth-app": "^8.0.3", "@octokit/plugin-paginate-graphql": "^6.0.0", "@octokit/plugin-paginate-rest": "^14.0.0", "@octokit/plugin-rest-endpoint-methods": "^17.0.0", "@octokit/plugin-retry": "^8.0.3", "@octokit/plugin-throttling": "^11.0.3", "@octokit/request-error": "^7.0.2", "@octokit/types": "^16.0.0", "@octokit/webhooks": "^14.0.0" } }, "sha512-4+/OFSqOjoyULo7eN7EA97DE0Xydj/PW5aIckxqQIoFjFwqXKuFCvXUJObyJfBF9Khu4RL/jlDRI9FPaMGfPnw=="], - "on-finished": ["on-finished@2.4.1", "", { "dependencies": { "ee-first": "1.1.1" } }, "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg=="], "once": ["once@1.4.0", "", { "dependencies": { "wrappy": "1" } }, "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w=="], "onetime": ["onetime@7.0.0", "", { "dependencies": { "mimic-function": "^5.0.0" } }, "sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ=="], - "ora": ["ora@8.2.0", "", { "dependencies": { "chalk": "^5.3.0", "cli-cursor": "^5.0.0", "cli-spinners": "^2.9.2", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.0.0", "log-symbols": "^6.0.0", "stdin-discarder": "^0.2.2", "string-width": "^7.2.0", "strip-ansi": "^7.1.0" } }, "sha512-weP+BZ8MVNnlCm8c0Qdc1WSWq4Qn7I+9CJGm7Qali6g44e/PUzbjNqJX5NJ9ljlNMosfJvg1fKEGILklK9cwnw=="], + "ora": ["ora@9.3.0", "", { "dependencies": { "chalk": "^5.6.2", "cli-cursor": "^5.0.0", "cli-spinners": "^3.2.0", "is-interactive": "^2.0.0", "is-unicode-supported": "^2.1.0", "log-symbols": "^7.0.1", "stdin-discarder": "^0.3.1", "string-width": "^8.1.0" } }, "sha512-lBX72MWFduWEf7v7uWf5DHp9Jn5BI8bNPGuFgtXMmr2uDz2Gz2749y3am3agSDdkhHPHYmmxEGSKH85ZLGzgXw=="], "parse-ms": ["parse-ms@4.0.0", "", {}, "sha512-TXfryirbmq34y8QBwgqCVLi+8oA3oWx2eAnSn62ITyEhEYaWRlVZ2DvMM9eZbMs/RfxPu/PK/aBLyGj4IrqMHw=="], @@ -406,8 +528,20 @@ "path-to-regexp": ["path-to-regexp@8.3.0", "", {}, "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA=="], + "pathe": ["pathe@2.0.3", "", {}, "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w=="], + + "pathval": ["pathval@2.0.1", "", {}, "sha512-//nshmD55c46FuFw26xV/xFAaB5HF9Xdap7HJBBnrKdAd6/GxDBaNA1870O79+9ueg61cZLSVc+OaFlfmObYVQ=="], + + "picocolors": ["picocolors@1.1.1", "", {}, "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="], + + "picomatch": ["picomatch@4.0.3", "", {}, "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q=="], + "pkce-challenge": ["pkce-challenge@5.0.1", "", {}, "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ=="], + "postcss": ["postcss@8.5.6", "", { "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", "source-map-js": "^1.2.1" } }, "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg=="], + + "prebuild-install": ["prebuild-install@7.1.3", "", { "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", "github-from-package": "0.0.0", "minimist": "^1.2.3", "mkdirp-classic": "^0.5.3", "napi-build-utils": "^2.0.0", "node-abi": "^3.3.0", "pump": "^3.0.0", "rc": "^1.2.7", "simple-get": "^4.0.0", "tar-fs": "^2.0.0", "tunnel-agent": "^0.6.0" }, "bin": { "prebuild-install": "bin.js" } }, "sha512-8Mf2cbV7x1cXPUILADGI3wuhfqWvtiLA1iclTDbFRZkgRQS0NqsPZphna9V+HyTEadheuPmjaJMsbzKQFOzLug=="], + "pretty-bytes": ["pretty-bytes@6.1.1", "", {}, "sha512-mQUvGU6aUFQ+rNvTIAcZuWGRT9a6f6Yrg9bHs4ImKF+HZCEK+plBvnAZYSIQztknZF2qnzNtr6F8s0+IuptdlQ=="], "pretty-ms": ["pretty-ms@9.3.0", "", { "dependencies": { "parse-ms": "^4.0.0" } }, "sha512-gjVS5hOP+M3wMm5nmNOucbIrqudzs9v/57bWRHQWLYklXqoXKrVfYW2W9+glfGsqtPgpiz5WwyEEB+ksXIx3gQ=="], @@ -416,10 +550,12 @@ "proxy-addr": ["proxy-addr@2.0.7", "", { "dependencies": { "forwarded": "0.2.0", "ipaddr.js": "1.9.1" } }, "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg=="], - "proxy-from-env": ["proxy-from-env@1.1.0", "", {}, "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg=="], + "pump": ["pump@3.0.3", "", { "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA=="], "qs": ["qs@6.14.0", "", { "dependencies": { "side-channel": "^1.1.0" } }, "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w=="], + "queue-microtask": ["queue-microtask@1.2.3", "", {}, "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A=="], + "range-parser": ["range-parser@1.2.1", "", {}, "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg=="], "raw-body": ["raw-body@3.0.2", "", { "dependencies": { "bytes": "~3.1.2", "http-errors": "~2.0.1", "iconv-lite": "~0.7.0", "unpipe": "~1.0.0" } }, "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA=="], @@ -432,12 +568,20 @@ "require-from-string": ["require-from-string@2.0.2", "", {}, "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw=="], + "resolve-pkg-maps": ["resolve-pkg-maps@1.0.0", "", {}, "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw=="], + "restore-cursor": ["restore-cursor@5.1.0", "", { "dependencies": { "onetime": "^7.0.0", "signal-exit": "^4.1.0" } }, "sha512-oMA2dcrw6u0YfxJQXm342bFKX/E4sG9rbTzO9ptUcR/e8A33cHuvStiYOwH7fszkZlZ1z/ta9AAoPk2F4qIOHA=="], "retry": ["retry@0.13.1", "", {}, "sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg=="], + "reusify": ["reusify@1.1.0", "", {}, "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw=="], + + "rollup": ["rollup@4.57.1", "", { "dependencies": { "@types/estree": "1.0.8" }, "optionalDependencies": { "@rollup/rollup-android-arm-eabi": "4.57.1", "@rollup/rollup-android-arm64": "4.57.1", "@rollup/rollup-darwin-arm64": "4.57.1", "@rollup/rollup-darwin-x64": "4.57.1", "@rollup/rollup-freebsd-arm64": "4.57.1", "@rollup/rollup-freebsd-x64": "4.57.1", "@rollup/rollup-linux-arm-gnueabihf": "4.57.1", "@rollup/rollup-linux-arm-musleabihf": "4.57.1", "@rollup/rollup-linux-arm64-gnu": "4.57.1", "@rollup/rollup-linux-arm64-musl": "4.57.1", "@rollup/rollup-linux-loong64-gnu": "4.57.1", "@rollup/rollup-linux-loong64-musl": "4.57.1", "@rollup/rollup-linux-ppc64-gnu": "4.57.1", "@rollup/rollup-linux-ppc64-musl": "4.57.1", "@rollup/rollup-linux-riscv64-gnu": "4.57.1", "@rollup/rollup-linux-riscv64-musl": "4.57.1", "@rollup/rollup-linux-s390x-gnu": "4.57.1", "@rollup/rollup-linux-x64-gnu": "4.57.1", "@rollup/rollup-linux-x64-musl": "4.57.1", "@rollup/rollup-openbsd-x64": "4.57.1", "@rollup/rollup-openharmony-arm64": "4.57.1", "@rollup/rollup-win32-arm64-msvc": "4.57.1", "@rollup/rollup-win32-ia32-msvc": "4.57.1", "@rollup/rollup-win32-x64-gnu": "4.57.1", "@rollup/rollup-win32-x64-msvc": "4.57.1", "fsevents": "~2.3.2" }, "bin": { "rollup": "dist/bin/rollup" } }, "sha512-oQL6lgK3e2QZeQ7gcgIkS2YZPg5slw37hYufJ3edKlfQSGGm8ICoxswK15ntSzF/a8+h7ekRy7k7oWc3BQ7y8A=="], + "router": ["router@2.2.0", "", { "dependencies": { "debug": "^4.4.0", "depd": "^2.0.0", "is-promise": "^4.0.0", "parseurl": "^1.3.3", "path-to-regexp": "^8.0.0" } }, "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ=="], + "run-parallel": ["run-parallel@1.2.0", "", { "dependencies": { "queue-microtask": "^1.2.2" } }, "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA=="], + "safe-buffer": ["safe-buffer@5.2.1", "", {}, "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="], "safer-buffer": ["safer-buffer@2.1.2", "", {}, "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="], @@ -448,8 +592,6 @@ "serve-static": ["serve-static@2.2.0", "", { "dependencies": { "encodeurl": "^2.0.0", "escape-html": "^1.0.3", "parseurl": "^1.3.3", "send": "^1.2.0" } }, "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ=="], - "set-blocking": ["set-blocking@2.0.0", "", {}, "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw=="], - "setprototypeof": ["setprototypeof@1.2.0", "", {}, "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw=="], "shebang-command": ["shebang-command@2.0.0", "", { "dependencies": { "shebang-regex": "^3.0.0" } }, "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA=="], @@ -464,13 +606,21 @@ "side-channel-weakmap": ["side-channel-weakmap@1.0.2", "", { "dependencies": { "call-bound": "^1.0.2", "es-errors": "^1.3.0", "get-intrinsic": "^1.2.5", "object-inspect": "^1.13.3", "side-channel-map": "^1.0.1" } }, "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A=="], + "siginfo": ["siginfo@2.0.0", "", {}, "sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g=="], + "signal-exit": ["signal-exit@3.0.7", "", {}, "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ=="], - "simple-git": ["simple-git@3.30.0", "", { "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", "debug": "^4.4.0" } }, "sha512-q6lxyDsCmEal/MEGhP1aVyQ3oxnagGlBDOVSIB4XUVLl1iZh0Pah6ebC9V4xBap/RfgP2WlI8EKs0WS0rMEJHg=="], + "simple-concat": ["simple-concat@1.0.1", "", {}, "sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q=="], + + "simple-get": ["simple-get@4.0.1", "", { "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", "simple-concat": "^1.0.0" } }, "sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA=="], + + "simple-git": ["simple-git@3.32.3", "", { "dependencies": { "@kwsites/file-exists": "^1.1.1", "@kwsites/promise-deferred": "^1.1.1", "debug": "^4.4.0" } }, "sha512-56a5oxFdWlsGygOXHWrG+xjj5w9ZIt2uQbzqiIGdR/6i5iococ7WQ/bNPzWxCJdEUGUCmyMH0t9zMpRJTaKxmw=="], "sleep-promise": ["sleep-promise@9.1.0", "", {}, "sha512-UHYzVpz9Xn8b+jikYSD6bqvf754xL2uBUzDFwiU6NcdZeifPr6UfgU43xpkPu67VMS88+TI2PSI7Eohgqf2fKA=="], - "slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], + "slice-ansi": ["slice-ansi@8.0.0", "", { "dependencies": { "ansi-styles": "^6.2.3", "is-fullwidth-code-point": "^5.1.0" } }, "sha512-stxByr12oeeOyY2BlviTNQlYV5xOj47GirPr4yA1hE9JCtxfQN0+tVbkxwCtYDQWhEKWFHsEK48ORg5jrouCAg=="], + + "source-map-js": ["source-map-js@1.2.1", "", {}, "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="], "sqlite-vec": ["sqlite-vec@0.1.7-alpha.2", "", { "optionalDependencies": { "sqlite-vec-darwin-arm64": "0.1.7-alpha.2", "sqlite-vec-darwin-x64": "0.1.7-alpha.2", "sqlite-vec-linux-arm64": "0.1.7-alpha.2", "sqlite-vec-linux-x64": "0.1.7-alpha.2", "sqlite-vec-windows-x64": "0.1.7-alpha.2" } }, "sha512-rNgRCv+4V4Ed3yc33Qr+nNmjhtrMnnHzXfLVPeGb28Dx5mmDL3Ngw/Wk8vhCGjj76+oC6gnkmMG8y73BZWGBwQ=="], @@ -484,15 +634,19 @@ "sqlite-vec-windows-x64": ["sqlite-vec-windows-x64@0.1.7-alpha.2", "", { "os": "win32", "cpu": "x64" }, "sha512-TRP6hTjAcwvQ6xpCZvjP00pdlda8J38ArFy1lMYhtQWXiIBmWnhMaMbq4kaeCYwvTTddfidatRS+TJrwIKB/oQ=="], + "stackback": ["stackback@0.0.2", "", {}, "sha512-1XMJE5fQo1jGH6Y/7ebnwPOBEkIEnT4QF32d5R1+VXdXveM0IBMJt8zfaxX1P3QhVwrYe+576+jkANtSS2mBbw=="], + "statuses": ["statuses@2.0.2", "", {}, "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw=="], - "stdin-discarder": ["stdin-discarder@0.2.2", "", {}, "sha512-UhDfHmA92YAlNnCfhmq0VeNL5bDbiZGg7sZ2IvPsXubGkiNa9EC+tUTsjBRsYUAz87btI6/1wf4XoVvQ3uRnmQ=="], + "std-env": ["std-env@3.10.0", "", {}, "sha512-5GS12FdOZNliM5mAOxFRg7Ir0pWz8MdpYm6AY6VPkGpbA7ZzmbzNcBJQ0GPvvyWgcY7QAhCgf9Uy89I03faLkg=="], + + "stdin-discarder": ["stdin-discarder@0.3.1", "", {}, "sha512-reExS1kSGoElkextOcPkel4NE99S0BWxjUHQeDFnR8S993JxpPX7KU4MNmO19NXhlJp+8dmdCbKQVNgLJh2teA=="], "stdout-update": ["stdout-update@4.0.1", "", { "dependencies": { "ansi-escapes": "^6.2.0", "ansi-styles": "^6.2.1", "string-width": "^7.1.0", "strip-ansi": "^7.1.0" } }, "sha512-wiS21Jthlvl1to+oorePvcyrIkiG/6M3D3VTmDUlJm7Cy6SbFhKkAvX+YBuHLxck/tO3mrdpC/cNesigQc3+UQ=="], "steno": ["steno@4.0.2", "", {}, "sha512-yhPIQXjrlt1xv7dyPQg2P17URmXbuM5pdGkpiMB3RenprfiBlvK415Lctfe0eshk90oA7/tNq7WEiMK8RSP39A=="], - "string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + "string-width": ["string-width@8.2.0", "", { "dependencies": { "get-east-asian-width": "^1.5.0", "strip-ansi": "^7.1.2" } }, "sha512-6hJPQ8N0V0P3SNmP6h2J99RLuzrWz2gvT7VnK5tKvrNqJoyS9W4/Fb8mo31UiPvy00z7DQXkP2hnKBVav76thw=="], "string_decoder": ["string_decoder@1.3.0", "", { "dependencies": { "safe-buffer": "~5.2.0" } }, "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA=="], @@ -500,22 +654,40 @@ "strip-json-comments": ["strip-json-comments@2.0.1", "", {}, "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ=="], - "tar": ["tar@6.2.1", "", { "dependencies": { "chownr": "^2.0.0", "fs-minipass": "^2.0.0", "minipass": "^5.0.0", "minizlib": "^2.1.1", "mkdirp": "^1.0.3", "yallist": "^4.0.0" } }, "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A=="], + "strip-literal": ["strip-literal@3.1.0", "", { "dependencies": { "js-tokens": "^9.0.1" } }, "sha512-8r3mkIM/2+PpjHoOtiAW8Rg3jJLHaV7xPwG+YRGrv6FP0wwk/toTpATxWYOW0BKdWwl82VT2tFYi5DlROa0Mxg=="], + + "tar": ["tar@7.5.10", "", { "dependencies": { "@isaacs/fs-minipass": "^4.0.0", "chownr": "^3.0.0", "minipass": "^7.1.2", "minizlib": "^3.1.0", "yallist": "^5.0.0" } }, "sha512-8mOPs1//5q/rlkNSPcCegA6hiHJYDmSLEI8aMH/CdSQJNWztHC9WHNam5zdQlfpTwB9Xp7IBEsHfV5LKMJGVAw=="], + + "tar-fs": ["tar-fs@2.1.4", "", { "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^2.1.4" } }, "sha512-mDAjwmZdh7LTT6pNleZ05Yt65HC3E+NiQzl672vQG38jIrehtJk/J3mNwIg+vShQPcLF/LV7CMnDW6vjj6sfYQ=="], + + "tar-stream": ["tar-stream@2.2.0", "", { "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", "fs-constants": "^1.0.0", "inherits": "^2.0.3", "readable-stream": "^3.1.1" } }, "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ=="], + + "tinybench": ["tinybench@2.9.0", "", {}, "sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg=="], + + "tinyexec": ["tinyexec@0.3.2", "", {}, "sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA=="], - "toad-cache": ["toad-cache@3.7.0", "", {}, "sha512-/m8M+2BJUpoJdgAHoG+baCwBT+tf2VraSfkBgl0Y00qIWt41DJ8R5B8nsEw0I58YwF5IZH6z24/2TobDKnqSWw=="], + "tinyglobby": ["tinyglobby@0.2.15", "", { "dependencies": { "fdir": "^6.5.0", "picomatch": "^4.0.3" } }, "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ=="], + + "tinypool": ["tinypool@1.1.1", "", {}, "sha512-Zba82s87IFq9A9XmjiX5uZA/ARWDrB03OHlq+Vw1fSdt0I+4/Kutwy8BP4Y/y/aORMo61FQ0vIb5j44vSo5Pkg=="], + + "tinyrainbow": ["tinyrainbow@2.0.0", "", {}, "sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw=="], + + "tinyspy": ["tinyspy@4.0.4", "", {}, "sha512-azl+t0z7pw/z958Gy9svOTuzqIk6xq+NSheJzn5MMWtWTFywIacg2wUlzKFGtt3cthx0r2SxMK0yzJOR0IES7Q=="], + + "to-regex-range": ["to-regex-range@5.0.1", "", { "dependencies": { "is-number": "^7.0.0" } }, "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ=="], "toidentifier": ["toidentifier@1.0.1", "", {}, "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA=="], + "tsx": ["tsx@4.21.0", "", { "dependencies": { "esbuild": "~0.27.0", "get-tsconfig": "^4.7.5" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "bin": { "tsx": "dist/cli.mjs" } }, "sha512-5C1sg4USs1lfG0GFb2RLXsdpXqBSEhAaA/0kPL01wxzpMqLILNxIxIOKiILz+cdg/pLnOUxFYOR5yhHU666wbw=="], + + "tunnel-agent": ["tunnel-agent@0.6.0", "", { "dependencies": { "safe-buffer": "^5.0.1" } }, "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w=="], + "type-is": ["type-is@2.0.1", "", { "dependencies": { "content-type": "^1.0.5", "media-typer": "^1.1.0", "mime-types": "^3.0.0" } }, "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw=="], "typescript": ["typescript@5.9.3", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw=="], "undici-types": ["undici-types@7.16.0", "", {}, "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw=="], - "universal-github-app-jwt": ["universal-github-app-jwt@2.2.2", "", {}, "sha512-dcmbeSrOdTnsjGjUfAlqNDJrhxXizjAz94ija9Qw8YkZ1uu0d+GoZzyH+Jb9tIIqvGsadUfwg+22k5aDqqwzbw=="], - - "universal-user-agent": ["universal-user-agent@7.0.3", "", {}, "sha512-TmnEAEAsBJVZM/AADELsK76llnwcf9vMKuPz8JflO1frO8Lchitr0fNaN9d+Ap0BjKtqWqd/J17qeDnXh8CL2A=="], - "universalify": ["universalify@2.0.1", "", {}, "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw=="], "unpipe": ["unpipe@1.0.0", "", {}, "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ=="], @@ -524,13 +696,19 @@ "util-deprecate": ["util-deprecate@1.0.2", "", {}, "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="], - "validate-npm-package-name": ["validate-npm-package-name@6.0.2", "", {}, "sha512-IUoow1YUtvoBBC06dXs8bR8B9vuA3aJfmQNKMoaPG/OFsPmoQvw8xh+6Ye25Gx9DQhoEom3Pcu9MKHerm/NpUQ=="], + "validate-npm-package-name": ["validate-npm-package-name@7.0.2", "", {}, "sha512-hVDIBwsRruT73PbK7uP5ebUt+ezEtCmzZz3F59BSr2F6OVFnJ/6h8liuvdLrQ88Xmnk6/+xGGuq+pG9WwTuy3A=="], "vary": ["vary@1.1.2", "", {}, "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg=="], - "which": ["which@5.0.0", "", { "dependencies": { "isexe": "^3.1.1" }, "bin": { "node-which": "bin/which.js" } }, "sha512-JEdGzHwwkrbWoGOlIHqQ5gtprKGOenpDHpxE9zVR1bWbOtYRyPPHMe9FaP6x61CmNaTThSkb0DAJte5jD+DmzQ=="], + "vite": ["vite@7.3.1", "", { "dependencies": { "esbuild": "^0.27.0", "fdir": "^6.5.0", "picomatch": "^4.0.3", "postcss": "^8.5.6", "rollup": "^4.43.0", "tinyglobby": "^0.2.15" }, "optionalDependencies": { "fsevents": "~2.3.3" }, "peerDependencies": { "@types/node": "^20.19.0 || >=22.12.0", "jiti": ">=1.21.0", "less": "^4.0.0", "lightningcss": "^1.21.0", "sass": "^1.70.0", "sass-embedded": "^1.70.0", "stylus": ">=0.54.8", "sugarss": "^5.0.0", "terser": "^5.16.0", "tsx": "^4.8.1", "yaml": "^2.4.2" }, "optionalPeers": ["@types/node", "jiti", "less", "lightningcss", "sass", "sass-embedded", "stylus", "sugarss", "terser", "tsx", "yaml"], "bin": { "vite": "bin/vite.js" } }, "sha512-w+N7Hifpc3gRjZ63vYBXA56dvvRlNWRczTdmCBBa+CotUzAPf5b7YMdMR/8CQoeYE5LX3W4wj6RYTgonm1b9DA=="], + + "vite-node": ["vite-node@3.2.4", "", { "dependencies": { "cac": "^6.7.14", "debug": "^4.4.1", "es-module-lexer": "^1.7.0", "pathe": "^2.0.3", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0" }, "bin": { "vite-node": "vite-node.mjs" } }, "sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg=="], - "wide-align": ["wide-align@1.1.5", "", { "dependencies": { "string-width": "^1.0.2 || 2 || 3 || 4" } }, "sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg=="], + "vitest": ["vitest@3.2.4", "", { "dependencies": { "@types/chai": "^5.2.2", "@vitest/expect": "3.2.4", "@vitest/mocker": "3.2.4", "@vitest/pretty-format": "^3.2.4", "@vitest/runner": "3.2.4", "@vitest/snapshot": "3.2.4", "@vitest/spy": "3.2.4", "@vitest/utils": "3.2.4", "chai": "^5.2.0", "debug": "^4.4.1", "expect-type": "^1.2.1", "magic-string": "^0.30.17", "pathe": "^2.0.3", "picomatch": "^4.0.2", "std-env": "^3.9.0", "tinybench": "^2.9.0", "tinyexec": "^0.3.2", "tinyglobby": "^0.2.14", "tinypool": "^1.1.1", "tinyrainbow": "^2.0.0", "vite": "^5.0.0 || ^6.0.0 || ^7.0.0-0", "vite-node": "3.2.4", "why-is-node-running": "^2.3.0" }, "peerDependencies": { "@edge-runtime/vm": "*", "@types/debug": "^4.1.12", "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", "@vitest/browser": "3.2.4", "@vitest/ui": "3.2.4", "happy-dom": "*", "jsdom": "*" }, "optionalPeers": ["@edge-runtime/vm", "@types/debug", "@types/node", "@vitest/browser", "@vitest/ui", "happy-dom", "jsdom"], "bin": { "vitest": "vitest.mjs" } }, "sha512-LUCP5ev3GURDysTWiP47wRRUpLKMOfPh+yKTx3kVIEiu5KOMeqzpnYNsKyOoVrULivR8tLcks4+lga33Whn90A=="], + + "which": ["which@6.0.1", "", { "dependencies": { "isexe": "^4.0.0" }, "bin": { "node-which": "bin/which.js" } }, "sha512-oGLe46MIrCRqX7ytPUf66EAYvdeMIZYn3WaocqqKZAxrBpkqHfL/qvTyJ/bTk5+AqHCjXmrv3CEWgy368zhRUg=="], + + "why-is-node-running": ["why-is-node-running@2.3.0", "", { "dependencies": { "siginfo": "^2.0.0", "stackback": "0.0.2" }, "bin": { "why-is-node-running": "cli.js" } }, "sha512-hUrmaWBdVDcxvYqnyh09zunKzROWjbZTiNy8dBEjkS7ehEDQibXJ7XvlmtbwuTclUiIyN+CyXQD4Vmko8fNm8w=="], "wrap-ansi": ["wrap-ansi@7.0.0", "", { "dependencies": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", "strip-ansi": "^6.0.0" } }, "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q=="], @@ -538,7 +716,7 @@ "y18n": ["y18n@5.0.8", "", {}, "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA=="], - "yallist": ["yallist@4.0.0", "", {}, "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A=="], + "yallist": ["yallist@5.0.0", "", {}, "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw=="], "yaml": ["yaml@2.8.2", "", { "bin": { "yaml": "bin.mjs" } }, "sha512-mplynKqc1C2hTVYxd0PU2xQAc22TI1vShAYGksCCfxbn/dFwnHTNi1bvYsBTkhdUNtGIf5xNOg938rrSSYvS9A=="], @@ -556,31 +734,29 @@ "cliui/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "cmake-js/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "cross-spawn/which": ["which@2.0.2", "", { "dependencies": { "isexe": "^2.0.0" }, "bin": { "node-which": "./bin/node-which" } }, "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA=="], - "form-data/mime-types": ["mime-types@2.1.35", "", { "dependencies": { "mime-db": "1.52.0" } }, "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw=="], - - "fs-minipass/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "ipull/lifecycle-utils": ["lifecycle-utils@2.1.0", "", {}, "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA=="], - "gauge/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "ipull/pretty-ms": ["pretty-ms@8.0.0", "", { "dependencies": { "parse-ms": "^3.0.0" } }, "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q=="], - "gauge/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "ipull/slice-ansi": ["slice-ansi@7.1.2", "", { "dependencies": { "ansi-styles": "^6.2.1", "is-fullwidth-code-point": "^5.0.0" } }, "sha512-iOBWFgUX7caIZiuutICxVgX1SdxwAVFFKwt1EvMYYec/NWO5meOJ6K5uQxhrYBdQJne4KxiqZc+KptFOWFSI9w=="], - "ipull/lifecycle-utils": ["lifecycle-utils@2.1.0", "", {}, "sha512-AnrXnE2/OF9PHCyFg0RSqsnQTzV991XaZA/buhFDoc58xU7rhSCDgCz/09Lqpsn4MpoPHt7TRAXV1kWZypFVsA=="], + "is-fullwidth-code-point/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], - "ipull/pretty-ms": ["pretty-ms@8.0.0", "", { "dependencies": { "parse-ms": "^3.0.0" } }, "sha512-ASJqOugUF1bbzI35STMBUpZqdfYKlJugy6JBziGi2EE+AL5JPJGSzvpeVXojxrr0ViUYoToUjb5kjSEGf7Y83Q=="], + "micromatch/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], + "ora/cli-spinners": ["cli-spinners@3.4.0", "", {}, "sha512-bXfOC4QcT1tKXGorxL3wbJm6XJPDqEnij2gQ2m7ESQuE+/z9YFIWnl/5RpTiKWbMq3EVKR4fRLJGn6DVfu0mpw=="], - "ora/log-symbols": ["log-symbols@6.0.0", "", { "dependencies": { "chalk": "^5.3.0", "is-unicode-supported": "^1.3.0" } }, "sha512-i24m8rpwhmPIS4zscNzK6MSEhk0DUWa/8iYQWxhffV8jkI4Phvs3F+quL5xvS0gdQR0FyTCMMH33Y78dDTzzIw=="], + "postcss/nanoid": ["nanoid@3.3.11", "", { "bin": { "nanoid": "bin/nanoid.cjs" } }, "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="], "proper-lockfile/retry": ["retry@0.12.0", "", {}, "sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow=="], "restore-cursor/signal-exit": ["signal-exit@4.1.0", "", {}, "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw=="], - "wide-align/string-width": ["string-width@4.2.3", "", { "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", "strip-ansi": "^6.0.1" } }, "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g=="], + "stdout-update/string-width": ["string-width@7.2.0", "", { "dependencies": { "emoji-regex": "^10.3.0", "get-east-asian-width": "^1.0.0", "strip-ansi": "^7.1.0" } }, "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ=="], + + "tar/chownr": ["chownr@3.0.0", "", {}, "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g=="], "wrap-ansi/ansi-styles": ["ansi-styles@4.3.0", "", { "dependencies": { "color-convert": "^2.0.1" } }, "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg=="], @@ -596,27 +772,11 @@ "cliui/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "cmake-js/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "cross-spawn/which/isexe": ["isexe@2.0.0", "", {}, "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw=="], - "form-data/mime-types/mime-db": ["mime-db@1.52.0", "", {}, "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="], - - "gauge/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "gauge/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "gauge/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "ipull/pretty-ms/parse-ms": ["parse-ms@3.0.0", "", {}, "sha512-Tpb8Z7r7XbbtBTrM9UhpkzzaMrqA2VXMT3YChzYltwV3P3pM6t8wl7TvpMnSTosz1aQAdVib7kdoys7vYOPerw=="], - "ora/log-symbols/is-unicode-supported": ["is-unicode-supported@1.3.0", "", {}, "sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ=="], - - "wide-align/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], - - "wide-align/string-width/is-fullwidth-code-point": ["is-fullwidth-code-point@3.0.0", "", {}, "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg=="], - - "wide-align/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], + "stdout-update/string-width/get-east-asian-width": ["get-east-asian-width@1.4.0", "", {}, "sha512-QZjmEOC+IT1uk6Rx0sX22V6uHWVwbdbxf1faPqJ1QhLdGgsRGCZoyaQBm/piRdJy/D2um6hM1UP7ZEeQ4EkP+Q=="], "wrap-ansi/string-width/emoji-regex": ["emoji-regex@8.0.0", "", {}, "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A=="], @@ -630,8 +790,6 @@ "yargs/string-width/strip-ansi": ["strip-ansi@6.0.1", "", { "dependencies": { "ansi-regex": "^5.0.1" } }, "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A=="], - "wide-align/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], - "yargs/string-width/strip-ansi/ansi-regex": ["ansi-regex@5.0.1", "", {}, "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ=="], } } diff --git a/docs/SYNTAX.md b/docs/SYNTAX.md new file mode 100644 index 00000000..b53ec69c --- /dev/null +++ b/docs/SYNTAX.md @@ -0,0 +1,181 @@ +# QMD Query Syntax + +QMD queries are structured documents with typed sub-queries. Each line specifies a search type and query text. + +## Grammar + +```ebnf +query = expand_query | query_document ; +expand_query = text | explicit_expand ; +explicit_expand= "expand:" text ; +query_document = [ intent_line ] { typed_line } ; +intent_line = "intent:" text newline ; +typed_line = type ":" text newline ; +type = "lex" | "vec" | "hyde" ; +text = quoted_phrase | plain_text ; +quoted_phrase = '"' { character } '"' ; +plain_text = { character } ; +newline = "\n" ; +``` + +## Query Types + +| Type | Method | Description | +|------|--------|-------------| +| `lex` | BM25 | Keyword search with exact matching | +| `vec` | Vector | Semantic similarity search | +| `hyde` | Vector | Hypothetical document embedding | + +## Default Behavior + +A QMD query is either a single expand query or a multi-line query document. Any single-line query with no prefix is treated as an expand query and passed to the expansion model, which emits lex, vec, and hyde variants automatically. + +``` +# These are equivalent and cannot be combined with typed lines: +how does authentication work +expand: how does authentication work +``` + +## Lex Query Syntax + +Lex queries support special syntax for precise keyword matching: + +```ebnf +lex_query = { lex_term } ; +lex_term = negation | phrase | word ; +negation = "-" ( phrase | word ) ; +phrase = '"' { character } '"' ; +word = { letter | digit | "'" } ; +``` + +| Syntax | Meaning | Example | +|--------|---------|---------| +| `word` | Prefix match | `perf` matches "performance" | +| `"phrase"` | Exact phrase | `"rate limiter"` | +| `-word` | Exclude term | `-sports` | +| `-"phrase"` | Exclude phrase | `-"test data"` | + +### Examples + +``` +lex: CAP theorem consistency +lex: "machine learning" -"deep learning" +lex: auth -oauth -saml +``` + +## Vec Query Syntax + +Vec queries are natural language questions. No special syntax — just write what you're looking for. + +``` +vec: how does the rate limiter handle burst traffic +vec: what is the tradeoff between consistency and availability +``` + +## Hyde Query Syntax + +Hyde queries are hypothetical answer passages (50-100 words). Write what you expect the answer to look like. + +``` +hyde: The rate limiter uses a sliding window algorithm with a 60-second window. When a client exceeds 100 requests per minute, subsequent requests return 429 Too Many Requests. +``` + +## Multi-Line Queries + +Combine multiple query types for best results. First query gets 2x weight in fusion. + +``` +lex: rate limiter algorithm +vec: how does rate limiting work in the API +hyde: The API implements rate limiting using a token bucket algorithm... +``` + +## Expand Queries + +An expand query stands alone; it's not mixed with typed lines. You can either rely on the default untyped form or add the explicit `expand:` prefix: + +``` +expand: error handling best practices +# equivalent +error handling best practices +``` + +Both forms call the local query expansion model, which generates lex, vec, and hyde variations automatically. + +## Intent + +An optional `intent:` line provides background context to disambiguate ambiguous queries. It steers query expansion, reranking, and snippet extraction but does not search on its own. + +- At most one `intent:` line per query document +- `intent:` cannot appear alone — at least one `lex:`, `vec:`, or `hyde:` line is required +- Intent is also available via the `--intent` CLI flag or MCP `intent` parameter + +``` +intent: web page load times and Core Web Vitals +lex: performance +vec: how to improve performance +``` + +Without intent, "performance" is ambiguous (web-perf? team health? fitness?). With intent, the search pipeline preferentially selects and ranks web-performance content. + +## Constraints + +- Top-level query must be either a standalone expand query or a multi-line document +- Query documents allow only `lex`, `vec`, `hyde`, and `intent` typed lines (no `expand:` inside) +- `lex` syntax (`-term`, `"phrase"`) only works in lex queries +- At most one `intent:` line per query document; cannot appear alone +- Empty lines are ignored +- Leading/trailing whitespace is trimmed + +## MCP/HTTP API + +The `query` tool accepts a query document: + +```json +{ + "q": "lex: CAP theorem\nvec: consistency vs availability", + "collections": ["docs"], + "limit": 10 +} +``` + +Or structured format: + +```json +{ + "searches": [ + { "type": "lex", "query": "CAP theorem" }, + { "type": "vec", "query": "consistency vs availability" } + ] +} +``` + +With intent: + +```json +{ + "searches": [ + { "type": "lex", "query": "performance" } + ], + "intent": "web page load times and Core Web Vitals" +} +``` + +## CLI + +```bash +# Single line (implicit expand) +qmd query "how does auth work" + +# Multi-line with types +qmd query $'lex: auth token\nvec: how does authentication work' + +# Structured +qmd query $'lex: keywords\nvec: question\nhyde: hypothetical answer...' + +# With intent (inline) +qmd query $'intent: web performance and latency\nlex: performance\nvec: how to improve performance' + +# With intent (flag) +qmd query --intent "web performance and latency" "performance" +``` diff --git a/finetune/BALANCED_DISTRIBUTION.md b/finetune/BALANCED_DISTRIBUTION.md deleted file mode 100644 index 5acbe484..00000000 --- a/finetune/BALANCED_DISTRIBUTION.md +++ /dev/null @@ -1,157 +0,0 @@ -# QMD Training Data - Balanced Distribution Summary - -## Overview - -The training data has been rebalanced to reduce excessive tech focus while maintaining adequate technical coverage for QMD's use case. The new distribution emphasizes diverse life topics while keeping tech at a reasonable 15%. - -## Distribution Comparison - -### Before (Original Data) -``` -Technical: ~50% ████████████████████████████████████████ -How-to: ~45% █████████████████████████████████████ -What-is: ~40% █████████████████████████████████ -Other: ~15% ████████████ -Short queries: 10% ████████ -Temporal: 1.6% █ -Named entities: 3.4% ██ -``` - -### After (Balanced Approach) -``` -Category Percentage -──────────────────────────────────────── -Health & Wellness 12% █████████ -Finance & Business 12% █████████ -Technology 15% ███████████ -Home & Garden 10% ████████ -Food & Cooking 10% ████████ -Travel & Geography 10% ████████ -Hobbies & Crafts 10% ████████ -Education & Learning 8% ██████ -Arts & Culture 8% ██████ -Lifestyle & Relationships 5% ████ -──────────────────────────────────────── -Short queries (1-2 words): 20% -Temporal (2025/2026): 15% -Named entities: 10%+ -``` - -## Key Improvements - -### 1. Category Diversity - -**New Non-Tech Categories Added:** -- **Health & Wellness**: Meditation, fitness, nutrition, mental health -- **Finance & Business**: Budgeting, investing, career, entrepreneurship -- **Home & Garden**: DIY, repairs, cleaning, gardening, organization -- **Food & Cooking**: Recipes, techniques, meal planning, nutrition -- **Travel & Geography**: Travel planning, destinations, geography facts -- **Hobbies & Crafts**: Photography, art, music, woodworking, knitting -- **Education & Learning**: Study techniques, languages, online courses -- **Arts & Culture**: Art history, music, film, theater, literature -- **Lifestyle & Relationships**: Habits, relationships, parenting, minimalism - -### 2. Temporal Queries (2025/2026) - -Updated to use current era years for recency queries: -- "latest research 2026" -- "Shopify updates 2025" -- "what changed in React 2026" -- "AI developments 2025" - -This ensures the model learns to handle queries from the current time period. - -### 3. Short Query Coverage - -Expanded from 47 to 144+ short keywords across all categories: -- Tech: auth, config, api, cache, deploy -- Health: meditate, hydrate, stretch, exercise -- Finance: budget, save, invest, taxes -- Home: clean, organize, repair, garden -- Food: cook, bake, recipe, meal -- Travel: travel, pack, passport, hotel -- Hobbies: photo, draw, paint, knit, guitar -- Education: study, learn, course, exam -- Arts: art, music, film, dance -- Life: habit, routine, organize, parent - -## Usage - -### Quick Start - Use Balanced Data - -```bash -cd finetune - -# Add 500 balanced examples -cat data/qmd_expansion_balanced.jsonl >> data/qmd_expansion_v2.jsonl - -# Prepare with enhanced short query templates -uv run dataset/prepare_data.py --add-short 2 - -# Train -uv run train.py sft --config configs/sft.yaml -``` - -### Generate Fresh Data with Claude API - -```bash -# Set API key -export ANTHROPIC_API_KEY=your_key - -# Generate 300 balanced examples -uv run dataset/generate_data.py --count 300 \ - --output data/qmd_expansion_fresh.jsonl - -# Analyze distribution -uv run dataset/analyze_data.py --input data/qmd_expansion_fresh.jsonl - -# Prepare for training -uv run dataset/prepare_data.py --input data/qmd_expansion_fresh.jsonl -``` - -### Generate Even More Balanced Examples - -```bash -# Generate 500 life-focused examples (15% tech) -uv run dataset/generate_balanced.py - -# Or generate 265 additional diverse examples -uv run dataset/generate_diverse.py -``` - -## File Summary - -### Modified Files: -- `dataset/generate_data.py` - Added category weights (15% tech), 2025/2026 dates -- `dataset/prepare_data.py` - Expanded SHORT_QUERIES from 47→144, templates 5→16 - -### New Files: -- `dataset/generate_balanced.py` - Life-focused generator (500 examples) -- `dataset/generate_diverse.py` - Philosophy/History/Geography/Trivia generator (265 examples) -- `dataset/analyze_data.py` - Dataset analysis and quality reporting -- `DATA_IMPROVEMENTS.md` - Detailed improvement documentation - -### Generated Data: -- `data/qmd_expansion_balanced.jsonl` - 500 balanced examples -- `data/qmd_expansion_diverse_addon.jsonl` - 265 diverse examples - -## Expected Benefits - -1. **Better Short Query Handling**: 20% coverage vs 10% before -2. **Named Entity Preservation**: 10%+ coverage vs 3.4% before -3. **Temporal Understanding**: 15% with 2025/2026 vs 1.6% before -4. **Domain Diversity**: 10 categories vs tech-only before -5. **Life-Document Search**: Better at searching personal notes on health, finance, hobbies - -## Next Steps - -1. Merge balanced examples into training set -2. Retrain model with improved distribution -3. Evaluate using `evals/queries.txt` -4. Monitor scores on temporal/named-entity/short queries -5. Iterate based on results - ---- - -Generated: 2026-01-30 diff --git a/finetune/CLAUDE.md b/finetune/CLAUDE.md index 9b20b2ae..50a114bd 100644 --- a/finetune/CLAUDE.md +++ b/finetune/CLAUDE.md @@ -18,105 +18,77 @@ vec: another semantic variation - `lex:` lines for BM25 keyword search (1-3 lines, short keywords) - `vec:` lines for vector similarity search (1-3 lines, natural language) +## Training Data Format + +**There is exactly one JSONL format.** Every file in `data/*.jsonl` must match the strict Pydantic schema in `dataset/schema.py`: + +```json +{"query": "auth config", "output": [["hyde", "..."], ["lex", "..."], ["vec", "..."]]} +``` + +- `query`: non-empty string +- `output`: list of `[type, text]` pairs where type is `"lex"`, `"vec"`, or `"hyde"` +- Extra metadata fields (`category`, `intent`, `is_short`) are allowed but ignored + +The schema is enforced by `dataset/schema.py:TrainingExample` (Pydantic model). All data loading goes through `load_examples()` which fails loudly on invalid data. No format alternatives, no legacy fallbacks. + +**All `.jsonl` files in `data/` are concatenated and deduplicated for training runs.** The prepared train/val files in `data/train/` are ephemeral build artifacts. + ## HuggingFace Repositories | Repository | Purpose | |------------|---------| -| `tobil/qmd-query-expansion-1.7B` | Final merged model (SFT + GRPO) | +| `tobil/qmd-query-expansion-1.7B` | Final merged model (SFT baseline) | | `tobil/qmd-query-expansion-1.7B-gguf` | GGUF quantized versions for deployment | | `tobil/qmd-query-expansion-1.7B-sft` | SFT adapter checkpoint (intermediate) | -| `tobil/qmd-query-expansion-1.7B-grpo` | GRPO adapter checkpoint (intermediate) | | `tobil/qmd-query-expansion-train` | Prepared training dataset | +| `tobil/qmd-query-expansion-1.7B-grpo` | Experimental GRPO adapter (optional) | **Rules:** - No versioned repos (`-v1`, `-v2`, `-v4`, etc.) - update in place - Only push when eval scores improve over current deployed model - Always include eval results in model card when pushing -## Training Data - -All JSONL files in `data/` are training data: - -``` -data/ -├── qmd_expansion_v2.jsonl -├── qmd_expansion_handcrafted_only.jsonl -├── qmd_only_sampled.jsonl -├── qmd_only_variants.jsonl -└── ... any additional .jsonl files -``` - -**All `.jsonl` files in `data/` should be concatenated for training runs.** - -Each JSONL line: `{"input": "query", "output": "hyde:...\nlex:...\nvec:..."}` - -## Data Generation Tools +## Dataset Tools | Script | Purpose | |--------|---------| -| `dataset/generate_data.py` | Generate via Claude API (high quality) | -| `dataset/generate_data_offline.py` | Transform from HuggingFace datasets | -| `dataset/prepare_data.py` | Format for Qwen3 chat template | -| `dataset/clean_data.py` | Detect and fix technical term issues | -| `generate_only_variants.py` | Generate `/only:lex` and `/only:vec` variants | - -## Local Training Output - -All training outputs go to `outputs/` (gitignored): - -``` -outputs/ -├── sft/ # SFT checkpoint -└── grpo/ # GRPO checkpoint -``` +| `dataset/schema.py` | Pydantic `TrainingExample` model + `load_examples()` | +| `dataset/prepare_data.py` | Load via schema, apply Qwen3 chat template, dedup, split | +| `dataset/validate_schema.py` | Validate all JSONL files against schema | +| `dataset/score_data.py` | Score all examples using reward.py | +| `dataset/analyze_data.py` | Analyze distribution and quality | ## Training Pipeline Always use **Qwen3-1.7B** as the base model unless explicitly stated otherwise. -Training can run **locally** (requires CUDA GPU) or via **HuggingFace Jobs** (cloud GPU, no local hardware needed). - ### Stage 0: Prepare Data -Raw data in `data/*.jsonl` must be converted to Qwen3 chat format before training: - ```bash -# Process all JSONL files in data/ uv run dataset/prepare_data.py -# Creates: data/train/train.jsonl, data/train/val.jsonl - -# Or process a specific file -uv run dataset/prepare_data.py --input data/qmd_expansion_v2.jsonl +# Creates: data/train/train.jsonl, data/train/val.jsonl (ephemeral) ``` -This applies the Qwen3 chat template, deduplicates, and splits into train/val sets. - ### Stage 1: SFT ```bash # Local (requires CUDA) uv run train.py sft --config configs/sft.yaml -# Output: outputs/sft/ -# Cloud (HuggingFace Jobs - no local GPU needed) +# Cloud (HuggingFace Jobs) hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 2h jobs/sft.py ``` -### Stage 2: GRPO +### Stage 2: (Experimental) GRPO ```bash -# Local (requires CUDA) -uv run train.py grpo --config configs/grpo.yaml -# Output: outputs/grpo/ - -# Cloud (HuggingFace Jobs - no local GPU needed) -hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 4h jobs/grpo.py +# Experimental script +cd finetune && HF_TOKEN=${HF_TOKEN} uv run python experiments/grpo/grpo.py ``` ### HuggingFace Jobs -If no local CUDA device is available, use `hf jobs` to run training in the cloud: - ```bash hf jobs ps # List running jobs hf jobs logs # Stream logs @@ -124,19 +96,12 @@ hf jobs inspect # Check status hf jobs cancel # Cancel a job ``` -The `jobs/` directory contains self-contained scripts that include all dependencies inline. - ### Evaluation ```bash -# Eval local model -uv run eval.py --model ./outputs/grpo - -# Eval HuggingFace model -uv run eval.py --model tobil/qmd-query-expansion-1.7B - -# Save eval results to file -uv run eval.py --model ./outputs/grpo -o eval_results.json +uv run eval.py ./outputs/sft +uv run eval.py tobil/qmd-query-expansion-1.7B +uv run eval.py ./outputs/sft -o eval_results.json ``` ## Quality Scoring @@ -144,42 +109,46 @@ uv run eval.py --model ./outputs/grpo -o eval_results.json `reward.py` is the single source of truth for scoring: ```bash -# Self-test the reward function -uv run reward.py +uv run reward.py # Self-test ``` See `SCORING.md` for the full rubric. -## Deployment Rules +## Experiments -**Never upload without eval.** Every model push must include eval results. +Experimental training configurations live in `experiments/`: -### Checklist +``` +experiments/ +├── lfm2/ # LiquidAI LFM2-1.2B (hybrid architecture, faster inference) +│ ├── sft_lfm2.yaml +│ └── sft_lfm2.py +├── grpo/ # Experimental GRPO recipe and config +│ ├── grpo.py +│ └── grpo.yaml +└── gepa/ # DSPy-based prompt optimization (GEPA) + ├── dspy_gepa.py + └── ... +``` -1. Train SFT on all `data/*.jsonl` → `outputs/sft/` -2. Train GRPO on top of SFT → `outputs/grpo/` -3. **Run eval on local model**: `uv run eval.py --model ./outputs/grpo -o eval_results.json` -4. Compare against current deployed model's eval -5. If eval improves: - - Push to `tobil/qmd-query-expansion-1.7B` - - **Include eval output in the model card / commit message** -6. Convert to GGUF and update `tobil/qmd-query-expansion-1.7B-gguf` -7. Update `src/llm.ts` DEFAULT_GENERATE_MODEL if repo name changed +These are not part of the main training pipeline. ## Key Files ``` finetune/ ├── reward.py # Scoring function (single source of truth) -├── train.py # Unified SFT + GRPO training +├── train.py # SFT training entrypoint ├── eval.py # Generate and score expansions ├── convert_gguf.py # GGUF conversion ├── SCORING.md # Detailed scoring rubric ├── CLAUDE.md # This file -├── data/ # All training JSONL files -├── outputs/ # Local training outputs (gitignored) -├── dataset/ # Data generation scripts +├── Justfile # Common commands +├── data/ # All training JSONL files (strict schema) +├── dataset/ # Schema + data tools (Pydantic-based) ├── jobs/ # Self-contained HuggingFace Jobs scripts -├── configs/ # Training configs (sft.yaml, grpo.yaml) -└── evals/ # Test queries and results +├── configs/ # Training configs (sft.yaml) +├── evals/ # Test queries +├── experiments/ # Experimental configs (LFM2, GEPA, GRPO) +└── outputs/ # Local training outputs (gitignored) ``` diff --git a/finetune/DATA_IMPROVEMENTS.md b/finetune/DATA_IMPROVEMENTS.md deleted file mode 100644 index 7c7460c6..00000000 --- a/finetune/DATA_IMPROVEMENTS.md +++ /dev/null @@ -1,218 +0,0 @@ -# QMD Training Data Improvements Summary - -## Overview - -This document summarizes the improvements made to the QMD query expansion training data to increase diversity and quality. - -## Issues Identified - -### 1. Query Template Diversity (CRITICAL) -- **Before**: Only 10 query templates in `generate_data.py` -- **Impact**: Limited variety in generated queries, repetitive patterns - -### 2. Short Query Coverage (CRITICAL) -- **Before**: 47 short technical terms in `prepare_data.py` -- **Current**: 100 short queries (10.0% of data) -- **Target**: 15%+ for proper ambiguous query handling - -### 3. Named Entity Queries (CRITICAL) -- **Current**: Only 34 named entity queries (3.4%) -- **Target**: 10%+ for entity preservation training -- **Impact**: Model struggles with capitalized tech terms (React, Docker, etc.) - -### 4. Temporal/Recency Queries (CRITICAL) -- **Current**: Only 16 temporal queries (1.6%) -- **Target**: 5%+ for eval alignment -- **Impact**: Poor handling of "latest", "recent", "2024" queries - -### 5. Hyde Length Issues -- **Current**: 997/1000 examples have hyde >200 chars -- **Impact**: May cause truncation issues during training - -## Improvements Implemented - -### 1. Enhanced `dataset/generate_data.py` - -#### Query Templates (10 → 46 templates) -Added organized categories with balanced weights: -- **Technical** (35%): 14 templates for documentation queries -- **Personal** (10%): 8 templates for notes/journals -- **Research** (15%): 9 templates for learning queries -- **Short** (20%): 6 templates for keyword queries -- **Temporal** (15%): 7 templates for recency queries -- **Entities** (5%): 4 templates for named entity queries - -#### Word Lists (10× expansion) -- **TECHNOLOGIES**: 10 → 60+ (languages, frameworks, databases, tools, cloud, ML) -- **TECHNOLOGIES_2**: Added for comparison queries -- **ACTIONS**: 8 → 22 verbs -- **CONCEPTS**: 8 → 25 concepts -- **USE_CASES**: 5 → 16 scenarios -- **ERROR_TYPES**: 5 → 16 error categories -- **TOPICS**: 5 → 20 topics -- **KEYWORDS**: 8 → 72 short technical terms -- **MODIFIERS**: 5 → 24 modifiers including temporal -- **NAMED_ENTITIES**: 24 capitalized tech names -- **PERSONS**: 12 tech personalities -- **ORGANIZATIONS**: 14 tech companies -- **PRODUCTS**: 16 developer tools - -#### Category-Weighted Sampling -- New `CATEGORY_WEIGHTS` dictionary ensures balanced generation -- `generate_random_query()` now selects templates by category weight -- Guarantees 20% short queries, 15% temporal, 10% named entities - -### 2. Enhanced `dataset/prepare_data.py` - -#### Short Queries (47 → 144 queries) -Expanded SHORT_QUERIES with organized categories: -- Programming languages & runtimes (20) -- Frontend frameworks (11) -- Backend frameworks (8) -- Databases (11) -- Infrastructure & DevOps (12) -- Cloud platforms (10) -- Tools & utilities (12) -- Security & auth (13) -- Web technologies (12) -- Data & ML (11) -- Testing (8) -- Build tools (7) -- Monitoring & observability (7) -- API & integration (7) -- Architecture patterns (8) -- Development concepts (21) -- **General knowledge** (NEW): - - Trivia (5) - - Geography (11) - - Philosophy (6) - - History (8) - - Science (11) - - Arts & culture (10) -- Common short phrases (28) - -#### Short Templates (5 → 16 templates) -Added diverse templates for different query intents: -- Configuration/Setup (original) -- Tutorial/Learning (original) -- Best practices (original) -- Troubleshooting (original) -- Examples/Code (original) -- Documentation/Reference (NEW) -- Installation (NEW) -- Comparison (NEW) -- Performance (NEW) -- Security (NEW) -- Testing (NEW) -- Deployment (NEW) -- Debugging (NEW) -- Integration (NEW) -- Migration (NEW) - -### 3. New `dataset/generate_diverse.py` - -Created script to generate 265 additional examples: -- **Trivia**: 10 queries (world capitals, facts, records) -- **Geography**: 13 queries (countries, rivers, mountains, climate) -- **Philosophy**: 13 queries (stoicism, existentialism, ethics, logic) -- **History**: 13 queries (ancient, medieval, wars, civilizations) -- **Science**: 10 queries (physics, biology, evolution, climate) -- **Arts/Culture**: 10 queries (art, music, literature, film) -- **Temporal**: 182 queries (latest, recent, changelog, updates) -- **Named Entities**: 14 queries (React, Docker, AWS, etc.) - -### 4. New `dataset/analyze_data.py` - -Created comprehensive analysis tool: -- Query length distribution tracking -- Category distribution analysis -- Named entity detection -- Temporal query identification -- Output format validation -- Duplicate detection -- Recommendation engine - -## Usage Instructions - -### To add diverse examples to existing data: - -```bash -# Append diverse examples -cat finetune/data/qmd_expansion_diverse_addon.jsonl >> finetune/data/qmd_expansion_v2.jsonl - -# Prepare with enhanced short query templates -uv run dataset/prepare_data.py --add-short 2 -``` - -### To generate new data with improved templates: - -```bash -# Set API key -export ANTHROPIC_API_KEY=your_key - -# Generate 200 new examples with weighted categories -uv run dataset/generate_data.py --count 200 --output data/qmd_expansion_new.jsonl - -# Analyze the generated data -uv run dataset/analyze_data.py --input data/qmd_expansion_new.jsonl - -# Prepare for training -uv run dataset/prepare_data.py --input data/qmd_expansion_new.jsonl --add-short 3 -``` - -### To analyze current dataset: - -```bash -uv run dataset/analyze_data.py --input data/qmd_expansion_v2.jsonl --show-examples 3 -``` - -## Expected Impact - -### After Applying Improvements: - -1. **Short Queries**: 10% → ~20% (meets 15% target) -2. **Named Entities**: 3.4% → ~12% (exceeds 10% target) -3. **Temporal Queries**: 1.6% → ~10% (exceeds 5% target) -4. **Query Diversity**: 10 templates → 46 templates (4.6× variety) -5. **Domain Coverage**: Tech-only → Tech + Trivia/Geography/Philosophy/History/Science/Arts - -### Model Performance Improvements: - -- Better handling of ambiguous short queries ("auth", "config") -- Improved entity preservation for tech terms (React, Docker, Kubernetes) -- Enhanced temporal understanding ("latest", "recent", "2024") -- More robust query expansion across diverse domains -- Better alignment with evaluation queries in `evals/queries.txt` - -## Files Modified/Created - -### Modified: -- `finetune/dataset/generate_data.py` - Enhanced templates, word lists, weighted sampling -- `finetune/dataset/prepare_data.py` - Expanded SHORT_QUERIES and SHORT_TEMPLATES - -### Created: -- `finetune/dataset/generate_diverse.py` - Generate examples for underrepresented categories -- `finetune/dataset/analyze_data.py` - Dataset analysis and quality reporting -- `finetune/data/qmd_expansion_diverse_addon.jsonl` - 265 diverse examples (generated) - -## Next Steps - -1. **Merge diverse examples** into main dataset -2. **Regenerate training data** using improved templates -3. **Retrain model** with more diverse data -4. **Evaluate** using `evals/queries.txt` to verify improvements -5. **Iterate** based on evaluation results - -## Metrics to Track - -After retraining, monitor these metrics from `eval.py`: -- Average score on named entity queries (should improve) -- Average score on temporal queries (should improve) -- Average score on short queries (should improve) -- Entity preservation rate (critical metric) -- Diversity score distribution - ---- - -Generated: 2026-01-30 -Author: opencode AI assistant diff --git a/finetune/Justfile b/finetune/Justfile index 6f127856..0cd101d6 100644 --- a/finetune/Justfile +++ b/finetune/Justfile @@ -26,18 +26,9 @@ train-local: HF_TOKEN=${HF_TOKEN} uv run torchrun --standalone --nproc_per_node auto \ train.py sft --config configs/sft_local.yaml |& tee /tmp/qmd-sft-train.log -grpo-local: - CUDA_VISIBLE_DEVICES=1,2,3 HF_TOKEN=${HF_TOKEN} uv run torchrun --standalone --nproc_per_node 3 \ - train.py grpo --config configs/grpo.yaml |& tee /tmp/qmd-grpo-train.log - -gepa-local: - UV_CACHE_DIR=/tmp/uv-cache LITELLM_CACHE_DIR=/tmp/litellm-cache OLLAMA_API_BASE=http://localhost:11434 \ - uv run python gepa/dspy_gepa.py \ - --input data/qmd_expansion_v2.jsonl \ - --model ollama/glm-4.7-flash:Q8_0 \ - --reflection-model ollama/glm-4.7-flash:Q8_0 \ - --max-metric-calls 100 --limit 20 \ - --valset data/qmd_expansion_handcrafted.jsonl --val-limit 20 \ - --max-tokens 512 --reflection-max-tokens 512 \ - --emit gepa/gepa_outputs_glm.jsonl \ - --save-prompt gepa/best_prompt_glm.txt +# Experimental GRPO training is in finetune/experiments/grpo and not part of +# the default pipeline. +# +# grpo-local: +# HF_TOKEN=${HF_TOKEN} uv run train.py grpo --config experiments/grpo/grpo.yaml |& tee /tmp/qmd-grpo-train.log + diff --git a/finetune/README.md b/finetune/README.md index fec6a1e8..bbf4561e 100644 --- a/finetune/README.md +++ b/finetune/README.md @@ -40,22 +40,24 @@ These feed into QMD's three search backends: # 1. SFT: teach the model the output format (~45 min on A10G, ~$1.50) hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 2h jobs/sft.py -# 2. GRPO: RL refinement on top of SFT (~20 min on A10G, ~$0.50) -hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 4h jobs/grpo.py +# 2. Evaluate against test queries (needs local GPU or use eval job) +uv run eval.py tobil/qmd-query-expansion-1.7B -# 3. Evaluate against test queries (needs local GPU or use eval job) -uv run eval.py --model tobil/qmd-query-expansion-1.7B-grpo \ - --sft-model tobil/qmd-query-expansion-1.7B-sft - -# 4. Convert to GGUF for local deployment (Ollama, llama.cpp) +# 3. Convert to GGUF for local deployment (Ollama, llama.cpp) uv run convert_gguf.py --size 1.7B + +# NOTE: GRPO is currently experimental and moved to finetune/experiments/grpo +# if you want to run it manually, use: +# cd finetune && uv run python experiments/grpo/grpo.py ``` ### Local training (if you have a GPU) ```bash uv run train.py sft --config configs/sft.yaml -uv run train.py grpo --config configs/grpo.yaml + +# Experimental GRPO +cd finetune && uv run python experiments/grpo/grpo.py ``` ### Monitoring HF Jobs @@ -85,27 +87,26 @@ direct `lex:/vec:/hyde:` output without `` blocks. ``` finetune/ ├── reward.py # Scoring/reward function (single source of truth) -├── train.py # Unified SFT + GRPO training (two subcommands) +├── train.py # SFT training entrypoint ├── eval.py # Generate expansions and score them ├── convert_gguf.py # GGUF conversion for Ollama/llama.cpp ├── jobs/ │ ├── sft.py # Self-contained SFT for HuggingFace Jobs -│ ├── grpo.py # Self-contained GRPO for HuggingFace Jobs │ ├── eval.py # Self-contained eval for HuggingFace Jobs -│ ├── eval_common.py # Shared eval utilities -│ └── quantize.py # GGUF quantization for HuggingFace Jobs +│ └── eval_common.py # Shared eval utilities ├── configs/ -│ ├── sft.yaml # SFT hyperparameters for Qwen3-1.7B -│ └── grpo.yaml # GRPO hyperparameters for Qwen3-1.7B +│ └── sft.yaml # SFT hyperparameters for Qwen3-1.7B ├── evals/ │ └── queries.txt # 31 test queries across 8 categories -├── data/ -│ └── qmd_expansion_v2.jsonl # Source training data (1,000 high-quality examples) +├── experiments/ +│ └── grpo/ # Experimental GRPO configuration and script (optional) +├── data/ # Training JSONL files (all concatenated for training) ├── dataset/ -│ ├── generate_data.py # Generate data via Claude API -│ ├── generate_data_offline.py # Generate from existing HF dataset -│ ├── prepare_data.py # Format for Qwen3 chat template -│ └── clean_data.py # Detect technical term misinterpretations +│ ├── prepare_data.py # Format for Qwen3 chat template, dedup, split +│ ├── schema.py # Parse/normalize output format +│ ├── validate_schema.py # Validate JSONL against schema +│ ├── score_data.py # Score all examples using reward.py +│ └── analyze_data.py # Analyze distribution and quality ├── SCORING.md # Detailed scoring rubric reference └── README.md # This file ``` @@ -122,7 +123,7 @@ Teaches the model the `lex:/vec:/hyde:` output format from labeled examples. | Method | LoRA (rank 16, alpha 32) | | Target modules | All projection layers (q/k/v/o/gate/up/down) | | Dataset | ~2,290 examples (train split) | -| Effective batch size | 16 (4 × 4 gradient accumulation) | +| Effective batch size | 16 (4 x 4 gradient accumulation) | | Epochs | 5 | | Learning rate | 2e-4 (cosine schedule) | @@ -131,29 +132,14 @@ uv run train.py sft --config configs/sft.yaml uv run train.py sft --config configs/sft.yaml --dry-run # preview config ``` -### Stage 2: GRPO (Group Relative Policy Optimization) +### Stage 2: (Experimental) GRPO -Reinforcement learning on top of the merged SFT weights. The model generates -multiple expansions per query, they are scored by the reward function, and the -model is updated to prefer higher-scoring outputs. - -| Parameter | Value | -|-----------|-------| -| Base | Merged SFT checkpoint | -| Method | LoRA (rank 4, alpha 8) — smaller for RL stability | -| Target modules | q_proj, v_proj only | -| Reward | `reward.py` (rule-based, 5 dimensions) | -| KL beta | 0.04 — prevents drift from SFT checkpoint | -| Generations per prompt | 4 | -| Max steps | 200 | -| Learning rate | 5e-7 | - -**Important:** `beta > 0` is critical. With `beta=0` the model experiences -catastrophic drift and scores drop to 0%. +GRPO is currently treated as experimental and kept under `experiments/grpo/`. +It is not part of the default production path for this repository. ```bash -uv run train.py grpo --config configs/grpo.yaml -uv run train.py grpo --config configs/grpo.yaml --dry-run # test reward function +# Optional experimental GRPO run +cd finetune && uv run python experiments/grpo/grpo.py ``` ## Evaluation @@ -161,27 +147,26 @@ uv run train.py grpo --config configs/grpo.yaml --dry-run # test reward functio `eval.py` generates expansions from a model and scores them against test queries: ```bash -# Evaluate an SFT model +# Evaluate a SFT model uv run eval.py --model tobil/qmd-query-expansion-1.7B-sft -# Evaluate a GRPO model (needs SFT adapter merged first) -uv run eval.py --model tobil/qmd-query-expansion-1.7B-grpo \ - --sft-model tobil/qmd-query-expansion-1.7B-sft +# Evaluate an SFT output dir +uv run eval.py outputs/sft # Verbose output with deduction details -uv run eval.py --model tobil/qmd-query-expansion-1.7B-sft -v +uv run eval.py tobil/qmd-query-expansion-1.7B -v -# Save detailed scores to JSON -uv run eval.py --model tobil/qmd-query-expansion-1.7B-sft -o scores.json +# Optional: evaluate GRPO experimental output (if run) +uv run eval.py outputs/grpo -# Score an existing JSONL file (backwards compat with old run.py output) -uv run eval.py --score-only evals/results_old.jsonl +# Save detailed scores to JSON +uv run eval.py tobil/qmd-query-expansion-1.7B -o scores.json ``` ## Reward Function -`reward.py` is the single source of truth for scoring. It is used both as the -GRPO reward signal during training and for evaluation. +`reward.py` is the single source of truth for scoring. It is used for evaluation +and (optionally) as the GRPO reward signal in the experimental path. Five scoring dimensions (max 120 without hyde, 140 with): @@ -205,16 +190,13 @@ uv run reward.py ## GGUF Conversion -Merges base + SFT + GRPO adapters into a single model and produces -quantized GGUF files for deployment: +Merges base + SFT and (optionally) GRPO adapters into a single model, then +produces quantized GGUF files for deployment: ```bash # Use preset for 1.7B uv run convert_gguf.py --size 1.7B -# Use preset for 4B -uv run convert_gguf.py --size 4B - # Custom models uv run convert_gguf.py --base Qwen/Qwen3-1.7B \ --sft tobil/qmd-query-expansion-1.7B-sft \ @@ -235,34 +217,26 @@ ollama run qmd-expand ## Data Pipeline -The training data (1,000 examples in `data/qmd_expansion_v2.jsonl`) was generated -from two sources and cleaned for quality. To regenerate: +All JSONL files in `data/` are concatenated for training. To prepare for training: ```bash -# Generate from existing HuggingFace dataset (bulk, no API needed) -uv run dataset/generate_data_offline.py - -# Generate via Claude API (higher quality, needs ANTHROPIC_API_KEY) -uv run dataset/generate_data.py --count 100 - -# Detect and fix technical term misinterpretations -uv run dataset/clean_data.py - -# Format for Qwen3 chat template, add short-query augmentation, split train/val +# Format for Qwen3 chat template, deduplicate, split train/val uv run dataset/prepare_data.py + +# Validate data quality +just validate ``` ## Architecture Notes -The two-stage training approach (SFT → GRPO) is standard for structured-output models: +The production training approach is currently **SFT-only**: 1. **SFT** establishes format compliance and basic query understanding. It uses a large LoRA (rank 16, all projection layers) because it needs to learn a new output format from scratch. -2. **GRPO** refines quality within the learned format. It uses a small LoRA - (rank 4, q/v only) and KL regularization to make incremental improvements - without losing what SFT taught. +2. **GRPO** exists as an optional experimental path under `experiments/grpo/` + and is not in the production training pipeline. The reward function is entirely rule-based (no LLM judge) which makes it fast, deterministic, and suitable as an RL signal. See `SCORING.md` for the full rubric. @@ -280,20 +254,12 @@ deterministic, and suitable as an RL signal. See `SCORING.md` for the full rubri | Epochs | 5 | | Hardware | A10G (24 GB VRAM) | -### GRPO - -| Metric | Value | -|--------|-------| -| Mean reward | 0.757 | -| Final loss | 0.0005 | -| KL divergence | 0.00048 | -| Mean completion length | ~58 tokens | -| Training time | ~19 min (200 steps) | -| Hardware | A10G (24 GB VRAM) | - ### Evaluation Scores | Model | Average Score | Excellent (30) | |-------|--------------|-----------------| | SFT | 92.0% | 30/30 | -| GRPO | 91.7% | 30/30 | + +> GRPO scores are not tracked in this branch; see `experiments/grpo/` for historical +> experimental results. + diff --git a/finetune/SCORING.md b/finetune/SCORING.md index e75c04d4..dfaa2cce 100644 --- a/finetune/SCORING.md +++ b/finetune/SCORING.md @@ -61,24 +61,29 @@ vec: authentication configuration options | Lex lines are keyword-focused (shorter) | +5 | -2 if lex is longer than vec | | Vec lines are natural language (complete phrases) | +5 | -2 if vec is just keywords | -### 5. Named Entity Preservation (0-20 points, CRITICAL) +### 5. Named Entity Preservation (-65 to +20 points, CRITICAL) -Named entities are proper nouns, brand names, technical terms, and acronyms that MUST appear in lex queries. This prevents generic expansions that lose the specific topic. +Named entities are proper nouns, brand names, personal names, technical terms, and acronyms that MUST appear in lex queries. This prevents generic expansions that lose the specific topic. + +**Two-level checking:** | Criterion | Points | Deduction | |-----------|--------|-----------| -| All lex lines contain at least one entity | +15 | - | -| Some lex lines contain entities | +5 | - | -| NO lex lines contain entities | - | **-30 HEAVY PENALTY** | +| **Per-line**: All lex lines contain at least one entity | +15 | - | +| **Per-line**: Some lex lines contain entities | +5 | - | +| **Per-line**: NO lex lines contain entities | - | **-30 HEAVY PENALTY** | +| **Per-entity**: Entity completely absent from all lex+vec | - | **-20 per dropped entity** | | Generic filler phrases in lex | - | -15 per phrase | | Entities also in vec lines | +5 | - | **Named Entity Detection:** - All-caps acronyms: `TDS`, `API`, `GPU`, `AWS` -- Capitalized proper nouns: `React`, `Docker`, `Kubernetes` +- Capitalized proper nouns (any position): `React`, `Docker`, `Bob`, `Sarah` +- Personal names at query start: `Bob asked about deploy` → `Bob` is an entity - Technical terms: `node.js`, `C++`, `.NET` - CamelCase: `JavaScript`, `TypeScript` - Compound names: `TDS motorsports` → both words are entities +- Project names: `Project Atlas`, `Horizon team` **Generic Filler Phrases (BANNED in lex):** - "find information about" @@ -88,14 +93,41 @@ Named entities are proper nouns, brand names, technical terms, and acronyms that **Examples:** -| Query | Bad Lex (Score: 0.30) | Good Lex (Score: 1.00) | -|-------|----------------------|------------------------| +| Query | Bad Lex | Good Lex | +|-------|---------|----------| | `who is TDS motorsports` | `lex: find information about` | `lex: TDS motorsports history` | | | `lex: company details` | `lex: TDS motorsports founders` | +| `meeting with Bob about C++` | `lex: c++ meetings` | `lex: Bob "C++" meeting` | +| | `vec: programming meeting notes` | `vec: meeting notes with Bob about C++` | | `how to use React hooks` | `lex: programming tutorial` | `lex: React hooks tutorial` | | | `lex: how to code` | `lex: useEffect useState hooks` | -**Key Rule**: If a query mentions a specific entity (brand, product, technology), EVERY lex line should include that entity or a direct variation of it. +**Key Rule**: If a query mentions a specific entity (person, brand, product, technology, project name), that entity MUST appear somewhere in the lex+vec output. Dropping a person's name is especially costly. + +### 6. Lex Phrase Quoting (bonus, +3 points) + +When a query contains multi-word technical terms or proper nouns, lex output should use quoted phrases for exact matching in BM25. + +| Criterion | Points | +|-----------|--------| +| Uses `"quoted phrases"` in lex when query has multi-word entities | +3 | + +**When to quote:** +- Multi-word proper nouns: `"New York"`, `"Monte Carlo"` +- Specific technical terms: `"machine learning"`, `"rate limit"` +- Exact compound terms: `"connection pool"`, `"merge conflict"` + +**When to use negation (`-term`):** +- Disambiguating terms: `rust -corrosion`, `java -coffee`, `apple -fruit` +- Excluding related-but-wrong topics: `"machine learning" -"deep learning"` +- Narrowing scope: `docker -kubernetes`, `python -snake` + +**Example:** +``` +Query: python memory leak debugging +Good lex: "memory leak" python -java -javascript +Good lex: tracemalloc "garbage collector" profiler +``` ## Score Calculation diff --git a/finetune/configs/sft.yaml b/finetune/configs/sft.yaml index 830b5939..b7d132eb 100644 --- a/finetune/configs/sft.yaml +++ b/finetune/configs/sft.yaml @@ -23,6 +23,11 @@ training: max_length: 512 warmup_ratio: 0.03 lr_scheduler: "cosine" + # Save checkpoints every 30 minutes + save_interval_minutes: 30 + # Fallback time-step save cadence if needed (not used for wall-clock mode) + save_steps: 200 + save_total_limit: 3 lora: rank: 16 diff --git a/finetune/configs/sft_local.yaml b/finetune/configs/sft_local.yaml index 4d70a5cc..43941ff4 100644 --- a/finetune/configs/sft_local.yaml +++ b/finetune/configs/sft_local.yaml @@ -21,6 +21,10 @@ training: warmup_ratio: 0.03 lr_scheduler: "cosine" ddp_find_unused_parameters: false + # Save checkpoints every 30 minutes + save_interval_minutes: 30 + # Fallback time-step save cadence if needed (not used for wall-clock mode) + save_steps: 200 lora: rank: 16 diff --git a/finetune/data/best_glm_prompt.txt b/finetune/data/best_glm_prompt.txt deleted file mode 100644 index e85b2215..00000000 --- a/finetune/data/best_glm_prompt.txt +++ /dev/null @@ -1,17 +0,0 @@ -You are a search query expansion expert. Given a query, output retrieval-optimized expansions. - -Output format (exactly this, no other text): -lex: -lex: -lex: -vec: -vec: -hyde: <1-2 sentence hypothetical document snippet> - -Rules: -- lex: SHORT keywords (2-5 words), preserve named entities -- vec: Natural phrases (8-15 words) -- hyde: Realistic document passage -- No generic phrases like "how to" or "information about" in lex - -Query: {query} \ No newline at end of file diff --git a/finetune/data/gepa_generated.prompts.json b/finetune/data/gepa_generated.prompts.json deleted file mode 100644 index 4a723df3..00000000 --- a/finetune/data/gepa_generated.prompts.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "predict": { - "traces": [], - "train": [], - "demos": [], - "signature": { - "instructions": "Expand a search query into retrieval-optimized variations.\n\nOutput format:\n- lex: lines are short, keyword-focused (for BM25 search)\n- vec: lines are natural language phrases (for vector search) \n- hyde: is a hypothetical document passage (optional)\n\nRules:\n- Include 2-3 lex: lines with key terms preserved\n- Include 2-3 vec: lines as complete natural phrases\n- Named entities (brands, technologies) MUST appear in lex lines\n- Never use generic phrases like \"find information about\"", - "fields": [ - { - "prefix": "Query:", - "description": "The search query to expand" - }, - { - "prefix": "Reasoning: Let's think step by step in order to", - "description": "${reasoning}" - }, - { - "prefix": "Expansion:", - "description": "Multi-line expansion with lex:, vec:, and optional hyde: prefixes" - } - ] - }, - "lm": null - }, - "metadata": { - "dependency_versions": { - "python": "3.14", - "dspy": "3.1.2", - "cloudpickle": "3.1" - } - } -} diff --git a/finetune/data/qmd_expansion_lex_phrases_negation.jsonl b/finetune/data/qmd_expansion_lex_phrases_negation.jsonl new file mode 100644 index 00000000..1c15fd00 --- /dev/null +++ b/finetune/data/qmd_expansion_lex_phrases_negation.jsonl @@ -0,0 +1,74 @@ +{"query": "performance optimization C++ program", "intent": "optimizing a C++ application", "output": [["lex", "\"C++ performance\" optimization -sports -athlete"], ["lex", "\"memory allocation\" \"cache miss\" profiling"], ["vec", "how to improve the runtime performance of a C++ program"], ["hyde", "C++ performance optimization involves profiling with tools like perf or valgrind, reducing memory allocations, improving cache locality, and avoiding unnecessary copies. Key techniques include move semantics, reserve on vectors, and SIMD intrinsics for hot loops."]]} +{"query": "python memory leak debugging", "intent": "debugging a Python application", "output": [["lex", "\"memory leak\" python -java -javascript"], ["lex", "\"garbage collector\" reference counting tracemalloc"], ["vec", "how to find and fix memory leaks in a Python application"], ["hyde", "Python memory leaks often occur when objects hold references longer than expected, preventing garbage collection. Use tracemalloc or memory_profiler to track allocations over time. Common causes include circular references, global caches, and event listeners that aren't removed."]]} +{"query": "connection pool exhaustion database", "intent": "debugging database connectivity issues", "output": [["lex", "\"connection pool\" exhausted timeout -redis -cache"], ["lex", "\"max connections\" database pool overflow"], ["vec", "why does the database connection pool run out of connections under load"], ["hyde", "Connection pool exhaustion occurs when all connections are checked out and new requests must wait or fail. This typically happens when queries run slowly, connections aren't released properly, or traffic spikes beyond pool capacity."]]} +{"query": "rate limiting API implementation", "intent": "implementing rate limiting in a backend service", "output": [["lex", "\"rate limit\" \"token bucket\" OR \"sliding window\" -ethereum -cryptocurrency"], ["lex", "\"requests per second\" throttle middleware"], ["vec", "how to implement rate limiting for an API endpoint"], ["hyde", "A token bucket rate limiter grants each client N tokens per time window. Each request consumes one token. When tokens run out, requests are rejected with 429 Too Many Requests."]]} +{"query": "SQL query performance slow", "intent": "optimizing a slow database query", "output": [["lex", "\"query plan\" index scan \"full table\" slow -nosql -mongodb"], ["lex", "\"missing index\" \"N+1\" joins optimization"], ["vec", "why is my SQL query running slowly and how do I optimize it"], ["hyde", "Slow SQL queries are usually caused by missing indexes, full table scans, or N+1 query patterns. Use EXPLAIN ANALYZE to view the query plan and add indexes on columns in WHERE and JOIN clauses."]]} +{"query": "machine learning model overfitting", "intent": "training a machine learning model", "output": [["lex", "\"overfitting\" \"validation loss\" regularization -sports -fitness"], ["lex", "dropout \"weight decay\" \"early stopping\" training"], ["vec", "how to detect and prevent overfitting in a machine learning model"], ["hyde", "Overfitting occurs when a model memorizes training data instead of learning generalizable patterns, leading to high training accuracy but poor validation performance."]]} +{"query": "docker container networking", "intent": "configuring Docker networking", "output": [["lex", "\"docker network\" bridge overlay -kubernetes -k8s"], ["lex", "\"container ip\" \"port mapping\" expose publish"], ["vec", "how do Docker containers communicate with each other on the same host"], ["hyde", "Docker containers on the same host communicate via bridge networks. Use docker network create to make named networks, then --network flag to attach containers."]]} +{"query": "authentication token JWT", "intent": "implementing JWT authentication", "output": [["lex", "\"JWT\" \"json web token\" \"secret key\" -oauth -saml"], ["lex", "\"bearer token\" signature expiry claims"], ["vec", "how does JWT authentication work and how do I validate a token"], ["hyde", "JWT tokens consist of three base64-encoded parts: header, payload with claims, and signature. The server validates the signature using a secret key and checks expiry."]]} +{"query": "async await error handling javascript", "intent": "writing async JavaScript code", "output": [["lex", "\"async\" \"await\" \"try catch\" promise -python -rust"], ["lex", "\"unhandled rejection\" \"error boundary\" async"], ["vec", "how to properly handle errors in async/await JavaScript functions"], ["hyde", "Wrap await calls in try/catch blocks to handle rejections. Unhandled promise rejections crash Node.js processes. Use Promise.allSettled() for parallel operations with partial failures."]]} +{"query": "git merge conflict resolution", "intent": "resolving a git merge conflict", "output": [["lex", "\"merge conflict\" \"<<<<<<\" rebase resolution -github -gitlab"], ["lex", "\"conflict markers\" \"ours\" \"theirs\" checkout"], ["vec", "how do I resolve a git merge conflict between two branches"], ["hyde", "Git merge conflicts occur when two branches change the same lines. Conflict markers show both versions. Edit the file to keep the correct version, remove markers, then git add and commit."]]} +{"query": "kubernetes pod crashloopbackoff", "intent": "debugging a Kubernetes deployment", "output": [["lex", "\"CrashLoopBackOff\" pod logs restart -docker -vagrant"], ["lex", "\"container failed\" liveness probe startup"], ["vec", "why is my Kubernetes pod stuck in CrashLoopBackOff and how do I fix it"], ["hyde", "CrashLoopBackOff means the container keeps crashing and Kubernetes backs off restarts exponentially. Check logs with kubectl logs --previous to see the crash output."]]} +{"query": "react state management redux", "intent": "managing state in a React application", "output": [["lex", "\"Redux\" \"useReducer\" \"action creator\" -angular -vue"], ["lex", "\"store dispatch\" \"selector\" \"middleware\" thunk"], ["vec", "when should I use Redux versus local React state for state management"], ["hyde", "Redux is best for state shared across many components. Local useState is fine for UI state scoped to one component. For medium complexity, useContext + useReducer avoids Redux boilerplate."]]} +{"query": "machine learning vs deep learning", "intent": "comparing ML approaches", "output": [["lex", "\"machine learning\" -\"deep learning\" traditional algorithms"], ["lex", "\"deep learning\" \"neural network\" -\"machine learning\" classical"], ["vec", "what is the difference between machine learning and deep learning"], ["hyde", "Machine learning encompasses algorithms that learn from data including decision trees, SVMs, and random forests. Deep learning is a subset using neural networks with multiple layers."]]} +{"query": "python web scraping beautiful soup", "intent": "scraping web pages with Python", "output": [["lex", "\"Beautiful Soup\" python scraping -selenium -playwright"], ["lex", "\"web scraping\" beautifulsoup4 html parsing"], ["vec", "how to scrape web pages using Beautiful Soup in Python"], ["hyde", "Beautiful Soup is a Python library for parsing HTML and XML. Install with pip install beautifulsoup4. Use requests to fetch pages, then BeautifulSoup to navigate the DOM tree."]]} +{"query": "rust ownership and borrowing", "intent": "understanding Rust memory model", "output": [["lex", "rust ownership borrowing -corrosion -oxidation -metal"], ["lex", "\"borrow checker\" lifetime \"move semantics\" rust"], ["vec", "how does Rust's ownership and borrowing system work"], ["hyde", "Rust's ownership system ensures memory safety without garbage collection. Each value has one owner. References can borrow values immutably or mutably but not both simultaneously."]]} +{"query": "java stream api filtering", "intent": "processing Java collections functionally", "output": [["lex", "\"Stream API\" java filter map -coffee -island"], ["lex", "java streams \"lambda expression\" collect"], ["vec", "how to use Java Stream API for filtering and transforming collections"], ["hyde", "Java Streams provide a functional approach to processing collections. Chain operations like filter(), map(), and collect() for declarative data transformation."]]} +{"query": "apple silicon mac development", "intent": "developing for Apple Silicon", "output": [["lex", "\"Apple Silicon\" M1 M2 M3 development -fruit -recipe"], ["lex", "\"arm64\" \"apple silicon\" xcode native -cider"], ["vec", "how to develop and optimize apps for Apple Silicon Macs"], ["hyde", "Apple Silicon Macs use ARM-based chips (M1, M2, M3). Native arm64 builds run fastest. Use Universal binaries to support both architectures."]]} +{"query": "spring boot dependency injection", "intent": "configuring Spring IoC", "output": [["lex", "\"Spring Boot\" \"dependency injection\" autowired -season -weather"], ["lex", "\"Spring\" IoC container bean \"component scan\""], ["vec", "how does dependency injection work in Spring Boot applications"], ["hyde", "Spring Boot uses IoC container to manage bean lifecycle. Annotate classes with @Component, @Service, or @Repository. Use @Autowired or constructor injection to wire dependencies."]]} +{"query": "new york city restaurant recommendations", "intent": "finding restaurants in NYC", "output": [["lex", "\"New York City\" restaurant -state -upstate"], ["lex", "\"NYC\" dining \"best restaurants\" food"], ["vec", "top restaurant recommendations in New York City"], ["hyde", "New York City's dining scene ranges from Michelin-starred restaurants to iconic street food. Popular neighborhoods for dining include the West Village, Williamsburg, and Lower East Side."]]} +{"query": "san francisco hiking trails", "intent": "finding outdoor activities in SF", "output": [["lex", "\"San Francisco\" hiking trails -49ers -football"], ["lex", "\"Bay Area\" hike outdoors \"Golden Gate\""], ["vec", "best hiking trails in and around San Francisco"], ["hyde", "San Francisco offers urban hikes with stunning views. Popular trails include Lands End, Twin Peaks, and the Presidio trails along the Golden Gate Bridge."]]} +{"query": "natural language processing transformers", "intent": "understanding NLP architectures", "output": [["lex", "\"natural language processing\" transformers -electrical -power"], ["lex", "NLP \"transformer architecture\" attention -robots"], ["vec", "how do transformer models work for natural language processing"], ["hyde", "Transformer models use self-attention mechanisms to process text in parallel rather than sequentially. The architecture includes encoder and decoder stacks with multi-head attention layers."]]} +{"query": "red black tree implementation", "intent": "implementing a balanced BST", "output": [["lex", "\"red-black tree\" implementation balancing -color -paint"], ["lex", "\"red black\" BST rotation insertion deletion"], ["vec", "how to implement a red-black tree data structure"], ["hyde", "Red-black trees are self-balancing binary search trees. Each node is colored red or black. Rotations and recoloring maintain balance after insertions and deletions."]]} +{"query": "azure devops pipeline yaml", "intent": "configuring CI/CD in Azure DevOps", "output": [["lex", "\"Azure DevOps\" pipeline yaml -AWS -github"], ["lex", "\"azure-pipelines.yml\" CI CD build stages"], ["vec", "how to configure CI/CD pipelines in Azure DevOps using YAML"], ["hyde", "Azure DevOps pipelines are defined in azure-pipelines.yml. Define stages, jobs, and steps. Use templates for reusable configurations and variable groups for secrets."]]} +{"query": "terraform state management remote backend", "intent": "managing infrastructure as code", "output": [["lex", "\"terraform state\" \"remote backend\" locking -ansible -chef"], ["lex", "terraform \"state file\" S3 backend \"state lock\""], ["vec", "how to manage Terraform state with a remote backend"], ["hyde", "Terraform state tracks infrastructure resources. Use a remote backend like S3 with DynamoDB locking for team collaboration and state consistency."]]} +{"query": "visual studio code extensions", "intent": "customizing VS Code", "output": [["lex", "\"Visual Studio Code\" extensions -\"Visual Studio\" -MSVC"], ["lex", "\"VS Code\" plugins marketplace extensions"], ["vec", "best extensions and plugins for Visual Studio Code"], ["hyde", "VS Code extensions add language support, debugging, and productivity features. Install from the marketplace. Popular extensions include Prettier, ESLint, and GitLens."]]} +{"query": "go concurrency goroutines channels", "intent": "writing concurrent Go code", "output": [["lex", "goroutines channels concurrency -board -game"], ["lex", "\"go routines\" \"channel\" select sync -baduk"], ["vec", "how to use goroutines and channels for concurrency in Go"], ["hyde", "Go handles concurrency with goroutines (lightweight threads) and channels (typed communication pipes). Use select to wait on multiple channels. The sync package provides mutexes."]]} +{"query": "swift ui declarative interface", "intent": "building iOS interfaces with SwiftUI", "output": [["lex", "\"SwiftUI\" declarative interface -taylor -singer"], ["lex", "SwiftUI view modifier \"state management\""], ["vec", "how to build user interfaces with SwiftUI's declarative syntax"], ["hyde", "SwiftUI is Apple's declarative UI framework. Describe views as structs conforming to the View protocol. Use @State, @Binding, and @Observable for reactive state management."]]} +{"query": "cross site scripting prevention", "intent": "securing web applications against XSS", "output": [["lex", "\"cross-site scripting\" XSS prevention -CSS -style"], ["lex", "XSS sanitization \"content security policy\" escaping"], ["vec", "how to prevent cross-site scripting vulnerabilities in web applications"], ["hyde", "Prevent XSS by escaping user input before rendering, using Content Security Policy headers, and sanitizing HTML with libraries like DOMPurify."]]} +{"query": "amazon web services lambda cold start", "intent": "optimizing serverless latency", "output": [["lex", "\"AWS Lambda\" \"cold start\" latency -shopping -retail"], ["lex", "\"Lambda\" warmup provisioned concurrency -calculus"], ["vec", "how to reduce AWS Lambda cold start latency"], ["hyde", "Lambda cold starts occur when a new execution environment is initialized. Reduce them with provisioned concurrency, smaller deployment packages, and choosing faster runtimes like Go or Rust."]]} +{"query": "monte carlo simulation finance", "intent": "financial modeling with simulation", "output": [["lex", "\"Monte Carlo\" simulation finance pricing -casino -gambling"], ["lex", "\"Monte Carlo\" \"random sampling\" portfolio risk"], ["vec", "how to use Monte Carlo simulation for financial modeling and risk analysis"], ["hyde", "Monte Carlo simulation uses random sampling to model uncertainty in financial outcomes. Generate thousands of scenarios to estimate option prices, portfolio risk, or probability of ruin."]]} +{"query": "el nino weather patterns", "intent": "understanding climate phenomena", "output": [["lex", "\"El Nino\" weather patterns -la -nina"], ["lex", "\"El Nino\" ENSO climate \"ocean temperature\""], ["vec", "how does El Nino affect global weather patterns"], ["hyde", "El Nino is a climate pattern involving warming of Pacific Ocean surface temperatures. It disrupts normal weather patterns globally, causing droughts in some regions and flooding in others."]]} +{"query": "hong kong dim sum restaurants", "intent": "finding dim sum in Hong Kong", "output": [["lex", "\"Hong Kong\" \"dim sum\" restaurant -movie -film"], ["lex", "\"Hong Kong\" yum cha brunch Cantonese"], ["vec", "best dim sum restaurants to visit in Hong Kong"], ["hyde", "Hong Kong is famous for its dim sum culture. Traditional yum cha restaurants serve steamed dumplings, buns, and small plates from rolling carts during morning and lunch hours."]]} +{"query": "type 2 diabetes management diet", "intent": "managing diabetes through nutrition", "output": [["lex", "\"type 2 diabetes\" diet management -\"type 1\" -juvenile"], ["lex", "\"blood sugar\" \"glycemic index\" \"type 2\" nutrition"], ["vec", "dietary management strategies for type 2 diabetes"], ["hyde", "Managing type 2 diabetes through diet involves controlling carbohydrate intake, choosing low glycemic index foods, and maintaining regular meal timing. Focus on whole grains, vegetables, and lean protein."]]} +{"query": "post traumatic stress disorder treatment", "intent": "treating PTSD", "output": [["lex", "\"PTSD\" treatment therapy -military -veteran"], ["lex", "\"post-traumatic stress\" EMDR CBT \"trauma therapy\""], ["vec", "effective treatments for post-traumatic stress disorder"], ["hyde", "PTSD treatments include cognitive behavioral therapy (CBT), EMDR (eye movement desensitization), and prolonged exposure therapy. Medication like SSRIs can also help manage symptoms."]]} +{"query": "carbon fiber manufacturing process", "intent": "understanding materials manufacturing", "output": [["lex", "\"carbon fiber\" manufacturing process -bicycle -car"], ["lex", "\"carbon fiber\" autoclave layup \"resin transfer\""], ["vec", "how is carbon fiber manufactured and what are the production steps"], ["hyde", "Carbon fiber is made by carbonizing polyacrylonitrile (PAN) precursor fibers at high temperatures. The process involves stabilization, carbonization, surface treatment, and sizing before weaving into fabrics."]]} +{"query": "sourdough starter maintenance", "intent": "maintaining a sourdough culture", "output": [["lex", "\"sourdough starter\" maintenance feeding -san -francisco"], ["lex", "\"sourdough\" fermentation discard hydration"], ["vec", "how to maintain and feed a sourdough starter"], ["hyde", "Feed your sourdough starter equal parts flour and water by weight every 12-24 hours at room temperature. Discard half before feeding to maintain a manageable size and healthy yeast population."]]} +{"query": "french press coffee technique", "intent": "brewing coffee with a french press", "output": [["lex", "\"french press\" coffee technique ratio -journalism -media"], ["lex", "\"french press\" brew time grind coarse"], ["vec", "how to brew coffee with a french press for best results"], ["hyde", "Use coarsely ground coffee at a 1:15 ratio with water just off the boil (200F). Steep for 4 minutes, then press slowly. Preheat the carafe for consistent temperature."]]} +{"query": "coral reef bleaching climate change", "intent": "understanding marine ecology threats", "output": [["lex", "\"coral bleaching\" \"climate change\" temperature -hair -cosmetic"], ["lex", "\"coral reef\" bleaching warming ocean -aquarium"], ["vec", "how does climate change cause coral reef bleaching"], ["hyde", "Coral bleaching occurs when ocean temperatures rise above normal, causing corals to expel their symbiotic algae. Prolonged bleaching leads to coral death and reef ecosystem collapse."]]} +{"query": "supply chain disruption risk management", "intent": "managing supply chain risks", "output": [["lex", "\"supply chain\" disruption \"risk management\" -software -devops"], ["lex", "\"supply chain\" resilience diversification contingency"], ["vec", "how to manage supply chain disruption risks"], ["hyde", "Supply chain risk management involves identifying vulnerabilities, diversifying suppliers, maintaining safety stock, and developing contingency plans for disruptions."]]} +{"query": "real time operating system embedded", "intent": "choosing an OS for embedded systems", "output": [["lex", "\"real-time operating system\" RTOS embedded -desktop -windows"], ["lex", "\"RTOS\" FreeRTOS \"task scheduling\" deterministic"], ["vec", "what is a real-time operating system and when to use one for embedded systems"], ["hyde", "An RTOS guarantees task execution within strict time constraints. Used in embedded systems where timing is critical: automotive, medical devices, and industrial control."]]} +{"query": "agile scrum sprint planning", "intent": "running effective sprint planning", "output": [["lex", "\"sprint planning\" scrum agile -running -marathon"], ["lex", "\"scrum\" \"story points\" velocity backlog"], ["vec", "how to run effective sprint planning in agile scrum"], ["hyde", "Sprint planning is a scrum ceremony where the team selects work from the backlog for the upcoming sprint. Estimate story points, set the sprint goal, and ensure the team has capacity."]]} +{"query": "gradient descent optimization neural network", "intent": "training neural networks", "output": [["lex", "\"gradient descent\" optimization \"learning rate\" -hiking -slope"], ["lex", "\"SGD\" \"Adam optimizer\" backpropagation convergence"], ["vec", "how does gradient descent work for optimizing neural networks"], ["hyde", "Gradient descent minimizes the loss function by iteratively updating weights in the direction of steepest descent. Variants include SGD, Adam, and AdaGrad, each with different learning rate strategies."]]} +{"query": "mercury retrograde astronomy", "intent": "understanding planetary motion", "output": [["lex", "\"Mercury retrograde\" astronomy orbit -astrology -horoscope"], ["lex", "Mercury \"apparent retrograde\" planet -element -thermometer"], ["vec", "what causes Mercury to appear to move backwards in the sky"], ["hyde", "Mercury retrograde is an apparent backward motion caused by differences in orbital speed. As Earth overtakes Mercury's position, the planet appears to reverse direction against the background stars."]]} +{"query": "silicon valley startup culture", "intent": "understanding tech entrepreneurship", "output": [["lex", "\"Silicon Valley\" startup culture -TV -show -HBO"], ["lex", "\"Silicon Valley\" venture capital entrepreneurship"], ["vec", "what defines the startup culture in Silicon Valley"], ["hyde", "Silicon Valley's startup culture emphasizes rapid iteration, venture capital funding, and disruptive innovation. The ecosystem includes incubators, angel investors, and a tolerance for failure."]]} +{"query": "long covid symptoms treatment", "intent": "understanding post-COVID recovery", "output": [["lex", "\"long COVID\" symptoms treatment -acute -vaccine"], ["lex", "\"post-COVID\" fatigue \"brain fog\" recovery"], ["vec", "what are the symptoms and treatments for long COVID"], ["hyde", "Long COVID symptoms persist weeks or months after infection and include fatigue, brain fog, shortness of breath, and joint pain. Treatment focuses on symptom management and gradual rehabilitation."]]} +{"query": "pandas dataframe groupby aggregation", "intent": "analyzing data with pandas", "output": [["lex", "pandas \"groupby\" aggregation dataframe -animal -bear"], ["lex", "pandas \"group by\" agg sum mean \"pivot table\""], ["vec", "how to use groupby and aggregation functions on a pandas DataFrame"], ["hyde", "Use df.groupby('column').agg() to group rows and compute aggregates like sum, mean, or count. Chain multiple aggregations or use named aggregation for clarity."]]} +{"query": "dead letter queue message processing", "intent": "handling failed messages in queues", "output": [["lex", "\"dead letter queue\" DLQ \"failed messages\" -postal -mail"], ["lex", "\"dead letter\" retry \"message processing\" SQS RabbitMQ"], ["vec", "what is a dead letter queue and how to handle failed messages"], ["hyde", "A dead letter queue captures messages that fail processing after multiple retries. Monitor DLQ depth, set up alerts, and implement reprocessing logic for recoverable failures."]]} +{"query": "graph database neo4j cypher", "intent": "querying graph databases", "output": [["lex", "\"Neo4j\" cypher \"graph database\" -SQL -relational"], ["lex", "\"graph query\" Neo4j nodes relationships traversal"], ["vec", "how to query a Neo4j graph database using Cypher"], ["hyde", "Cypher is Neo4j's declarative query language. Use MATCH to find patterns, CREATE to add nodes and relationships, and WHERE for filtering. Pattern matching follows (node)-[rel]->(node) syntax."]]} +{"query": "reverse proxy nginx load balancing", "intent": "configuring nginx for load balancing", "output": [["lex", "\"reverse proxy\" nginx \"load balancing\" -apache -caddy"], ["lex", "nginx upstream \"proxy_pass\" \"load balancer\""], ["vec", "how to configure nginx as a reverse proxy with load balancing"], ["hyde", "Configure nginx upstream blocks to define backend servers. Use proxy_pass in location blocks to forward requests. Load balancing methods include round-robin, least connections, and IP hash."]]} +{"query": "binary search tree deletion", "intent": "implementing BST operations", "output": [["lex", "\"binary search tree\" deletion algorithm -forest -plant"], ["lex", "BST delete node \"in-order successor\" rebalance"], ["vec", "how to delete a node from a binary search tree"], ["hyde", "BST deletion has three cases: leaf node (remove directly), one child (replace with child), two children (replace with in-order successor or predecessor then delete that node)."]]} +{"query": "kubernetes helm chart templating", "intent": "packaging Kubernetes deployments", "output": [["lex", "\"Helm chart\" templating kubernetes -sailing -boat"], ["lex", "helm values.yaml \"chart template\" \"go template\""], ["vec", "how to create and customize Kubernetes Helm charts with templates"], ["hyde", "Helm charts use Go templates to generate Kubernetes manifests. Define defaults in values.yaml, override at install time. Use helpers in _helpers.tpl for reusable template fragments."]]} +{"query": "convolutional neural network image classification", "intent": "understanding CNN architectures", "output": [["lex", "\"convolutional neural network\" CNN \"image classification\" -news -cable"], ["lex", "CNN convolution pooling \"feature extraction\" -journalism"], ["vec", "how do convolutional neural networks classify images"], ["hyde", "CNNs extract features from images using convolutional layers that learn filters for edges, textures, and shapes. Pooling reduces spatial dimensions. Fully connected layers map features to class probabilities."]]} +{"query": "stock market index fund investing", "intent": "long-term investment strategy", "output": [["lex", "\"index fund\" investing \"stock market\" -day -trading"], ["lex", "\"S&P 500\" \"index fund\" passive \"expense ratio\""], ["vec", "how to invest in stock market index funds for long-term growth"], ["hyde", "Index funds track a market index like the S&P 500 with low fees. They offer broad diversification, consistent returns matching the market, and outperform most active managers over time."]]} +{"query": "lithium ion battery degradation", "intent": "understanding battery aging", "output": [["lex", "\"lithium-ion\" battery degradation cycle -mining -extraction"], ["lex", "\"Li-ion\" battery \"capacity fade\" aging charging"], ["vec", "what causes lithium-ion batteries to degrade over time"], ["hyde", "Lithium-ion batteries degrade through repeated charge cycles, high temperatures, and deep discharges. Capacity fades as the electrolyte decomposes and lithium gets trapped in the anode."]]} +{"query": "functional programming monads haskell", "intent": "understanding Haskell abstractions", "output": [["lex", "monads Haskell \"functional programming\" -monastery -monk"], ["lex", "\"monad\" Maybe IO \"do notation\" Haskell"], ["vec", "what are monads in Haskell and how do they work in functional programming"], ["hyde", "Monads in Haskell wrap computations with context (Maybe for failure, IO for effects). They chain operations with >>= (bind) ensuring effects are sequenced and composable."]]} +{"query": "design patterns factory method", "intent": "applying creational design patterns", "output": [["lex", "\"factory method\" \"design pattern\" creational -manufacturing -industrial"], ["lex", "\"factory pattern\" abstract creator -assembly -plant"], ["vec", "how does the factory method design pattern work and when to use it"], ["hyde", "The factory method pattern defines an interface for creating objects but lets subclasses decide which class to instantiate. It promotes loose coupling by separating creation from usage."]]} +{"query": "protocol buffers grpc serialization", "intent": "using efficient RPC serialization", "output": [["lex", "\"Protocol Buffers\" protobuf gRPC -REST -JSON"], ["lex", "\"gRPC\" proto3 serialization \"service definition\""], ["vec", "how to use Protocol Buffers with gRPC for efficient serialization"], ["hyde", "Protocol Buffers define message schemas in .proto files. gRPC uses them for RPC service definitions. protoc generates client and server code. Binary format is smaller and faster than JSON."]]} +{"query": "chaos engineering resilience testing", "intent": "testing system reliability", "output": [["lex", "\"chaos engineering\" resilience testing -theory -physics"], ["lex", "\"chaos monkey\" \"fault injection\" \"game day\" -random"], ["vec", "how to practice chaos engineering to test system resilience"], ["hyde", "Chaos engineering deliberately injects failures into production systems to verify resilience. Start with hypotheses about expected behavior, then run controlled experiments to find weaknesses."]]} +{"query": "event sourcing CQRS architecture", "intent": "implementing event-driven systems", "output": [["lex", "\"event sourcing\" CQRS architecture -calendar -planning"], ["lex", "\"event store\" \"command query\" projection -party"], ["vec", "how to implement event sourcing with CQRS architecture pattern"], ["hyde", "Event sourcing stores state changes as immutable events rather than current state. CQRS separates read and write models. Commands produce events, projections build read-optimized views from the event stream."]]} +{"query": "zero trust network architecture", "intent": "securing network infrastructure", "output": [["lex", "\"zero trust\" network architecture -social -faith"], ["lex", "\"zero trust\" microsegmentation \"identity verification\" -religion"], ["vec", "what is zero trust network architecture and how to implement it"], ["hyde", "Zero trust assumes no implicit trust for any user or device. Every access request is verified regardless of network location. Implement with identity verification, microsegmentation, and least-privilege access."]]} +{"query": "service mesh istio microservices", "intent": "managing microservice communication", "output": [["lex", "\"service mesh\" Istio microservices -fabric -textile"], ["lex", "Istio sidecar \"traffic management\" -yoga -meditation"], ["vec", "how to use Istio service mesh for microservices communication"], ["hyde", "Istio injects sidecar proxies alongside each microservice to handle traffic routing, load balancing, and mTLS. It provides observability, security, and traffic management without application code changes."]]} +{"query": "principal component analysis dimensionality reduction", "intent": "reducing data dimensions", "output": [["lex", "\"principal component analysis\" PCA -school -administrator"], ["lex", "PCA \"dimensionality reduction\" eigenvalue variance"], ["vec", "how does PCA reduce dimensions in high-dimensional data"], ["hyde", "PCA finds orthogonal axes of maximum variance in data. Project data onto the top k principal components to reduce dimensions while preserving the most information."]]} +{"query": "los angeles traffic congestion solutions", "intent": "addressing urban transportation", "output": [["lex", "\"Los Angeles\" traffic congestion -movie -Hollywood"], ["lex", "\"LA\" freeway commute \"public transit\" metro"], ["vec", "solutions for traffic congestion problems in Los Angeles"], ["hyde", "Los Angeles traffic congestion stems from car-dependent infrastructure and sprawl. Solutions include expanding Metro rail, improving bus rapid transit, congestion pricing, and transit-oriented development."]]} +{"query": "blue green deployment zero downtime", "intent": "deploying without downtime", "output": [["lex", "\"blue-green deployment\" \"zero downtime\" -color -paint"], ["lex", "\"blue green\" deployment rollback cutover -art"], ["vec", "how to implement blue-green deployments for zero-downtime releases"], ["hyde", "Blue-green deployment runs two identical production environments. Route traffic to blue (current), deploy to green (new). After validation, switch the router to green. Rollback by switching back to blue."]]} +{"query": "rio de janeiro carnival festival", "intent": "learning about Brazilian culture", "output": [["lex", "\"Rio de Janeiro\" carnival festival -movie -animation"], ["lex", "\"Rio\" carnival samba parade \"Sambodromo\""], ["vec", "what is the Rio de Janeiro carnival festival and when does it happen"], ["hyde", "Rio's Carnival is a massive annual festival before Lent featuring samba school parades at the Sambodromo, street parties called blocos, and elaborate costumes. It typically runs for five days."]]} +{"query": "object relational mapping hibernate", "intent": "mapping Java objects to databases", "output": [["lex", "\"Hibernate\" ORM \"object-relational mapping\" -sleep -bear"], ["lex", "Hibernate JPA \"entity mapping\" \"lazy loading\""], ["vec", "how to use Hibernate ORM for database access in Java"], ["hyde", "Hibernate maps Java objects to database tables using annotations or XML. It handles SQL generation, caching, and lazy loading. JPA is the standard interface that Hibernate implements."]]} +{"query": "social security retirement benefits", "intent": "understanding retirement planning", "output": [["lex", "\"Social Security\" retirement benefits -cyber -network"], ["lex", "\"Social Security\" \"full retirement age\" -hacking -breach"], ["vec", "how do Social Security retirement benefits work and when to claim"], ["hyde", "Social Security retirement benefits are based on your highest 35 years of earnings. Full retirement age is 66-67 depending on birth year. Claiming early at 62 reduces benefits permanently."]]} +{"query": "differential equation numerical methods", "intent": "solving differential equations numerically", "output": [["lex", "\"differential equation\" \"numerical methods\" solver -personality -psychology"], ["lex", "ODE \"Runge-Kutta\" \"Euler method\" numerical"], ["vec", "numerical methods for solving differential equations"], ["hyde", "Numerical methods approximate solutions to differential equations through discretization. Euler's method is simplest but inaccurate. Runge-Kutta methods (RK4) offer better accuracy per step."]]} +{"query": "cross platform mobile development flutter", "intent": "building mobile apps with Flutter", "output": [["lex", "\"Flutter\" \"cross-platform\" mobile -butterfly -insect"], ["lex", "Flutter Dart widget \"hot reload\" -React -Native"], ["vec", "how to build cross-platform mobile apps using Flutter"], ["hyde", "Flutter uses Dart to build native-compiled apps for iOS and Android from a single codebase. Its widget system provides a rich UI toolkit with hot reload for fast development."]]} +{"query": "renewable energy solar panel efficiency", "intent": "evaluating solar energy", "output": [["lex", "\"solar panel\" efficiency renewable -space -satellite"], ["lex", "\"photovoltaic\" efficiency \"solar cell\" -solar -system"], ["vec", "how efficient are solar panels and what affects their performance"], ["hyde", "Modern solar panels achieve 20-25% efficiency for residential installations. Efficiency depends on cell technology, temperature, shading, angle, and panel degradation over time."]]} +{"query": "great barrier reef conservation", "intent": "protecting marine ecosystems", "output": [["lex", "\"Great Barrier Reef\" conservation protection -gaming -level"], ["lex", "\"Great Barrier Reef\" marine preservation -aquarium"], ["vec", "conservation efforts to protect the Great Barrier Reef"], ["hyde", "The Great Barrier Reef faces threats from coral bleaching, ocean acidification, and pollution. Conservation efforts include marine protected areas, water quality improvement, and coral restoration programs."]]} +{"query": "attention mechanism transformer architecture", "intent": "understanding transformer internals", "output": [["lex", "\"attention mechanism\" transformer architecture -ADHD -focus"], ["lex", "\"self-attention\" \"multi-head\" \"query key value\" -electrical"], ["vec", "how does the attention mechanism work in transformer architecture"], ["hyde", "Self-attention computes relevance scores between all pairs of tokens using query, key, and value projections. Multi-head attention runs multiple parallel attention functions for richer representations."]]} +{"query": "write ahead log database recovery", "intent": "understanding database durability", "output": [["lex", "\"write-ahead log\" WAL database recovery -diary -journal"], ["lex", "WAL \"crash recovery\" \"transaction log\" checkpoint"], ["vec", "how does write-ahead logging enable database crash recovery"], ["hyde", "Write-ahead logging writes changes to a log before modifying data pages. On crash, replay the WAL to restore committed transactions and undo incomplete ones, ensuring durability and consistency."]]} +{"query": "middle earth tolkien geography", "intent": "exploring Tolkien's fictional world", "output": [["lex", "\"Middle-earth\" Tolkien geography map -real -actual"], ["lex", "\"Lord of the Rings\" Tolkien \"Shire\" \"Mordor\" map"], ["vec", "geography and map of Middle-earth from Tolkien's works"], ["hyde", "Middle-earth's geography spans from the Shire in the northwest to Mordor in the southeast. Key regions include Rohan's plains, Gondor's kingdom, Mirkwood forest, and the Misty Mountains."]]} diff --git a/finetune/data/qmd_expansion_personal_entities.jsonl b/finetune/data/qmd_expansion_personal_entities.jsonl new file mode 100644 index 00000000..70f0ed4c --- /dev/null +++ b/finetune/data/qmd_expansion_personal_entities.jsonl @@ -0,0 +1,50 @@ +{"query": "meeting with Bob about C++", "intent": "discussing C++ implementation details", "output": [["hyde", "Bob and I discussed C++ implementation details during our meeting, covering template metaprogramming and memory management."], ["lex", "Bob \"C++\" meeting"], ["lex", "Bob C++ discussion notes"], ["vec", "meeting notes with Bob about C++ programming"], ["vec", "Bob's discussion about C++ implementation"]]} +{"query": "Sarah's presentation on Q4 goals", "intent": "reviewing quarterly objectives", "output": [["hyde", "Sarah presented the Q4 goals to the team, outlining revenue targets, product milestones, and hiring plans for the quarter."], ["lex", "Sarah Q4 goals presentation"], ["lex", "Sarah \"Q4\" quarterly goals slides"], ["vec", "Sarah's presentation about Q4 quarterly goals"], ["vec", "Q4 goals and objectives presented by Sarah"]]} +{"query": "email from Dave about the deployment issue", "intent": "tracking a production deployment problem", "output": [["hyde", "Dave emailed about the production deployment failure, noting that the database migration timed out and rollback was needed."], ["lex", "Dave deployment issue email"], ["lex", "Dave email deploy problem"], ["vec", "email from Dave about the deployment issue"], ["vec", "Dave's message about production deployment problems"]]} +{"query": "Alex's proposal for switching to TypeScript", "intent": "evaluating a language migration", "output": [["hyde", "Alex proposed migrating our frontend codebase from JavaScript to TypeScript for better type safety and developer experience."], ["lex", "Alex TypeScript proposal migration"], ["lex", "Alex \"TypeScript\" switch proposal"], ["vec", "Alex's proposal to migrate to TypeScript"], ["vec", "TypeScript migration plan proposed by Alex"]]} +{"query": "conversation with Lisa about the design mockups", "intent": "reviewing UI design progress", "output": [["hyde", "Lisa walked me through the updated design mockups for the new dashboard, including the navigation redesign and responsive layouts."], ["lex", "Lisa design mockups conversation"], ["lex", "Lisa mockups dashboard design"], ["vec", "conversation with Lisa about design mockups"], ["vec", "Lisa's feedback on the design mockup revisions"]]} +{"query": "standup notes from the Platform team", "intent": "tracking daily team progress", "output": [["hyde", "Platform team standup covered the API gateway migration, database upgrade progress, and the new monitoring rollout."], ["lex", "\"Platform team\" standup notes"], ["lex", "Platform standup daily meeting"], ["vec", "standup meeting notes from the Platform team"], ["vec", "Platform team daily standup updates"]]} +{"query": "Mike's feedback on the API design doc", "intent": "incorporating review feedback", "output": [["hyde", "Mike reviewed the API design document and suggested using pagination for list endpoints and adding rate limiting headers."], ["lex", "Mike API design doc feedback"], ["lex", "Mike \"API design\" review"], ["vec", "Mike's feedback and comments on the API design document"], ["vec", "API design document review from Mike"]]} +{"query": "meeting with Jennifer about the hiring pipeline", "intent": "managing engineering recruitment", "output": [["hyde", "Jennifer and I reviewed the engineering hiring pipeline. We have 12 candidates in the interview loop and need to speed up the offer stage."], ["lex", "Jennifer hiring pipeline meeting"], ["lex", "Jennifer interview hiring discussion"], ["vec", "meeting with Jennifer about engineering hiring pipeline"], ["vec", "Jennifer's update on the hiring and interview process"]]} +{"query": "Tom's analysis of the performance regression", "intent": "debugging a performance issue", "output": [["hyde", "Tom traced the performance regression to a missing database index on the users table that was dropped during the last migration."], ["lex", "Tom \"performance regression\" analysis"], ["lex", "Tom performance issue investigation"], ["vec", "Tom's root cause analysis of the performance regression"], ["vec", "performance regression investigation by Tom"]]} +{"query": "Rachel's notes on the vendor evaluation", "intent": "comparing vendor options", "output": [["hyde", "Rachel evaluated three vendors for our logging infrastructure: Datadog, Splunk, and Grafana Cloud. She recommended Datadog for cost and features."], ["lex", "Rachel vendor evaluation notes"], ["lex", "Rachel vendor comparison assessment"], ["vec", "Rachel's notes from the vendor evaluation process"], ["vec", "vendor evaluation and comparison by Rachel"]]} +{"query": "discussion with Chris about the database migration", "intent": "planning infrastructure changes", "output": [["hyde", "Chris outlined the plan to migrate from MySQL to PostgreSQL. The migration will happen in phases starting with the read replicas."], ["lex", "Chris database migration discussion"], ["lex", "Chris MySQL PostgreSQL migration"], ["vec", "discussion with Chris about the database migration plan"], ["vec", "Chris's database migration strategy and timeline"]]} +{"query": "email thread with Maria about the contract renewal", "intent": "managing vendor relationships", "output": [["hyde", "Maria forwarded the updated contract terms from the vendor. The renewal includes a 15% price increase but adds premium support."], ["lex", "Maria contract renewal email"], ["lex", "Maria vendor contract thread"], ["vec", "email thread with Maria about the contract renewal terms"], ["vec", "Maria's correspondence about vendor contract renewal"]]} +{"query": "Kevin's demo of the new search feature", "intent": "reviewing a feature demo", "output": [["hyde", "Kevin demoed the new full-text search feature with autocomplete, faceted filters, and highlighted results. Ships next sprint."], ["lex", "Kevin demo search feature"], ["lex", "Kevin \"search feature\" demo presentation"], ["vec", "Kevin's demonstration of the new search feature"], ["vec", "new search feature demo presented by Kevin"]]} +{"query": "meeting with Priya about the budget review", "intent": "reviewing financial planning", "output": [["hyde", "Priya walked through the Q3 budget actuals versus projections. Infrastructure costs were 20% over budget due to the traffic spike."], ["lex", "Priya budget review meeting"], ["lex", "Priya \"budget review\" Q3 financials"], ["vec", "meeting with Priya about the quarterly budget review"], ["vec", "Priya's budget review and cost analysis"]]} +{"query": "Daniel's incident report on the outage", "intent": "reviewing a production incident", "output": [["hyde", "Daniel wrote the postmortem for Tuesday's outage. Root cause was a misconfigured load balancer health check that caused cascading failures."], ["lex", "Daniel incident report outage"], ["lex", "Daniel outage postmortem \"incident report\""], ["vec", "Daniel's incident report about the production outage"], ["vec", "outage postmortem and incident report from Daniel"]]} +{"query": "brainstorm with Emma about the onboarding flow", "intent": "improving user experience", "output": [["hyde", "Emma and I brainstormed improvements to the user onboarding flow, including progressive profiling, interactive tutorials, and a simpler setup wizard."], ["lex", "Emma onboarding flow brainstorm"], ["lex", "Emma \"onboarding\" UX brainstorm"], ["vec", "brainstorming session with Emma about the onboarding flow"], ["vec", "Emma's ideas for improving user onboarding experience"]]} +{"query": "James asked about the deploy process", "intent": "knowledge sharing on deployments", "output": [["hyde", "James asked how our deployment process works. I walked him through the CI pipeline, staging environment, and production rollout procedure."], ["lex", "James deploy process question"], ["lex", "James deployment procedure"], ["vec", "James asking about the deployment process"], ["vec", "deployment process explanation for James"]]} +{"query": "notes from the Project Atlas kickoff", "intent": "tracking project initiation", "output": [["hyde", "Project Atlas kickoff meeting covered scope, timeline, and team allocation. Target launch is end of Q2 with a beta in March."], ["lex", "\"Project Atlas\" kickoff notes"], ["lex", "\"Project Atlas\" meeting launch"], ["vec", "kickoff meeting notes for Project Atlas"], ["vec", "Project Atlas project kickoff and planning notes"]]} +{"query": "feedback from the Horizon team retro", "intent": "improving team processes", "output": [["hyde", "The Horizon team retrospective identified slow code reviews and unclear requirements as the top two issues. Action items assigned to leads."], ["lex", "\"Horizon team\" retro feedback"], ["lex", "Horizon retrospective improvement"], ["vec", "feedback and action items from the Horizon team retrospective"], ["vec", "Horizon team retrospective meeting notes and outcomes"]]} +{"query": "conversation with Yuki about the localization effort", "intent": "planning internationalization", "output": [["hyde", "Yuki outlined the plan to localize the product into Japanese and Korean. She needs string extraction completed by Friday for the translation vendor."], ["lex", "Yuki localization effort conversation"], ["lex", "Yuki localization i18n translation"], ["vec", "conversation with Yuki about product localization"], ["vec", "Yuki's plan for the localization and translation effort"]]} +{"query": "Marcus's review of the security audit findings", "intent": "addressing security issues", "output": [["hyde", "Marcus reviewed the third-party security audit. Critical findings include exposed admin endpoints and weak session token generation."], ["lex", "Marcus security audit review"], ["lex", "Marcus \"security audit\" findings"], ["vec", "Marcus's review of the security audit results"], ["vec", "security audit findings reviewed by Marcus"]]} +{"query": "sync with Laura about customer escalations", "intent": "managing customer issues", "output": [["hyde", "Laura briefed me on three priority customer escalations: data export timeout for Acme Corp, billing discrepancy for TechStart, and API rate limit increase for GlobalTech."], ["lex", "Laura customer escalations sync"], ["lex", "Laura \"customer escalation\" priority"], ["vec", "sync meeting with Laura about customer escalations"], ["vec", "Laura's update on priority customer escalation cases"]]} +{"query": "one on one with Nathan about career growth", "intent": "supporting career development", "output": [["hyde", "Nathan and I discussed his career development goals. He wants to move into a tech lead role and is interested in the architecture track."], ["lex", "Nathan \"career growth\" 1-on-1"], ["lex", "Nathan career development meeting"], ["vec", "one-on-one with Nathan about career growth and development"], ["vec", "Nathan's career goals and growth discussion"]]} +{"query": "Emily's update on the data pipeline refactor", "intent": "tracking infrastructure work", "output": [["hyde", "Emily reported that the data pipeline refactor is 70% complete. The new Spark jobs are running 3x faster but the Airflow DAGs still need updating."], ["lex", "Emily \"data pipeline\" refactor update"], ["lex", "Emily pipeline Spark Airflow progress"], ["vec", "Emily's progress update on the data pipeline refactor"], ["vec", "data pipeline refactor status from Emily"]]} +{"query": "meeting with Ahmed about the mobile app launch", "intent": "planning a product launch", "output": [["hyde", "Ahmed presented the mobile app launch timeline. Beta TestFlight goes out Monday, app store submission on Wednesday, and public launch next Friday."], ["lex", "Ahmed \"mobile app\" launch meeting"], ["lex", "Ahmed app launch timeline"], ["vec", "meeting with Ahmed about the mobile app launch plan"], ["vec", "Ahmed's timeline for the mobile app launch"]]} +{"query": "Sophia's research on competitor pricing", "intent": "analyzing market positioning", "output": [["hyde", "Sophia analyzed competitor pricing across five direct competitors. Our mid-tier plan is priced 20% higher than average but includes more features."], ["lex", "Sophia competitor pricing research"], ["lex", "Sophia \"competitor analysis\" pricing"], ["vec", "Sophia's research and analysis of competitor pricing"], ["vec", "competitive pricing analysis done by Sophia"]]} +{"query": "discussion with Carlos about the API rate limits", "intent": "adjusting service configuration", "output": [["hyde", "Carlos proposed increasing the default API rate limit from 100 to 500 requests per minute for paying customers, with burst handling."], ["lex", "Carlos \"API rate limit\" discussion"], ["lex", "Carlos rate limit increase proposal"], ["vec", "discussion with Carlos about API rate limit changes"], ["vec", "Carlos's proposal for adjusting API rate limits"]]} +{"query": "retro notes from Sprint 23", "intent": "reviewing sprint outcomes", "output": [["hyde", "Sprint 23 retrospective: what went well was the quick bug turnaround. What to improve was the unclear acceptance criteria on feature tickets."], ["lex", "\"Sprint 23\" retro notes"], ["lex", "\"Sprint 23\" retrospective feedback"], ["vec", "retrospective notes from Sprint 23"], ["vec", "Sprint 23 team retrospective outcomes and action items"]]} +{"query": "conversation with Diana about the accessibility audit", "intent": "addressing accessibility compliance", "output": [["hyde", "Diana shared the accessibility audit results. Twenty-three WCAG AA violations found, mostly missing alt text and insufficient color contrast."], ["lex", "Diana accessibility audit conversation"], ["lex", "Diana WCAG \"accessibility audit\""], ["vec", "conversation with Diana about the accessibility audit findings"], ["vec", "Diana's accessibility audit results and recommendations"]]} +{"query": "Omar's prototype for the recommendation engine", "intent": "evaluating a new feature prototype", "output": [["hyde", "Omar built a prototype recommendation engine using collaborative filtering. Initial results show a 15% improvement in click-through rate on test data."], ["lex", "Omar prototype \"recommendation engine\""], ["lex", "Omar recommendation algorithm prototype"], ["vec", "Omar's prototype for the product recommendation engine"], ["vec", "recommendation engine prototype built by Omar"]]} +{"query": "planning meeting for the Falcon release", "intent": "coordinating a release schedule", "output": [["hyde", "The Falcon release planning meeting set the feature freeze for March 15 and the GA date for April 1. Three blockers need resolution this week."], ["lex", "\"Falcon release\" planning meeting"], ["lex", "Falcon release timeline blockers"], ["vec", "planning meeting for the Falcon product release"], ["vec", "Falcon release planning and timeline discussion"]]} +{"query": "Aisha's presentation on the A/B test results", "intent": "reviewing experiment outcomes", "output": [["hyde", "Aisha presented the A/B test results for the new checkout flow. Variant B showed a 12% conversion lift with statistical significance."], ["lex", "Aisha \"A/B test\" results presentation"], ["lex", "Aisha experiment checkout conversion"], ["vec", "Aisha's presentation on the A/B test experiment results"], ["vec", "A/B test results and analysis presented by Aisha"]]} +{"query": "one on one with Ryan about team dynamics", "intent": "improving team collaboration", "output": [["hyde", "Ryan raised concerns about communication between the frontend and backend squads. We agreed to introduce a weekly sync between the two teams."], ["lex", "Ryan \"team dynamics\" 1-on-1"], ["lex", "Ryan team communication meeting"], ["vec", "one-on-one with Ryan about team dynamics and collaboration"], ["vec", "Ryan's concerns about team dynamics and communication"]]} +{"query": "notes from the board meeting with investors", "intent": "tracking strategic decisions", "output": [["hyde", "Board meeting covered Q3 financial results, Series B fundraising timeline, and the product roadmap for 2025. Investors asked about path to profitability."], ["lex", "board meeting investors notes"], ["lex", "\"board meeting\" investor quarterly"], ["vec", "notes from the board meeting with investors"], ["vec", "investor board meeting notes and key discussion points"]]} +{"query": "Mei-Lin's proposal for the intern program", "intent": "planning an internship structure", "output": [["hyde", "Mei-Lin proposed a structured 12-week intern program with mentorship pairing, weekly tech talks, and a capstone project presentation at the end."], ["lex", "Mei-Lin intern program proposal"], ["lex", "Mei-Lin \"intern program\" structure"], ["vec", "Mei-Lin's proposal for the engineering intern program"], ["vec", "intern program structure proposed by Mei-Lin"]]} +{"query": "conversation with Raj about migrating to Kubernetes", "intent": "planning infrastructure migration", "output": [["hyde", "Raj outlined a phased Kubernetes migration: start with stateless services, then move databases with persistent volumes, and finally sunset the old EC2 instances."], ["lex", "Raj Kubernetes migration conversation"], ["lex", "Raj \"Kubernetes\" migration plan"], ["vec", "conversation with Raj about migrating infrastructure to Kubernetes"], ["vec", "Raj's plan for the Kubernetes migration"]]} +{"query": "weekly sync with the Growth team", "intent": "tracking growth initiatives", "output": [["hyde", "Growth team weekly sync covered the new referral program performance, email campaign results, and the upcoming product-led growth experiment."], ["lex", "\"Growth team\" weekly sync"], ["lex", "Growth team meeting updates"], ["vec", "weekly sync meeting notes with the Growth team"], ["vec", "Growth team weekly meeting updates and priorities"]]} +{"query": "Ivan's analysis of user churn data", "intent": "understanding user retention", "output": [["hyde", "Ivan analyzed user churn patterns and found that users who don't complete onboarding within 24 hours have a 60% higher churn rate."], ["lex", "Ivan churn data analysis"], ["lex", "Ivan \"user churn\" retention analysis"], ["vec", "Ivan's analysis of user churn data and patterns"], ["vec", "user churn analysis and insights from Ivan"]]} +{"query": "chat with Nora about the new CI pipeline", "intent": "improving developer tooling", "output": [["hyde", "Nora set up the new GitHub Actions CI pipeline with parallel test suites, caching, and automatic preview deployments for pull requests."], ["lex", "Nora CI pipeline chat"], ["lex", "Nora \"CI pipeline\" \"GitHub Actions\""], ["vec", "chat with Nora about the new CI pipeline setup"], ["vec", "Nora's work on the new CI/CD pipeline"]]} +{"query": "handoff notes from Victor before his vacation", "intent": "managing work continuity", "output": [["hyde", "Victor's handoff notes cover three in-progress PRs, the pending security patch deployment, and the customer demo scheduled for Thursday."], ["lex", "Victor handoff notes vacation"], ["lex", "Victor handoff \"before vacation\""], ["vec", "handoff notes from Victor before his vacation"], ["vec", "Victor's transition notes and pending items before time off"]]} +{"query": "feedback from the usability testing with Acme Corp", "intent": "incorporating user feedback", "output": [["hyde", "Usability testing with Acme Corp users revealed confusion around the permissions model and a request for bulk import functionality."], ["lex", "\"Acme Corp\" usability testing feedback"], ["lex", "\"Acme Corp\" user testing results"], ["vec", "feedback from usability testing sessions with Acme Corp"], ["vec", "Acme Corp usability testing findings and user feedback"]]} +{"query": "meeting with the Design Systems team about tokens", "intent": "evolving the design system", "output": [["hyde", "The Design Systems team presented their new design token architecture with semantic naming, dark mode support, and automatic documentation generation."], ["lex", "\"Design Systems\" team tokens meeting"], ["lex", "\"design tokens\" meeting \"Design Systems\""], ["vec", "meeting with the Design Systems team about design tokens"], ["vec", "Design Systems team discussion about design token architecture"]]} +{"query": "pair programming session with Kai on the auth refactor", "intent": "collaborative code improvement", "output": [["hyde", "Kai and I pair programmed on the auth refactor, extracting the session management into a dedicated service and adding refresh token rotation."], ["lex", "Kai \"pair programming\" auth refactor"], ["lex", "Kai auth refactor session"], ["vec", "pair programming session with Kai on the authentication refactor"], ["vec", "Kai's collaboration on the auth service refactoring"]]} +{"query": "lunch conversation with Pat about Rust at Stripe", "intent": "discussing Rust adoption at a company", "output": [["hyde", "Pat mentioned Stripe is using Rust for some performance-critical services. They have seen significant latency improvements in their payment processing path."], ["lex", "Pat Rust Stripe conversation"], ["lex", "Pat \"Rust\" \"Stripe\" discussion"], ["vec", "conversation with Pat about Rust usage at Stripe"], ["vec", "Pat's insights about Rust adoption at Stripe"]]} +{"query": "Ada's writeup on the CDN migration", "intent": "documenting infrastructure changes", "output": [["hyde", "Ada documented the CDN migration from CloudFront to Fastly, including performance benchmarks, configuration differences, and the rollout plan."], ["lex", "Ada CDN migration writeup"], ["lex", "Ada \"CDN migration\" CloudFront Fastly"], ["vec", "Ada's writeup and documentation on the CDN migration"], ["vec", "CDN migration documentation authored by Ada"]]} +{"query": "workshop notes from the team offsite in Portland", "intent": "capturing offsite planning outcomes", "output": [["hyde", "The Portland offsite workshop focused on team OKRs for H2, architecture vision for 2026, and cross-team collaboration improvements."], ["lex", "Portland offsite workshop notes"], ["lex", "\"team offsite\" Portland workshop"], ["vec", "workshop notes from the team offsite in Portland"], ["vec", "Portland team offsite workshop outcomes and planning"]]} +{"query": "Tara's RFC on the event-driven architecture", "intent": "evaluating an architecture proposal", "output": [["hyde", "Tara's RFC proposes migrating from synchronous REST calls to an event-driven architecture using Kafka for inter-service communication."], ["lex", "Tara RFC \"event-driven architecture\""], ["lex", "Tara RFC Kafka \"event driven\""], ["vec", "Tara's RFC proposing event-driven architecture migration"], ["vec", "event-driven architecture RFC written by Tara"]]} +{"query": "call with Jordan from customer success about renewals", "intent": "managing enterprise renewals", "output": [["hyde", "Jordan from customer success flagged three enterprise accounts at risk of non-renewal. Main concerns are missing API features and support response times."], ["lex", "Jordan \"customer success\" renewals call"], ["lex", "Jordan renewal risk enterprise"], ["vec", "call with Jordan from customer success about renewal risks"], ["vec", "Jordan's update on enterprise customer renewals"]]} +{"query": "discussion with Zara about the testing strategy", "intent": "improving QA approach", "output": [["hyde", "Zara proposed a new testing pyramid: more unit tests, fewer E2E tests, and contract tests between services to catch integration issues earlier."], ["lex", "Zara \"testing strategy\" discussion"], ["lex", "Zara testing pyramid E2E unit"], ["vec", "discussion with Zara about the testing strategy overhaul"], ["vec", "Zara's proposed testing strategy and approach"]]} +{"query": "follow up with Sam on the billing discrepancy", "intent": "resolving a billing issue", "output": [["hyde", "Sam investigated the billing discrepancy for the enterprise plan. The issue was double-counting usage during the timezone boundary at midnight UTC."], ["lex", "Sam billing discrepancy follow-up"], ["lex", "Sam \"billing\" issue investigation"], ["vec", "follow-up with Sam about the billing discrepancy"], ["vec", "Sam's investigation into the billing discrepancy"]]} diff --git a/finetune/data/qmd_expansion_sports.jsonl b/finetune/data/qmd_expansion_sports.jsonl new file mode 100644 index 00000000..8a2966e5 --- /dev/null +++ b/finetune/data/qmd_expansion_sports.jsonl @@ -0,0 +1,48 @@ +{"query": "UFC fight", "output": [["lex", "UFC \"Ultimate Fighting Championship\" fight"], ["lex", "MMA mixed martial arts bout"], ["vec", "Ultimate Fighting Championship fight results and highlights"], ["hyde", "The UFC (Ultimate Fighting Championship) fight card featured a five-round main event. The bout ended by TKO in the third round, with the fighter landing a devastating combination that dropped his opponent."]]} +{"query": "UFC fighter rankings", "output": [["lex", "UFC \"Ultimate Fighting Championship\" fighter rankings"], ["lex", "MMA pound-for-pound rankings weight class"], ["vec", "current UFC fighter rankings across all weight divisions"], ["hyde", "The UFC pound-for-pound rankings were updated following UFC 310. The lightweight division saw significant movement, with the champion retaining the #1 spot after a dominant title defense."]]} +{"query": "UFC fight tonight", "output": [["lex", "UFC \"Ultimate Fighting Championship\" fight tonight"], ["lex", "UFC fight card tonight main event"], ["vec", "what UFC fights are happening tonight and where to watch"], ["hyde", "Tonight's UFC Fight Night card begins at 7pm ET with preliminary bouts on ESPN+, followed by the main card at 10pm ET. The main event features a welterweight clash between two top-10 ranked fighters."]]} +{"query": "UFC weight classes", "output": [["lex", "UFC \"Ultimate Fighting Championship\" weight classes divisions"], ["lex", "MMA weight divisions flyweight bantamweight lightweight"], ["vec", "what are the UFC weight classes and their limits"], ["hyde", "UFC weight classes range from strawweight (115 lbs) to heavyweight (265 lbs). The men's divisions include flyweight (125), bantamweight (135), featherweight (145), lightweight (155), welterweight (170), middleweight (185), light heavyweight (205), and heavyweight (265)."]]} +{"query": "UFC pay-per-view", "output": [["lex", "UFC PPV pay-per-view event"], ["lex", "\"Ultimate Fighting Championship\" PPV card buy"], ["vec", "how to buy and watch UFC pay-per-view events"], ["hyde", "UFC pay-per-view events are available exclusively on ESPN+ for $79.99. The PPV main card typically begins at 10pm ET, preceded by the prelims on ESPN. Major numbered events like UFC 300 feature championship bouts."]]} +{"query": "NFL game scores", "output": [["lex", "NFL \"National Football League\" game scores"], ["lex", "NFL football scores results today"], ["vec", "National Football League game scores and results"], ["hyde", "The NFL Week 14 scores are in: the Chiefs defeated the Bills 27-24 in a thrilling Sunday Night Football matchup. The game came down to a last-second field goal that sealed the victory."]]} +{"query": "NFL draft", "output": [["lex", "NFL \"National Football League\" draft picks"], ["lex", "NFL draft prospects round selection"], ["vec", "National Football League draft picks and prospect analysis"], ["hyde", "The NFL Draft is held annually in late April, consisting of seven rounds over three days. Teams select eligible college football players, with the order determined by the previous season's record, giving the worst teams the earliest picks."]]} +{"query": "NFL Super Bowl", "output": [["lex", "NFL \"National Football League\" Super Bowl"], ["lex", "Super Bowl championship game NFC AFC"], ["vec", "NFL Super Bowl championship game results and history"], ["hyde", "The Super Bowl is the annual championship game of the National Football League. The NFC champion faces the AFC champion in the most-watched sporting event in the United States, typically held on the first Sunday in February."]]} +{"query": "NFL playoff standings", "output": [["lex", "NFL \"National Football League\" playoff standings"], ["lex", "NFL postseason bracket wild card division"], ["vec", "current NFL playoff standings and wild card race"], ["hyde", "The NFL playoff bracket includes 14 teams—seven from each conference. The top seed in each conference earns a first-round bye. Wild card weekend features six games, followed by the divisional round, conference championships, and the Super Bowl."]]} +{"query": "NFL trade deadline", "output": [["lex", "NFL \"National Football League\" trade deadline"], ["lex", "NFL player trades deadline deals"], ["vec", "National Football League trade deadline deals and rumors"], ["hyde", "The NFL trade deadline falls in early November each season. Teams looking to contend acquire players to bolster their rosters, while rebuilding teams trade veterans for draft picks. Notable deadline deals have reshaped playoff races."]]} +{"query": "NBA game", "output": [["lex", "NBA \"National Basketball Association\" game"], ["lex", "NBA basketball game score results"], ["vec", "National Basketball Association game results and highlights"], ["hyde", "The NBA regular season game tipped off at 7:30pm ET. The home team secured a 112-105 victory behind a 35-point performance from their star guard, who hit the go-ahead three-pointer with 45 seconds remaining."]]} +{"query": "NBA trade deadline", "output": [["lex", "NBA \"National Basketball Association\" trade deadline"], ["lex", "NBA player trades deadline deals rumors"], ["vec", "National Basketball Association trade deadline deals and rumors"], ["hyde", "The NBA trade deadline in February is one of the most active periods in the league. Contending teams look to add missing pieces while lottery-bound teams move veterans for young players and draft capital. The deadline has produced blockbuster multi-team deals."]]} +{"query": "NBA playoffs", "output": [["lex", "NBA \"National Basketball Association\" playoffs"], ["lex", "NBA postseason bracket play-in tournament"], ["vec", "National Basketball Association playoff bracket and series results"], ["hyde", "The NBA playoffs feature 16 teams competing in a best-of-seven series format across four rounds. The play-in tournament determines the 7th and 8th seeds. The playoffs culminate in the NBA Finals, where the Eastern and Western Conference champions meet."]]} +{"query": "NBA draft lottery", "output": [["lex", "NBA \"National Basketball Association\" draft lottery"], ["lex", "NBA draft lottery odds picks prospects"], ["vec", "how does the NBA draft lottery work and who are the top prospects"], ["hyde", "The NBA Draft Lottery determines the order of selection for the 14 teams that did not make the playoffs. The team with the worst record gets the best odds (14%) at the #1 overall pick, but the weighted lottery system means any of the bottom teams can move up."]]} +{"query": "NHL game", "output": [["lex", "NHL \"National Hockey League\" game"], ["lex", "NHL hockey game score results"], ["vec", "National Hockey League game scores and highlights"], ["hyde", "The NHL game ended in overtime after a 3-3 tie through regulation. The home team scored the game-winner on a power play goal 2:34 into the extra period, extending their winning streak to five games."]]} +{"query": "NHL Stanley Cup playoffs", "output": [["lex", "NHL \"National Hockey League\" Stanley Cup playoffs"], ["lex", "Stanley Cup playoff bracket series results"], ["vec", "National Hockey League Stanley Cup playoff results and bracket"], ["hyde", "The NHL Stanley Cup Playoffs feature 16 teams in a best-of-seven format across four rounds. The two conference champions meet in the Stanley Cup Final. The Cup is the oldest professional sports trophy in North America, first awarded in 1893."]]} +{"query": "NHL trade deadline", "output": [["lex", "NHL \"National Hockey League\" trade deadline"], ["lex", "NHL player trades deadline deals rentals"], ["vec", "National Hockey League trade deadline deals and acquisitions"], ["hyde", "The NHL trade deadline in early March sees contending teams acquire rental players for their playoff push. Teams out of contention sell pending unrestricted free agents for draft picks and prospects. Deadline day often features dozens of trades."]]} +{"query": "MLB World Series", "output": [["lex", "MLB \"Major League Baseball\" World Series"], ["lex", "World Series championship fall classic"], ["vec", "Major League Baseball World Series results and history"], ["hyde", "The World Series is the annual championship of Major League Baseball, contested between the American League and National League pennant winners. The best-of-seven series is played in October, earning it the nickname 'the Fall Classic.'"]]} +{"query": "MLB trade rumors", "output": [["lex", "MLB \"Major League Baseball\" trade rumors"], ["lex", "MLB trades deadline deals prospects"], ["vec", "Major League Baseball trade rumors and potential deals"], ["hyde", "MLB trade deadline activity heats up in late July as contenders look to add pitching and hitting. The most sought-after players are starting pitchers with team-friendly contracts and power bats from rebuilding clubs willing to trade for top prospects."]]} +{"query": "MLB standings", "output": [["lex", "MLB \"Major League Baseball\" standings"], ["lex", "MLB division standings wild card race"], ["vec", "current Major League Baseball standings and wild card race"], ["hyde", "The MLB standings show the division leaders and wild card contenders across the American and National Leagues. Each league has three divisions (East, Central, West), with division winners and three wild card teams qualifying for the postseason."]]} +{"query": "F1 race results", "output": [["lex", "F1 \"Formula 1\" \"Formula One\" race results"], ["lex", "Formula 1 Grand Prix race winner podium"], ["vec", "Formula 1 race results and Grand Prix standings"], ["hyde", "The Formula 1 Grand Prix race results are in. The pole-sitter converted his front-row start into a dominant victory, leading every lap and finishing 12 seconds ahead of his teammate. The constructors' championship battle tightened with both teams scoring heavily."]]} +{"query": "F1 driver standings", "output": [["lex", "F1 \"Formula 1\" driver standings championship"], ["lex", "Formula 1 drivers championship points WDC"], ["vec", "current Formula 1 World Drivers' Championship standings"], ["hyde", "The Formula 1 World Drivers' Championship standings after round 15 show a tight battle at the top, with just 28 points separating the leader from second place. Consistency in point scoring across all races has been the key differentiator."]]} +{"query": "F1 constructors championship", "output": [["lex", "F1 \"Formula 1\" constructors championship standings"], ["lex", "Formula 1 constructors WCC team points"], ["vec", "Formula 1 World Constructors' Championship standings and points"], ["hyde", "The Formula 1 Constructors' Championship awards points to teams based on the combined results of both drivers. The championship carries enormous financial implications, as prize money distribution is largely determined by final constructors' standings."]]} +{"query": "F1 Grand Prix schedule", "output": [["lex", "F1 \"Formula 1\" Grand Prix schedule calendar"], ["lex", "Formula 1 race calendar circuit dates"], ["vec", "Formula 1 Grand Prix race schedule and calendar for the season"], ["hyde", "The Formula 1 calendar features 24 Grands Prix across five continents. The season runs from March to December, visiting iconic circuits like Monaco, Silverstone, Monza, and Spa-Francorchamps alongside newer venues in the Middle East and Asia."]]} +{"query": "MLS Cup", "output": [["lex", "MLS \"Major League Soccer\" Cup"], ["lex", "MLS Cup championship playoff final"], ["vec", "Major League Soccer MLS Cup championship results"], ["hyde", "The MLS Cup is the championship match of Major League Soccer, concluding the MLS Cup Playoffs. The single-match final determines the league champion. The playoff format includes a best-of-three first round followed by single-elimination conference semifinals, finals, and the Cup."]]} +{"query": "MLS standings", "output": [["lex", "MLS \"Major League Soccer\" standings"], ["lex", "MLS standings points table Eastern Western conference"], ["vec", "current Major League Soccer standings and playoff picture"], ["hyde", "The MLS regular season standings determine playoff seeding. Each conference's top nine teams qualify for the MLS Cup Playoffs. Points are awarded as three for a win, one for a draw, and zero for a loss. Goal differential serves as the primary tiebreaker."]]} +{"query": "IMSA race results", "output": [["lex", "IMSA \"International Motor Sports Association\" race results"], ["lex", "IMSA WeatherTech SportsCar Championship results"], ["vec", "International Motor Sports Association race results and standings"], ["hyde", "The IMSA WeatherTech SportsCar Championship race results from the weekend showed a dominant performance by the GTP class leaders. The prototype covered 348 laps over the race distance, with strategy calls on pit timing proving decisive in the final stint."]]} +{"query": "IMSA LMP2 standings", "output": [["lex", "IMSA LMP2 standings championship"], ["lex", "IMSA \"International Motor Sports Association\" LMP2 class points"], ["vec", "IMSA WeatherTech Championship LMP2 class standings and results"], ["hyde", "The IMSA LMP2 class standings in the WeatherTech SportsCar Championship show a close fight for the title. The class features prototype-style race cars with spec Gibson V8 engines, competing alongside the top-tier GTP and GTD classes at endurance events."]]} +{"query": "IMSA Daytona 24", "output": [["lex", "IMSA Daytona 24 Hours \"Rolex 24\""], ["lex", "\"Daytona 24 Hours\" endurance race Rolex"], ["vec", "IMSA Rolex 24 at Daytona endurance race results"], ["hyde", "The Rolex 24 at Daytona is the season-opening round of the IMSA WeatherTech SportsCar Championship. The 24-hour endurance race at Daytona International Speedway features multi-class competition with GTP prototypes, LMP2, GTD Pro, and GTD cars racing simultaneously."]]} +{"query": "IMSA GTD class", "output": [["lex", "IMSA GTD \"Grand Touring Daytona\" class"], ["lex", "IMSA GTD GT3 sports car racing"], ["vec", "IMSA WeatherTech GTD class cars and competition"], ["hyde", "The IMSA GTD (Grand Touring Daytona) class features GT3-specification sports cars from manufacturers including Porsche, BMW, Mercedes-AMG, Lamborghini, and Ferrari. GTD Pro is the professional tier while GTD features a mix of professional and amateur drivers."]]} +{"query": "WEC Le Mans", "output": [["lex", "WEC \"World Endurance Championship\" Le Mans"], ["lex", "\"24 Hours of Le Mans\" FIA WEC endurance"], ["vec", "World Endurance Championship 24 Hours of Le Mans results"], ["hyde", "The 24 Hours of Le Mans is the crown jewel of the FIA World Endurance Championship. Held annually at the Circuit de la Sarthe in France, the race features Hypercar, LMP2, and LMGT3 classes competing over 24 hours on the legendary 13.6km circuit."]]} +{"query": "WEC Hypercar", "output": [["lex", "WEC \"World Endurance Championship\" Hypercar class"], ["lex", "FIA WEC Hypercar LMH LMDh prototype"], ["vec", "World Endurance Championship Hypercar class cars and manufacturers"], ["hyde", "The Hypercar class in the FIA World Endurance Championship features both Le Mans Hypercars (LMH) and Le Mans Daytona hybrid (LMDh) prototypes. Manufacturers including Toyota, Ferrari, Porsche, Peugeot, and Cadillac compete for the overall victory at Le Mans and WEC rounds."]]} +{"query": "WEC race calendar", "output": [["lex", "WEC \"World Endurance Championship\" race calendar schedule"], ["lex", "FIA WEC season rounds circuits dates"], ["vec", "FIA World Endurance Championship race schedule and calendar"], ["hyde", "The FIA World Endurance Championship calendar features eight rounds across the globe, including the 24 Hours of Le Mans, 6 Hours of Spa, and races at COTA, Fuji, Bahrain, and other circuits. Each round except Le Mans is a 6-hour or 8-hour race."]]} +{"query": "NASCAR Cup Series", "output": [["lex", "NASCAR Cup Series race results"], ["lex", "NASCAR stock car racing Cup Series standings"], ["vec", "NASCAR Cup Series race results and driver standings"], ["hyde", "The NASCAR Cup Series is the top tier of stock car racing in the United States. The season features 36 races across oval tracks, road courses, and superspeedways. The playoffs determine the champion through an elimination format culminating at Phoenix Raceway."]]} +{"query": "NASCAR Daytona 500", "output": [["lex", "NASCAR Daytona 500 race"], ["lex", "\"Daytona 500\" \"Great American Race\" NASCAR"], ["vec", "NASCAR Daytona 500 results and highlights"], ["hyde", "The Daytona 500 is the most prestigious race in NASCAR, opening the Cup Series season each February at Daytona International Speedway. Known as 'The Great American Race,' it features 200 laps of intense superspeedway drafting and pack racing on the 2.5-mile tri-oval."]]} +{"query": "NASCAR playoff standings", "output": [["lex", "NASCAR playoff standings Cup Series"], ["lex", "NASCAR Cup playoffs elimination points cutoff"], ["vec", "current NASCAR Cup Series playoff standings and elimination race"], ["hyde", "The NASCAR Cup Series playoffs feature 16 drivers competing across 10 races in four rounds. Four drivers are eliminated after each three-race round, with the Championship 4 racing for the title at the season finale. Wins and stage points determine advancement."]]} +{"query": "PGA golf tournament", "output": [["lex", "PGA \"Professional Golfers Association\" tournament"], ["lex", "PGA Tour golf tournament leaderboard results"], ["vec", "PGA Tour golf tournament results and leaderboard"], ["hyde", "The PGA Tour event concluded with a final-round 65 to win by two strokes at 18-under par. The tournament featured a stacked field including several major champions competing on the par-72 layout. The victory earned the champion 500 FedExCup points."]]} +{"query": "PGA major championship", "output": [["lex", "PGA golf major championship"], ["lex", "\"PGA Championship\" Masters \"US Open\" \"The Open\" golf major"], ["vec", "PGA Tour major championship results and history"], ["hyde", "The four men's golf majors are the Masters (April, Augusta National), the PGA Championship (May), the U.S. Open (June), and The Open Championship (July, British Open). These tournaments carry the most prestige and FedExCup points on the PGA Tour calendar."]]} +{"query": "ATP tennis rankings", "output": [["lex", "ATP \"Association of Tennis Professionals\" rankings"], ["lex", "ATP Tour men's tennis world rankings points"], ["vec", "Association of Tennis Professionals men's tennis world rankings"], ["hyde", "The ATP Rankings determine men's tennis player standings based on points earned at tournaments over the past 52 weeks. Grand Slams award the most points (2000 for the winner), followed by ATP Masters 1000 events. The year-end #1 ranking is one of tennis's highest honors."]]} +{"query": "ATP Grand Slam results", "output": [["lex", "ATP tennis Grand Slam results"], ["lex", "\"Grand Slam\" tennis tournament results draw men's"], ["vec", "men's tennis Grand Slam tournament results and draw"], ["hyde", "The Grand Slam tournaments are the four most prestigious events in tennis: the Australian Open (January), French Open (May-June), Wimbledon (June-July), and US Open (August-September). Each features a 128-player draw with best-of-five-sets matches in the men's singles."]]} +{"query": "WTA tennis", "output": [["lex", "WTA \"Women's Tennis Association\" tour"], ["lex", "WTA women's tennis rankings tournament results"], ["vec", "Women's Tennis Association tour results and world rankings"], ["hyde", "The WTA Tour is the top professional tennis circuit for women. The tour features four Grand Slams, WTA 1000 events, WTA 500, and WTA 250 tournaments. Rankings are based on points accumulated over a rolling 52-week period, with Grand Slams offering the highest point totals."]]} +{"query": "FIFA World Cup", "output": [["lex", "FIFA \"Fédération Internationale de Football Association\" World Cup"], ["lex", "FIFA World Cup soccer football tournament"], ["vec", "FIFA World Cup international soccer tournament results and history"], ["hyde", "The FIFA World Cup is the most prestigious international soccer tournament, held every four years. National teams from around the world compete through qualifying stages before 32 (expanded to 48 in 2026) teams meet at the finals. The tournament is the most-watched sporting event globally."]]} +{"query": "FIFA rankings", "output": [["lex", "FIFA world rankings football soccer"], ["lex", "\"FIFA rankings\" national team points international"], ["vec", "FIFA men's world rankings for international soccer teams"], ["hyde", "The FIFA World Rankings rank men's national football teams based on match results over the past four years, weighted by match importance, opponent strength, and confederation. The rankings determine seeding for World Cup draws and other FIFA competitions."]]} +{"query": "F1 qualifying results", "output": [["lex", "F1 \"Formula 1\" qualifying results grid"], ["lex", "Formula 1 qualifying session pole position Q1 Q2 Q3"], ["vec", "Formula 1 qualifying session results and starting grid"], ["hyde", "Formula 1 qualifying determines the starting grid through three knockout sessions. Q1 eliminates the slowest five cars, Q2 eliminates the next five, and Q3 is a top-10 shootout for pole position. Sprint qualifying sessions use a shorter format at select Grand Prix weekends."]]} +{"query": "NBA free agency", "output": [["lex", "NBA \"National Basketball Association\" free agency"], ["lex", "NBA free agent signings contracts offseason"], ["vec", "National Basketball Association free agency signings and contracts"], ["hyde", "NBA free agency begins July 1st each year when unrestricted free agents can negotiate with any team. The salary cap and luxury tax shape which teams can offer max contracts. Restricted free agents can receive offer sheets that their current team has the right to match."]]} +{"query": "NFL fantasy football", "output": [["lex", "NFL \"National Football League\" fantasy football"], ["lex", "fantasy football rankings waiver wire projections"], ["vec", "NFL fantasy football player rankings and waiver wire pickups"], ["hyde", "Fantasy football managers set weekly lineups of NFL players who earn points based on real-game statistics. Key positions include quarterback, running back, wide receiver, and tight end. Waiver wire pickups and trade strategies are crucial for navigating injuries and bye weeks throughout the season."]]} +{"query": "NASCAR Xfinity Series", "output": [["lex", "NASCAR Xfinity Series race results"], ["lex", "NASCAR Xfinity standings drivers points"], ["vec", "NASCAR Xfinity Series race results and driver standings"], ["hyde", "The NASCAR Xfinity Series is the second tier of NASCAR competition, serving as a development series for drivers aspiring to reach the Cup Series. Many Xfinity races are held on the same weekends as Cup events, with some Cup drivers making occasional starts."]]} +{"query": "MMA UFC event", "output": [["lex", "MMA UFC \"Ultimate Fighting Championship\" event"], ["lex", "MMA \"mixed martial arts\" UFC fight card"], ["vec", "UFC mixed martial arts event fight card and results"], ["hyde", "The UFC event featured 12 bouts across the preliminary and main card. The main event was a five-round championship fight, with the challenger earning a unanimous decision victory to claim the belt. Two performance bonuses were awarded for spectacular finishes."]]} diff --git a/finetune/data/qmd_expansion_v2.jsonl b/finetune/data/qmd_expansion_v2.jsonl deleted file mode 100644 index f05e91a9..00000000 --- a/finetune/data/qmd_expansion_v2.jsonl +++ /dev/null @@ -1,1498 +0,0 @@ -{"output": [["lex", "tourism impact local culture"], ["lex", "cultural effects mass tourism communities"], ["lex", "tourist influence indigenous traditions"], ["vec", "what are the positive and negative effects of tourism on local cultural traditions and communities"], ["vec", "how does mass tourism change the customs, language, and daily life of host communities"], ["hyde", "Tourism often leads to cultural commodification, where traditional dances, crafts, and rituals are adapted to meet tourist expectations. In Bali, temple ceremonies have been shortened and repackaged as entertainment, diluting their spiritual significance for locals."]], "query": "how tourism affects local cultures"} -{"output": [["lex", "home fermentation vegetables guide"], ["lex", "lacto fermentation salt brine method"], ["lex", "homemade sauerkraut kimchi ferment"], ["vec", "what is the step-by-step process for fermenting vegetables at home using salt brine"], ["vec", "how do you safely ferment foods like sauerkraut and kimchi in your kitchen"], ["hyde", "To ferment vegetables at home, submerge them in a 2-3% salt brine in a mason jar. Keep at room temperature (65-75°F) for 3-7 days, burping the jar daily to release CO2. Taste after day 3 and refrigerate once the tanginess is to your liking."]], "query": "how to ferment foods at home"} -{"output": [["lex", "modern vintage decor mix interior design"], ["lex", "combining antique furniture contemporary style"], ["vec", "how do you blend vintage furniture and antique pieces with modern interior design elements"], ["vec", "what are effective ways to combine mid-century or antique decor with contemporary minimalist style"], ["hyde", "Pair a vintage wooden dresser with a sleek modern mirror. Use neutral wall colors as a backdrop and let one statement antique piece anchor each room. Mix textures—a velvet mid-century sofa with clean-lined metal side tables creates visual contrast without clashing."]], "query": "how to mix modern and vintage decor"} -{"output": [["lex", "scientific experiment steps procedure"], ["lex", "scientific method hypothesis variables control"], ["lex", "lab experiment design methodology"], ["vec", "what are the steps to design and carry out a controlled scientific experiment"], ["vec", "how do you formulate a hypothesis, set up controls, and collect data in a scientific experiment"], ["hyde", "Step 1: Define your research question. Step 2: Formulate a testable hypothesis. Step 3: Identify independent, dependent, and controlled variables. Step 4: Design your procedure with a control group. Step 5: Collect and record data systematically. Step 6: Analyze results and draw conclusions."]], "query": "how to perform a scientific experiment"} -{"output": [["lex", "webmail client email browser"], ["lex", "web-based email service provider"], ["lex", "online email login inbox access"], ["vec", "how to access and use web-based email services like Gmail, Outlook, or Yahoo Mail through a browser"], ["vec", "what are the most popular webmail providers and how do their features compare"], ["hyde", "Webmail allows you to access your email through a web browser without installing a desktop client. Popular services include Gmail (mail.google.com), Outlook.com, Yahoo Mail, and ProtonMail. Log in with your credentials to read, compose, and manage messages from any device."]], "query": "web mail"} -{"output": [["lex", "quran topics contents themes"], ["lex", "quran teachings subjects covered"], ["vec", "what are the main topics and themes discussed in the Quran"], ["vec", "what subjects does the Quran address including theology, law, morality, and prophetic stories"], ["hyde", "The Quran covers topics including monotheism (tawhid), the Day of Judgment, stories of prophets from Adam to Muhammad, ethical conduct, family law, dietary rules, charity (zakat), prayer, and the relationship between God and humanity. It contains 114 surahs organized roughly by length."]], "query": "what does the quran cover"} -{"output": [["lex", "web.config file IIS ASP.NET"], ["lex", "web server configuration settings"], ["lex", "web.config XML settings authentication"], ["vec", "how to configure a web.config file for IIS and ASP.NET applications"], ["vec", "what settings and sections are available in a web.config file for web server configuration"], ["hyde", "The web.config file is an XML configuration file used by IIS and ASP.NET. It controls settings such as authentication, authorization, custom errors, connection strings, and HTTP handlers. Place it in the root of your application directory. Example: "]], "query": "web config"} -{"output": [["lex", "farm equipment selection tractor implements"], ["lex", "agricultural machinery buying guide"], ["lex", "choosing tractor size horsepower acreage"], ["vec", "what factors should you consider when selecting farm equipment like tractors and implements for your land"], ["vec", "how do you match the right agricultural machinery to your farm size, crop type, and budget"], ["hyde", "Match tractor horsepower to your acreage: 25-45 HP for under 50 acres, 45-85 HP for 50-200 acres, and 100+ HP for large operations. Consider PTO power for running implements like mowers and tillers. Evaluate whether two-wheel or four-wheel drive suits your terrain. Used equipment can save 40-60% over new."]], "query": "how to choose farm equipment"} -{"output": [["lex", "thought experiments philosophy reasoning"], ["lex", "philosophical thought experiment trolley problem examples"], ["vec", "how do philosophers use thought experiments like the trolley problem to test moral and logical intuitions"], ["vec", "what role do hypothetical scenarios play in advancing philosophical arguments and theories"], ["hyde", "Thought experiments isolate specific variables in complex problems by constructing hypothetical scenarios. Judith Jarvis Thomson's violinist argument tests bodily autonomy intuitions, while the trolley problem probes deontological vs. consequentialist reasoning. They help philosophers identify hidden assumptions and clarify conceptual boundaries."]], "query": "how do thought experiments aid philosophical reasoning"} -{"output": [["lex", "logic philosophy significance role"], ["lex", "formal logic philosophical argument validity"], ["vec", "why is logic considered foundational to philosophical inquiry and argumentation"], ["vec", "how does formal and informal logic help philosophers evaluate the validity of arguments"], ["hyde", "Logic provides the structural framework for all philosophical reasoning. Aristotle's syllogistic logic established rules for valid deduction. Modern formal logic, including propositional and predicate calculus, allows philosophers to precisely evaluate argument validity, identify fallacies, and construct rigorous proofs."]], "query": "what is the significance of logic in philosophy"} -{"output": [["lex", "5k run training plan beginner"], ["lex", "couch to 5k running program schedule"], ["vec", "what is a good beginner training plan to prepare for running a 5k race"], ["vec", "how many weeks does it take to train for a 5k and what should each week look like"], ["hyde", "An 8-week 5K training plan for beginners: Weeks 1-2, alternate 1 min running and 2 min walking for 20 minutes, 3 days per week. Weeks 3-4, run 3 min, walk 1 min. Weeks 5-6, run 5 min, walk 1 min. Weeks 7-8, run continuously for 25-30 minutes. Include rest days between runs."]], "query": "how to train for a 5k run"} -{"output": [["lex", "political dialogue conversation civil discourse"], ["lex", "discussing politics constructively disagreement"], ["vec", "how can you have productive political conversations with people who hold different views"], ["vec", "what techniques help maintain respectful and constructive political dialogue across ideological divides"], ["hyde", "Start by listening actively and asking clarifying questions rather than immediately countering. Use \"I\" statements instead of accusations. Acknowledge shared values before addressing disagreements. Avoid strawmanning—restate the other person's position accurately before responding. Focus on specific policies rather than party labels."]], "query": "how to engage with political dialogues"} -{"output": [["lex", "competitive analysis business strategy"], ["lex", "competitor analysis market research framework"], ["vec", "what is competitive analysis in business and how do companies use it to inform strategy"], ["vec", "what frameworks and methods are used to conduct a competitive analysis of rival companies"], ["hyde", "Competitive analysis is the process of identifying competitors and evaluating their strategies, strengths, and weaknesses relative to your own. Key frameworks include Porter's Five Forces, SWOT analysis, and competitor profiling. Analyze pricing, product features, market share, marketing channels, and customer reviews."]], "query": "what is competitive analysis"} -{"output": [["lex", "united nations structure operations governance"], ["lex", "UN general assembly security council agencies"], ["vec", "how is the United Nations structured and what are the roles of its main bodies like the General Assembly and Security Council"], ["vec", "how does the UN make decisions, enforce resolutions, and coordinate international action"], ["hyde", "The UN operates through six principal organs: the General Assembly (all 193 members, one vote each), the Security Council (15 members, 5 permanent with veto power), the Secretariat, the International Court of Justice, ECOSOC, and the Trusteeship Council. Resolutions require majority votes; Security Council decisions need 9 of 15 votes with no P5 veto."]], "query": "how does the united nations operate"} -{"output": [["lex", "crusades medieval holy wars Jerusalem"], ["lex", "crusades history 1096 Christian Muslim"], ["vec", "what were the Crusades and why did European Christians launch military campaigns to the Holy Land"], ["vec", "what were the major Crusades, their outcomes, and their lasting impact on Europe and the Middle East"], ["hyde", "The Crusades were a series of religious wars between 1096 and 1291, initiated by the Latin Church to recapture the Holy Land from Muslim rule. The First Crusade (1096-1099) captured Jerusalem. Subsequent crusades had mixed results, and the last Crusader stronghold at Acre fell in 1291."]], "query": "what are the crusades?"} -{"output": [["lex", "literary theme definition examples"], ["lex", "theme in literature central idea meaning"], ["vec", "what is a literary theme and how does it differ from the subject or plot of a story"], ["vec", "how do authors develop and convey themes throughout a work of literature"], ["hyde", "A literary theme is the underlying message or central idea explored in a work of fiction. Unlike the subject (what the story is about), the theme is what the story says about that subject. For example, a novel's subject might be war, while its theme could be \"war dehumanizes both victors and victims.\""]], "query": "what is a literary theme?"} -{"output": [["lex", "consent ethics moral significance"], ["lex", "informed consent autonomy medical ethics"], ["vec", "why is consent considered ethically important in medical, legal, and interpersonal contexts"], ["vec", "how does the concept of informed consent protect individual autonomy and human dignity"], ["hyde", "Consent is ethically significant because it respects individual autonomy—the right of persons to make decisions about their own bodies and lives. In medical ethics, informed consent requires that patients understand the risks, benefits, and alternatives before agreeing to treatment. Without valid consent, actions become coercive regardless of their intent."]], "query": "what is the ethical significance of consent"} -{"output": [["lex", "paint color mixing guide ratios"], ["lex", "acrylic oil paint mixing technique"], ["lex", "paint color chart combinations blending"], ["vec", "how do you mix paint colors to achieve specific shades and hues"], ["vec", "what are the basic color mixing ratios and techniques for acrylic and oil paints"], ["hyde", "Start with the three primary colors: red, blue, and yellow. Mix red and blue for purple, blue and yellow for green, red and yellow for orange. Add white to lighten (tint) and black to darken (shade). Mix small amounts gradually—it takes less dark paint to shift a light color than the reverse."]], "query": "paint mix"} -{"output": [["lex", "office energy conservation tips"], ["lex", "reduce electricity workplace energy saving"], ["vec", "what are practical ways to reduce energy consumption in an office or workplace"], ["vec", "how can offices save electricity through lighting, HVAC, and equipment management"], ["hyde", "Switch to LED lighting and install occupancy sensors in conference rooms and restrooms. Set computers to sleep mode after 10 minutes of inactivity. Use smart power strips to eliminate phantom loads. Set thermostats to 68°F in winter and 76°F in summer. These measures typically reduce office energy use by 20-30%."]], "query": "how to conserve energy in the office?"} -{"output": [["lex", "soil pH test kit method"], ["lex", "test soil acidity alkalinity garden"], ["vec", "how do you test the pH level of garden soil using a home test kit or meter"], ["vec", "what methods are available for measuring soil pH and interpreting the results for gardening"], ["hyde", "Insert a soil pH meter probe 4-6 inches into moist soil for a quick reading. For more accuracy, use a chemical test kit: mix one part soil with one part distilled water, let settle, then add the indicator solution. Compare the color to the chart. Most garden plants prefer pH 6.0-7.0."]], "query": "how to test soil ph?"} -{"output": [["lex", "sustainable building certification LEED BREEAM"], ["lex", "green building standards certification process"], ["vec", "what are the main sustainable building certifications like LEED, BREEAM, and WELL, and how do you achieve them"], ["vec", "how do you navigate the requirements and application process for green building certifications"], ["hyde", "LEED (Leadership in Energy and Environmental Design) awards points across categories: energy, water, materials, indoor quality, and site selection. Projects need 40-49 points for Certified, 50-59 for Silver, 60-79 for Gold, and 80+ for Platinum. BREEAM is more common in Europe and uses a percentage-based scoring system."]], "query": "navigating sustainable building certifications"} -{"output": [["lex", "religious leaders role function community"], ["lex", "clergy priests imams rabbis duties responsibilities"], ["vec", "what roles do religious leaders like priests, imams, and rabbis play in their communities"], ["vec", "how do religious leaders guide spiritual practice, provide counsel, and serve their congregations"], ["hyde", "Religious leaders serve as spiritual guides, interpreters of sacred texts, and community organizers. A parish priest administers sacraments, leads worship, and provides pastoral care. An imam leads prayers, delivers Friday sermons (khutbah), and offers religious guidance. Rabbis teach Torah, arbitrate Jewish law, and counsel congregants."]], "query": "what is the role of religious leaders?"} -{"output": [["lex", "balanced diet nutrition food groups"], ["lex", "healthy eating meal plan macronutrients"], ["vec", "how do you maintain a balanced diet with the right proportions of proteins, carbohydrates, fats, and vitamins"], ["vec", "what does a daily balanced meal plan look like for an average adult"], ["hyde", "A balanced diet includes roughly 45-65% carbohydrates, 20-35% fats, and 10-35% protein. Fill half your plate with fruits and vegetables, a quarter with whole grains, and a quarter with lean protein. Aim for 25-30g of fiber daily. Limit added sugars to under 25g and sodium to under 2300mg per day."]], "query": "how to maintain a balanced diet"} -{"output": [["lex", "moral philosophy ethics definition branches"], ["lex", "ethics normative metaethics applied"], ["vec", "what is moral philosophy and what are its main branches including normative ethics and metaethics"], ["vec", "how does moral philosophy address questions of right and wrong, virtue, and duty"], ["hyde", "Moral philosophy, or ethics, is the branch of philosophy concerned with questions of right and wrong conduct. It includes three main branches: metaethics (the nature of moral judgments), normative ethics (frameworks like utilitarianism, deontology, and virtue ethics), and applied ethics (specific issues like abortion or euthanasia)."]], "query": "what is moral philosophy"} -{"output": [["lex", "light meter photography exposure reading"], ["lex", "incident reflected light meter settings"], ["vec", "how do you use a handheld light meter to measure exposure for photography"], ["vec", "what is the difference between incident and reflected light metering and when should you use each"], ["hyde", "Point an incident light meter at the camera from the subject's position with the dome facing the lens. It reads the light falling on the subject, giving accurate exposure regardless of subject brightness. For reflected metering, point the meter at the subject from the camera position. Set the ISO first, then read the recommended aperture and shutter speed."]], "query": "how to use a light meter"} -{"output": [["lex", "creative writing significance purpose value"], ["lex", "creative writing literary expression storytelling"], ["vec", "why is creative writing significant as a form of artistic expression and communication"], ["vec", "how does creative writing contribute to culture, self-expression, and empathy"], ["hyde", "Creative writing allows individuals to explore complex emotions, construct meaning, and communicate experiences that resist straightforward exposition. Through fiction, poetry, and memoir, writers develop empathy by inhabiting other perspectives. Studies show that reading literary fiction improves theory of mind and emotional intelligence."]], "query": "what is the significance of creative writing?"} -{"output": [["lex", "confucianism key principles ren li xiao"], ["lex", "confucian philosophy five relationships virtues"], ["vec", "what are the core principles and virtues of Confucianism such as ren, li, and filial piety"], ["vec", "how do the five key relationships in Confucianism structure social and moral order"], ["hyde", "The key principles of Confucianism include Ren (benevolence/humaneness), Li (ritual propriety), Xiao (filial piety), Yi (righteousness), and Zhi (wisdom). The Five Relationships define social bonds: ruler-subject, parent-child, husband-wife, elder-younger sibling, and friend-friend. Each relationship carries reciprocal obligations."]], "query": "what are the key principles of confucianism?"} -{"output": [["lex", "agile project management scrum kanban"], ["lex", "agile methodology sprints iterative development"], ["vec", "what is agile project management and how does it differ from traditional waterfall approaches"], ["vec", "how do agile frameworks like Scrum and Kanban organize work into sprints and iterations"], ["hyde", "Agile project management is an iterative approach that delivers work in short cycles called sprints (typically 1-4 weeks). Teams hold daily standups, plan sprint backlogs, and conduct retrospectives. Key frameworks include Scrum (with defined roles: Product Owner, Scrum Master, Team) and Kanban (continuous flow with WIP limits)."]], "query": "what is agile project management"} -{"output": [["lex", "Harlem Renaissance significance African American culture"], ["lex", "Harlem Renaissance 1920s literature art music"], ["vec", "what was the Harlem Renaissance and why was it significant for African American culture and arts"], ["vec", "which writers, artists, and musicians defined the Harlem Renaissance and what impact did they have"], ["hyde", "The Harlem Renaissance (1920s-1930s) was a cultural explosion centered in Harlem, New York, that transformed African American literature, music, and art. Langston Hughes, Zora Neale Hurston, and Claude McKay produced groundbreaking literary works. Jazz and blues flourished at the Cotton Club. The movement asserted Black identity and challenged racial stereotypes."]], "query": "what is the significance of the harlem renaissance"} -{"output": [["lex", "World War I causes triggers assassination"], ["lex", "WWI outbreak 1914 Franz Ferdinand alliances"], ["vec", "what events and conditions triggered the start of World War I in 1914"], ["vec", "how did the assassination of Archduke Franz Ferdinand lead to a full-scale world war through the alliance system"], ["hyde", "The assassination of Archduke Franz Ferdinand of Austria-Hungary on June 28, 1914, in Sarajevo triggered WWI. Austria-Hungary issued an ultimatum to Serbia. The alliance system pulled in Russia (allied with Serbia), Germany (allied with Austria-Hungary), France (allied with Russia), and Britain (allied with France and Belgium)."]], "query": "what triggered world war i"} -{"output": [["lex", "improve drawing skills practice techniques"], ["lex", "learn to draw exercises sketching"], ["vec", "what exercises and practice routines help improve drawing and sketching skills for beginners"], ["vec", "how can you develop better hand-eye coordination and observational skills for drawing"], ["hyde", "Practice gesture drawing daily: set a timer for 30-60 seconds and sketch the overall pose of a figure or object without lifting your pencil. Draw from life, not just photos. Study basic forms—spheres, cylinders, boxes—and learn to see complex objects as combinations of these shapes. Fill a sketchbook page every day."]], "query": "how to improve drawing skills?"} -{"output": [["lex", "international relations definition political science"], ["lex", "IR theory realism liberalism diplomacy"], ["vec", "what is the field of international relations and what theories explain how states interact"], ["vec", "how does international relations study diplomacy, conflict, trade, and cooperation between nations"], ["hyde", "International relations (IR) is a subfield of political science that studies interactions between states, international organizations, and non-state actors. Major theoretical frameworks include realism (states pursue power in an anarchic system), liberalism (institutions and cooperation reduce conflict), and constructivism (social norms shape state behavior)."]], "query": "what is international relations"} -{"output": [["lex", "Human Genome Project HGP DNA sequencing"], ["lex", "human genome mapping genes 2003 completed"], ["vec", "what was the Human Genome Project and what did it accomplish in mapping human DNA"], ["vec", "how has the Human Genome Project influenced genetics, medicine, and our understanding of human biology"], ["hyde", "The Human Genome Project (1990-2003) was an international research effort to sequence all 3.2 billion base pairs of human DNA and identify approximately 20,500 genes. Completed in April 2003, it cost $2.7 billion and has enabled advances in personalized medicine, genetic testing, and understanding of hereditary diseases."]], "query": "what is the human genome project"} -{"output": [["lex", "neighborhood safety assessment crime check"], ["lex", "evaluate neighborhood crime rate walkability"], ["vec", "how do you assess whether a neighborhood is safe before moving there"], ["vec", "what factors and data sources help evaluate neighborhood safety including crime statistics and local conditions"], ["hyde", "Check crime maps on sites like CrimeMapping.com or SpotCrime using the ZIP code. Walk the neighborhood at different times of day and night. Look for signs of community investment: maintained properties, street lighting, and active businesses. Talk to residents and visit the local police precinct for crime statistics."]], "query": "how to assess a neighborhood safety"} -{"output": [["lex", "just society characteristics principles fairness"], ["lex", "social justice equality Rawls distributive justice"], ["vec", "what are the defining characteristics of a just society according to political philosophy"], ["vec", "how do philosophers like John Rawls define justice and the principles of a fair society"], ["hyde", "John Rawls argued a just society is one where principles are chosen behind a \"veil of ignorance\"—not knowing your own position. His two principles: (1) equal basic liberties for all, and (2) social and economic inequalities are arranged to benefit the least advantaged (difference principle) with fair equality of opportunity."]], "query": "what are the characteristics of a just society"} -{"output": [["lex", "narrative arc significance story structure"], ["lex", "narrative arc exposition climax resolution"], ["vec", "what is a narrative arc and why is it significant in storytelling and fiction writing"], ["vec", "how do the stages of a narrative arc—exposition, rising action, climax, falling action, resolution—shape a story"], ["hyde", "The narrative arc structures a story's progression from exposition through rising action to climax, then falling action and resolution. Gustav Freytag formalized this as a five-act pyramid. A strong arc creates tension, develops characters through conflict, and delivers emotional payoff, keeping readers engaged from beginning to end."]], "query": "what is the significance of the narrative arc?"} -{"output": [["lex", "bioethics definition medical ethics biology"], ["lex", "bioethics issues euthanasia cloning genetic engineering"], ["vec", "what is bioethics and what moral questions does it address in medicine and biological science"], ["vec", "how does bioethics evaluate issues like genetic engineering, euthanasia, and organ transplantation"], ["hyde", "Bioethics is an interdisciplinary field that examines ethical issues arising from advances in biology and medicine. Core principles include autonomy (patient choice), beneficence (do good), non-maleficence (do no harm), and justice (fair distribution). It addresses topics such as end-of-life care, genetic editing (CRISPR), stem cell research, and clinical trial ethics."]], "query": "what is bioethics"} -{"output": [["lex", "reincarnation hinduism samsara karma"], ["lex", "Hindu rebirth cycle moksha atman"], ["vec", "what role does reincarnation play in Hindu belief and how is it connected to karma and moksha"], ["vec", "how does the concept of samsara and the cycle of rebirth shape Hindu spiritual practice"], ["hyde", "In Hinduism, reincarnation (samsara) is the cycle of death and rebirth of the atman (soul). Karma—the accumulated results of actions—determines the conditions of each rebirth. The ultimate goal is moksha: liberation from the cycle of samsara, achieved through jnana (knowledge), bhakti (devotion), or karma yoga (selfless action)."]], "query": "what is the significance of reincarnation in hinduism"} -{"output": [["lex", "learn programming coding beginner"], ["lex", "learn to code online courses tutorials"], ["lex", "programming language beginner Python JavaScript"], ["vec", "how can a beginner start learning to code and which programming language should they learn first"], ["vec", "what are the best free resources and online courses for learning programming from scratch"], ["hyde", "Start with Python or JavaScript—both have gentle learning curves and wide applications. Free resources include freeCodeCamp.org, Codecademy, and CS50 on edX. Begin with variables, loops, and functions, then build small projects. Practice daily on coding challenges at sites like LeetCode or Codewars."]], "query": "learn code"} -{"output": [["lex", "Enlightenment significance 18th century philosophy"], ["lex", "Age of Enlightenment reason science liberty"], ["vec", "what was the Enlightenment and why is it considered a turning point in Western intellectual history"], ["vec", "how did Enlightenment thinkers like Voltaire, Locke, and Kant influence modern democracy and science"], ["hyde", "The Enlightenment (c. 1685-1815) emphasized reason, individual liberty, and scientific inquiry over tradition and religious authority. Thinkers like John Locke (natural rights), Voltaire (freedom of speech), and Kant (\"dare to know\") laid the intellectual foundations for democratic revolutions, constitutional government, and the separation of church and state."]], "query": "what is the significance of the enlightenment?"} -{"output": [["lex", "Google Docs word processor cloud"], ["lex", "Google Docs collaboration editing sharing"], ["lex", "Google Docs templates formatting features"], ["vec", "how do you use Google Docs to create, edit, and collaborate on documents online"], ["vec", "what features does Google Docs offer for real-time collaboration, formatting, and sharing"], ["hyde", "Google Docs is a free cloud-based word processor at docs.google.com. It supports real-time collaboration—multiple users can edit simultaneously with changes tracked by color. Share documents via link or email with view, comment, or edit permissions. It auto-saves to Google Drive and supports export to .docx, .pdf, and other formats."]], "query": "google docs"} -{"output": [["lex", "statistical analysis research methods"], ["lex", "statistical tests t-test ANOVA regression research"], ["vec", "how do researchers choose and perform appropriate statistical analyses for their data"], ["vec", "what are the common statistical methods used in academic research and when should each be applied"], ["hyde", "Choose your statistical test based on your data type and research question. Use t-tests for comparing two group means, ANOVA for three or more groups, chi-square for categorical data, and regression for predicting outcomes. Check assumptions: normality (Shapiro-Wilk test), homogeneity of variance (Levene's test), and independence of observations."]], "query": "how to perform statistical analysis in research"} -{"output": [["lex", "physics role engineering applications"], ["lex", "physics principles mechanical electrical civil engineering"], ["vec", "how do physics principles apply to engineering disciplines like mechanical, electrical, and civil engineering"], ["vec", "what fundamental physics concepts are essential for engineers to understand and apply"], ["hyde", "Physics underpins all engineering disciplines. Mechanical engineers apply Newton's laws and thermodynamics to design engines and machines. Electrical engineers use Maxwell's equations and semiconductor physics to build circuits. Civil engineers rely on statics and material strength calculations to design buildings and bridges that withstand loads."]], "query": "what is the role of physics in engineering"} -{"output": [["lex", "topographic map reading contour lines"], ["lex", "topo map elevation contour interval legend"], ["vec", "how do you read contour lines and elevation data on a topographic map"], ["vec", "what do the symbols, contour lines, and colors on a USGS topographic map represent"], ["hyde", "Contour lines connect points of equal elevation. Lines close together indicate steep terrain; lines far apart indicate gentle slopes. The contour interval (stated in the legend) is the elevation difference between adjacent lines. Every fifth line is an index contour, drawn thicker with the elevation labeled. Brown lines show terrain, blue shows water."]], "query": "how to read a topographic map?"} -{"output": [["lex", "car speakers choosing size type"], ["lex", "car audio speakers coaxial component upgrade"], ["vec", "how do you choose aftermarket car speakers that fit your vehicle and sound preferences"], ["vec", "what is the difference between coaxial and component car speakers and which should you buy"], ["hyde", "Check your car's speaker sizes (common: 6.5\", 6x9\", 5.25\") using a fitment guide. Coaxial speakers are all-in-one replacements—easy to install with tweeter built in. Component speakers separate the woofer, tweeter, and crossover for better sound staging but require more installation work. Look for sensitivity (85+ dB) and RMS power handling matching your head unit or amp."]], "query": "how to choose car speakers?"} -{"output": [["lex", "buy organic seeds online garden"], ["lex", "organic seed suppliers heirloom non-GMO"], ["vec", "where can you buy certified organic and heirloom seeds for a home garden"], ["vec", "which online seed companies sell high-quality organic and non-GMO vegetable and flower seeds"], ["hyde", "Trusted organic seed suppliers include Johnny's Selected Seeds, High Mowing Organic Seeds, Seed Savers Exchange, and Baker Creek Heirloom Seeds. Look for USDA Certified Organic labels and non-GMO verification. Order in January-February for spring planting. Many offer sampler packs for beginners."]], "query": "where to buy organic seeds?"} -{"output": [["lex", "digital transformation challenges obstacles"], ["lex", "enterprise digital transformation barriers legacy systems"], ["vec", "what are the main challenges organizations face when undergoing digital transformation"], ["vec", "how do legacy systems, culture resistance, and skill gaps hinder digital transformation efforts"], ["hyde", "Common digital transformation challenges include resistance to change from employees, integrating legacy systems with new platforms, data silos across departments, cybersecurity risks during migration, and shortage of skilled talent. McKinsey reports that 70% of digital transformation initiatives fail, often due to organizational culture rather than technology."]], "query": "challenges of digital transformation"} -{"output": [["lex", "thriller novel elements writing techniques"], ["lex", "good thriller pacing suspense plot twists"], ["vec", "what elements make a thriller novel compelling including pacing, suspense, and plot structure"], ["vec", "how do successful thriller writers build tension and keep readers turning pages"], ["hyde", "A great thriller has a high-stakes central conflict, a ticking clock, and a protagonist under escalating pressure. Pacing is crucial—short chapters and cliffhanger endings drive momentum. Plant red herrings and misdirection, then deliver a twist that recontextualizes earlier clues. The antagonist should be intelligent and formidable, making the hero's victory feel earned."]], "query": "what makes a good thriller novel?"} -{"output": [["lex", "earth atmosphere composition gases percentages"], ["lex", "atmospheric gases nitrogen oxygen argon CO2"], ["vec", "what gases make up the Earth's atmosphere and in what proportions"], ["vec", "what is the chemical composition of Earth's atmosphere including trace gases"], ["hyde", "Earth's atmosphere is composed of 78.09% nitrogen (N₂), 20.95% oxygen (O₂), 0.93% argon (Ar), and 0.04% carbon dioxide (CO₂). Trace gases include neon, helium, methane, krypton, and water vapor (0-4% depending on humidity). The atmosphere extends roughly 480 km above the surface and is divided into five layers: troposphere, stratosphere, mesosphere, thermosphere, and exosphere."]], "query": "what is the composition of the earth's atmosphere"} -{"output": [["lex", "file petition government civic action"], ["lex", "government petition create submit signatures"], ["vec", "how do you create and file a formal petition to a government body or elected representative"], ["vec", "what is the process for submitting a petition to local, state, or federal government"], ["hyde", "To file a petition, clearly state your request and supporting reasons. Collect signatures from eligible constituents—most jurisdictions require a minimum number based on population. File the petition with the appropriate government office (city clerk, state legislature, or Congress). Online platforms like Change.org can amplify support but may not satisfy legal petition requirements."]], "query": "how to file a petition to government"} -{"output": [["lex", "grow rhododendrons planting care soil"], ["lex", "rhododendron acidic soil shade watering"], ["vec", "how do you plant and care for rhododendrons including soil, light, and watering requirements"], ["vec", "what soil pH and growing conditions do rhododendrons need to thrive"], ["hyde", "Rhododendrons require acidic soil (pH 4.5-6.0), partial shade, and consistent moisture. Plant in well-drained soil amended with peat moss or composted pine bark. Mulch with 2-3 inches of pine needles. Water deeply once a week—they have shallow root systems sensitive to drought. Avoid planting too deep; keep the root ball crown at soil level."]], "query": "how to grow rhododendrons?"} -{"output": [["lex", "surveillance ethics privacy government"], ["lex", "mass surveillance civil liberties Fourth Amendment"], ["vec", "what are the ethical issues surrounding government and corporate surveillance of citizens"], ["vec", "how do privacy rights conflict with security justifications for mass surveillance programs"], ["hyde", "Mass surveillance raises fundamental questions about the balance between security and privacy. Critics argue programs like the NSA's PRISM violate Fourth Amendment protections against unreasonable search. Proponents claim surveillance prevents terrorism. The chilling effect—self-censorship by citizens who know they're watched—threatens free expression and democratic participation."]], "query": "what is the ethics of surveillance"} -{"output": [["lex", "regex match pattern regular expression"], ["lex", "regex syntax matching groups capture"], ["lex", "regular expression examples tutorial"], ["vec", "how do you write and use regular expressions to match patterns in text"], ["vec", "what is the syntax for regex pattern matching including groups, quantifiers, and character classes"], ["hyde", "A regex (regular expression) matches text patterns. Common syntax: `.` matches any character, `*` means zero or more, `+` means one or more, `?` means optional. `[a-z]` matches lowercase letters. `\\d` matches digits. Capture groups use parentheses: `(\\d{3})-(\\d{4})` matches and captures phone number parts. Use `^` for start and `$` for end of line."]], "query": "regex match"} -{"output": [["lex", "research ethics principles IRB"], ["lex", "ethical research human subjects informed consent"], ["vec", "what ethical principles govern scientific and academic research involving human subjects"], ["vec", "how do institutional review boards ensure ethical standards in research studies"], ["hyde", "Research ethics are governed by the Belmont Report's three principles: respect for persons (informed consent), beneficence (minimize harm, maximize benefit), and justice (fair selection of subjects). Institutional Review Boards (IRBs) review all human subjects research. Key requirements include voluntary participation, confidentiality, right to withdraw, and risk-benefit assessment."]], "query": "what is the ethics of research"} -{"output": [["lex", "set daily intentions morning routine"], ["lex", "intention setting mindfulness journaling"], ["vec", "how do you set meaningful daily intentions as part of a morning routine"], ["vec", "what is the practice of setting intentions and how does it differ from goal-setting"], ["hyde", "Each morning, sit quietly for 2-3 minutes and ask yourself: \"How do I want to feel today?\" and \"What matters most today?\" Write one to three intentions in a journal—e.g., \"I will be present in conversations\" or \"I will approach challenges with curiosity.\" Intentions focus on how you show up, not on tasks to complete. Review them at midday and evening."]], "query": "how to set intentions for the day?"} -{"output": [["lex", "sacred music worship role function"], ["lex", "religious hymns chants liturgical music"], ["vec", "what role does sacred music play in religious worship services across different faiths"], ["vec", "how do hymns, chants, and liturgical music enhance the experience of communal worship"], ["hyde", "Sacred music serves multiple functions in worship: it creates a contemplative atmosphere, unifies the congregation through shared singing, reinforces theological themes through lyrics, and marks liturgical transitions. Gregorian chant in Catholic Mass, bhajans in Hindu puja, and the Islamic adhan each use distinct musical forms to invoke the sacred and facilitate prayer."]], "query": "what is the role of sacred music in worship?"} -{"output": [["lex", "ancient Roman society features structure"], ["lex", "Roman social classes patricians plebeians republic"], ["vec", "what were the defining features of ancient Roman society including social classes, government, and daily life"], ["vec", "how was ancient Roman society structured in terms of class hierarchy, citizenship, and law"], ["hyde", "Roman society was divided into patricians (aristocratic families), plebeians (common citizens), freedmen, and slaves. Citizens had legal rights including voting and property ownership. The Senate held political power, though plebeians gained representation through tribunes. Roman law (Twelve Tables, 450 BC) codified legal principles still influential today. The paterfamilias held authority over extended households."]], "query": "what are the features of ancient roman society?"} -{"output": [["lex", "family role society function socialization"], ["lex", "family structure social institution support"], ["vec", "what roles does the family unit play in society including socialization, support, and cultural transmission"], ["vec", "how do families function as the primary social institution for raising children and maintaining social order"], ["hyde", "The family is society's primary unit of socialization, teaching children language, norms, and values. Functionalist sociologists identify four key roles: socialization of children, economic cooperation, emotional support, and regulation of sexual behavior. Families also transmit cultural identity, religious traditions, and social status across generations."]], "query": "what is the role of family in society"} -{"output": [["lex", "quantitative easing QE monetary policy"], ["lex", "quantitative easing central bank bond buying"], ["vec", "what is quantitative easing and how do central banks use it to stimulate the economy"], ["vec", "how does the Federal Reserve's quantitative easing program work and what are its effects on inflation and interest rates"], ["hyde", "Quantitative easing (QE) is an unconventional monetary policy where a central bank buys government bonds and other securities to inject money into the economy. When the Fed buys bonds, it increases bank reserves, lowers long-term interest rates, and encourages lending. The Fed used QE after 2008 and during COVID-19, expanding its balance sheet to over $8 trillion."]], "query": "what is quantitative easing explained"} -{"output": [["lex", "guerrilla marketing unconventional low-cost"], ["lex", "guerrilla marketing examples campaigns street"], ["vec", "what is guerrilla marketing and how do businesses use unconventional tactics to promote products"], ["vec", "what are examples of successful guerrilla marketing campaigns and what makes them effective"], ["hyde", "Guerrilla marketing uses unconventional, low-cost tactics to create memorable brand experiences in unexpected places. Examples include flash mobs, street art installations, viral stunts, and ambient advertising placed in surprising locations. Jay Conrad Levinson coined the term in 1984. Success depends on creativity, surprise, and shareability rather than large advertising budgets."]], "query": "what is guerrilla marketing"} -{"output": [["lex", "geology study earth science rocks minerals"], ["lex", "geology branches mineralogy tectonics stratigraphy"], ["vec", "what is geology and what do geologists study about the Earth's structure, materials, and history"], ["vec", "what are the main branches of geology including mineralogy, petrology, and plate tectonics"], ["hyde", "Geology is the scientific study of the Earth's structure, composition, and processes. Geologists examine rocks, minerals, fossils, and landforms to understand Earth's 4.5-billion-year history. Major branches include mineralogy (minerals), petrology (rocks), stratigraphy (rock layers), paleontology (fossils), and tectonics (plate movement and earthquakes)."]], "query": "what is the study of geology"} -{"output": [["lex", "photograph artwork lighting camera setup"], ["lex", "art photography reproduction color accuracy"], ["vec", "how do you photograph paintings and artwork with accurate color and minimal glare"], ["vec", "what camera settings, lighting, and techniques produce high-quality photographs of artwork"], ["hyde", "Use two identical lights at 45-degree angles to the artwork to eliminate glare and ensure even illumination. Mount the camera on a tripod, centered and parallel to the surface. Shoot in RAW at ISO 100, f/8 for sharpness. Include a color checker card in one frame for accurate white balance. Use a remote shutter to avoid camera shake."]], "query": "how to photograph artwork?"} -{"output": [["lex", "smart home technologies devices IoT"], ["lex", "smart home automation hub Alexa Google Home"], ["vec", "what smart home technologies are available for automating lighting, security, climate, and entertainment"], ["vec", "how do smart home devices and IoT platforms like Alexa, Google Home, and HomeKit work together"], ["hyde", "Smart home technologies connect devices via Wi-Fi, Zigbee, Z-Wave, or Matter protocol to a central hub or voice assistant. Common categories include smart lighting (Philips Hue), thermostats (Nest, Ecobee), security cameras (Ring, Arlo), locks (August, Yale), and speakers (Amazon Echo, Google Nest). Automations trigger actions based on time, location, or sensor data."]], "query": "what are smart home technologies"} -{"output": [["lex", "sports youth development influence benefits"], ["lex", "youth athletics child development teamwork discipline"], ["vec", "how does participation in sports influence the physical, social, and emotional development of young people"], ["vec", "what benefits do organized sports provide for youth including teamwork, discipline, and mental health"], ["hyde", "Research shows youth sports participation improves physical fitness, teaches teamwork and leadership, and builds self-esteem. A 2019 study in the Journal of Sport and Health Science found that adolescents who play organized sports report lower rates of depression and anxiety. However, excessive pressure and early specialization can lead to burnout and injury."]], "query": "how sports influence youth development"} -{"output": [["lex", "build self-confidence techniques self-esteem"], ["lex", "improve confidence self-worth mindset"], ["vec", "what are practical strategies for building self-confidence and overcoming self-doubt"], ["vec", "how can someone develop greater self-confidence through daily habits and mindset shifts"], ["hyde", "Start by setting small, achievable goals and completing them—each success builds evidence of competence. Practice self-compassion: replace harsh self-criticism with the tone you'd use with a friend. Keep a \"wins\" journal and review it weekly. Gradually expand your comfort zone by doing one slightly uncomfortable thing each day. Confidence grows from accumulated experience, not positive thinking alone."]], "query": "how to build self-confidence"} -{"output": [["lex", "family field trip planning kids activities"], ["lex", "family outing day trip educational fun"], ["vec", "how do you plan an enjoyable and educational family field trip with children"], ["vec", "what are tips for organizing a family day trip including choosing destinations, packing, and budgeting"], ["hyde", "Choose an age-appropriate destination: museums, nature centers, farms, or historical sites. Check hours, admission costs, and accessibility online. Pack snacks, water, sunscreen, and a first-aid kit. Plan for shorter attention spans—schedule breaks every 60-90 minutes. Involve kids in planning by letting them choose one activity. Bring a scavenger hunt list to keep them engaged."]], "query": "how to plan a family field trip?"} -{"output": [["lex", "scientific model definition types examples"], ["lex", "scientific models simulation representation theory"], ["vec", "what is a scientific model and how do scientists use models to explain and predict natural phenomena"], ["vec", "what are the different types of scientific models including physical, mathematical, and computational models"], ["hyde", "A scientific model is a simplified representation of a system or phenomenon used to explain observations and make predictions. Models can be physical (a globe representing Earth), mathematical (equations describing gravity), or computational (climate simulations). All models are approximations—George Box wrote, \"All models are wrong, but some are useful.\""]], "query": "what is a scientific model"} -{"output": [["lex", "file I/O input output operations"], ["lex", "file read write programming IO"], ["lex", "file handling open close stream"], ["vec", "how do you perform file input and output operations in programming languages"], ["vec", "what are the common methods for reading from and writing to files in Python, Java, or C"], ["hyde", "File I/O involves opening a file, reading or writing data, and closing it. In Python: `with open('file.txt', 'r') as f: data = f.read()` for reading, and `with open('file.txt', 'w') as f: f.write('hello')` for writing. The `with` statement ensures the file is properly closed. Use 'a' mode to append, 'rb'/'wb' for binary files."]], "query": "io file"} -{"output": [["lex", "creative portrait photography ideas techniques"], ["lex", "portrait photo ideas poses lighting creative"], ["vec", "what are unique and creative portrait photography ideas for interesting and artistic results"], ["vec", "how can you use lighting, props, angles, and locations for creative portrait photography"], ["hyde", "Try shooting through prisms or crystal balls for rainbow light effects. Use fairy lights wrapped around the subject for warm bokeh. Photograph through rain-covered glass for a moody feel. Use dramatic side lighting with one bare bulb for chiaroscuro portraits. Shoot reflections in puddles, mirrors, or sunglasses. Double exposure combining portraits with textures or nature works well in-camera or in post."]], "query": "what are creative portrait ideas?"} -{"output": [["lex", "fix hair repair damaged broken"], ["lex", "hair repair treatment dry frizzy damaged"], ["lex", "hairstyle fix bad hair day"], ["vec", "how do you fix and repair damaged, dry, or frizzy hair"], ["vec", "what are quick fixes for a bad hair day and long-term solutions for hair damage"], ["hyde", "For damaged hair, use a deep conditioning mask with keratin or argan oil once a week. Trim split ends every 6-8 weeks. Reduce heat styling—if you must, use a heat protectant spray at 300°F max. For a quick bad hair day fix, try dry shampoo at the roots, a slicked-back bun, or braids. Sleep on a silk pillowcase to reduce friction and breakage."]], "query": "fix hair"} -{"output": [["lex", "build up strength fitness training"], ["lex", "build up muscle mass exercise"], ["lex", "buildup gradual increase accumulation"], ["vec", "how do you progressively build up strength and muscle through a structured training program"], ["vec", "what does it mean to build up endurance, skills, or resources gradually over time"], ["hyde", "To build up strength, follow progressive overload: gradually increase weight, reps, or sets each week. A beginner program like Starting Strength adds 5 lbs to compound lifts every session. Eat adequate protein (0.7-1g per pound bodyweight). Rest 48 hours between training the same muscle group. Consistency over 8-12 weeks produces measurable strength gains."]], "query": "build up"} -{"output": [["lex", "participate protest rally demonstration rights"], ["lex", "protest safety tips First Amendment rights"], ["vec", "how do you safely and effectively participate in a protest or public demonstration"], ["vec", "what should you know about your legal rights and safety precautions when attending a protest"], ["hyde", "Know your rights: the First Amendment protects peaceful assembly on public property. Bring water, snacks, a phone charger, and ID. Write an emergency contact number on your arm. Stay with a buddy and agree on a meeting point. Wear comfortable shoes and weather-appropriate clothing. If tear gas is used, move upwind. Document police interactions by filming at a safe distance."]], "query": "how to participate in a protest"} -{"output": [["lex", "principle of utility utilitarianism Bentham Mill"], ["lex", "utility principle greatest happiness greatest number"], ["vec", "what is the principle of utility in utilitarian ethics as defined by Bentham and Mill"], ["vec", "how does the utilitarian principle of utility evaluate actions based on their consequences for overall happiness"], ["hyde", "The principle of utility, formulated by Jeremy Bentham, states that the morally right action is the one that produces the greatest happiness for the greatest number. Bentham's felicific calculus measured pleasure by intensity, duration, certainty, and extent. John Stuart Mill refined this, distinguishing higher (intellectual) pleasures from lower (bodily) pleasures."]], "query": "what is the principle of utility?"} -{"output": [["lex", "brand logo design create process"], ["lex", "logo design principles typography color branding"], ["vec", "how do you design an effective brand logo from concept to final design"], ["vec", "what principles of logo design ensure a brand mark is memorable, scalable, and versatile"], ["hyde", "Start by researching the brand's values, target audience, and competitors. Sketch 20-30 rough concepts on paper before going digital. A strong logo works in black and white, at small sizes (favicon), and large formats (billboard). Limit to 2-3 colors and one typeface. Test on business cards, websites, and merchandise. Tools: Adobe Illustrator, Figma, or Affinity Designer for vector-based design."]], "query": "how to create a brand logo"} -{"output": [["lex", "check tire pressure gauge PSI"], ["lex", "tire pressure TPMS correct level car"], ["vec", "how do you check and adjust tire pressure using a tire gauge"], ["vec", "what is the correct tire pressure for a car and how often should it be checked"], ["hyde", "Check tire pressure when tires are cold (before driving or 3+ hours after). Remove the valve cap, press a tire gauge firmly onto the valve stem, and read the PSI. Compare to the recommended pressure on the driver's door jamb sticker (not the tire sidewall—that's the maximum). Add air at a gas station if low. Check all four tires plus the spare monthly."]], "query": "how to check tire pressure?"} -{"output": [["lex", "cook quinoa recipe instructions stovetop"], ["lex", "quinoa cooking ratio water time"], ["vec", "what is the correct method for cooking quinoa on the stovetop with the right water ratio"], ["vec", "how do you cook fluffy quinoa and what is the water to quinoa ratio"], ["hyde", "Rinse 1 cup quinoa in a fine mesh strainer to remove bitter saponins. Combine with 2 cups water and a pinch of salt in a saucepan. Bring to a boil, reduce to low, cover, and simmer for 15 minutes. Remove from heat and let steam with the lid on for 5 minutes. Fluff with a fork. Yields about 3 cups cooked quinoa."]], "query": "how to cook quinoa"} -{"output": [["lex", "prevent identity theft protection tips"], ["lex", "identity theft prevention credit freeze monitor"], ["vec", "what steps can you take to protect yourself from identity theft and fraud"], ["vec", "how do credit freezes, strong passwords, and monitoring help prevent identity theft"], ["hyde", "Freeze your credit at all three bureaus (Equifax, Experian, TransUnion)—it's free and prevents unauthorized accounts. Use unique passwords with a password manager. Enable two-factor authentication on all financial accounts. Shred documents with personal information. Monitor bank statements weekly and check your credit report annually at AnnualCreditReport.com."]], "query": "how to prevent identity theft"} -{"output": [["lex", "start blog setup hosting platform"], ["lex", "blogging beginners WordPress Substack setup"], ["vec", "how do you start a blog from scratch including choosing a platform, domain, and writing your first posts"], ["vec", "what are the steps to launch a successful blog and attract readers"], ["hyde", "Choose a platform: WordPress.org for full control (needs hosting), or Substack/Ghost for simplicity. Pick a niche you can write about consistently. Register a domain name ($10-15/year). Write 5-10 posts before launching so visitors find content immediately. Optimize for SEO with clear titles and headers. Share on social media and engage with other bloggers in your niche."]], "query": "how to start a blog"} -{"output": [["lex", "documentary photography style techniques"], ["lex", "documentary photojournalism storytelling long-term"], ["vec", "what is documentary photography and how does it differ from photojournalism and street photography"], ["vec", "what techniques and approaches do documentary photographers use to tell stories through images"], ["hyde", "Documentary photography aims to chronicle real events, conditions, or people over time to create a truthful narrative. Unlike photojournalism's focus on breaking news, documentary work unfolds over weeks, months, or years. Key practitioners include Dorothea Lange (Great Depression), Sebastião Salgado (workers, migration), and James Nachtwey (conflict). Shoot with available light, build trust with subjects, and caption extensively."]], "query": "documentary photography"} -{"output": [["lex", "tides causes moon gravitational pull"], ["lex", "tidal forces moon sun earth gravity"], ["vec", "what causes ocean tides and how do the gravitational forces of the moon and sun create them"], ["vec", "how does the moon's gravitational pull create high and low tides on Earth"], ["hyde", "Tides are primarily caused by the gravitational pull of the Moon on Earth's oceans. The side of Earth facing the Moon experiences a direct gravitational pull creating a tidal bulge (high tide). A second bulge forms on the opposite side due to inertial forces. The Sun's gravity also contributes—spring tides (highest) occur during full and new moons when Sun and Moon align."]], "query": "what causes tides"} -{"output": [["lex", "history Christianity origins spread timeline"], ["lex", "Christianity history Jesus apostles church development"], ["vec", "what is the history of Christianity from its origins with Jesus to the modern era"], ["vec", "how did Christianity spread from a small Jewish sect to a global religion over two millennia"], ["hyde", "Christianity originated in 1st-century Judea with the teachings of Jesus of Nazareth. After his crucifixion (c. 30 AD), apostles like Paul spread the faith across the Roman Empire. Constantine legalized it in 313 AD (Edict of Milan). The Great Schism (1054) split Eastern Orthodox and Roman Catholic churches. The Protestant Reformation began in 1517 with Martin Luther."]], "query": "what is the history of christianity?"} -{"output": [["lex", "Industrial Revolution history manufacturing 18th century"], ["lex", "Industrial Revolution steam engine factories Britain"], ["vec", "what was the Industrial Revolution and how did it transform manufacturing, society, and the economy"], ["vec", "when and where did the Industrial Revolution begin and what were its major innovations and consequences"], ["hyde", "The Industrial Revolution began in Britain around 1760-1840, transforming agrarian economies into industrial ones. Key innovations included the steam engine (James Watt), spinning jenny (textile production), and iron smelting with coke. Factories replaced cottage industries. Urbanization accelerated as workers moved to cities. It brought economic growth but also child labor, pollution, and harsh working conditions."]], "query": "what is the industrial revolution"} -{"output": [["lex", "sustainable forestry management practices"], ["lex", "sustainable logging forest stewardship FSC"], ["vec", "what is sustainable forestry and how does it balance timber harvesting with forest ecosystem health"], ["vec", "what practices and certifications like FSC ensure forests are managed sustainably"], ["hyde", "Sustainable forestry manages forests to meet current timber needs without compromising future generations' resources. Practices include selective logging (harvesting individual trees rather than clearcutting), replanting harvested areas, maintaining buffer zones near waterways, and preserving biodiversity corridors. The Forest Stewardship Council (FSC) certifies sustainably managed forests."]], "query": "what is sustainable forestry?"} -{"output": [["lex", "character arc definition types fiction"], ["lex", "character arc development flat dynamic transformation"], ["vec", "what is a character arc in fiction and how do characters change throughout a story"], ["vec", "what are the different types of character arcs including positive, negative, and flat arcs"], ["hyde", "A character arc is the transformation a character undergoes from the beginning to the end of a story. In a positive arc, the character overcomes a flaw or false belief (e.g., Scrooge in A Christmas Carol). In a negative arc, they descend (Walter White in Breaking Bad). In a flat arc, the character's beliefs remain constant but they change the world around them."]], "query": "what is character arc?"} -{"output": [["lex", "ethical dilemmas research handling IRB"], ["lex", "research ethics conflict resolution informed consent"], ["vec", "how should researchers identify and address ethical dilemmas that arise during scientific studies"], ["vec", "what frameworks and procedures help resolve ethical conflicts in academic and clinical research"], ["hyde", "When facing an ethical dilemma in research, consult your IRB or ethics committee immediately. Common dilemmas include conflicts between maximizing data quality and minimizing participant burden, handling incidental findings, and balancing confidentiality with mandatory reporting obligations. Document your reasoning and decisions. The Belmont Report provides foundational guidance: respect for persons, beneficence, and justice."]], "query": "how to address ethical dilemmas in research"} -{"output": [["lex", "manage stress effectively coping techniques"], ["lex", "stress management relaxation anxiety reduction"], ["vec", "what are evidence-based techniques for managing stress and reducing anxiety in daily life"], ["vec", "how can you manage chronic stress through exercise, mindfulness, and lifestyle changes"], ["hyde", "Effective stress management combines multiple approaches. Exercise 30 minutes daily—even walking reduces cortisol. Practice diaphragmatic breathing: inhale 4 counts, hold 4, exhale 6. Limit caffeine after noon. Maintain consistent sleep and wake times. Cognitive reframing: identify catastrophic thoughts and replace them with realistic assessments. Social connection is protective—schedule regular time with supportive people."]], "query": "how to manage stress effectively"} -{"output": [["lex", "philosophy of science scientific change paradigm shift"], ["lex", "Kuhn paradigm revolution Popper falsification Lakatos"], ["vec", "how do philosophers of science like Kuhn, Popper, and Lakatos explain scientific revolutions and theory change"], ["vec", "what does the philosophy of science say about how scientific knowledge evolves and paradigms shift"], ["hyde", "Thomas Kuhn argued science progresses through paradigm shifts: periods of \"normal science\" within an accepted framework are punctuated by revolutionary crises when anomalies accumulate. Karl Popper proposed that science advances through falsification—theories must be testable and those that survive rigorous attempts at refutation are provisionally accepted. Lakatos offered a middle ground with his research programme methodology."]], "query": "how does the philosophy of science address scientific change"} -{"output": [["lex", "Judaism rituals practices observances"], ["lex", "Jewish rituals Shabbat Passover bar mitzvah kosher"], ["vec", "what are the major rituals and religious observances in Judaism"], ["vec", "how do Jewish rituals like Shabbat, Passover, and bar/bat mitzvah mark life and calendar events"], ["hyde", "Key Jewish rituals include Shabbat (weekly rest from Friday sunset to Saturday night with candle lighting, kiddush, and challah), the Passover seder (retelling the Exodus), Yom Kippur fasting, circumcision (brit milah) on the 8th day, bar/bat mitzvah at 13/12, and daily prayer (Shacharit, Mincha, Ma'ariv). Keeping kosher governs dietary laws separating meat and dairy."]], "query": "what are the rituals of judaism"} -{"output": [["lex", "scientists communicate findings publications"], ["lex", "scientific communication peer review journal conference"], ["vec", "how do scientists share and publish their research findings with the scientific community and public"], ["vec", "what are the channels scientists use to communicate results including journals, conferences, and preprints"], ["hyde", "Scientists communicate findings through peer-reviewed journal articles (the gold standard), conference presentations (talks and posters), and preprint servers like arXiv and bioRxiv for rapid dissemination. The publication process involves writing a manuscript, submitting to a journal, peer review by 2-3 experts, revision, and acceptance. Increasingly, scientists also use social media and press releases to reach the public."]], "query": "how do scientists communicate their findings"} -{"output": [["lex", "mock test practice exam preparation"], ["lex", "mock exam sample questions test prep"], ["lex", "practice test online free exam"], ["vec", "how do you use mock tests and practice exams to prepare for standardized tests and certifications"], ["vec", "where can you find free mock tests and practice exams for tests like SAT, GRE, or professional certifications"], ["hyde", "Mock tests simulate real exam conditions—same time limits, question types, and format. Take full-length practice tests under timed conditions every 1-2 weeks during preparation. Review every wrong answer to identify weak areas. Free mock tests are available on Khan Academy (SAT), ETS (GRE), and official certification body websites. Score trends across mock tests predict actual performance."]], "query": "mock test"} -{"output": [["lex", "foreshadowing purpose literary device fiction"], ["lex", "foreshadowing examples narrative technique"], ["vec", "what is the purpose of foreshadowing in literature and how do authors use it to build suspense"], ["vec", "how does foreshadowing create anticipation and cohesion in a story's plot"], ["hyde", "Foreshadowing plants clues or hints about future events in a narrative, building suspense and making plot developments feel earned rather than arbitrary. Chekhov's gun principle—if a gun appears in Act 1, it must fire by Act 3—is a classic example. Effective foreshadowing is subtle enough to miss on first reading but obvious in retrospect, rewarding rereading."]], "query": "what is the purpose of foreshadowing?"} -{"output": [["lex", "trail running off-road terrain"], ["lex", "trail running shoes gear technique"], ["vec", "what is trail running and how does it differ from road running"], ["vec", "what gear, technique, and training do you need for trail running on off-road terrain"], ["hyde", "Trail running is running on unpaved surfaces—dirt paths, mountain trails, forest tracks, and rocky terrain. Unlike road running, it requires navigating elevation changes, uneven footing, and obstacles. Use trail shoes with aggressive lugs for grip and rock plates for protection. Shorten your stride on technical terrain. Popular distances range from 5K to ultramarathons (50+ miles)."]], "query": "what is trail running?"} -{"output": [["lex", "Cold War impact consequences effects"], ["lex", "Cold War legacy geopolitics nuclear arms race"], ["vec", "what were the major political, social, and economic impacts of the Cold War on the world"], ["vec", "how did the Cold War shape international relations, the nuclear arms race, and proxy conflicts"], ["hyde", "The Cold War (1947-1991) divided the world into Western (NATO) and Eastern (Warsaw Pact) blocs. Its impacts include the nuclear arms race (peaking at 70,000+ warheads), proxy wars in Korea, Vietnam, and Afghanistan, the Space Race, decolonization movements influenced by superpower competition, and the eventual collapse of the Soviet Union in 1991 leading to U.S. unipolarity."]], "query": "what was the impact of the cold war?"} -{"output": [["lex", "street photography ethics legal rights"], ["lex", "street photography consent privacy public space"], ["vec", "what are the ethical considerations and legal rights involved in street photography"], ["vec", "is it ethical to photograph strangers in public and what are the legal rules around street photography"], ["hyde", "In most countries, photographing people in public spaces is legally permitted since there is no expectation of privacy. However, ethical street photographers follow principles: avoid exploiting vulnerable people, don't photograph children without parental awareness, respect requests to delete images, and consider whether the image dignifies or demeans the subject. Some photographers adopt a \"golden rule\" approach."]], "query": "street photography ethics"} -{"output": [["lex", "Vitosha mountain Sofia Bulgaria"], ["lex", "Vitosha hiking trails Cherni Vrah peak"], ["vec", "what are the hiking trails and attractions on Vitosha mountain near Sofia, Bulgaria"], ["vec", "what is Vitosha mountain and what outdoor activities are available in Vitosha Nature Park"], ["hyde", "Vitosha is a mountain massif on the outskirts of Sofia, Bulgaria, reaching 2,290m at Cherni Vrah (Black Peak). Vitosha Nature Park offers hiking trails, ski runs at Aleko, and the Boyana Waterfall. The golden bridges stone river is a popular landmark. Access from Sofia takes 30 minutes by car or bus. The mountain is a popular day trip for Sofia residents year-round."]], "query": "vitosha mountain"} -{"output": [["lex", "anthology definition literary collection"], ["lex", "anthology book short stories poems collected works"], ["vec", "what is an anthology and how are literary anthologies compiled and organized"], ["vec", "what types of works are typically collected in an anthology such as short stories, poems, or essays"], ["hyde", "An anthology is a curated collection of literary works—short stories, poems, essays, or excerpts—by various authors, assembled around a common theme, genre, or time period. Editors select and arrange pieces to create a coherent reading experience. Examples include The Norton Anthology of English Literature and Best American Short Stories, published annually."]], "query": "what is an anthology?"} -{"output": [["lex", "Yom Kippur significance Jewish holy day"], ["lex", "Yom Kippur Day of Atonement fasting prayer"], ["vec", "what is Yom Kippur and why is it the most significant holy day in Judaism"], ["vec", "how do Jewish people observe Yom Kippur through fasting, prayer, and repentance"], ["hyde", "Yom Kippur (Day of Atonement) is the holiest day in Judaism, falling on the 10th of Tishrei. Observers fast for 25 hours from sunset to sunset, abstaining from food, water, leather shoes, and bathing. The day is spent in synagogue prayer, including the Kol Nidre service and the Neilah closing prayer. It is a day of repentance (teshuvah) for sins against God, concluding the ten Days of Awe."]], "query": "what is the significance of the yom kippur?"} -{"output": [["lex", "clean camping Leave No Trace principles"], ["lex", "clean camping eco-friendly minimal impact"], ["vec", "what is clean camping and how do you minimize your environmental impact while camping outdoors"], ["vec", "what are the Leave No Trace principles and how do they apply to clean camping practices"], ["hyde", "Clean camping follows Leave No Trace principles: plan ahead, travel on durable surfaces, dispose of waste properly, leave what you find, minimize campfire impact, respect wildlife, and be considerate of others. Pack out all trash including food scraps. Use biodegradable soap 200 feet from water sources. Dig catholes 6-8 inches deep for human waste. Leave campsites cleaner than you found them."]], "query": "what is clean camping?"} -{"output": [["lex", "evaluate scientific claims critical thinking"], ["lex", "scientific literacy evidence evaluation peer review"], ["vec", "how do you critically evaluate scientific claims and distinguish credible research from misinformation"], ["vec", "what criteria should you use to assess whether a scientific study's conclusions are reliable"], ["hyde", "Check the source: is it published in a peer-reviewed journal? Look for sample size, control groups, and statistical significance (p < 0.05). Distinguish correlation from causation. Check if results have been replicated by independent researchers. Evaluate conflicts of interest and funding sources. Be skeptical of single studies—look for systematic reviews and meta-analyses that synthesize multiple studies."]], "query": "how to evaluate scientific claims critically"} -{"output": [["lex", "song worship significance religious singing"], ["lex", "worship music congregational singing hymns praise"], ["vec", "what role does congregational singing and worship music play in religious services"], ["vec", "why is song considered a significant form of spiritual expression and communal worship across faiths"], ["hyde", "Singing in worship engages the whole person—body, mind, and emotions—in ways that spoken word alone cannot. Neuroscience shows group singing synchronizes heart rates and releases oxytocin, fostering communal bonding. In Christian worship, hymns reinforce theology through memorable lyrics. The Psalms themselves are songs, and Paul urged believers to address one another \"in psalms, hymns, and spiritual songs\" (Ephesians 5:19)."]], "query": "what is the significance of song in worship?"} -{"output": [["lex", "algae ecosystem role food chain"], ["lex", "algae oxygen production aquatic ecosystems"], ["lex", "algae photosynthesis carbon cycle"], ["vec", "what role do algae play in aquatic and marine ecosystems"], ["vec", "how do algae contribute to oxygen production and food webs"], ["hyde", "Algae produce approximately 50% of the world's oxygen through photosynthesis and form the base of aquatic food chains. Phytoplankton, a type of microalgae, supports marine ecosystems by providing energy to zooplankton, fish, and larger organisms."]], "query": "what is the significance of algae in ecosystems"} -{"output": [["lex", "marathon training plan schedule"], ["lex", "long distance running program beginner"], ["lex", "marathon race preparation mileage"], ["vec", "what is a good training plan for running a first marathon"], ["vec", "how to build weekly mileage for marathon race preparation"], ["hyde", "A typical 16-week marathon training plan starts with a base of 15-20 miles per week, gradually increasing the long run by 1-2 miles each week. Include easy runs, tempo runs at marathon pace, and one rest day. Taper volume 2-3 weeks before race day."]], "query": "how to train for a marathon"} -{"output": [["lex", "child tantrum public calm techniques"], ["lex", "toddler meltdown coping strategies"], ["vec", "what are effective ways to calm a toddler having a tantrum in a public place"], ["vec", "how should parents respond when their child has a meltdown in a store or restaurant"], ["hyde", "When your child has a tantrum in public, stay calm and speak in a low, steady voice. Get down to their eye level, acknowledge their feelings, and offer simple choices. If needed, move to a quieter spot and wait for the intensity to pass before addressing the behavior."]], "query": "how to handle a child's tantrum in public?"} -{"output": [["lex", "index fund investing brokerage account"], ["lex", "S&P 500 index fund buy shares"], ["lex", "passive investing index ETF"], ["vec", "how to open a brokerage account and buy index funds for long-term investing"], ["vec", "what are the steps to start investing in S&P 500 or total market index funds"], ["hyde", "To invest in index funds, open a brokerage account with a provider like Vanguard, Fidelity, or Schwab. Choose a broad market index fund such as VTSAX or an S&P 500 ETF like VOO. Set up automatic contributions and reinvest dividends for compound growth."]], "query": "how to invest in index funds"} -{"output": [["lex", "data science statistics machine learning"], ["lex", "data science analysis programming Python R"], ["vec", "what does data science involve and what skills are needed to work in the field"], ["vec", "how does data science combine statistics, programming, and domain knowledge"], ["hyde", "Data science is an interdisciplinary field that uses statistical methods, machine learning algorithms, and programming to extract insights from structured and unstructured data. Practitioners typically work with Python or R, use tools like pandas and scikit-learn, and apply techniques such as regression, classification, and clustering."]], "query": "what is data science"} -{"output": [["lex", "improve focus concentration techniques"], ["lex", "attention span exercises deep work"], ["vec", "what are practical techniques to improve focus and concentration during work or study"], ["vec", "how can I train my brain to maintain attention for longer periods"], ["hyde", "To improve concentration, try the Pomodoro technique: work for 25 minutes, then take a 5-minute break. Eliminate distractions by silencing notifications and using website blockers. Regular exercise, adequate sleep, and mindfulness meditation have all been shown to increase sustained attention."]], "query": "how to improve concentration skills?"} -{"output": [["lex", "Earth Hour participation lights off event"], ["lex", "Earth Hour date 2026 how to join"], ["vec", "how do I participate in the annual Earth Hour lights-off event"], ["vec", "what can individuals and businesses do during Earth Hour to show support"], ["hyde", "Earth Hour takes place on the last Saturday of March each year. To participate, turn off all non-essential lights for one hour starting at 8:30 PM local time. You can also share your participation on social media using #EarthHour and organize community events."]], "query": "how to participate in earth hour?"} -{"output": [["lex", "nanotechnology nanomaterials nanoscale engineering"], ["lex", "nanotech applications medicine electronics"], ["vec", "what is nanotechnology and how are nanoscale materials used in different industries"], ["vec", "what are the main applications of nanotechnology in medicine and electronics"], ["hyde", "Nanotechnology involves manipulating matter at the nanoscale, typically between 1 and 100 nanometers. Applications include targeted drug delivery using nanoparticles, carbon nanotube transistors in electronics, and nanocoatings that repel water and resist corrosion."]], "query": "what are nanotechnologies"} -{"output": [["lex", "color palette painting color theory"], ["lex", "mixing paint colors warm cool complementary"], ["vec", "how do artists create a cohesive color palette for a painting using color theory"], ["vec", "what techniques help choose harmonious paint colors for an artwork"], ["hyde", "Start with a limited palette of 4-6 colors: a warm and cool version of each primary (e.g., cadmium yellow, lemon yellow, ultramarine blue, cerulean blue, alizarin crimson, cadmium red). Mix swatches to map out your range. Use complementary colors for contrast and analogous colors for harmony."]], "query": "how to create a color palette for painting?"} -{"output": [["lex", "homemade pasta recipe dough eggs flour"], ["lex", "fresh pasta making rolling cutting"], ["vec", "what is the recipe and technique for making fresh pasta dough from scratch"], ["vec", "how to roll and cut homemade pasta without a pasta machine"], ["hyde", "Combine 2 cups of 00 flour with 3 large eggs on a clean surface. Knead the dough for 8-10 minutes until smooth and elastic. Wrap in plastic and rest for 30 minutes. Roll out thin with a rolling pin or pasta machine, then cut into desired shapes like fettuccine or tagliatelle."]], "query": "how to make homemade pasta"} -{"output": [["lex", "stress reduction techniques relaxation"], ["lex", "manage stress exercise meditation breathing"], ["vec", "what are effective daily habits for reducing stress and improving mental health"], ["vec", "how can breathing exercises and physical activity help lower stress levels"], ["hyde", "Regular physical activity releases endorphins that naturally reduce stress. Practice deep breathing: inhale for 4 counts, hold for 4, exhale for 6. Other effective strategies include progressive muscle relaxation, journaling, limiting caffeine, and maintaining a consistent sleep schedule of 7-9 hours."]], "query": "how to reduce stress"} -{"output": [["lex", "research hypothesis formulation testable"], ["lex", "hypothesis writing independent dependent variable"], ["vec", "how do you write a clear and testable research hypothesis for a study"], ["vec", "what are the steps to develop a hypothesis from a research question"], ["hyde", "A research hypothesis is a specific, testable prediction about the relationship between variables. Start by identifying your research question, then review existing literature. Formulate the hypothesis as an if-then or directional statement, clearly defining the independent and dependent variables."]], "query": "how to develop a research hypothesis"} -{"output": [["lex", "social contract theory Hobbes Locke Rousseau"], ["lex", "social contract political philosophy government legitimacy"], ["vec", "what is social contract theory and how did Hobbes, Locke, and Rousseau differ in their views"], ["vec", "how does social contract theory explain the legitimacy of government authority"], ["hyde", "Social contract theory proposes that individuals consent, either explicitly or tacitly, to surrender some freedoms to a governing authority in exchange for social order. Hobbes argued for an absolute sovereign, Locke emphasized natural rights and limited government, and Rousseau stressed the general will of the people."]], "query": "what is social contract theory"} -{"output": [["lex", "code sharing platform snippet pastebin"], ["lex", "codeshare live collaborative editor"], ["lex", "share code online GitHub Gist"], ["vec", "what are the best platforms for sharing code snippets with others online"], ["vec", "how to share code collaboratively in real time with another developer"], ["hyde", "CodeShare.io is a free online editor for sharing code in real time. Paste or type your code, share the generated URL, and others can view or edit simultaneously. For permanent sharing, GitHub Gists let you create public or secret snippets with syntax highlighting and version history."]], "query": "code share"} -{"output": [["lex", "American Revolution significance independence 1776"], ["lex", "American Revolution impact democracy constitutional government"], ["vec", "why was the American Revolution historically significant for democracy and self-governance"], ["vec", "how did the American Revolution influence other independence movements worldwide"], ["hyde", "The American Revolution (1775-1783) established the United States as an independent nation and introduced a constitutional republic based on Enlightenment principles. The Declaration of Independence asserted natural rights, and the resulting Constitution created a framework of representative government that influenced the French Revolution and Latin American independence movements."]], "query": "what is the significance of the american revolution"} -{"output": [["lex", "political ideologies left right spectrum"], ["lex", "liberalism conservatism socialism political theory"], ["vec", "how can someone learn about different political ideologies and where they fall on the spectrum"], ["vec", "what are the main differences between liberalism, conservatism, socialism, and libertarianism"], ["hyde", "Political ideologies are organized systems of beliefs about governance and society. The left-right spectrum places socialism and progressivism on the left, emphasizing equality and collective action, while conservatism and libertarianism sit on the right, prioritizing individual freedom and tradition. Each ideology has distinct views on the role of government, economics, and social policy."]], "query": "how to understand political ideologies"} -{"output": [["lex", "social confidence building shyness overcome"], ["lex", "social anxiety tips conversation skills"], ["vec", "what are practical steps to feel more confident when talking to people at social events"], ["vec", "how can someone overcome social anxiety and build self-confidence in group settings"], ["hyde", "Start small: make eye contact and greet one new person at each event. Prepare a few open-ended questions in advance. Focus on listening rather than performing. After each interaction, note what went well. Gradual exposure reduces anxiety over time—the more you practice, the more natural conversations become."]], "query": "how to build confidence in social situations?"} -{"output": [["lex", "day hike packing list gear essentials"], ["lex", "hiking backpack water food first aid"], ["vec", "what should I bring in my backpack for a day hike in the mountains"], ["vec", "what are the essential items to pack for a full-day hiking trip"], ["hyde", "Day hike essentials: 2 liters of water, trail snacks (nuts, bars, fruit), map or GPS device, sun protection (hat, sunscreen, sunglasses), first aid kit, rain layer, extra warm layer, headlamp, and a fully charged phone. Wear moisture-wicking layers and broken-in hiking boots."]], "query": "what to pack for a day hike"} -{"output": [["lex", "digital collage art Photoshop mixed media"], ["lex", "digital collage techniques layers composition"], ["vec", "what is digital collage art and how is it created using software"], ["vec", "what tools and techniques do artists use to make digital collages"], ["hyde", "Digital collage art combines photographs, illustrations, textures, and graphic elements assembled in software like Photoshop, Procreate, or Canva. Artists layer, mask, blend, and transform images to create surreal or thematic compositions. Unlike physical collage, digital tools allow non-destructive editing and infinite experimentation with scale and color."]], "query": "what is digital collage art?"} -{"output": [["lex", "car radiator leak repair fix sealant"], ["lex", "radiator hose replacement coolant leak"], ["vec", "how to diagnose and fix a leaking car radiator or radiator hose"], ["vec", "can radiator stop-leak sealant permanently fix a small coolant leak"], ["hyde", "For a small radiator leak, a stop-leak product like Bar's Leaks can provide a temporary fix. Add it to the coolant reservoir and run the engine. For permanent repair, locate the leak by pressurizing the cooling system, then either solder the radiator, replace the damaged hose, or install a new radiator if the damage is severe."]], "query": "how to fix a car radiator leak?"} -{"output": [["lex", "buy saffron threads online spice shop"], ["lex", "saffron purchase quality grade price"], ["vec", "where is the best place to buy high-quality saffron threads online or in stores"], ["vec", "how to find genuine saffron and avoid counterfeit or adulterated products"], ["hyde", "Buy saffron from reputable spice retailers like Penzeys, Burlap & Barrel, or specialty grocery stores. Look for grade 1 (Sargol or Negin) Iranian or Spanish saffron. Expect to pay $8-15 per gram. Avoid suspiciously cheap saffron—it may be dyed safflower or corn silk."]], "query": "where to buy saffron"} -{"output": [["lex", "Mahayana Buddhism bodhisattva teachings"], ["lex", "Mahayana vs Theravada Buddhism sutras"], ["vec", "what are the core beliefs and practices of Mahayana Buddhism"], ["vec", "how does Mahayana Buddhism differ from Theravada Buddhism"], ["hyde", "Mahayana Buddhism, the \"Great Vehicle,\" emerged around the 1st century CE and emphasizes the bodhisattva ideal—the aspiration to attain enlightenment for the benefit of all sentient beings, not just oneself. Key texts include the Heart Sutra and Lotus Sutra. Major traditions include Zen, Pure Land, and Tibetan Buddhism."]], "query": "what is mahayana buddhism"} -{"output": [["lex", "utilitarianism ethics greatest happiness principle"], ["lex", "utilitarianism Bentham Mill consequentialism"], ["vec", "what is utilitarianism and how does it determine right and wrong actions"], ["vec", "how did Jeremy Bentham and John Stuart Mill develop utilitarian ethics"], ["hyde", "Utilitarianism is a consequentialist ethical theory holding that the morally right action is the one that produces the greatest happiness for the greatest number. Jeremy Bentham proposed a quantitative \"felicific calculus,\" while John Stuart Mill distinguished between higher and lower pleasures, arguing quality of happiness matters as much as quantity."]], "query": "what is utilitarianism in ethics"} -{"output": [["lex", "climate change global warming greenhouse gases"], ["lex", "climate change causes effects CO2 emissions"], ["vec", "what causes climate change and what are its effects on the planet"], ["vec", "how do greenhouse gas emissions from human activity drive global warming"], ["hyde", "Climate change refers to long-term shifts in global temperatures and weather patterns. Since the Industrial Revolution, burning fossil fuels has released carbon dioxide and methane, trapping heat in the atmosphere. This has caused average global temperatures to rise by about 1.1°C, leading to melting ice caps, rising sea levels, and more extreme weather events."]], "query": "what is climate change?"} -{"output": [["lex", "positive rights negative rights difference"], ["lex", "positive negative rights examples entitlements liberties"], ["vec", "what is the distinction between positive and negative rights in political philosophy"], ["vec", "can you explain positive rights versus negative rights with examples"], ["hyde", "Negative rights require others to refrain from interfering—examples include freedom of speech, the right to privacy, and freedom from torture. Positive rights require others to provide something—examples include the right to education, healthcare, or a minimum standard of living. The distinction is central to debates between libertarians and welfare-state advocates."]], "query": "what is the difference between positive and negative rights"} -{"output": [["lex", "migraine causes triggers brain"], ["lex", "migraine headache serotonin vascular nerve"], ["vec", "what are the biological causes and common triggers of migraine headaches"], ["vec", "why do some people get migraines and what happens in the brain during one"], ["hyde", "Migraines involve abnormal brain activity affecting nerve signals, chemicals, and blood vessels. Cortical spreading depression—a wave of electrical activity across the cortex—triggers the trigeminal nerve, releasing inflammatory peptides. Common triggers include stress, hormonal changes, certain foods (aged cheese, alcohol), sleep disruption, and bright lights."]], "query": "what causes migraines"} -{"output": [["lex", "talk children bullying conversation advice"], ["lex", "kids bullying prevention parent discussion"], ["vec", "how should parents talk to their children about bullying at school"], ["vec", "what are age-appropriate ways to discuss bullying with kids and help them respond"], ["hyde", "Start the conversation calmly by asking open-ended questions: \"Has anyone at school been mean to you or someone else?\" Listen without overreacting. Teach your child to say \"Stop, I don't like that\" firmly, walk away, and tell a trusted adult. Role-play scenarios so they can practice responses."]], "query": "how to talk to kids about bullying?"} -{"output": [["lex", "replace windshield wipers signs worn"], ["lex", "wiper blade replacement frequency lifespan"], ["vec", "how often should windshield wipers be replaced and what are signs they need changing"], ["vec", "what are the signs that windshield wiper blades are worn out and need replacement"], ["hyde", "Replace windshield wipers every 6-12 months or when you notice streaking, skipping, squeaking, or smearing. Inspect the rubber edge for cracks, tears, or stiffness. If wipers leave unwiped areas or chatter across the glass, it's time for new blades. Extreme heat and cold accelerate deterioration."]], "query": "when to replace windshield wipers?"} -{"output": [["lex", "aerate lawn manually core aeration fork"], ["lex", "lawn aeration by hand spike tool"], ["vec", "how to aerate a lawn by hand without a machine using a garden fork or manual aerator"], ["vec", "what is the best technique for manually aerating compacted soil in a yard"], ["hyde", "To aerate manually, push a garden fork or manual core aerator into the soil every 4-6 inches, rocking it slightly to loosen the earth. Work in rows across the lawn. The best time to aerate is early fall for cool-season grasses or late spring for warm-season grasses. Water the lawn the day before to soften the soil."]], "query": "how to aerate lawn manually?"} -{"output": [["lex", "business communication skills effective workplace"], ["lex", "professional email writing clear messaging"], ["vec", "how can employees improve their written and verbal communication skills at work"], ["vec", "what techniques make business emails and presentations clearer and more effective"], ["hyde", "Effective business communication starts with clarity: state the purpose in the first sentence, use short paragraphs, and include a clear call to action. In meetings, summarize key points and assign action items. Avoid jargon when possible. Active listening—paraphrasing what others say—builds rapport and reduces misunderstandings."]], "query": "how to improve business communication"} -{"output": [["lex", "manage anxiety natural remedies without medication"], ["lex", "anxiety relief breathing exercise meditation"], ["vec", "what are natural ways to manage anxiety without medication"], ["vec", "how can exercise, breathing techniques, and lifestyle changes reduce anxiety symptoms"], ["hyde", "Natural anxiety management includes regular aerobic exercise (30 minutes, 5 days a week), diaphragmatic breathing, progressive muscle relaxation, and limiting caffeine and alcohol. Cognitive behavioral techniques like thought journaling help identify and challenge anxious thinking patterns. Herbal supplements such as chamomile and ashwagandha show some evidence of benefit."]], "query": "how to manage anxiety naturally"} -{"output": [["lex", "lease agreement draft template rental"], ["lex", "residential lease contract terms clauses"], ["vec", "what should be included when drafting a residential lease agreement"], ["vec", "how to write a legally sound rental lease agreement between landlord and tenant"], ["hyde", "A residential lease agreement should include: names of landlord and tenant, property address, lease term (start/end dates), monthly rent amount and due date, security deposit amount and return conditions, maintenance responsibilities, pet policy, late fee terms, and termination/renewal clauses. Both parties should sign and retain copies."]], "query": "how to draft a lease agreement"} -{"output": [["lex", "burnout syndrome workplace exhaustion"], ["lex", "burnout symptoms causes recovery"], ["vec", "what is burnout and what are its symptoms, causes, and effects on health"], ["vec", "how does chronic work stress lead to burnout and what does it feel like"], ["hyde", "Burnout is a state of chronic physical and emotional exhaustion caused by prolonged stress, typically work-related. The WHO classifies it by three dimensions: energy depletion, increased mental distance or cynicism toward one's job, and reduced professional efficacy. Symptoms include fatigue, insomnia, irritability, and difficulty concentrating."]], "query": "what is burnout?"} -{"output": [["lex", "let go negative thoughts techniques"], ["lex", "negative thinking patterns CBT mindfulness"], ["vec", "how to stop dwelling on negative thoughts and break rumination cycles"], ["vec", "what mindfulness or cognitive techniques help release negative thinking"], ["hyde", "To let go of negative thoughts, practice cognitive defusion: observe the thought without engaging it, label it (\"I'm having the thought that...\"), and let it pass like a cloud. Mindfulness meditation trains this skill. Write recurring worries in a journal, then close it—this externalizes them. Challenge distortions by asking: \"Is this thought based on facts or assumptions?\""]], "query": "how to let go of negative thoughts?"} -{"output": [["lex", "brew tea temperature steep time"], ["lex", "tea brewing method loose leaf"], ["vec", "what are the correct water temperatures and steeping times for different types of tea"], ["vec", "how to brew loose leaf tea properly for the best flavor"], ["hyde", "Water temperature and steep time vary by tea type. Black tea: 200-212°F for 3-5 minutes. Green tea: 160-180°F for 2-3 minutes. White tea: 160-185°F for 4-5 minutes. Oolong: 185-205°F for 3-5 minutes. Use 1 teaspoon of loose leaf per 8 oz cup. Pre-warm the teapot with hot water for consistent extraction."]], "query": "how to brew the perfect cup of tea"} -{"output": [["lex", "anarchism political philosophy anti-state"], ["lex", "anarchism theory Kropotkin Bakunin mutual aid"], ["vec", "what is anarchism as a political philosophy and what do anarchists believe"], ["vec", "how do different branches of anarchism envision a society without government"], ["hyde", "Anarchism is a political philosophy that rejects involuntary, coercive hierarchy—particularly the state—and advocates for voluntary, cooperative social organization. Major branches include anarcho-communism (Kropotkin), which envisions communal ownership, anarcho-syndicalism, which organizes through labor unions, and individualist anarchism, which emphasizes personal autonomy."]], "query": "what is anarchism"} -{"output": [["lex", "daily motivation habits discipline routine"], ["lex", "stay motivated goals productivity tips"], ["vec", "what are practical strategies to stay motivated and productive every day"], ["vec", "how to maintain motivation when working toward long-term goals"], ["hyde", "Set one clear priority each morning rather than a long to-do list. Break large goals into small daily tasks. Track streaks—visual progress reinforces consistency. Pair difficult tasks with rewards. On low-motivation days, commit to just 5 minutes; starting is the hardest part, and momentum usually follows."]], "query": "how to stay motivated daily?"} -{"output": [["lex", "sort list programming algorithm"], ["lex", "list sort Python Java ascending descending"], ["lex", "array sorting methods comparison"], ["vec", "how to sort a list or array in different programming languages"], ["vec", "what sorting algorithms are used for lists and how do they compare in performance"], ["hyde", "In Python, sort a list in-place with list.sort() or return a new sorted list with sorted(). Use key= for custom sorting: sorted(items, key=lambda x: x.name). In Java, use Collections.sort() or List.sort(). Common algorithms include quicksort (O(n log n) average), mergesort (stable, O(n log n)), and timsort (Python/Java default)."]], "query": "list sort"} -{"output": [["lex", "Renaissance period 14th-17th century Europe"], ["lex", "Renaissance art culture Florence rebirth"], ["vec", "what was the Renaissance period and why was it significant in European history"], ["vec", "how did the Renaissance transform art, science, and culture in Europe"], ["hyde", "The Renaissance (14th-17th century) was a cultural movement that began in Florence, Italy, marking the transition from the medieval period to modernity. It saw a revival of classical Greek and Roman art and philosophy. Key figures include Leonardo da Vinci, Michelangelo, and Galileo. The invention of the printing press accelerated the spread of new ideas across Europe."]], "query": "what was the renaissance period"} -{"output": [["lex", "smart thermostat WiFi programmable Nest Ecobee"], ["lex", "smart thermostat energy savings features"], ["vec", "what is a smart thermostat and how does it save energy compared to a regular thermostat"], ["vec", "how do smart thermostats like Nest and Ecobee learn and control home temperature"], ["hyde", "A smart thermostat connects to WiFi and can be controlled via a smartphone app. Models like the Nest Learning Thermostat and Ecobee use sensors and machine learning to build a schedule based on your habits. They adjust heating and cooling automatically, reducing energy use by 10-15% on average compared to standard programmable thermostats."]], "query": "what is a smart thermostat?"} -{"output": [["lex", "Great Barrier Reef Australia coral ecosystem"], ["lex", "Great Barrier Reef marine biodiversity coral bleaching"], ["vec", "what is the Great Barrier Reef and why is it important for marine biodiversity"], ["vec", "where is the Great Barrier Reef located and what threats does it face"], ["hyde", "The Great Barrier Reef, off the coast of Queensland, Australia, is the world's largest coral reef system, stretching over 2,300 kilometers. It comprises nearly 3,000 individual reef systems and supports over 1,500 fish species, 400 coral species, and 30 species of whales and dolphins. Coral bleaching from rising ocean temperatures is its greatest threat."]], "query": "what is the great barrier reef"} -{"output": [["lex", "Sacred Heart Jesus Catholic devotion"], ["lex", "Sacred Heart significance symbolism Christianity"], ["vec", "what does the Sacred Heart of Jesus symbolize in Catholic tradition"], ["vec", "what is the history and religious significance of devotion to the Sacred Heart"], ["hyde", "The Sacred Heart is a devotional image in Catholicism representing Jesus Christ's divine love for humanity. Popularized by St. Margaret Mary Alacoque's 17th-century visions, it depicts Christ's heart surrounded by a crown of thorns, flames, and a cross. The feast of the Sacred Heart is celebrated 19 days after Pentecost."]], "query": "what is the significance of the sacred heart?"} -{"output": [["lex", "survival camping wilderness skills bushcraft"], ["lex", "survival camping gear shelter fire water"], ["vec", "what is survival camping and what skills do you need to camp with minimal gear"], ["vec", "how to prepare for a survival camping trip in the wilderness"], ["hyde", "Survival camping means spending time outdoors with minimal or no modern gear, relying on wilderness skills. Core skills include building a debris shelter, starting fire with a ferro rod or bow drill, purifying water by boiling or filtering, navigating with a map and compass, and foraging or trapping for food."]], "query": "what is survival camping?"} -{"output": [["lex", "WiFi dropping connection fix troubleshoot"], ["lex", "WiFi disconnecting frequently router reset"], ["vec", "how to troubleshoot a WiFi connection that keeps dropping or disconnecting"], ["vec", "why does my WiFi keep cutting out and how do I fix it"], ["hyde", "If your WiFi keeps dropping, try these steps: 1) Restart your router and modem by unplugging for 30 seconds. 2) Move closer to the router or remove obstructions. 3) Change the WiFi channel in router settings to reduce interference. 4) Update router firmware. 5) Check for driver updates on your device. 6) Disable power-saving mode for your wireless adapter."]], "query": "how to fix wifi connection dropping"} -{"output": [["lex", "horror writing elements techniques atmosphere"], ["lex", "horror fiction suspense tension dread"], ["vec", "what literary elements and techniques make horror writing effective"], ["vec", "how do horror authors create suspense, tension, and fear in their stories"], ["hyde", "Effective horror writing relies on atmosphere, pacing, and the unknown. Build dread through setting—dark, isolated, claustrophobic spaces. Use sensory details to ground the reader. Withhold information: what the reader imagines is scarier than what you show. Escalate tension gradually, then release it with a shock. Relatable characters make the stakes feel real."]], "query": "what are the key elements of horror writing?"} -{"output": [["lex", "free press importance democracy journalism"], ["lex", "freedom of press First Amendment accountability"], ["vec", "why is a free press important for democracy and holding governments accountable"], ["vec", "what role does press freedom play in protecting civil liberties and public information"], ["hyde", "A free press serves as a watchdog on government and powerful institutions, exposing corruption, fraud, and abuse. The First Amendment protects press freedom in the United States. Without it, citizens lack access to independent information needed to make informed decisions. Countries with restricted press freedoms consistently rank lower on democracy indices."]], "query": "what is the importance of free press"} -{"output": [["lex", "best national parks USA visit"], ["lex", "top national parks Yellowstone Yosemite Zion"], ["vec", "what are the most popular and scenic national parks to visit in the United States"], ["vec", "which national parks offer the best hiking, scenery, and wildlife experiences"], ["hyde", "Top US national parks include Yellowstone (geysers, wildlife), Yosemite (granite cliffs, waterfalls), Grand Canyon (layered red rock), Zion (slot canyons, river hikes), Glacier (pristine alpine lakes), and Acadia (Atlantic coastline). Visit during shoulder season (May or September) for fewer crowds and pleasant weather."]], "query": "what are the best national parks?"} -{"output": [["lex", "deconstruction Derrida literary theory philosophy"], ["lex", "deconstruction meaning binary oppositions text"], ["vec", "what is deconstruction in philosophy and literary theory as developed by Jacques Derrida"], ["vec", "how does deconstructionist analysis challenge fixed meaning in texts"], ["hyde", "Deconstruction, associated with Jacques Derrida, is a method of critical analysis that examines how meaning in texts is constructed through binary oppositions (speech/writing, presence/absence). Derrida argued that meaning is never fixed; it is always deferred through a chain of signifiers. Deconstruction reveals the internal contradictions and assumptions hidden within texts."]], "query": "what is deconstruction"} -{"output": [["lex", "leaky faucet repair fix dripping"], ["lex", "faucet washer O-ring cartridge replacement"], ["vec", "how to fix a dripping faucet by replacing the washer or cartridge"], ["vec", "what are the step-by-step instructions for repairing a leaky kitchen or bathroom faucet"], ["hyde", "Turn off the water supply valves under the sink. Remove the faucet handle by unscrewing the decorative cap and handle screw. Pull out the stem or cartridge. For compression faucets, replace the rubber washer and O-ring. For cartridge faucets, replace the entire cartridge. Reassemble, turn the water back on, and test for leaks."]], "query": "how to repair a leaky faucet"} -{"output": [["lex", "Ganges River Hinduism sacred significance"], ["lex", "Ganga river Hindu rituals purification"], ["vec", "why is the Ganges River considered sacred in Hinduism"], ["vec", "what religious rituals and beliefs are associated with the Ganges in Hindu tradition"], ["hyde", "The Ganges (Ganga) is Hinduism's holiest river, personified as the goddess Ganga. Hindus believe bathing in the Ganges washes away sins and that immersing ashes of the dead in the river frees the soul from the cycle of rebirth. The cities of Varanasi and Haridwar along the Ganges host major pilgrimage sites and cremation ghats."]], "query": "what is the significance of the ganges river in hinduism?"} -{"output": [["lex", "buy bonsai trees online nursery shop"], ["lex", "bonsai tree purchase quality species"], ["vec", "where are the best places to buy bonsai trees online or at local nurseries"], ["vec", "which online retailers and nurseries sell high-quality bonsai trees for beginners"], ["hyde", "Reputable bonsai retailers include Bonsai Boy of New York, Brussel's Bonsai, and Eastern Leaf (online). Local bonsai nurseries and Japanese garden shops often carry better-quality specimens. For beginners, start with hardy species like Chinese elm, ficus, or juniper. Expect to pay $30-80 for a quality starter tree."]], "query": "best places to buy bonsai trees"} -{"output": [["lex", "physics principles fundamental laws"], ["lex", "Newton's laws thermodynamics relativity quantum"], ["vec", "what are the fundamental principles and laws of physics"], ["vec", "how do Newton's laws, thermodynamics, and quantum mechanics form the foundations of physics"], ["hyde", "The fundamental principles of physics include Newton's three laws of motion, the law of universal gravitation, the laws of thermodynamics (energy conservation, entropy), Maxwell's equations for electromagnetism, Einstein's special and general relativity, and quantum mechanics. These describe how matter, energy, space, and time interact at all scales."]], "query": "what are the principles of physics"} -{"output": [["lex", "SEO optimization website search engine ranking"], ["lex", "on-page SEO meta tags keywords content"], ["vec", "what are the key steps to optimize a website for search engine rankings"], ["vec", "how to improve on-page and technical SEO for better Google search results"], ["hyde", "On-page SEO: use target keywords in title tags, H1 headings, and meta descriptions. Write unique, high-quality content over 1,000 words. Optimize images with alt text and compression. Technical SEO: ensure fast page load times (under 3 seconds), mobile responsiveness, HTTPS, clean URL structure, and an XML sitemap submitted to Google Search Console."]], "query": "how to optimize website for seo"} -{"output": [["lex", "Buddhist sacred texts scriptures Tripitaka"], ["lex", "Buddhism sutras Pali Canon Mahayana texts"], ["vec", "what are the main sacred texts and scriptures of Buddhism"], ["vec", "how do the Pali Canon and Mahayana sutras differ as Buddhist scriptures"], ["hyde", "The primary Buddhist scripture is the Tripitaka (Pali Canon), composed of three \"baskets\": the Vinaya Pitaka (monastic rules), Sutta Pitaka (discourses of the Buddha), and Abhidhamma Pitaka (philosophical analysis). Mahayana Buddhism adds texts like the Heart Sutra, Diamond Sutra, and Lotus Sutra, emphasizing the bodhisattva path."]], "query": "what are the sacred texts of buddhism"} -{"output": [["lex", "public hearing participation attend testify"], ["lex", "public hearing comment speak local government"], ["vec", "how can citizens participate and give testimony at public hearings"], ["vec", "what are the steps to attend and speak at a local government public hearing"], ["hyde", "To participate in a public hearing, check your local government website for upcoming meetings and agendas. Sign up to speak in advance if required. Prepare a concise statement (usually 2-3 minutes). State your name and address for the record. Focus on facts and personal impact. You can also submit written comments before the deadline."]], "query": "how to participate in public hearings"} -{"output": [["lex", "hypothesis definition scientific research"], ["lex", "hypothesis testable prediction experiment"], ["vec", "what is a hypothesis in the scientific method and how is one formed"], ["vec", "what makes a good scientific hypothesis and how is it different from a theory"], ["hyde", "A hypothesis is a testable prediction about the relationship between two or more variables. In the scientific method, it follows observation and research: based on existing knowledge, you propose an explanation that can be tested through experimentation. A hypothesis must be falsifiable—there must be a possible outcome that would prove it wrong."]], "query": "what is a hypothesis"} -{"output": [["lex", "extreme sports photography action camera"], ["lex", "adventure sports photography techniques shutter speed"], ["vec", "what is extreme sports photography and what equipment and techniques does it require"], ["vec", "how do photographers capture high-speed action shots in extreme sports"], ["hyde", "Extreme sports photography captures athletes performing in high-risk activities like surfing, snowboarding, rock climbing, and base jumping. Photographers use fast shutter speeds (1/1000s or faster), continuous autofocus, and burst mode. Key gear includes weather-sealed DSLRs or mirrorless cameras, telephoto lenses (70-200mm), and GoPro-style action cameras for POV shots."]], "query": "what is extreme sports photography?"} -{"output": [["lex", "sustainable living tips eco-friendly lifestyle"], ["lex", "reduce waste carbon footprint daily habits"], ["vec", "what are practical everyday habits for living a more sustainable and eco-friendly life"], ["vec", "how can individuals reduce their carbon footprint and waste in daily living"], ["hyde", "Sustainable living starts with reducing consumption: buy less, choose durable goods, and repair before replacing. Eat more plant-based meals, which have a lower carbon footprint. Use public transit, bike, or walk. Reduce waste through composting and recycling. Switch to renewable energy and use LED lighting. Carry reusable bags, bottles, and containers."]], "query": "how to live sustainably?"} -{"output": [["lex", "epistemological relativism knowledge truth"], ["lex", "epistemological relativism philosophy objectivity"], ["vec", "what is epistemological relativism and how does it challenge objective truth claims"], ["vec", "how does epistemological relativism argue that knowledge is relative to perspective or culture"], ["hyde", "Epistemological relativism holds that knowledge and truth are not absolute but are relative to the social, cultural, or historical context in which they are produced. Different communities may have equally valid but incompatible knowledge systems. Critics argue this leads to self-refutation: the claim that all knowledge is relative is itself presented as an absolute truth."]], "query": "what is epistemological relativism"} -{"output": [["lex", "mixed media art techniques materials"], ["lex", "mixed media collage painting assemblage"], ["vec", "what is mixed media art and what materials and techniques are commonly used"], ["vec", "how do artists combine different media like paint, paper, and found objects in mixed media artwork"], ["hyde", "Mixed media art combines two or more artistic media in a single work—for example, acrylic paint with collaged paper, fabric, ink, and found objects. Techniques include layering, texturing with gels and paste, image transfers, and assemblage. The combination of materials creates visual depth and tactile richness that single-medium works cannot achieve."]], "query": "what is mixed media art?"} -{"output": [["lex", "Microsoft jobs hiring apply career"], ["lex", "Microsoft interview process software engineer"], ["vec", "how to apply for a job at Microsoft and what is the interview process like"], ["vec", "what qualifications and steps are needed to get hired at Microsoft"], ["hyde", "Apply through Microsoft's careers portal at careers.microsoft.com. Most technical roles require a CS degree or equivalent experience. The interview process typically includes a phone screen, online coding assessment, and an on-site loop of 4-5 interviews covering algorithms, system design, and behavioral questions. Prepare with LeetCode and system design practice."]], "query": "how to work at microsoft?"} -{"output": [["lex", "haiku characteristics syllable structure"], ["lex", "haiku poetry 5-7-5 Japanese nature"], ["vec", "what are the defining characteristics and rules of haiku poetry"], ["vec", "how is a traditional Japanese haiku structured and what themes does it explore"], ["hyde", "Haiku is a Japanese poetic form traditionally consisting of three lines with a 5-7-5 syllable pattern (or 17 morae in Japanese). Haiku typically captures a moment in nature and includes a kigo (seasonal word) and a kireji (cutting word) that creates a pause or shift. The poem juxtaposes two images to evoke emotion through suggestion rather than direct statement."]], "query": "what are the characteristics of haiku?"} -{"output": [["lex", "Plato theory of Forms Ideas philosophy"], ["lex", "Platonic Forms abstract reality idealism"], ["vec", "what is Plato's theory of Forms and how does it explain reality"], ["vec", "how did Plato distinguish between the world of Forms and the physical world"], ["hyde", "Plato's theory of Forms posits that the physical world is a shadow of a higher, non-material reality consisting of perfect, eternal Forms (Ideas). A beautiful object participates in the Form of Beauty; a just action reflects the Form of Justice. True knowledge comes from understanding these abstract Forms through reason, not through sensory experience of the changeable physical world."]], "query": "what is plato's theory of forms"} -{"output": [["lex", "law of attraction manifestation positive thinking"], ["lex", "law of attraction belief visualization"], ["vec", "what is the law of attraction and how is it supposed to work"], ["vec", "does the law of attraction have any scientific basis or evidence"], ["hyde", "The law of attraction is the belief that positive or negative thoughts bring positive or negative experiences into a person's life. Proponents, popularized by the book \"The Secret,\" claim that visualizing desired outcomes and maintaining a positive mindset attracts those outcomes. Scientists generally consider it pseudoscience, though positive thinking can influence motivation and goal-directed behavior."]], "query": "what is the law of attraction?"} -{"output": [["lex", "literary parody satire imitation genre"], ["lex", "parody literature examples humor exaggeration"], ["vec", "what is literary parody and how does it use imitation for comedic or critical effect"], ["vec", "what are famous examples of parody in literature"], ["hyde", "Literary parody imitates the style, conventions, or content of a specific work or genre for comedic or critical effect. It exaggerates distinctive features to expose flaws or absurdities. Examples include Don Quixote (parodying chivalric romances), Northanger Abbey (Gothic novels), and The Hitchhiker's Guide to the Galaxy (science fiction tropes)."]], "query": "what is literary parody?"} -{"output": [["lex", "cryptocurrency investing safely beginner"], ["lex", "crypto investment security wallet exchange"], ["vec", "how can beginners invest in cryptocurrency safely and minimize risk of loss"], ["vec", "what security measures should you take when buying and storing cryptocurrency"], ["hyde", "To invest in crypto safely: use reputable exchanges like Coinbase or Kraken with two-factor authentication. Never invest more than you can afford to lose. Transfer holdings to a hardware wallet (Ledger, Trezor) for long-term storage. Diversify across Bitcoin and Ethereum rather than speculative altcoins. Beware of phishing scams and never share your seed phrase."]], "query": "how to invest in cryptocurrency safely?"} -{"output": [["lex", "protagonist definition literature main character"], ["lex", "protagonist role story narrative hero"], ["vec", "what is a protagonist in literature and what role do they play in a story"], ["vec", "how does the protagonist differ from the antagonist in narrative fiction"], ["hyde", "The protagonist is the central character of a narrative, the one whose goals and conflicts drive the plot. The story is told from their perspective or follows their journey. Protagonists are not always heroes—they can be antiheroes or morally ambiguous characters. The antagonist opposes the protagonist, creating the central conflict of the story."]], "query": "what is a protagonist?"} -{"output": [["lex", "promotion review preparation performance"], ["lex", "job promotion meeting self-assessment achievements"], ["vec", "how should an employee prepare for a promotion review meeting with their manager"], ["vec", "what documentation and evidence should you gather before a promotion discussion"], ["hyde", "Before your promotion review, compile a list of key accomplishments with measurable results (revenue generated, projects delivered, efficiency improvements). Gather positive feedback from colleagues and clients. Align your achievements with the next-level job description. Prepare specific examples demonstrating leadership, initiative, and impact. Practice articulating your case concisely."]], "query": "how to prepare for a promotion review?"} -{"output": [["lex", "reduce water usage conservation tips home"], ["lex", "save water household low-flow fixtures"], ["vec", "what are practical ways to reduce water consumption at home"], ["vec", "how can individuals conserve water in their daily routines and household"], ["hyde", "Install low-flow showerheads (2 GPM or less) and faucet aerators. Fix leaky faucets—a drip wastes up to 3,000 gallons per year. Take shorter showers (5 minutes saves 12 gallons). Run dishwashers and washing machines only with full loads. Water gardens in the early morning to reduce evaporation. Collect rainwater for outdoor use."]], "query": "how to reduce personal water usage?"} -{"output": [["lex", "sustainable technology green tech renewable energy"], ["lex", "sustainable technology clean energy innovation"], ["vec", "what are examples of sustainable technologies that reduce environmental impact"], ["vec", "how is technology being used to promote sustainability and fight climate change"], ["hyde", "Sustainable technologies aim to reduce environmental impact while meeting human needs. Examples include solar panels and wind turbines for clean energy, electric vehicles, energy-efficient building materials, carbon capture systems, biodegradable plastics, precision agriculture that reduces water and pesticide use, and smart grids that optimize energy distribution."]], "query": "sustainable technology"} -{"output": [["lex", "vote in person polling place Election Day"], ["lex", "in-person voting process ID requirements"], ["vec", "what are the steps to vote in person at a polling place on Election Day"], ["vec", "what do I need to bring and expect when voting in person for the first time"], ["hyde", "To vote in person, check your registration status and find your polling location at vote.org or your state's election website. Bring a valid photo ID if required by your state. On Election Day, go to your assigned polling place, check in with a poll worker, receive your ballot, mark your choices, and submit your ballot through the scanner or ballot box."]], "query": "how do i vote in person"} -{"output": [["lex", "aquaponics fish plants symbiotic system"], ["lex", "aquaponics setup grow food fish tank"], ["vec", "what is aquaponics and how does it combine fish farming with plant growing"], ["vec", "how does an aquaponics system work and what can you grow with it"], ["hyde", "Aquaponics is a food production system that combines aquaculture (raising fish) with hydroponics (growing plants in water). Fish waste provides natural fertilizer for the plants, and the plants filter the water for the fish, creating a symbiotic cycle. Common setups use tilapia or goldfish with leafy greens, herbs, and tomatoes."]], "query": "what is aquaponics?"} -{"output": [["lex", "Hajj Islam pilgrimage Mecca significance"], ["lex", "Hajj pillar Islam Kaaba rituals"], ["vec", "why is the Hajj pilgrimage to Mecca significant in Islam"], ["vec", "what are the rituals and spiritual meaning of the Hajj for Muslims"], ["hyde", "The Hajj is the fifth pillar of Islam, requiring every able-bodied Muslim who can afford it to make the pilgrimage to Mecca at least once in their lifetime. Performed during Dhul Hijjah, the rituals include circling the Kaaba seven times (tawaf), walking between Safa and Marwah, standing at Arafat, and the symbolic stoning of the devil at Mina."]], "query": "what is the significance of the hajj in islam?"} -{"output": [["lex", "hypothesis testing statistics null alternative"], ["lex", "hypothesis test p-value significance level"], ["vec", "what is hypothesis testing in statistics and how does it work"], ["vec", "how do you perform a hypothesis test using null and alternative hypotheses"], ["hyde", "Hypothesis testing is a statistical method for making decisions using data. You state a null hypothesis (H0, no effect) and an alternative hypothesis (H1, effect exists). Collect data and calculate a test statistic. If the p-value is below the significance level (typically 0.05), reject H0. Common tests include t-test, chi-square, and ANOVA."]], "query": "what is a hypothesis testing"} -{"output": [["lex", "publish scientific article journal peer review"], ["lex", "scientific paper submission academic journal"], ["vec", "what are the steps to publish a research article in a peer-reviewed scientific journal"], ["vec", "how does the peer review and journal submission process work for scientific papers"], ["hyde", "To publish a scientific article: 1) Write the manuscript following IMRAD format (Introduction, Methods, Results, Discussion). 2) Choose a target journal matching your topic and impact level. 3) Format per the journal's author guidelines. 4) Submit through the journal's online portal. 5) Respond to peer reviewer comments during revision. The process typically takes 3-12 months."]], "query": "how to publish a scientific article"} -{"output": [["lex", "poetry themes common literary motifs"], ["lex", "poetry themes love death nature identity"], ["vec", "what are the most common themes explored in poetry across different periods"], ["vec", "how do poets use recurring themes like love, death, and nature in their work"], ["hyde", "Common poetry themes include love and desire, mortality and the passage of time, nature and the seasons, loss and grief, identity and self-discovery, war and conflict, beauty, spirituality, and social justice. These universal themes recur across periods—from Sappho's love lyrics to Keats's meditations on mortality to contemporary poets exploring identity."]], "query": "what are common themes in poetry?"} -{"output": [["lex", "write resume format template job"], ["lex", "resume writing tips work experience skills"], ["vec", "how to write an effective resume that stands out to employers and recruiters"], ["vec", "what should be included in a resume and how should it be formatted"], ["hyde", "A strong resume includes: contact information, a brief professional summary (2-3 sentences), work experience in reverse chronological order with bullet-point achievements, education, and relevant skills. Use action verbs (\"led,\" \"built,\" \"increased\") and quantify results (\"increased sales by 25%\"). Keep it to one page for under 10 years of experience. Tailor it to each job posting."]], "query": "how to write a resume"} -{"output": [["lex", "key performance indicators KPIs metrics"], ["lex", "KPI examples business performance measurement"], ["vec", "what are key performance indicators and how are they used to measure business success"], ["vec", "how do companies choose and track the right KPIs for their goals"], ["hyde", "Key Performance Indicators (KPIs) are measurable values that demonstrate how effectively a company is achieving its objectives. Examples include revenue growth rate, customer acquisition cost, employee retention rate, and net promoter score. Effective KPIs are specific, measurable, achievable, relevant, and time-bound (SMART). They should align directly with strategic goals."]], "query": "what are key performance indicators"} -{"output": [["lex", "art inspiration online websites platforms"], ["lex", "art inspiration Pinterest Behance DeviantArt"], ["vec", "where can artists find creative inspiration and references online"], ["vec", "what websites and platforms are best for discovering art inspiration"], ["hyde", "Top platforms for art inspiration include Pinterest (curated mood boards), Behance and Dribbble (professional portfolios), ArtStation (digital and concept art), DeviantArt (community art), and Instagram art hashtags. Museums also offer virtual collections: Google Arts & Culture, the Met's Open Access, and the Rijksmuseum's digital archive."]], "query": "how to find art inspiration online?"} -{"output": [["lex", "logic ethics moral reasoning philosophy"], ["lex", "logical arguments ethical theory validity"], ["vec", "what role does logic play in ethical reasoning and moral philosophy"], ["vec", "how do philosophers use logical arguments to evaluate ethical claims"], ["hyde", "Logic provides the structural framework for ethical reasoning. Valid arguments require that conclusions follow necessarily from premises. In ethics, logic helps identify fallacies, test the consistency of moral principles, and evaluate whether ethical claims are well-supported. For example, the logical form of universalizability in Kant's categorical imperative tests moral maxims for contradiction."]], "query": "what is the significance of logic in ethics?"} -{"output": [["lex", "sustainable urban living city eco-friendly"], ["lex", "urban sustainability public transit green housing"], ["vec", "what are practical ways to live sustainably in a city environment"], ["vec", "how can urban residents reduce their environmental footprint in daily life"], ["hyde", "Sustainable urban living includes using public transit, biking, or walking instead of driving. Choose an energy-efficient apartment, reduce food waste through composting and meal planning, shop at local farmers markets, and support community gardens. Use shared resources like tool libraries and car-sharing services to reduce individual consumption."]], "query": "how to engage in sustainable urban living?"} -{"output": [["lex", "shalom Judaism peace concept meaning"], ["lex", "shalom Hebrew wholeness completeness Jewish"], ["vec", "what does the concept of shalom mean in Judaism beyond just peace"], ["vec", "how is shalom understood as wholeness and completeness in Jewish theology"], ["hyde", "Shalom in Judaism means far more than the absence of conflict. Derived from the Hebrew root meaning \"wholeness\" or \"completeness,\" shalom encompasses peace, harmony, welfare, and flourishing. It describes right relationships between people, with God, and with creation. The pursuit of shalom (rodef shalom) is a central ethical obligation in Jewish life."]], "query": "what is the concept of shalom in judaism?"} -{"output": [["lex", "structuralism functionalism differences psychology"], ["lex", "structuralism Wundt functionalism James psychology"], ["vec", "what are the differences between structuralism and functionalism in psychology"], ["vec", "how did Wundt's structuralism differ from William James's functionalism"], ["hyde", "Structuralism, founded by Wilhelm Wundt, sought to break down mental processes into their basic elements through introspection—analyzing the structure of consciousness. Functionalism, led by William James, focused instead on the purpose of mental processes—how the mind helps organisms adapt to their environment. Structuralism asked \"what is consciousness?\" while functionalism asked \"what is consciousness for?\""]], "query": "how do structuralism and functionalism differ"} -{"output": [["lex", "Duolingo language courses available"], ["lex", "Duolingo app languages learn"], ["vec", "what language courses are available on Duolingo and which are the most popular"], ["vec", "how effective is Duolingo for learning a new language and what languages does it offer"], ["hyde", "Duolingo offers courses in over 40 languages, including Spanish, French, German, Japanese, Korean, Mandarin, Italian, Portuguese, and Hindi. Each course uses gamified lessons with speaking, listening, reading, and writing exercises. Popular courses include Spanish for English speakers (the most enrolled) and English for Spanish speakers."]], "query": "duolingo courses"} -{"output": [["lex", "hang artwork without nails wall"], ["lex", "picture hanging command strips adhesive hooks"], ["vec", "how to hang pictures and artwork on walls without using nails or drilling holes"], ["vec", "what are the best no-damage methods for hanging frames on walls"], ["hyde", "Command Strips by 3M hold up to 16 lbs and leave no wall damage—press firmly for 30 seconds and wait 1 hour before hanging. Other nail-free options include adhesive hooks, velcro strips, magnetic frames, and picture hanging wire with adhesive anchors. For heavier pieces, use monkey hooks which require only a tiny hole, no hammer needed."]], "query": "how to hang artwork without nails"} -{"output": [["lex", "augmented reality applications fields industry"], ["lex", "AR technology healthcare education retail"], ["vec", "how is augmented reality being used in healthcare, education, and retail industries"], ["vec", "what are real-world applications of augmented reality across different fields"], ["hyde", "Augmented reality overlays digital content onto the real world and is applied across many fields. In healthcare, surgeons use AR to visualize anatomy during procedures. In education, AR apps bring textbook content to life in 3D. Retailers like IKEA use AR to let customers preview furniture in their homes. In manufacturing, AR guides workers through assembly with step-by-step overlays."]], "query": "how augmented reality is applied in different fields"} -{"output": [["lex", "best soil roses growing type"], ["lex", "rose garden soil pH loam drainage"], ["vec", "what type of soil do roses grow best in and how should it be prepared"], ["vec", "what soil pH and composition are ideal for growing healthy rose bushes"], ["hyde", "Roses thrive in well-draining loamy soil with a pH between 6.0 and 6.5. Amend heavy clay soil with compost and coarse sand to improve drainage. Mix in aged manure or rose-specific fertilizer before planting. Ensure soil holds moisture without becoming waterlogged. Mulch with 2-3 inches of organic material to retain moisture and regulate temperature."]], "query": "what are the best soil types for roses"} -{"output": [["lex", "siblings get along fighting conflict resolution"], ["lex", "sibling rivalry reduce cooperation strategies"], ["vec", "how can parents encourage their children to get along and reduce sibling rivalry"], ["vec", "what strategies help siblings resolve conflicts and build positive relationships"], ["hyde", "Give each child one-on-one time to reduce competition for attention. Avoid comparing siblings or labeling them (\"the smart one\"). Teach conflict resolution: help them express feelings with \"I\" statements and find compromises. Praise cooperation when you see it. Set clear family rules about physical aggression and name-calling."]], "query": "how to encourage siblings to get along?"} -{"output": [["lex", "Great Wall China history construction"], ["lex", "Great Wall China length dynasty defense"], ["vec", "what is the Great Wall of China and why was it built"], ["vec", "how long is the Great Wall of China and which dynasties built it"], ["hyde", "The Great Wall of China is a series of fortifications built over centuries to protect Chinese states and empires from northern invasions. The most well-known sections were built during the Ming Dynasty (1368-1644). The total length, including all branches and sections across dynasties, is approximately 21,196 kilometers (13,171 miles)."]], "query": "what is the great wall of china?"} -{"output": [["lex", "attend political rally event tips"], ["lex", "political rally preparation safety what to bring"], ["vec", "how to find and attend a political rally or campaign event in your area"], ["vec", "what should you know before attending your first political rally"], ["hyde", "Find rallies through candidate websites, social media, or event platforms like Eventbrite. Register if required (RSVP is often free). Arrive early as venues fill up. Bring water, sunscreen if outdoors, a charged phone, and valid ID. Wear comfortable shoes. Be aware of your surroundings and know the exit locations. Follow posted rules about signs and bags."]], "query": "how to attend a political rally"} -{"output": [["lex", "narrative arc function story structure"], ["lex", "narrative arc exposition climax resolution plot"], ["vec", "what is a narrative arc and how does it structure a story from beginning to end"], ["vec", "what are the parts of a narrative arc and why is it important in storytelling"], ["hyde", "A narrative arc is the structure that shapes a story's progression. It typically follows five stages: exposition (introduces characters and setting), rising action (builds conflict and tension), climax (the turning point), falling action (consequences unfold), and resolution (conflict is resolved). The arc gives readers a satisfying sense of progression and closure."]], "query": "what is the function of a narrative arc?"} -{"output": [["lex", "argparse Python command line arguments"], ["lex", "argument parser CLI Python module"], ["vec", "how to use Python argparse module to parse command line arguments"], ["vec", "how to define positional and optional arguments with argparse"], ["hyde", "Use argparse to handle CLI arguments: parser = argparse.ArgumentParser(); parser.add_argument(\"file\"); args = parser.parse_args(). Supports positional args, optional flags, subcommands, and type validation."]], "query": "arg parse"} -{"output": [["lex", "draw realistic portrait pencil technique"], ["lex", "portrait drawing face proportions shading"], ["vec", "how to draw a realistic human portrait with accurate proportions and shading"], ["vec", "what techniques do artists use to draw lifelike faces with pencil"], ["hyde", "Start with a lightly sketched oval. Divide the face: eyes sit at the midpoint, the nose halfway between eyes and chin, and the mouth one-third below the nose. Use a grid or Loomis method for proportions. Build tonal values gradually—light layers first, then darker shadows. Blend with a tortillon for smooth skin textures. Pay close attention to the light source direction."]], "query": "how to draw realistic portraits?"} -{"output": [["lex", "religion impact culture society influence"], ["lex", "religion culture art morality traditions"], ["vec", "how has religion shaped culture, art, and social norms throughout history"], ["vec", "what influence does religion have on cultural values, laws, and traditions"], ["hyde", "Religion has profoundly shaped cultures worldwide—influencing art (Gothic cathedrals, Islamic calligraphy, Hindu temple sculpture), moral codes, legal systems (Sharia, Canon law), dietary practices, marriage customs, holidays, and music. Religious narratives provide shared identity and meaning. The Protestant work ethic, for example, influenced Western capitalism according to Max Weber."]], "query": "what is the impact of religion on culture?"} -{"output": [["lex", "ethics of war just war theory morality"], ["lex", "just war ethics military conflict jus ad bellum"], ["vec", "what is just war theory and the ethical principles governing warfare"], ["vec", "how do philosophers evaluate whether a war is morally justified"], ["hyde", "Just war theory establishes criteria for morally permissible warfare. Jus ad bellum (right to go to war) requires just cause, legitimate authority, right intention, last resort, proportionality, and reasonable chance of success. Jus in bello (right conduct in war) requires distinction between combatants and civilians and proportional use of force."]], "query": "what is the ethics of war"} -{"output": [["lex", "statistical analysis scientific data methods"], ["lex", "statistical tests data analysis research t-test ANOVA"], ["vec", "how to choose and apply the right statistical tests for analyzing scientific research data"], ["vec", "what are the steps for performing statistical analysis on experimental data"], ["hyde", "Choose your statistical test based on data type and research question. For comparing two group means, use an independent t-test (parametric) or Mann-Whitney U (non-parametric). For three or more groups, use one-way ANOVA. For correlations, use Pearson's r (continuous) or Spearman's rho (ordinal). Report effect sizes and confidence intervals alongside p-values."]], "query": "how to analyze scientific data statistically"} -{"output": [["lex", "analyze experimental data methods results"], ["lex", "experimental data analysis visualization interpretation"], ["vec", "what are the steps to properly analyze and interpret experimental research data"], ["vec", "how to organize, visualize, and draw conclusions from experimental results"], ["hyde", "Start by cleaning the data: remove outliers using predefined criteria and check for missing values. Calculate descriptive statistics (mean, median, standard deviation). Visualize distributions with histograms or box plots. Apply appropriate statistical tests to evaluate hypotheses. Interpret results in context of your research question and note limitations."]], "query": "how to analyze experimental data"} -{"output": [["lex", "climate action policy emissions reduction"], ["lex", "climate action carbon neutral renewable energy 2026"], ["vec", "what actions are governments and individuals taking to combat climate change"], ["vec", "what are the most effective climate action strategies for reducing greenhouse gas emissions"], ["hyde", "Climate action encompasses policies and initiatives to reduce greenhouse gas emissions and adapt to climate change. Key strategies include transitioning to renewable energy, electrifying transportation, improving energy efficiency in buildings, protecting forests, and implementing carbon pricing. The Paris Agreement aims to limit warming to 1.5°C above pre-industrial levels."]], "query": "climate action"} -{"output": [["lex", "Shinto teachings beliefs practices Japan"], ["lex", "Shinto kami nature purity rituals"], ["vec", "what are the core beliefs and teachings of the Shinto religion in Japan"], ["vec", "how does Shinto view nature, purity, and the spiritual world"], ["hyde", "Shinto, Japan's indigenous religion, centers on the worship of kami—spirits inhabiting natural features, ancestors, and sacred places. Core teachings emphasize purity (physical and spiritual cleanliness), harmony with nature, respect for ancestors, and community ritual. There is no single scripture; practice focuses on shrine worship, seasonal festivals (matsuri), and purification rites (harae)."]], "query": "what are the main teachings of shinto?"} -{"output": [["lex", "chronic pain management clinic treatment"], ["lex", "pain clinic multidisciplinary therapy near me"], ["vec", "what services do chronic pain management clinics offer and how do they treat patients"], ["vec", "how to find a reputable chronic pain management clinic for long-term treatment"], ["hyde", "Chronic pain management clinics use a multidisciplinary approach combining medication management, physical therapy, cognitive behavioral therapy, nerve blocks, and interventional procedures like epidural steroid injections. Teams typically include pain medicine physicians, physical therapists, and psychologists. Ask your primary care doctor for a referral or search the American Academy of Pain Medicine directory."]], "query": "chronic pain management clinics"} -{"output": [["lex", "business consultant role responsibilities"], ["lex", "management consulting services"], ["lex", "business advisory consultant"], ["vec", "what does a business consultant do and what services do they provide"], ["vec", "what qualifications and skills are needed to become a business consultant"], ["hyde", "A business consultant is a professional who advises organizations on strategy, operations, and management. They analyze business problems, identify inefficiencies, and recommend solutions to improve performance and profitability."]], "query": "what is a business consultant"} -{"output": [["lex", "classic literature characteristics traits"], ["lex", "literary classics defining features"], ["vec", "what qualities make a work of fiction considered classic literature"], ["vec", "what distinguishes classic literature from other genres or time periods"], ["hyde", "Classic literature is defined by its enduring relevance, universal themes, and artistic merit. These works explore the human condition through complex characters, moral dilemmas, and language that transcends the era in which they were written."]], "query": "what are the characteristics of classic literature?"} -{"output": [["lex", "blockchain technology distributed ledger"], ["lex", "blockchain decentralized cryptographic"], ["lex", "blockchain consensus mechanism"], ["vec", "how does blockchain technology work as a distributed ledger system"], ["vec", "what are the technical components that make up a blockchain"], ["hyde", "Blockchain is a distributed ledger technology where transactions are recorded in blocks linked by cryptographic hashes. Each block contains a timestamp and transaction data, forming an immutable chain validated by a network of nodes through consensus mechanisms."]], "query": "what is blockchain technology"} -{"output": [["lex", "luxury bedding sets buy online"], ["lex", "high-end sheets duvet comforter"], ["lex", "premium Egyptian cotton bedding"], ["vec", "where can I purchase high-quality luxury bedding sets online or in stores"], ["vec", "which brands sell the best luxury sheets and duvet covers"], ["hyde", "Shop our collection of luxury bedding sets crafted from 100% Egyptian cotton and Italian-woven sateen. Thread counts from 400 to 1000. Free shipping on orders over $200. Available in king, queen, and California king sizes."]], "query": "where to buy luxury bedding sets"} -{"output": [["lex", "early retirement financial planning"], ["lex", "FIRE financial independence retire early"], ["lex", "early retirement savings rate"], ["vec", "how much money do you need to save to retire before age 50"], ["vec", "what financial strategies allow people to retire early through the FIRE movement"], ["hyde", "To retire early, aim to save 50-70% of your income and invest in low-cost index funds. At a 4% safe withdrawal rate, you need roughly 25x your annual expenses. A person spending $40,000/year needs about $1 million to retire."]], "query": "how to retire early"} -{"output": [["lex", "climate change agriculture crop yields"], ["lex", "global warming farming drought impact"], ["lex", "climate change food production"], ["vec", "how does rising global temperature affect crop yields and food production"], ["vec", "what effects does climate change have on soil quality and growing seasons for farmers"], ["hyde", "Rising temperatures and shifting precipitation patterns reduce crop yields by 2-6% per decade. Droughts, heat stress, and unpredictable frost dates disrupt planting schedules, while increased CO2 levels alter nutrient content in staple crops like wheat and rice."]], "query": "how climate change affects farming"} -{"output": [["lex", "car tire damage inspection signs"], ["lex", "tire wear tread depth sidewall"], ["lex", "tire replacement damage indicators"], ["vec", "how do you inspect car tires for damage and know when they need replacement"], ["vec", "what are the signs of dangerous tire wear or sidewall damage on a vehicle"], ["hyde", "Check tire tread depth using the penny test—insert a penny with Lincoln's head facing down. If you can see the top of his head, the tread is below 2/32\" and the tire needs replacing. Also inspect sidewalls for bulges, cracks, or cuts."]], "query": "how to assess car tire damage?"} -{"output": [["lex", "kindle library ebook collection"], ["lex", "Amazon Kindle digital library management"], ["lex", "kindle book organization archive"], ["vec", "how to manage and organize your ebook library on a Kindle device"], ["vec", "how to borrow library books on Kindle through Libby or OverDrive"], ["hyde", "Your Kindle Library stores all purchased and borrowed ebooks. Access it by tapping 'Library' on the home screen. Filter by 'Downloaded' or 'All' to see books stored on the device or in the cloud. Use collections to organize titles by genre or topic."]], "query": "kindle library"} -{"output": [["lex", "wildflower planting clay soil"], ["lex", "wildflower seeds heavy clay ground"], ["vec", "what is the best method for growing wildflowers in heavy clay soil"], ["vec", "which wildflower species thrive in clay soil conditions"], ["hyde", "To plant wildflowers in clay soil, amend the top 2-3 inches with coarse sand and compost to improve drainage. Choose clay-tolerant species like black-eyed Susan, coneflower, and bee balm. Sow seeds in fall or early spring, pressing them into the surface without burying deeply."]], "query": "how to plant wildflowers in clay soil?"} -{"output": [["lex", "milky way astrophotography camera settings"], ["lex", "night sky photography milky way"], ["lex", "milky way photo long exposure"], ["vec", "what camera settings and equipment do you need to photograph the milky way"], ["vec", "how to find the best location and time for milky way photography"], ["hyde", "Set your camera to manual mode with an aperture of f/2.8 or wider, ISO 3200-6400, and a shutter speed of 15-25 seconds using the 500 rule. Use a sturdy tripod and a wide-angle lens. Shoot during a new moon away from light pollution."]], "query": "how to photograph the milky way"} -{"output": [["lex", "ocean currents thermohaline circulation"], ["lex", "ocean surface currents deep water"], ["lex", "ocean current patterns global"], ["vec", "what causes ocean currents and how do they circulate water around the globe"], ["vec", "what is the difference between surface ocean currents and deep water thermohaline circulation"], ["hyde", "Ocean currents are continuous, directed movements of seawater driven by wind, temperature, salinity, and the Earth's rotation. Surface currents are driven primarily by wind patterns, while deep-water thermohaline circulation is driven by differences in water density."]], "query": "what are ocean currents"} -{"output": [["lex", "moral absolutism ethical theory"], ["lex", "moral absolutism objective right wrong"], ["vec", "what does moral absolutism mean as an ethical philosophy"], ["vec", "how does moral absolutism differ from moral relativism in determining right and wrong"], ["hyde", "Moral absolutism holds that certain actions are inherently right or wrong regardless of context, culture, or consequence. Under this view, ethical rules are universal and unchanging—lying is always wrong, for example, even if it could prevent harm."]], "query": "what is the concept of moral absolutism?"} -{"output": [["lex", "smart home setup devices hub"], ["lex", "home automation WiFi Zigbee Z-Wave"], ["lex", "smart home starter guide speakers lights"], ["vec", "what devices and hubs do you need to set up a smart home automation system"], ["vec", "how to connect smart lights thermostats and speakers in a home network"], ["hyde", "Start with a smart speaker like Amazon Echo or Google Nest as your central hub. Connect smart bulbs (Philips Hue, LIFX) and a smart thermostat (Nest, Ecobee) over WiFi or Zigbee. Use the companion app to create automations like turning off lights at bedtime."]], "query": "how to set up a smart home?"} -{"output": [["lex", "cycling commute bike to work"], ["lex", "bicycle commuting urban transportation"], ["vec", "what does it mean to commute by bicycle and what are the benefits"], ["vec", "how do people use cycling as their daily commute to work in cities"], ["hyde", "Cycling commute refers to using a bicycle as your primary transportation to and from work. Bike commuters typically ride 3-15 miles each way, saving on fuel costs while getting daily exercise. Many cities now have protected bike lanes and bike-share programs."]], "query": "what is cycling commute?"} -{"output": [["lex", "ethical decision-making framework steps"], ["lex", "ethical reasoning moral dilemma process"], ["vec", "what frameworks or steps help with making ethical decisions in difficult situations"], ["vec", "how do you systematically evaluate moral choices when facing an ethical dilemma"], ["hyde", "A structured approach to ethical decision-making involves: (1) identify the ethical issue, (2) gather relevant facts, (3) consider stakeholders affected, (4) evaluate options using ethical frameworks like utilitarianism or deontology, and (5) make and justify your decision."]], "query": "how to approach ethical decision-making"} -{"output": [["lex", "find reliable realtor real estate agent"], ["lex", "choosing trustworthy real estate agent"], ["vec", "how do you find and vet a trustworthy real estate agent for buying or selling a home"], ["vec", "what qualities and credentials should you look for in a reliable realtor"], ["hyde", "Check that the realtor is licensed in your state and has no disciplinary actions. Read online reviews, ask for references from recent clients, and verify their transaction history. A good agent should know the local market and communicate promptly."]], "query": "how to find a reliable realtor"} -{"output": [["lex", "car lease process terms payments"], ["lex", "vehicle leasing agreement negotiation"], ["vec", "what are the steps to lease a car and what terms should you negotiate"], ["vec", "how do car lease payments work and what fees are involved"], ["hyde", "To lease a car, negotiate the capitalized cost (sale price), money factor (interest rate), and residual value. Monthly payments are based on the difference between the cap cost and residual, divided by the lease term, plus a finance charge. Typical leases run 24-36 months."]], "query": "how to lease a car?"} -{"output": [["lex", "death rituals funeral customs cultures"], ["lex", "cultural death commemoration ceremonies"], ["vec", "what are the different ways cultures around the world honor and commemorate the dead"], ["vec", "how do funeral rituals and mourning traditions vary across religions and cultures"], ["hyde", "In Mexico, Día de los Muertos celebrates deceased loved ones with altars, marigolds, and sugar skulls. Hindu cremation ceremonies release the soul for reincarnation. In Ghana, elaborate fantasy coffins reflect the deceased's life. Japanese Obon festivals welcome ancestral spirits home."]], "query": "how do different cultures commemorate death?"} -{"output": [["lex", "change flat tire steps jack"], ["lex", "car tire replacement spare"], ["vec", "what are the step-by-step instructions for changing a flat tire on the side of the road"], ["vec", "how to safely jack up a car and replace a flat tire with the spare"], ["hyde", "Loosen the lug nuts slightly before jacking. Place the jack under the vehicle frame near the flat tire and raise until the tire clears the ground. Remove lug nuts, pull off the flat, mount the spare, and hand-tighten the nuts in a star pattern. Lower the car and torque to 80-100 ft-lbs."]], "query": "how to change a tire"} -{"output": [["lex", "positive mindset development habits"], ["lex", "positive thinking mental attitude techniques"], ["vec", "what daily habits and techniques help develop and maintain a positive mindset"], ["vec", "how can you train your brain to think more positively and overcome negative thought patterns"], ["hyde", "Developing a positive mindset starts with awareness of negative self-talk. Replace \"I can't\" with \"I'm learning to.\" Practice daily gratitude by writing three things you're thankful for. Surround yourself with supportive people and limit exposure to negativity."]], "query": "how to develop a positive mindset?"} -{"output": [["lex", "bioinformatics computational biology genomics"], ["lex", "bioinformatics DNA sequence analysis"], ["vec", "what is the field of bioinformatics and how does it apply computational methods to biological data"], ["vec", "how is bioinformatics used to analyze DNA sequences and genomic data"], ["hyde", "Bioinformatics is an interdisciplinary field that combines biology, computer science, and statistics to analyze biological data. It involves developing algorithms and software to process DNA sequences, protein structures, and gene expression data from high-throughput experiments."]], "query": "what is bioinformatics"} -{"output": [["lex", "triathlon training plan preparation"], ["lex", "swim bike run triathlon training"], ["vec", "what training plan should a beginner follow to prepare for their first triathlon"], ["vec", "how to balance swimming cycling and running workouts when training for a triathlon"], ["hyde", "A 12-week sprint triathlon plan builds endurance across all three disciplines. Week 1: swim 2x (20 min), bike 2x (30 min), run 3x (20 min). Gradually increase volume by 10% per week. Include one brick workout (bike-to-run) weekly to simulate race-day transitions."]], "query": "how to prepare for a triathlon"} -{"output": [["lex", "car paint job spray booth steps"], ["lex", "automotive painting primer clearcoat"], ["vec", "what is the step-by-step process for painting a car at home or in a garage"], ["vec", "what preparation and materials are needed to repaint a car yourself"], ["hyde", "Sand the existing paint with 400-grit wet sandpaper until smooth. Apply 2-3 coats of automotive primer, sanding between coats with 600-grit. Spray the base color in thin, even passes, allowing 15 minutes flash time between coats. Finish with 2-3 coats of clearcoat."]], "query": "how to paint a car?"} -{"output": [["lex", "lab test blood work results"], ["lex", "laboratory diagnostic testing medical"], ["lex", "lab test ordered interpretation"], ["vec", "what types of medical lab tests are commonly ordered and what do the results mean"], ["vec", "how to understand blood test results from a laboratory"], ["hyde", "Common lab tests include CBC (complete blood count), CMP (comprehensive metabolic panel), lipid panel, and thyroid function tests. A CBC measures white blood cells, red blood cells, hemoglobin, and platelets. Results outside the reference range may indicate infection, anemia, or other conditions."]], "query": "lab test"} -{"output": [["lex", "buy iPhone 14 price deals"], ["lex", "iPhone 14 purchase Apple store carrier"], ["vec", "where can you buy an iPhone 14 at the best price online or in retail stores"], ["vec", "which stores and carriers currently sell the iPhone 14 and offer trade-in deals"], ["hyde", "Buy iPhone 14 starting at $599 from Apple.com, or save with carrier deals from Verizon, AT&T, and T-Mobile. Trade in your old device for up to $400 off. Also available at Best Buy, Walmart, and Amazon with financing options."]], "query": "where to buy iphone 14"} -{"output": [["lex", "categorical imperative Kant ethics"], ["lex", "Kantian categorical imperative universal law"], ["vec", "what is Kant's categorical imperative and how does it function as a moral principle"], ["vec", "how does the categorical imperative test whether an action is morally permissible"], ["hyde", "The categorical imperative, formulated by Immanuel Kant, states: \"Act only according to that maxim by which you can at the same time will that it should become a universal law.\" It requires that moral rules apply unconditionally to all rational beings, regardless of personal desires."]], "query": "what is the categorical imperative"} -{"output": [["lex", "renewable agriculture research 2025 2026"], ["lex", "regenerative sustainable farming research"], ["lex", "renewable agriculture soil carbon sequestration"], ["vec", "what are the latest scientific findings on regenerative and renewable agriculture techniques"], ["vec", "what recent research has been published on sustainable farming and soil health in 2025 or 2026"], ["hyde", "A 2025 study in Nature Food found that cover cropping and no-till practices increased soil organic carbon by 8-12% over five years. Researchers also demonstrated that integrating livestock grazing with crop rotation improved soil microbial diversity by 23%."]], "query": "latest research on renewable agriculture"} -{"output": [["lex", "cloud deployment pipeline CI/CD"], ["lex", "cloud deploy AWS Azure GCP"], ["lex", "cloud infrastructure deployment automation"], ["vec", "how to deploy applications to cloud platforms like AWS, Azure, or Google Cloud"], ["vec", "what tools and pipelines are used for automated cloud deployment"], ["hyde", "Deploy to the cloud using `gcloud deploy` or configure a CI/CD pipeline with GitHub Actions. Define your infrastructure with Terraform or CloudFormation, build container images, push to a registry, and roll out to Kubernetes or serverless environments."]], "query": "cloud deploy"} -{"output": [["lex", "Day of the Dead Día de los Muertos significance"], ["lex", "Day of the Dead Mexican tradition meaning"], ["vec", "what is the cultural and spiritual significance of Day of the Dead in Mexican tradition"], ["vec", "why is Día de los Muertos celebrated and what does it mean to families in Mexico"], ["hyde", "Día de los Muertos, celebrated November 1-2, is a Mexican tradition honoring deceased loved ones. Families build ofrendas (altars) decorated with marigolds, photos, and the departed's favorite foods. It blends pre-Columbian Aztec beliefs with Catholic All Saints' and All Souls' Days."]], "query": "what is the significance of day of the dead"} -{"output": [["lex", "Stonehenge prehistoric monument England"], ["lex", "Stonehenge purpose construction history"], ["vec", "what is Stonehenge and why was it built on Salisbury Plain in England"], ["vec", "what do archaeologists know about the history and purpose of Stonehenge"], ["hyde", "Stonehenge is a prehistoric stone circle on Salisbury Plain in Wiltshire, England, built in stages from roughly 3000 to 2000 BCE. The massive sarsen stones, some weighing 25 tons, were transported from Marlborough Downs 25 miles north. Its alignment with the summer solstice sunrise suggests astronomical or ceremonial function."]], "query": "what is stonehenge"} -{"output": [["lex", "bug fix debugging software"], ["lex", "bug fix code patch issue"], ["lex", "software bug troubleshooting resolution"], ["vec", "how to identify and fix bugs in software code effectively"], ["vec", "what is the process for debugging and resolving code issues"], ["hyde", "To fix a bug, first reproduce it reliably and identify the exact conditions that trigger it. Use a debugger or add logging to narrow down the faulty code path. Write a regression test that captures the bug, then modify the code until the test passes."]], "query": "bug fix"} -{"output": [["lex", "car wax application steps"], ["lex", "wax car paint protection polish"], ["vec", "what is the proper technique for waxing a car to protect the paint finish"], ["vec", "how often should you wax a car and what products work best"], ["hyde", "Wash and dry the car thoroughly before waxing. Apply a thin layer of carnauba or synthetic wax with a foam applicator pad using circular motions. Work one panel at a time, let it haze for 5-10 minutes, then buff off with a clean microfiber towel."]], "query": "how to wax a car?"} -{"output": [["lex", "veil of ignorance Rawls justice"], ["lex", "John Rawls original position veil of ignorance"], ["vec", "what is John Rawls' veil of ignorance thought experiment in political philosophy"], ["vec", "how does the veil of ignorance help determine principles of justice in a fair society"], ["hyde", "The veil of ignorance is a thought experiment by John Rawls in A Theory of Justice (1971). It asks people to choose principles of justice from an \"original position\" where they don't know their own race, gender, wealth, or abilities. Rawls argues this produces fair, impartial rules."]], "query": "what is the veil of ignorance"} -{"output": [["lex", "multiculturalism challenges social integration"], ["lex", "multicultural society tensions cultural diversity"], ["vec", "what social and political challenges arise in multicultural societies"], ["vec", "how do multicultural nations deal with cultural conflict and integration difficulties"], ["hyde", "Multicultural societies face challenges including language barriers, cultural misunderstandings, and tensions between assimilation and cultural preservation. Debates arise over shared national identity, religious accommodation in public institutions, and equitable representation of minority groups."]], "query": "what are the challenges of multiculturalism"} -{"output": [["lex", "smart city technology IoT urban"], ["lex", "smart cities infrastructure data sensors"], ["vec", "what defines a smart city and what technologies do they use"], ["vec", "how do smart cities use IoT sensors and data analytics to improve urban infrastructure"], ["hyde", "Smart cities integrate IoT sensors, data analytics, and connected infrastructure to improve urban services. Examples include adaptive traffic signals that reduce congestion by 25%, smart grids that optimize energy distribution, and sensors that monitor air quality and water systems in real time."]], "query": "what are smart cities?"} -{"output": [["lex", "supply chain optimization logistics"], ["lex", "supply chain efficiency inventory management"], ["vec", "what strategies and tools can companies use to optimize their supply chain operations"], ["vec", "how do businesses reduce supply chain costs while improving delivery speed and reliability"], ["hyde", "Optimize your supply chain by implementing demand forecasting with machine learning, reducing safety stock through just-in-time inventory, and diversifying suppliers to mitigate risk. Use real-time tracking and warehouse management systems to cut lead times by 15-30%."]], "query": "how to optimize supply chain"} -{"output": [["lex", "elevator pitch short business presentation"], ["lex", "elevator pitch 30-second summary"], ["vec", "what is an elevator pitch and how do you structure an effective one"], ["vec", "how do you deliver a compelling 30-second pitch for a business idea or job opportunity"], ["hyde", "An elevator pitch is a concise, 30-60 second summary of who you are and what you offer. Structure it as: hook (attention-grabbing opening), problem you solve, your solution, and a call to action. Practice until it sounds conversational, not rehearsed."]], "query": "what is an elevator pitch"} -{"output": [["lex", "car tire rotation pattern schedule"], ["lex", "tire rotation front rear cross"], ["vec", "how often should you rotate car tires and what pattern should you follow"], ["vec", "what is the correct tire rotation procedure for front-wheel and all-wheel drive vehicles"], ["hyde", "Rotate tires every 5,000-7,500 miles. For front-wheel drive, move fronts straight to the rear and cross the rears to the front. For rear-wheel drive, move rears straight forward and cross the fronts to the rear. All-wheel drive uses the rearward cross pattern."]], "query": "how to rotate car tires?"} -{"output": [["lex", "pow wow Native American attend participate"], ["lex", "pow wow etiquette attendance protocol"], ["vec", "how can non-Native people respectfully attend and participate in a pow wow"], ["vec", "what are the etiquette rules and customs visitors should follow at a pow wow"], ["hyde", "When attending a pow wow, stand during grand entry and honor songs. Don't touch dancers' regalia without permission. Ask before photographing. Bring a lawn chair, as seating is limited. Some dances are intertribal and open to all—the emcee will announce when visitors may join the circle."]], "query": "how to participate in a pow wow"} -{"output": [["lex", "car rust prevention treatment"], ["lex", "automotive rust repair body panel"], ["lex", "car rust removal undercarriage"], ["vec", "how to prevent and treat rust on a car body and undercarriage"], ["vec", "what causes rust on cars and how can you repair rusted panels"], ["hyde", "Car rust forms when bare metal is exposed to moisture and salt. Treat surface rust by sanding to bare metal, applying rust converter, priming, and repainting. For structural rust, cut out the damaged section and weld in a patch panel. Prevent rust with regular washing and undercoating."]], "query": "car rust"} -{"output": [["lex", "moral obligation ethical duty"], ["lex", "moral obligation philosophy definition"], ["vec", "what does moral obligation mean in ethics and where do moral duties come from"], ["vec", "how do philosophers define and justify moral obligations people have toward others"], ["hyde", "A moral obligation is a duty to act in accordance with ethical principles, regardless of legal requirements. For example, one may feel morally obligated to help a stranger in danger. Philosophers debate whether moral obligations stem from reason (Kant), consequences (Mill), or social contracts."]], "query": "what is moral obligation"} -{"output": [["lex", "thesis statement purpose essay writing"], ["lex", "thesis statement argument academic paper"], ["vec", "what role does a thesis statement play in an essay or academic paper"], ["vec", "why is a strong thesis statement important and how should it be written"], ["hyde", "A thesis statement presents the central argument of an essay in one or two sentences, typically at the end of the introduction. It tells the reader what the paper will argue and provides a roadmap for the evidence and analysis that follow. A strong thesis is specific, debatable, and supportable."]], "query": "what is the purpose of a thesis statement?"} -{"output": [["lex", "diplomatic event attendance protocol etiquette"], ["lex", "diplomatic reception dress code invitation"], ["vec", "what are the etiquette rules and dress codes for attending a diplomatic event or reception"], ["vec", "how do you get invited to and properly conduct yourself at a diplomatic function"], ["hyde", "At diplomatic events, follow the dress code specified on the invitation (black tie, business formal). Arrive punctually, greet the host first, and address ambassadors as \"Your Excellency.\" Exchange business cards with both hands. Avoid discussing controversial political topics unless invited to do so."]], "query": "how to attend a diplomatic event"} -{"output": [["lex", "renewable energy sources solar wind"], ["lex", "renewable energy types clean power"], ["vec", "what are the main types of renewable energy and how do they generate electricity"], ["vec", "how do renewable energy sources like solar and wind power differ from fossil fuels"], ["hyde", "Renewable energy comes from naturally replenishing sources: solar, wind, hydroelectric, geothermal, and biomass. Solar panels convert sunlight into electricity using photovoltaic cells. Wind turbines capture kinetic energy from moving air. These sources produce little or no greenhouse gas emissions during operation."]], "query": "what is renewable energy"} -{"output": [["lex", "machine learning algorithms training data"], ["lex", "machine learning AI neural networks"], ["vec", "what is machine learning and how do algorithms learn from data to make predictions"], ["vec", "how does machine learning differ from traditional programming and rule-based systems"], ["hyde", "Machine learning is a subset of artificial intelligence where algorithms learn patterns from training data rather than following explicit rules. Given labeled examples, a supervised learning model adjusts its parameters to minimize prediction error. Common algorithms include linear regression, decision trees, and neural networks."]], "query": "what is machine learning"} -{"output": [["lex", "protagonist role literary fiction"], ["lex", "protagonist main character story function"], ["vec", "what role does the protagonist play in driving the plot of a novel or story"], ["vec", "how does the protagonist function as the central character in literary fiction"], ["hyde", "The protagonist is the central character whose goals and conflicts drive the narrative. They face obstacles, make choices, and undergo transformation through the story arc. Readers experience the plot primarily through the protagonist's perspective, creating emotional investment in their journey."]], "query": "what is the role of the protagonist?"} -{"output": [["lex", "API testing automated endpoint"], ["lex", "REST API test Postman integration"], ["lex", "API endpoint validation testing"], ["vec", "how to write automated tests for REST API endpoints"], ["vec", "what tools and methods are used for API testing and validation"], ["hyde", "Test API endpoints using Postman or write automated tests with a framework like Jest or pytest. Send requests to each endpoint and assert status codes, response bodies, and headers. Example: `expect(response.status).toBe(200)` and validate the JSON schema of the response."]], "query": "api test"} -{"output": [["lex", "civic engagement participation community"], ["lex", "civic engagement voting local government"], ["vec", "what are effective ways to increase civic engagement and community participation"], ["vec", "how can citizens get more involved in local government and community decision-making"], ["hyde", "Improve civic engagement by attending city council meetings, volunteering for local organizations, and contacting elected officials about issues you care about. Register to vote and participate in every election, including local and midterm races. Join neighborhood associations and community boards."]], "query": "how to improve civic engagement"} -{"output": [["lex", "sustainable agriculture farming methods"], ["lex", "sustainable agriculture soil health crop rotation"], ["lex", "sustainable agriculture environmental impact"], ["vec", "what farming practices make agriculture sustainable and environmentally friendly"], ["vec", "how does sustainable agriculture balance food production with environmental conservation"], ["hyde", "Sustainable agriculture maintains productivity while protecting natural resources. Key practices include crop rotation, cover cropping, integrated pest management, reduced tillage, and efficient water use. These methods improve soil health, reduce erosion, and lower dependence on synthetic fertilizers and pesticides."]], "query": "sustainable agriculture"} -{"output": [["lex", "car door lock repair fix stuck"], ["lex", "car door lock actuator replacement"], ["vec", "how to diagnose and fix a car door lock that is stuck or not working"], ["vec", "how to replace a broken car door lock actuator or mechanism"], ["hyde", "If the car door lock won't engage, check the fuse first. Test the lock with the key and remote separately. If the remote works but the button doesn't, the switch is faulty. If neither works, the lock actuator has likely failed. Remove the door panel, disconnect the actuator, and replace it."]], "query": "how to fix car door lock?"} -{"output": [["lex", "drug test urine screening types"], ["lex", "drug test employment panel detection"], ["lex", "drug testing workplace results"], ["vec", "what types of drug tests are used for employment and what substances do they detect"], ["vec", "how long do drugs stay detectable in urine blood and hair drug tests"], ["hyde", "The standard 5-panel drug test screens for marijuana (THC), cocaine, opiates, amphetamines, and PCP. Urine tests detect most substances for 1-7 days, except marijuana which can be detected for up to 30 days in heavy users. Hair follicle tests cover approximately 90 days."]], "query": "drug test"} -{"output": [["lex", "lobbying participation advocacy government"], ["lex", "citizen lobbying elected officials"], ["vec", "how can ordinary citizens participate in lobbying and advocacy to influence legislation"], ["vec", "what steps are involved in organizing a lobbying effort for a political cause"], ["hyde", "Citizens can lobby by contacting representatives via phone, email, or scheduled meetings. Prepare a one-page brief on your issue with specific policy asks. Join advocacy organizations that coordinate lobbying days at state capitols. Grassroots lobbying involves petitions, public comment periods, and organized letter-writing campaigns."]], "query": "how to participate in lobbying efforts"} -{"output": [["lex", "photography inspiration ideas creative"], ["lex", "photography creative motivation techniques"], ["vec", "where do photographers find creative inspiration for new projects and subjects"], ["vec", "what techniques help overcome creative block and find fresh ideas for photography"], ["hyde", "Find photography inspiration by studying the work of photographers you admire on platforms like Flickr, 500px, and Instagram. Try a 365-day photo challenge. Walk familiar routes at different times of day. Limit yourself to one lens or shoot only in black and white to force creative thinking."]], "query": "how do you find inspiration for photography?"} -{"output": [["lex", "car LED lights installation wiring"], ["lex", "LED headlight bulb install car"], ["vec", "how to install aftermarket LED lights on a car including wiring and connections"], ["vec", "step-by-step guide for replacing car headlights or interior lights with LEDs"], ["hyde", "To install LED headlights, open the hood and locate the headlight housing. Twist the bulb holder counterclockwise to remove the old halogen bulb. Insert the LED bulb, secure the heat sink or fan module, and connect the driver if included. Test both low and high beams before reassembling."]], "query": "how to install car led lights?"} -{"output": [["lex", "research paper critical analysis evaluation"], ["lex", "academic paper critique methodology"], ["vec", "how do you critically evaluate the methodology and conclusions of a research paper"], ["vec", "what framework should you use to analyze the strengths and weaknesses of an academic study"], ["hyde", "When analyzing a research paper, evaluate: (1) Is the research question clearly stated? (2) Is the methodology appropriate and reproducible? (3) Is the sample size adequate? (4) Do the results support the conclusions? (5) Are limitations acknowledged? Check for conflicts of interest and citation of relevant prior work."]], "query": "how to critically analyze research papers"} -{"output": [["lex", "mindfulness meditation practice technique"], ["lex", "mindfulness meditation awareness breathing"], ["vec", "what is mindfulness meditation and how do you practice it"], ["vec", "what are the mental and physical health benefits of regular mindfulness meditation"], ["hyde", "Mindfulness meditation involves focusing attention on the present moment without judgment. Sit comfortably, close your eyes, and observe your breath. When thoughts arise, acknowledge them without engaging and gently return focus to breathing. Start with 5-10 minutes daily and gradually increase duration."]], "query": "what is mindfulness meditation"} -{"output": [["lex", "digital divide internet access inequality"], ["lex", "digital divide technology gap socioeconomic"], ["vec", "what is the digital divide and how does it affect people without internet access"], ["vec", "what factors contribute to the technology gap between different socioeconomic groups"], ["hyde", "The digital divide refers to the gap between those who have access to computers and the internet and those who do not. Roughly 2.7 billion people worldwide remain offline. Factors include income, geography, age, and education. Rural areas and developing countries are disproportionately affected."]], "query": "what is the digital divide"} -{"output": [["lex", "nihilism philosophy meaning Nietzsche"], ["lex", "nihilism existential moral meaning"], ["vec", "what is nihilism as a philosophical position and what does it claim about meaning and values"], ["vec", "how did Nietzsche and other philosophers develop and respond to nihilism"], ["hyde", "Nihilism is the philosophical view that life lacks objective meaning, purpose, or intrinsic value. Existential nihilism holds that no action is inherently meaningful. Friedrich Nietzsche warned that the \"death of God\" would lead to nihilism but urged individuals to create their own values through the will to power."]], "query": "what is nihilism"} -{"output": [["lex", "self-discipline improvement habits willpower"], ["lex", "self-discipline strategies consistency"], ["vec", "what daily habits and strategies help build stronger self-discipline"], ["vec", "how can you train yourself to stay disciplined and follow through on goals"], ["hyde", "Build self-discipline by starting with small commitments and increasing gradually. Make your bed every morning. Use the two-minute rule: if a task takes less than two minutes, do it now. Remove temptations from your environment and track your streaks to maintain momentum."]], "query": "how to improve self-discipline?"} -{"output": [["lex", "Bahá'í faith core practices worship"], ["lex", "Bahá'í religion prayer fasting principles"], ["vec", "what are the main spiritual practices and rituals observed in the Bahá'í faith"], ["vec", "what daily practices and religious obligations do Bahá'ís follow"], ["hyde", "Core Bahá'í practices include daily obligatory prayer (one of three prayers chosen by the individual), fasting during the Nineteen-Day Fast in March, participation in Nineteen-Day Feasts, and the recitation of \"Alláh-u-Abhá\" 95 times daily. Bahá'ís also observe the prohibition on backbiting and alcohol."]], "query": "what are the core practices of the bahá'í faith?"} -{"output": [["lex", "highlining slackline extreme height"], ["lex", "highlining equipment safety rigging"], ["vec", "what is highlining and how does it differ from regular slacklining"], ["vec", "what equipment and safety precautions are required for highlining at extreme heights"], ["hyde", "Highlining is the practice of walking a slackline anchored at significant height, often between cliffs, buildings, or over canyons. Unlike standard slacklining, highliners wear a climbing harness tethered to the line with a leash. Lines are rigged with redundant anchors using static rope or webbing."]], "query": "what is highlining?"} -{"output": [["lex", "travel Bali Indonesia flights visa"], ["lex", "Bali trip planning itinerary transportation"], ["vec", "how to plan a trip to Bali including flights, visas, and transportation"], ["vec", "what do you need to know before traveling to Bali Indonesia for the first time"], ["hyde", "Fly into Ngurah Rai International Airport (DPS) in southern Bali. Many countries receive a 30-day visa on arrival for $500,000 IDR (~$35). Book a private driver for around $40-50/day to explore the island. Popular areas include Ubud for culture, Seminyak for dining, and Uluwatu for surfing."]], "query": "how to travel to bali"} -{"output": [["lex", "fall Roman Empire causes decline"], ["lex", "Roman Empire collapse reasons factors"], ["vec", "what were the main political military and economic causes of the fall of the Roman Empire"], ["vec", "why did the Western Roman Empire collapse in 476 AD"], ["hyde", "The fall of the Western Roman Empire in 476 AD resulted from multiple factors: military overextension, barbarian invasions (Visigoths, Vandals, Ostrogoths), economic decline from debasement of currency, political instability with rapid emperor turnover, and the shift of power to Constantinople."]], "query": "what caused the fall of the roman empire"} -{"output": [["lex", "philosophy of mind consciousness problem"], ["lex", "philosophy of mind mental states dualism"], ["vec", "what does the philosophy of mind study about consciousness and mental states"], ["vec", "what are the main theories in philosophy of mind such as dualism and physicalism"], ["hyde", "Philosophy of mind examines the nature of mental states, consciousness, and their relationship to the physical brain. Central questions include the mind-body problem: how do subjective experiences (qualia) arise from neural processes? Key positions include dualism, physicalism, functionalism, and property dualism."]], "query": "what is philosophy of mind"} -{"output": [["lex", "personal brand building online presence"], ["lex", "personal branding strategy social media"], ["vec", "how do you build a strong personal brand for career growth or entrepreneurship"], ["vec", "what steps should you take to develop a recognizable personal brand online"], ["hyde", "Build your personal brand by defining your niche and unique value proposition. Create consistent profiles across LinkedIn, Twitter, and a personal website. Publish content regularly—blog posts, videos, or podcasts—that demonstrates your expertise. Engage authentically with your audience and network at industry events."]], "query": "how to build a personal brand"} -{"output": [["lex", "dialogue philosophy Socratic method"], ["lex", "philosophical dialogue significance discourse"], ["vec", "why is dialogue important as a method of philosophical inquiry and reasoning"], ["vec", "how did Socratic dialogue shape Western philosophical tradition"], ["hyde", "Dialogue has been central to philosophy since Plato's Socratic dialogues, where truth emerges through questioning and exchange rather than dogmatic assertion. The dialectical method exposes contradictions in arguments, refines ideas through challenge and response, and models philosophy as collaborative inquiry."]], "query": "what is the significance of dialogue in philosophy?"} -{"output": [["lex", "biography writing nonfiction life story"], ["lex", "biography research subject narrative"], ["vec", "what is involved in writing a biography of someone's life"], ["vec", "how do biographers research and structure a narrative about a person's life"], ["hyde", "Writing a biography means researching and narrating the story of a real person's life. Biographers conduct interviews, examine letters and documents, and verify facts through multiple sources. The narrative typically follows chronological structure while weaving in themes that defined the subject's character and impact."]], "query": "what does it mean to write a biography?"} -{"output": [["lex", "writing habit daily routine discipline"], ["lex", "writing habit consistency productivity"], ["vec", "how do you build and maintain a consistent daily writing habit"], ["vec", "what strategies help writers overcome procrastination and write regularly"], ["hyde", "Set a specific time and place to write every day, even if only for 15-20 minutes. Track your word count or time spent writing. Don't edit while drafting—just get words on the page. Use writing prompts if you're stuck. Many successful authors, including Stephen King, recommend writing at least 1,000 words daily."]], "query": "how to develop a writing habit?"} -{"output": [["lex", "green technology clean environmental"], ["lex", "green technology sustainable energy efficiency"], ["vec", "what is green technology and what industries does it apply to"], ["vec", "how does green technology help reduce environmental impact and promote sustainability"], ["hyde", "Green technology encompasses innovations that reduce environmental impact, including solar panels, electric vehicles, energy-efficient buildings, biodegradable materials, and water purification systems. These technologies aim to conserve resources, reduce waste, and lower carbon emissions across manufacturing, energy, and transportation sectors."]], "query": "what is green technology"} -{"output": [["lex", "car Bluetooth pairing phone connect"], ["lex", "car Bluetooth setup audio streaming"], ["vec", "how to pair a smartphone to a car's Bluetooth system for calls and music"], ["vec", "step-by-step instructions for connecting a phone to car Bluetooth for the first time"], ["hyde", "To connect via Bluetooth, enable Bluetooth on your phone and car infotainment system. On the car stereo, go to Settings > Bluetooth > Add Device. Select your car's name on your phone's Bluetooth list. Confirm the pairing code on both devices. The phone should automatically reconnect on future drives."]], "query": "how to connect car bluetooth?"} -{"output": [["lex", "building blocks of life molecules biochemistry"], ["lex", "amino acids nucleic acids proteins cells"], ["vec", "what are the fundamental molecular building blocks that make up all living organisms"], ["vec", "how do amino acids, nucleic acids, and lipids form the basis of life on Earth"], ["hyde", "The building blocks of life are four types of organic molecules: proteins (made from amino acids), nucleic acids (DNA and RNA from nucleotides), carbohydrates (sugars and polysaccharides), and lipids (fats and phospholipids). These molecules self-assemble into cells, the basic unit of all living organisms."]], "query": "what are the building blocks of life"} -{"output": [["lex", "cinematographer role film camera director of photography"], ["lex", "cinematographer lighting shot composition"], ["vec", "what does a cinematographer do on a film set and what creative decisions do they make"], ["vec", "how does the director of photography control lighting, camera, and visual storytelling in film"], ["hyde", "The cinematographer, or director of photography (DP), is responsible for the visual look of a film. They select cameras, lenses, and lighting setups, and work with the director to plan shot composition and camera movement. The DP oversees the camera and electrical departments on set."]], "query": "what is the role of a cinematographer?"} -{"output": [["lex", "landscape photography techniques composition"], ["lex", "landscape photography camera lens settings"], ["lex", "landscape photography golden hour"], ["vec", "what camera settings and techniques produce stunning landscape photographs"], ["vec", "how to compose and shoot landscape photography with proper exposure and depth of field"], ["hyde", "For landscape photography, use a wide-angle lens (16-35mm), aperture of f/8-f/11 for maximum sharpness, and a low ISO (100). Shoot during golden hour for warm, directional light. Use a tripod, compose with the rule of thirds, and include a strong foreground element to create depth."]], "query": "landscape photography"} -{"output": [["lex", "literary movements periods history"], ["lex", "literary movements Romanticism Modernism Realism"], ["vec", "what are the major literary movements in history and what defines each one"], ["vec", "how do literary movements like Romanticism, Realism, and Modernism differ from each other"], ["hyde", "Literary movements are periods defined by shared styles, themes, and philosophies. Romanticism (1800-1850) emphasized emotion and nature. Realism (1850-1900) depicted ordinary life accurately. Modernism (1900-1945) experimented with form and stream of consciousness. Postmodernism questioned grand narratives through irony and fragmentation."]], "query": "what are literary movements?"} -{"output": [["lex", "capital France Paris"], ["lex", "Paris capital city France"], ["vec", "what city is the capital of France"], ["vec", "where is the capital of France located and what is it known for"], ["hyde", "Paris is the capital and largest city of France, located on the Seine River in northern France. With a population of over 2 million in the city proper and 12 million in the metropolitan area, it is the country's political, economic, and cultural center."]], "query": "what is the capital of france?"} -{"output": [["lex", "golf playing tips beginner"], ["lex", "golf swing technique course"], ["lex", "golf rules gameplay etiquette"], ["vec", "how do you play golf and what are the basic rules for beginners"], ["vec", "what techniques and etiquette should new golfers learn before playing on a course"], ["hyde", "A round of golf consists of 18 holes. At each hole, tee off from the tee box, play through the fairway, and putt on the green. The objective is to complete each hole in the fewest strokes. Beginners should start at a driving range, learn basic grip and stance, and play executive (par-3) courses."]], "query": "golf play"} -{"output": [["lex", "treehouse building construction plans"], ["lex", "treehouse DIY wood platform tree"], ["vec", "how to design and build a treehouse safely in a backyard tree"], ["vec", "what materials and tools do you need to build a treehouse for kids"], ["hyde", "Choose a healthy hardwood tree (oak, maple, beech) with a trunk at least 12 inches in diameter. Use treehouse attachment bolts (TABs) rather than nails, which damage the tree. Build the platform at 6-8 feet high using pressure-treated lumber. Frame with 2x6 joists on 16-inch centers and deck with 5/4 boards."]], "query": "build a treehouse"} -{"output": [["lex", "classic car parts buy online supplier"], ["lex", "vintage car parts restoration OEM"], ["vec", "where can you purchase replacement parts for classic and vintage cars"], ["vec", "which online stores and suppliers specialize in classic car restoration parts"], ["hyde", "Find classic car parts at specialty suppliers like Summit Racing, Classic Industries, and Hemmings. Year One stocks OEM-quality parts for GM, Ford, and Mopar vehicles from the 1950s-80s. JEGS and Rock Auto also carry a wide selection. Check eBay Motors and swap meets for rare NOS (new old stock) parts."]], "query": "where to buy classic car parts"} -{"output": [["lex", "business goals setting SMART strategy"], ["lex", "business goal planning objectives targets"], ["vec", "how to set effective business goals using the SMART framework"], ["vec", "what process should entrepreneurs follow to define and track business objectives"], ["hyde", "Set business goals using the SMART framework: Specific (\"increase monthly revenue by 15%\"), Measurable (track with KPIs), Achievable (realistic given resources), Relevant (aligned with company mission), and Time-bound (complete by Q3). Break annual goals into quarterly milestones and review progress monthly."]], "query": "how to set business goals"} -{"output": [["lex", "Neolithic society characteristics agriculture settlement"], ["lex", "Neolithic period farming tools social structure"], ["vec", "what were the key characteristics of Neolithic societies after the agricultural revolution"], ["vec", "how did Neolithic communities organize their social structure, farming, and settlements"], ["hyde", "Neolithic societies (approximately 10,000-3,000 BCE) were characterized by the transition from hunting-gathering to agriculture. People domesticated plants and animals, formed permanent settlements, developed pottery and polished stone tools, and created increasingly complex social hierarchies with specialized labor roles."]], "query": "what are the characteristics of neolithic societies?"} -{"output": [["lex", "Judaism rituals significance religious practice"], ["lex", "Jewish rituals Shabbat observance tradition"], ["vec", "what role do rituals play in Jewish religious life and spiritual practice"], ["vec", "why are rituals like Shabbat, kashrut, and prayer important in Judaism"], ["hyde", "Rituals in Judaism (mitzvot) structure daily, weekly, and yearly life around sacred observance. Shabbat, observed from Friday evening to Saturday night, sanctifies time through rest, prayer, and family meals. Rituals connect Jews to their covenant with God, collective memory, and community identity across generations."]], "query": "what is the significance of rituals in judaism?"} -{"output": [["lex", "productivity work increase tips"], ["lex", "workplace productivity time management techniques"], ["vec", "what proven strategies help people increase their productivity at work"], ["vec", "how can you manage your time better to get more done during the workday"], ["hyde", "Increase workplace productivity by time-blocking your calendar in 90-minute focus sessions. Tackle your hardest task first (eat the frog). Batch similar tasks like email and meetings. Eliminate distractions by silencing notifications. Use the Pomodoro Technique: 25 minutes of work, 5-minute break, repeat."]], "query": "how to increase productivity at work?"} -{"output": [["lex", "panorama photography wide angle stitching"], ["lex", "panoramic photo technique camera rotation"], ["vec", "what is panorama photography and how do you capture and stitch panoramic images"], ["vec", "what camera techniques and software are used to create panoramic photographs"], ["hyde", "Panorama photography captures wide scenes by shooting multiple overlapping images and stitching them together. Use a tripod with a panoramic head, shoot in manual mode to keep exposure consistent, and overlap each frame by 30-50%. Stitch in software like Lightroom, PTGui, or Hugin."]], "query": "what is panorama photography?"} -{"output": [["lex", "Chinese history periods dynasties timeline"], ["lex", "China historical periods Qin Han Tang"], ["vec", "what are the major periods and dynasties in Chinese history from ancient to modern times"], ["vec", "how is Chinese history divided into dynastic periods and what defined each era"], ["hyde", "Key periods in Chinese history include: Shang Dynasty (1600-1046 BCE), Zhou Dynasty (1046-256 BCE), Qin Dynasty (221-206 BCE, first unified empire), Han Dynasty (206 BCE-220 CE), Tang Dynasty (618-907, golden age), Song Dynasty (960-1279), Ming Dynasty (1368-1644), Qing Dynasty (1644-1912), and the People's Republic (1949-present)."]], "query": "what are the key periods in chinese history"} -{"output": [["lex", "story elements plot character setting"], ["lex", "storytelling elements narrative structure"], ["vec", "what are the essential elements that make a story compelling and well-crafted"], ["vec", "how do plot, character, setting, and conflict work together in a good story"], ["hyde", "A good story requires compelling characters, a clear conflict, a structured plot (beginning, rising action, climax, resolution), a vivid setting, and a consistent point of view. Theme gives the story meaning beyond its events. Strong dialogue reveals character and advances the plot naturally."]], "query": "what are the elements of a good story?"} -{"output": [["lex", "artificial intelligence research news 2025 2026"], ["lex", "AI research breakthroughs latest developments"], ["lex", "machine learning AI news recent"], ["vec", "what are the most recent breakthroughs and developments in artificial intelligence research in 2025-2026"], ["vec", "what new AI models and techniques have been published in the latest research"], ["hyde", "In 2025-2026, AI research advanced with larger multimodal models capable of reasoning across text, image, and video. Key developments include improved chain-of-thought reasoning, AI agents that can use tools and write code, and open-weight models matching proprietary performance."]], "query": "latest news in artificial intelligence research"} -{"output": [["lex", "New Age spirituality beliefs practices"], ["lex", "New Age movement spiritual holistic"], ["vec", "what are the central beliefs and practices of New Age spirituality"], ["vec", "how does the New Age movement define spirituality, consciousness, and healing"], ["hyde", "New Age spirituality encompasses diverse beliefs including holistic healing, the interconnectedness of all life, personal spiritual growth, and the existence of higher consciousness. Practitioners may draw from Eastern religions, astrology, crystal healing, meditation, and the idea that individuals can channel divine energy."]], "query": "what are the main beliefs of new age spirituality?"} -{"output": [["lex", "camping trip kids family planning"], ["lex", "family camping children gear checklist"], ["vec", "how to plan and prepare for a family camping trip with young children"], ["vec", "what gear and activities should you bring when camping with kids for the first time"], ["hyde", "Plan a family camping trip by choosing a campground with bathrooms and short hiking trails. Pack extra layers, rain gear, and familiar snacks. Bring activities: nature scavenger hunts, glow sticks, and star charts. Set up camp early to let kids explore. Practice tent setup in the backyard first."]], "query": "how to plan a camping trip with kids"} -{"output": [["lex", "personal identity philosophy self"], ["lex", "identity philosophy Locke consciousness persistence"], ["vec", "how do philosophers define and explain personal identity and what makes someone the same person over time"], ["vec", "what are the major philosophical theories of identity from Locke to modern philosophy of mind"], ["hyde", "Philosophers debate what constitutes personal identity over time. John Locke argued identity rests on continuity of consciousness and memory. David Hume denied a fixed self, viewing identity as a bundle of perceptions. Derek Parfit argued identity is not what matters—psychological continuity is."]], "query": "how do philosophers conceptualize identity"} -{"output": [["lex", "civil society political role organizations"], ["lex", "civil society democracy NGOs advocacy"], ["vec", "what role do civil society organizations play in democratic politics and governance"], ["vec", "how does civil society influence government policy and hold political leaders accountable"], ["hyde", "Civil society—NGOs, advocacy groups, unions, and community organizations—serves as a check on government power. These groups mobilize citizens, advocate for policy changes, monitor elections, and provide services the state cannot. A strong civil society is considered essential for healthy democracy and government accountability."]], "query": "what is the role of civil society in politics"} -{"output": [["lex", "inflation impact personal finance manage"], ["lex", "inflation coping strategies budget investment"], ["vec", "how can individuals protect their finances and manage the impact of high inflation"], ["vec", "what financial strategies help people cope with rising prices and reduced purchasing power"], ["hyde", "To handle inflation, review your budget and cut discretionary spending. Move savings to high-yield accounts or I-bonds that adjust for inflation. Lock in fixed-rate loans before rates rise. Invest in assets that historically outpace inflation: equities, real estate, and TIPS (Treasury Inflation-Protected Securities)."]], "query": "how to handle inflation impact"} -{"output": [["lex", "energy conservation chemical reactions thermodynamics"], ["lex", "chemical reaction energy transfer exothermic endothermic"], ["vec", "how does the law of conservation of energy apply to chemical reactions"], ["vec", "how is energy transferred and conserved in exothermic and endothermic chemical reactions"], ["hyde", "In chemical reactions, energy is neither created nor destroyed (first law of thermodynamics). Exothermic reactions release energy—bonds formed in products are stronger than bonds broken in reactants. Endothermic reactions absorb energy—more energy is needed to break reactant bonds than is released forming product bonds."]], "query": "how is energy conserved during chemical reactions"} -{"output": [["lex", "sourdough bread recipe starter"], ["lex", "sourdough bread baking fermentation dough"], ["vec", "what is the step-by-step process for making sourdough bread from a starter"], ["vec", "how do you feed a sourdough starter and bake a loaf of sourdough bread at home"], ["hyde", "Mix 100g active starter, 375g water, 500g bread flour, and 10g salt. Stretch and fold every 30 minutes for 2 hours, then bulk ferment 4-8 hours until doubled. Shape, place in a banneton, and cold-proof in the fridge overnight. Bake in a Dutch oven at 450°F: 20 min covered, 20 min uncovered."]], "query": "how to make sourdough bread"} -{"output": [["lex", "aesthetics philosophy beauty art"], ["lex", "philosophy aesthetics theory judgment taste"], ["vec", "what is the philosophy of aesthetics and how does it define beauty and art"], ["vec", "how do philosophers like Kant and Hume approach questions of aesthetic judgment and taste"], ["hyde", "Aesthetics is the branch of philosophy concerned with the nature of beauty, art, and taste. Kant argued that aesthetic judgments are subjective yet claim universal validity—when we call something beautiful, we expect others to agree. Hume held that taste varies but can be refined through experience and education."]], "query": "what is the philosophy of aesthetics"} -{"output": [["lex", "hiking packing list gear essentials"], ["lex", "hiking pack checklist day hike"], ["vec", "what essential items should you pack for a day hike in the outdoors"], ["vec", "what gear and supplies do you need to bring on a hiking trip for safety and comfort"], ["hyde", "The ten essentials for hiking: navigation (map/compass/GPS), sun protection, insulation (extra layers), illumination (headlamp), first aid kit, fire starter, repair tools, nutrition (extra food), hydration (extra water), and emergency shelter. Also bring a whistle, trekking poles, and broken-in boots."]], "query": "what to pack for a hike?"} -{"output": [["lex", "existentialism philosophy Sartre Kierkegaard"], ["lex", "existentialism existence precedes essence freedom"], ["vec", "what is existentialist philosophy and what are its core claims about human freedom and meaning"], ["vec", "how did Sartre, Kierkegaard, and Camus define existentialism and its key ideas"], ["hyde", "Existentialism holds that existence precedes essence—humans are not born with a fixed nature but create themselves through choices. Sartre argued we are \"condemned to be free,\" fully responsible for our actions. Kierkegaard emphasized the anxiety of individual choice, while Camus explored the absurdity of seeking meaning in an indifferent universe."]], "query": "what is the philosophy of existentialism?"} -{"output": [["lex", "battery test multimeter voltage"], ["lex", "battery test car 12V load"], ["lex", "battery testing health capacity"], ["vec", "how to test a battery's charge level and health using a multimeter or load tester"], ["vec", "how to check if a car battery or device battery needs replacement"], ["hyde", "Test a 12V car battery with a multimeter set to DC volts. A fully charged battery reads 12.6V or higher. Between 12.0-12.4V indicates partial charge. Below 12.0V means the battery is discharged. For a load test, apply a load equal to half the CCA rating for 15 seconds—voltage should stay above 9.6V."]], "query": "battery test"} -{"output": [["lex", "HDR photography high dynamic range"], ["lex", "HDR photo bracketing tone mapping"], ["vec", "what is HDR photography and how does it capture a wider range of light and shadow"], ["vec", "how do you shoot and process HDR photos using exposure bracketing and tone mapping"], ["hyde", "HDR (High Dynamic Range) photography combines multiple exposures of the same scene—typically 3-5 bracketed shots—to capture detail in both highlights and shadows. The images are merged using software like Photomatix or Lightroom, then tone-mapped to produce a single image with a wider dynamic range than a single exposure."]], "query": "what is hdr photography?"} -{"output": [["lex", "literary awards significance publishing"], ["lex", "literary prizes Nobel Pulitzer Booker impact"], ["vec", "why are literary awards significant for authors and the publishing industry"], ["vec", "how do prizes like the Nobel, Pulitzer, and Booker Prize affect book sales and literary reputation"], ["hyde", "Literary awards elevate authors' visibility and boost book sales—Booker Prize winners typically see a 600% increase in sales. Awards canonize works in literary culture, influence academic curricula, and bring attention to underrepresented voices. They also shape publishers' marketing strategies and readers' choices."]], "query": "what is the significance of literary awards?"} -{"output": [["lex", "Cubism art movement Picasso Braque"], ["lex", "Cubism painting geometric abstraction"], ["vec", "what is Cubism as an art movement and how did it change visual representation in painting"], ["vec", "how did Picasso and Braque develop Cubism and what are its defining visual characteristics"], ["hyde", "Cubism, pioneered by Pablo Picasso and Georges Braque around 1907-1914, broke objects into geometric fragments and depicted multiple viewpoints simultaneously on a flat canvas. Analytic Cubism (1907-1912) deconstructed forms into monochrome facets. Synthetic Cubism (1912-1914) introduced collage, color, and simpler shapes."]], "query": "what is cubism?"} -{"output": [["lex", "cache hit rate ratio"], ["lex", "CPU cache hit miss latency"], ["lex", "web cache hit response time"], ["vec", "what happens when data is found in cache memory"], ["vec", "how cache hits improve application performance versus cache misses"], ["hyde", "A cache hit occurs when the requested data is found in the cache layer, avoiding a slower lookup to the backing store. Hit rates above 90% typically indicate effective caching."]], "query": "cache hit"} -{"output": [["lex", "machine learning research applications 2025 2026"], ["lex", "ML models scientific research use cases"], ["lex", "deep learning academic research tools"], ["vec", "how is machine learning being applied in scientific research today"], ["vec", "what are the latest ways researchers use ML models in their studies"], ["hyde", "Machine learning is now routinely used in genomics for variant calling, in climate science for weather prediction, and in materials science for discovering novel compounds. Recent breakthroughs include protein structure prediction and automated literature review."]], "query": "current applications of machine learning in research"} -{"output": [["lex", "vegetable garden planting steps"], ["lex", "backyard vegetable garden soil preparation"], ["lex", "raised bed vegetable garden layout"], ["vec", "what are the steps to start a vegetable garden from scratch"], ["vec", "how to prepare soil and plant vegetables for beginners"], ["hyde", "Choose a site with 6-8 hours of direct sunlight. Amend the soil with compost, till to 12 inches deep, and plant seedlings after the last frost date. Space rows 18-24 inches apart depending on the crop."]], "query": "how to plant a vegetable garden"} -{"output": [["lex", "existentialism authenticity Sartre Heidegger"], ["lex", "authentic existence existentialist philosophy"], ["vec", "what does authenticity mean in existentialist philosophy"], ["vec", "how do existentialist thinkers define living an authentic life"], ["hyde", "For Sartre, authenticity means acknowledging radical freedom and refusing bad faith—the self-deception of pretending our choices are determined by external forces. Heidegger's Eigentlichkeit calls us to own our finitude rather than losing ourselves in das Man."]], "query": "how does existentialism view authenticity"} -{"output": [["lex", "Great Depression 1929 economic collapse"], ["lex", "Great Depression causes unemployment stock market crash"], ["vec", "what caused the Great Depression and how did it affect the economy"], ["vec", "what were the major events and consequences of the Great Depression in the 1930s"], ["hyde", "The Great Depression began with the stock market crash of October 1929 and lasted until the late 1930s. Unemployment peaked at 25%, thousands of banks failed, and GDP fell by nearly 30%. The New Deal introduced federal relief programs."]], "query": "what is the great depression"} -{"output": [["lex", "International Court of Justice ICJ United Nations"], ["lex", "ICJ jurisdiction Hague rulings"], ["vec", "what is the purpose and function of the International Court of Justice"], ["vec", "how does the ICJ at The Hague resolve disputes between countries"], ["hyde", "The International Court of Justice (ICJ) is the principal judicial organ of the United Nations, located in The Hague, Netherlands. It settles legal disputes between states and gives advisory opinions on questions referred by UN organs."]], "query": "what is the international court of justice"} -{"output": [["lex", "influencer marketing social media brand promotion"], ["lex", "influencer campaigns Instagram TikTok sponsorship"], ["vec", "how does influencer marketing work for promoting brands on social media"], ["vec", "what is influencer marketing and why do companies pay content creators"], ["hyde", "Influencer marketing is a strategy where brands partner with social media creators who have engaged followings to promote products. Campaigns may involve sponsored posts, affiliate links, or product reviews. ROI is measured through engagement rates, conversions, and reach."]], "query": "what is influencer marketing"} -{"output": [["lex", "change flat tire steps jack lug nuts"], ["lex", "flat tire replacement spare wheel"], ["vec", "step-by-step instructions for changing a flat tire on the side of the road"], ["vec", "how to safely jack up a car and replace a flat tire with the spare"], ["hyde", "Loosen the lug nuts before jacking. Place the jack under the frame near the flat tire, raise the vehicle, remove the lug nuts, swap in the spare, hand-tighten the nuts in a star pattern, lower the car, then torque to 80-100 ft-lbs."]], "query": "how to change a flat tire?"} -{"output": [["lex", "lotus flower Buddhism symbolism"], ["lex", "lotus Buddhist enlightenment purity"], ["vec", "why is the lotus flower an important symbol in Buddhism"], ["vec", "what does the lotus represent in Buddhist art and teachings"], ["hyde", "The lotus grows from muddy water yet blooms immaculately, symbolizing the journey from suffering to enlightenment. In Buddhist iconography, the Buddha is often depicted seated on a lotus throne, representing purity of mind arising from the world of samsara."]], "query": "what is the significance of the lotus in buddhism?"} -{"output": [["lex", "code linter static analysis"], ["lex", "linting tools ESLint Pylint code quality"], ["lex", "lint rules syntax errors warnings"], ["vec", "what is code linting and how do linting tools check source code for errors"], ["vec", "how to set up a code linter for catching bugs and enforcing style rules"], ["hyde", "A linter performs static analysis on source code to detect syntax errors, stylistic issues, and potential bugs without executing the program. Popular linters include ESLint for JavaScript, Pylint for Python, and Clippy for Rust."]], "query": "code lint"} -{"output": [["lex", "content marketing strategy blog SEO"], ["lex", "content marketing audience engagement brand"], ["vec", "what is content marketing and how does it attract customers"], ["vec", "how do businesses use content marketing to drive traffic and build trust"], ["hyde", "Content marketing focuses on creating and distributing valuable, relevant content—blog posts, videos, podcasts, whitepapers—to attract and retain a target audience. Rather than directly promoting a product, it builds authority and nurtures leads through the sales funnel."]], "query": "what is content marketing"} -{"output": [["lex", "Hanukkah meaning Jewish festival of lights"], ["lex", "Hanukkah menorah Maccabees temple rededication"], ["vec", "what is the history and significance of Hanukkah in Judaism"], ["vec", "why do Jewish people celebrate Hanukkah and what does it commemorate"], ["hyde", "Hanukkah commemorates the rededication of the Second Temple in Jerusalem after the Maccabean revolt against the Seleucid Empire in 164 BCE. The miracle of the oil—one day's supply lasting eight days—is celebrated by lighting the menorah each night."]], "query": "what is the meaning of hanukkah"} -{"output": [["lex", "existential angst anxiety Kierkegaard"], ["lex", "existential dread absurdity freedom"], ["vec", "what does existential angst mean in philosophy"], ["vec", "how do existentialist philosophers describe the feeling of existential anxiety"], ["hyde", "Existential angst, or Angst, is the deep anxiety that arises from confronting freedom, mortality, and the absence of inherent meaning. Kierkegaard described it as the dizziness of freedom; Heidegger linked it to awareness of one's Being-toward-death."]], "query": "what is existential angst"} -{"output": [["lex", "open shelf styling tips decor"], ["lex", "kitchen open shelving arrangement display"], ["vec", "how to arrange and decorate open shelves so they look good"], ["vec", "what are tips for styling open shelves in a kitchen or living room"], ["hyde", "Group items in odd numbers and vary heights. Mix functional pieces like dishes with decorative objects like plants or small art. Leave 30% of the shelf empty to avoid clutter. Use a consistent color palette to tie everything together."]], "query": "how to style open shelves"} -{"output": [["lex", "LinkedIn profile optimization headline"], ["lex", "LinkedIn profile tips summary photo"], ["lex", "LinkedIn profile writing professional"], ["vec", "how to create an effective LinkedIn profile that attracts recruiters"], ["vec", "what should you include in your LinkedIn profile headline and summary"], ["hyde", "Your LinkedIn headline should go beyond your job title—include keywords and your value proposition. Use the summary section to tell your professional story in first person. Add a professional headshot; profiles with photos get 21x more views."]], "query": "linkedin profile"} -{"output": [["lex", "yoga benefits health flexibility stress"], ["lex", "yoga physical mental health advantages"], ["vec", "what are the physical and mental health benefits of practicing yoga regularly"], ["vec", "how does yoga improve flexibility, strength, and stress levels"], ["hyde", "Regular yoga practice improves flexibility, builds core strength, and lowers cortisol levels. Studies show it reduces chronic back pain, lowers blood pressure, and decreases symptoms of anxiety and depression. Even 20 minutes daily produces measurable benefits."]], "query": "what are the benefits of yoga"} -{"output": [["lex", "virtue ethics Aristotle character moral"], ["lex", "virtue ethics eudaimonia moral philosophy"], ["vec", "what is virtue ethics and how does it differ from other moral theories"], ["vec", "how does Aristotle's virtue ethics define moral character and the good life"], ["hyde", "Virtue ethics, rooted in Aristotle's Nicomachean Ethics, holds that morality centers on developing virtuous character traits—courage, temperance, justice, prudence—rather than following rules or calculating consequences. The goal is eudaimonia, or human flourishing."]], "query": "what is virtue ethics"} -{"output": [["lex", "carbon emissions calculation formula CO2"], ["lex", "carbon footprint calculator methodology"], ["vec", "how do you calculate the carbon emissions from energy use and transportation"], ["vec", "what formulas and data are used to measure carbon dioxide emissions"], ["hyde", "To calculate CO2 emissions, multiply the activity data (e.g., kWh of electricity, liters of fuel) by the appropriate emission factor. For gasoline: 2.31 kg CO2 per liter burned. For grid electricity, use the regional emission factor, typically 0.3-0.9 kg CO2/kWh."]], "query": "how to calculate carbon emissions?"} -{"output": [["lex", "rock climbing beginner indoor gym"], ["lex", "rock climbing gear shoes harness belay"], ["vec", "how to get started with rock climbing as a complete beginner"], ["vec", "what equipment and skills do beginners need for indoor rock climbing"], ["hyde", "Start at an indoor climbing gym where you can rent shoes and a harness. Take a belay certification class to learn rope handling. Begin on easy routes graded V0-V1 for bouldering or 5.6-5.8 for top-rope. Focus on footwork over arm strength."]], "query": "how to start rock climbing"} -{"output": [["lex", "moon garden white flowers night-blooming plants"], ["lex", "moon garden design layout fragrant plants"], ["vec", "how to plan and plant a garden designed to be enjoyed at night"], ["vec", "what plants and flowers work best in a moon garden"], ["hyde", "A moon garden features white and pale-colored flowers, silver foliage, and night-blooming plants that glow under moonlight. Include moonflower (Ipomoea alba), white nicotiana, night-blooming jasmine, dusty miller, and lamb's ear. Add light-colored gravel paths for reflection."]], "query": "how to create a moon garden?"} -{"output": [["lex", "bildungsroman coming-of-age novel literary genre"], ["lex", "bildungsroman significance literature examples"], ["vec", "what is a bildungsroman and why is it an important literary genre"], ["vec", "how does the bildungsroman novel trace a character's growth and development"], ["hyde", "The bildungsroman, or coming-of-age novel, follows a protagonist's psychological and moral development from youth to adulthood. Examples include Goethe's Wilhelm Meister, Dickens' Great Expectations, and Joyce's A Portrait of the Artist as a Young Man."]], "query": "what is the significance of the bildungsroman?"} -{"output": [["lex", "moral behavior ethics right wrong conduct"], ["lex", "moral behavior definition philosophy psychology"], ["vec", "what defines moral behavior and how do people distinguish right from wrong"], ["vec", "what is moral behavior according to ethics and psychology"], ["hyde", "Moral behavior refers to actions that conform to standards of right conduct within a society or ethical framework. It involves making choices that consider the well-being of others, guided by principles such as fairness, honesty, empathy, and respect for autonomy."]], "query": "what is moral behavior"} -{"output": [["lex", "rototiller operation tilling soil garden"], ["lex", "rototiller how to use depth settings"], ["vec", "step-by-step instructions for using a rototiller to prepare garden soil"], ["vec", "how to operate a rototiller safely and effectively"], ["hyde", "Set the tilling depth to 6-8 inches for new beds. Walk slowly and let the tines do the work—don't force it forward. Make overlapping passes in parallel rows. Avoid tilling wet soil, which creates compaction. Clean tines after each use."]], "query": "how to use a rototiller?"} -{"output": [["lex", "greenhouse build DIY construction plans"], ["lex", "greenhouse frame polycarbonate panels foundation"], ["vec", "how to build a small greenhouse in your backyard step by step"], ["vec", "what materials and design are needed to construct a DIY greenhouse"], ["hyde", "Start with a level foundation of treated lumber or concrete blocks. Build the frame from galvanized steel or cedar. Cover with 8mm twin-wall polycarbonate panels, which insulate better than glass. Include ridge vents for airflow and a door on the south-facing end."]], "query": "how to build a greenhouse?"} -{"output": [["lex", "sibling rivalry parenting tips conflict"], ["lex", "sibling fighting jealousy children strategies"], ["vec", "how can parents manage sibling rivalry and reduce fighting between children"], ["vec", "what strategies help siblings get along and resolve conflicts"], ["hyde", "Avoid comparing siblings or taking sides. Acknowledge each child's feelings before mediating. Teach conflict resolution skills: use I-statements, take turns speaking, and brainstorm solutions together. Spend one-on-one time with each child to reduce jealousy."]], "query": "how to handle sibling rivalry?"} -{"output": [["lex", "car paint polish compound buffing"], ["lex", "auto paint polishing scratch removal swirl marks"], ["vec", "how to polish car paint to remove scratches and restore shine"], ["vec", "what is the correct technique for machine polishing automotive paint"], ["hyde", "Wash and clay bar the surface first. Apply a small amount of polishing compound to a foam pad on a dual-action polisher. Work in 2x2 foot sections at 1200-1500 RPM with medium pressure. Wipe residue with a microfiber towel, then apply sealant or wax."]], "query": "how to polish car paint?"} -{"output": [["lex", "intrinsic value philosophy ethics"], ["lex", "intrinsic value stock valuation finance"], ["vec", "what does intrinsic value mean in philosophy and in finance"], ["vec", "how is intrinsic value defined as something valuable in itself regardless of consequences"], ["hyde", "In philosophy, intrinsic value is the worth something has in itself, independent of its usefulness. Kant argued that rational beings have intrinsic value as ends in themselves. In finance, intrinsic value refers to the calculated true worth of an asset based on fundamentals."]], "query": "what is intrinsic value"} -{"output": [["lex", "natural weed killer organic herbicide"], ["lex", "remove weeds without chemicals mulch vinegar"], ["vec", "what are natural methods for killing and preventing weeds in a garden"], ["vec", "how to get rid of weeds without using chemical herbicides"], ["hyde", "Apply a 3-4 inch layer of mulch to suppress weed growth. Pour boiling water directly on weeds in cracks. Spray a mixture of white vinegar, salt, and dish soap on foliage in full sun. Hand-pull weeds after rain when roots come out easily."]], "query": "how to get rid of weeds naturally"} -{"output": [["lex", "original sin Christian theology Adam Eve"], ["lex", "original sin doctrine fall of man"], ["vec", "what is original sin in Christian theology and where does the idea come from"], ["vec", "how does the concept of original sin explain human nature in Christianity"], ["hyde", "Original sin is the Christian doctrine that humanity inherited a sinful nature from Adam and Eve's disobedience in the Garden of Eden. Augustine of Hippo formalized the teaching, arguing that all humans are born in a state of sin, redeemable only through divine grace."]], "query": "what is the concept of original sin"} -{"output": [["lex", "brand building strategy identity positioning"], ["lex", "brand identity logo messaging target audience"], ["vec", "what steps are needed to build a strong and recognizable brand"], ["vec", "how do companies create a successful brand identity and positioning"], ["hyde", "Define your brand's mission, values, and target audience. Develop a distinctive visual identity—logo, color palette, typography. Craft a consistent brand voice across all channels. Differentiate with a clear value proposition and deliver on your brand promise consistently."]], "query": "how to build a successful brand"} -{"output": [["lex", "Baha'i faith teachings principles Baha'u'llah"], ["lex", "Baha'i beliefs unity humanity religion"], ["vec", "what are the core beliefs and teachings of the Baha'i faith"], ["vec", "what did Baha'u'llah teach about unity, equality, and world peace"], ["hyde", "The Baha'i faith, founded by Baha'u'llah in 19th-century Persia, teaches the oneness of God, the oneness of religion, and the oneness of humanity. Core principles include elimination of prejudice, equality of men and women, universal education, and harmony of science and religion."]], "query": "what are the teachings of the baha'i faith?"} -{"output": [["lex", "potty training toddler tips methods"], ["lex", "toddler toilet training readiness signs"], ["vec", "how to potty train a toddler and what are the signs of readiness"], ["vec", "what is the best approach to potty training a 2-year-old child"], ["hyde", "Watch for readiness signs: staying dry for 2 hours, showing interest in the toilet, and communicating the need to go. Start with a child-sized potty, establish a routine after meals and naps, use positive reinforcement, and expect accidents—avoid punishment."]], "query": "how to potty train a toddler?"} -{"output": [["lex", "reduce waste zero waste lifestyle tips"], ["lex", "waste reduction recycling composting reuse"], ["vec", "what are practical ways to reduce household waste in daily life"], ["vec", "how can individuals cut down on trash and move toward zero waste living"], ["hyde", "Bring reusable bags, bottles, and containers when shopping. Buy in bulk to reduce packaging. Compost food scraps instead of sending them to landfill. Choose products with minimal packaging, repair items before replacing, and donate what you no longer need."]], "query": "how to reduce waste in everyday life?"} -{"output": [["lex", "international relations trade policy tariffs"], ["lex", "geopolitics trade agreements bilateral multilateral"], ["vec", "how do international political relationships influence global trade and tariffs"], ["vec", "what is the connection between diplomacy and international trade policy"], ["hyde", "Diplomatic relations directly shape trade flows through tariffs, sanctions, and trade agreements. Countries with strong bilateral ties negotiate favorable terms—like the USMCA between the US, Mexico, and Canada—while geopolitical tensions can trigger trade wars and export controls."]], "query": "how international relations affect trade"} -{"output": [["lex", "business continuity planning BCP disaster recovery"], ["lex", "BCP risk assessment contingency plan"], ["vec", "what is a business continuity plan and why do organizations need one"], ["vec", "how do companies create a business continuity plan for disaster recovery"], ["hyde", "Business continuity planning (BCP) ensures an organization can maintain critical functions during and after a disruption. It includes risk assessment, identifying essential operations, establishing recovery time objectives, and defining procedures for communication, IT recovery, and alternate work sites."]], "query": "what is business continuity planning"} -{"output": [["lex", "playdate tips children toddler socializing"], ["lex", "kids playdate activities hosting"], ["vec", "how to plan and host a successful playdate for young children"], ["vec", "what tips help make a playdate fun and smooth for kids and parents"], ["hyde", "Keep playdates short—90 minutes is ideal for toddlers. Prepare a few structured activities but allow free play. Put away special toys to avoid conflicts. Have snacks ready, discuss allergies with the other parent beforehand, and supervise without hovering."]], "query": "how to have a successful playdate?"} -{"output": [["lex", "poetry forms types sonnet haiku epic"], ["lex", "poetic forms verse structures literary"], ["vec", "what are the main types and forms of poetry in literature"], ["vec", "how do different poetry forms like sonnets, haiku, and free verse differ"], ["hyde", "Major poetic forms include the sonnet (14 lines, iambic pentameter), haiku (3 lines, 5-7-5 syllables), epic (long narrative), ballad (storytelling with rhyme), ode (lyrical praise), limerick (humorous five-line form), villanelle (19 lines with refrains), and free verse (no fixed structure)."]], "query": "what are the major forms of poetry?"} -{"output": [["lex", "tulip bulbs planting time season fall"], ["lex", "tulip bulb planting depth spacing"], ["vec", "what time of year should you plant tulip bulbs for spring blooms"], ["vec", "when is the best season to plant tulips and how deep should the bulbs go"], ["hyde", "Plant tulip bulbs in fall, 6-8 weeks before the ground freezes—typically October to November in most zones. Set bulbs 6-8 inches deep, pointed end up, spaced 4-6 inches apart. They need a cold period of 12-16 weeks to bloom in spring."]], "query": "when to plant tulip bulbs?"} -{"output": [["lex", "raised garden beds buy online store"], ["lex", "raised bed garden kits cedar metal"], ["vec", "where can I buy raised garden beds and what materials are best"], ["vec", "what are the best places to purchase raised bed garden kits"], ["hyde", "Raised garden beds are available at Home Depot, Lowe's, and garden centers. Online retailers like Gardener's Supply, Amazon, and Birdies offer metal and cedar kits. Cedar is rot-resistant and long-lasting; galvanized steel beds are durable and modern-looking."]], "query": "where to buy raised garden beds?"} -{"output": [["lex", "tree planting technique hole depth root ball"], ["lex", "plant tree correctly mulch watering"], ["vec", "what is the correct way to plant a tree so it grows healthy"], ["vec", "how deep and wide should the hole be when planting a new tree"], ["hyde", "Dig a hole 2-3 times wider than the root ball but only as deep. Set the tree so the root flare sits at ground level. Backfill with native soil, water deeply, and apply 2-4 inches of mulch in a ring, keeping it away from the trunk to prevent rot."]], "query": "how to plant a tree properly?"} -{"output": [["lex", "enzymes digestion amylase protease lipase"], ["lex", "digestive enzymes stomach intestine breakdown"], ["vec", "how do enzymes help break down food during the digestive process"], ["vec", "what role do specific enzymes like amylase and protease play in digestion"], ["hyde", "Digestive enzymes catalyze the breakdown of macronutrients into absorbable units. Amylase in saliva and the pancreas breaks starch into sugars. Pepsin in the stomach cleaves proteins. Lipase from the pancreas breaks fats into fatty acids and glycerol in the small intestine."]], "query": "what is the role of enzymes in digestion"} -{"output": [["lex", "rock climbing clothing gear outfit"], ["lex", "climbing shoes harness chalk bag apparel"], ["vec", "what clothes and gear should you wear for indoor or outdoor rock climbing"], ["vec", "what is the best clothing to wear when rock climbing for comfort and safety"], ["hyde", "Wear stretchy, moisture-wicking pants or shorts that allow full range of motion. Choose a fitted athletic shirt—avoid loose fabric that catches on holds. Climbing shoes should fit snugly. Bring a chalk bag for grip and a harness for roped routes."]], "query": "what to wear for rock climbing"} -{"output": [["lex", "bioinformatics research applications 2025 2026"], ["lex", "bioinformatics genomics proteomics computational biology"], ["vec", "how is bioinformatics being used in current scientific research"], ["vec", "what are the newest bioinformatics tools and applications in genomics and drug discovery"], ["hyde", "Recent bioinformatics advances include single-cell RNA sequencing analysis pipelines, AlphaFold-based protein structure prediction for drug targets, CRISPR off-target analysis algorithms, and large-scale metagenomic assembly for microbiome studies."]], "query": "latest uses of bioinformatics in research"} -{"output": [["lex", "research bias scientific community peer review"], ["lex", "scientific bias mitigation replication reproducibility"], ["vec", "how do scientists identify and reduce bias in research studies"], ["vec", "what methods does the scientific community use to address research bias and ensure reproducibility"], ["hyde", "To combat research bias, journals require pre-registration of study protocols, blinded peer review, and reporting of negative results. Replication studies verify findings. Statistical safeguards like p-value corrections and effect size reporting reduce publication bias."]], "query": "how the scientific community addresses research bias"} -{"output": [["lex", "ethical dilemma real life examples"], ["lex", "moral dilemma everyday situations conflict"], ["vec", "what are examples of ethical dilemmas people face in everyday life"], ["vec", "how do real-life ethical dilemmas force people to choose between conflicting values"], ["hyde", "A common ethical dilemma is discovering a coworker falsifying expense reports—report them and risk the relationship, or stay silent and condone dishonesty. Other examples include whistleblowing, end-of-life medical decisions, and allocating scarce resources during emergencies."]], "query": "what is ethical dilemma in real life"} -{"output": [["lex", "street photography techniques composition tips"], ["lex", "street photography candid camera settings"], ["vec", "what are the best techniques for capturing compelling street photographs"], ["vec", "how do street photographers take candid shots of people in public spaces"], ["hyde", "Shoot at f/8 for deep depth of field and zone focus at 3 meters for quick candid shots. Use a 28mm or 35mm lens. Anticipate moments—find good light or backgrounds and wait for subjects to enter the frame. Shoot from the hip to stay inconspicuous."]], "query": "best techniques for street photography"} -{"output": [["lex", "become researcher academic career path"], ["lex", "research career PhD graduate school publish"], ["vec", "what steps do you need to take to become a professional researcher"], ["vec", "how do you build a career in academic or scientific research"], ["hyde", "Start with an undergraduate degree in your field, seek research assistant positions, and publish early. Apply to graduate programs for a master's or PhD. Build a publication record, attend conferences, and network with established researchers. Postdoctoral positions lead to faculty or industry research roles."]], "query": "how to become a researcher"} -{"output": [["lex", "WebSocket protocol real-time connection"], ["lex", "WebSocket API JavaScript server client"], ["lex", "WebSocket vs HTTP persistent connection"], ["vec", "how do WebSockets work for real-time bidirectional communication"], ["vec", "how to implement a WebSocket connection between a client and server"], ["hyde", "WebSocket provides full-duplex communication over a single TCP connection. After an HTTP upgrade handshake, client and server can send messages in both directions without polling. Use `new WebSocket('ws://host/path')` on the client and a library like ws on the server."]], "query": "web socket"} -{"output": [["lex", "lean manufacturing Toyota production system"], ["lex", "lean manufacturing waste reduction kaizen"], ["vec", "what is lean manufacturing and what principles does it follow"], ["vec", "how does lean manufacturing eliminate waste and improve production efficiency"], ["hyde", "Lean manufacturing, derived from the Toyota Production System, aims to minimize waste (muda) while maximizing value. Its five principles: define value from the customer's perspective, map the value stream, create flow, establish pull, and pursue perfection through continuous improvement (kaizen)."]], "query": "what is lean manufacturing"} -{"output": [["lex", "writing prompts creative fiction ideas"], ["lex", "writing prompts exercises journal story starters"], ["vec", "what are writing prompts and how do writers use them for inspiration"], ["vec", "how do writing prompts help overcome writer's block and spark creativity"], ["hyde", "Writing prompts are short scenarios, questions, or opening lines designed to spark creative writing. Examples: \"Write about a door that appeared overnight\" or \"Describe your earliest memory from a stranger's perspective.\" They help overcome writer's block and build a daily writing habit."]], "query": "what are writing prompts?"} -{"output": [["lex", "bokeh effect photography aperture lens"], ["lex", "bokeh background blur shallow depth of field"], ["vec", "how to achieve a bokeh effect with blurred background in photography"], ["vec", "what camera settings and lenses produce the best bokeh"], ["hyde", "Use a wide aperture (f/1.4 to f/2.8) to create shallow depth of field. A fast prime lens like a 50mm f/1.8 or 85mm f/1.4 produces smooth bokeh. Increase the distance between subject and background, and get close to your subject for maximum blur."]], "query": "how to capture bokeh effect"} -{"output": [["lex", "controlled experiment scientific method variables"], ["lex", "control group experimental group independent variable"], ["vec", "what is a controlled experiment and how does it work in science"], ["vec", "how do scientists set up control and experimental groups in a controlled experiment"], ["hyde", "A controlled experiment tests a hypothesis by changing one independent variable while keeping all other conditions constant. The control group receives no treatment, while the experimental group does. Comparing outcomes isolates the effect of the variable being tested."]], "query": "what is a controlled experiment"} -{"output": [["lex", "telemedicine telehealth virtual doctor visit"], ["lex", "telemedicine remote healthcare video consultation"], ["vec", "what is telemedicine and how does it deliver healthcare remotely"], ["vec", "how do patients use telemedicine for virtual doctor appointments"], ["hyde", "Telemedicine uses video calls, phone consultations, and remote monitoring to deliver healthcare without in-person visits. Patients can consult doctors from home for diagnoses, prescriptions, and follow-ups. It expanded rapidly during COVID-19 and now covers specialties from dermatology to psychiatry."]], "query": "what is telemedicine"} -{"output": [["lex", "Jainism teachings principles ahimsa karma"], ["lex", "Jain philosophy non-violence Mahavira"], ["vec", "what are the core teachings and beliefs of Jainism"], ["vec", "what did Mahavira teach about non-violence and the path to liberation in Jainism"], ["hyde", "Jainism, taught by Mahavira in the 6th century BCE, centers on ahimsa (non-violence), satya (truth), and aparigraha (non-attachment). Jains believe the soul is eternal, bound by karma accumulated through actions. Liberation (moksha) is achieved through right faith, right knowledge, and right conduct."]], "query": "what are the teachings of jainism"} -{"output": [["lex", "sustainable living eco-friendly lifestyle"], ["lex", "sustainable living reduce reuse recycle carbon footprint"], ["vec", "what does sustainable living mean and how can people practice it"], ["vec", "what are the key principles and habits of a sustainable lifestyle"], ["hyde", "Sustainable living means reducing your environmental impact by consuming fewer resources, choosing renewable energy, eating locally, minimizing waste, and favoring durable goods over disposable ones. It applies to housing, transportation, food, clothing, and daily consumption habits."]], "query": "what is sustainable living"} -{"output": [["lex", "XML parser parsing library"], ["lex", "XML DOM SAX parser programming"], ["lex", "XML parse Python JavaScript Java"], ["vec", "how to parse XML documents programmatically in different languages"], ["vec", "what are the common methods for reading and parsing XML files in code"], ["hyde", "To parse XML in Python, use `xml.etree.ElementTree`: `tree = ET.parse('file.xml'); root = tree.getroot()`. For streaming large files, use SAX with `xml.sax`. In JavaScript, use `DOMParser` or libraries like `fast-xml-parser`."]], "query": "xml parse"} -{"output": [["lex", "compound interest formula calculation rate"], ["lex", "compound interest savings investment growth"], ["vec", "how does compound interest grow money over time compared to simple interest"], ["vec", "what is the formula for compound interest and how is it calculated"], ["hyde", "Compound interest is calculated on both the principal and accumulated interest. The formula is A = P(1 + r/n)^(nt), where P is principal, r is annual rate, n is compounding frequency, and t is time in years. Monthly compounding on $10,000 at 5% yields $16,470 after 10 years."]], "query": "how does compound interest work"} -{"output": [["lex", "reason ethics moral philosophy rationalism"], ["lex", "reason morality Kant rational ethical judgment"], ["vec", "what role does reason play in making moral and ethical decisions"], ["vec", "how do philosophers like Kant argue that reason is the foundation of ethics"], ["hyde", "Kant held that reason alone can determine moral duty through the categorical imperative: act only according to maxims you could universalize. Rationalist ethics contrasts with sentimentalism (Hume), which grounds morality in emotion rather than rational deliberation."]], "query": "what is the role of reason in ethics"} -{"output": [["lex", "videography tips filming techniques camera"], ["lex", "video production shooting composition stabilization"], ["vec", "what are practical tips for improving videography and video shooting quality"], ["vec", "how to shoot better video with camera movement, lighting, and composition techniques"], ["hyde", "Stabilize shots with a gimbal or tripod. Follow the rule of thirds for framing. Shoot at 24fps for cinematic feel or 60fps for smooth slow motion. Use three-point lighting. Record clean audio separately with a lavalier or shotgun mic—audio quality matters more than resolution."]], "query": "videography tips"} -{"output": [["lex", "daycare choose selection criteria childcare"], ["lex", "daycare center evaluation safety ratio"], ["vec", "what should parents look for when choosing a daycare for their child"], ["vec", "how to evaluate and compare daycare centers for quality and safety"], ["hyde", "Visit multiple centers and observe interactions between staff and children. Check the staff-to-child ratio (1:4 for infants is ideal), licensing status, cleanliness, and safety measures. Ask about daily routines, curriculum, discipline policies, and staff qualifications and turnover."]], "query": "how to choose a daycare?"} -{"output": [["lex", "replace car alternator DIY steps"], ["lex", "alternator replacement belt removal installation"], ["vec", "step-by-step instructions for replacing a car alternator yourself"], ["vec", "how to remove and install a new alternator in a vehicle"], ["hyde", "Disconnect the negative battery terminal. Remove the serpentine belt by releasing the tensioner. Unplug the electrical connectors and unbolt the alternator. Install the new unit, reconnect the wiring, route the belt back on, and reconnect the battery. Test by checking voltage at 13.5-14.5V."]], "query": "how to replace car alternator?"} -{"output": [["lex", "create YouTube channel setup steps"], ["lex", "YouTube channel start grow subscribers content"], ["vec", "how to set up and launch a new YouTube channel from scratch"], ["vec", "what steps do you need to take to create and grow a YouTube channel"], ["hyde", "Sign in to YouTube with a Google account, click Create a Channel, and choose your channel name. Upload a profile picture and banner. Write a channel description with keywords. Plan a content schedule, create your first video, and optimize titles, thumbnails, and tags for search."]], "query": "how to create a youtube channel"} -{"output": [["lex", "mind-body dualism Descartes substance"], ["lex", "dualism philosophy of mind mental physical"], ["vec", "what is mind-body dualism and how does Descartes explain the relationship between mind and body"], ["vec", "how does dualism in philosophy argue that mind and body are separate substances"], ["hyde", "Cartesian dualism, proposed by René Descartes, holds that mind and body are two distinct substances: res cogitans (thinking substance) and res extensa (extended substance). The mind is non-physical and conscious; the body is physical and mechanistic. Their interaction remains the central problem."]], "query": "what is dualism in mind-body philosophy"} -{"output": [["lex", "cliffhanger literary device narrative suspense"], ["lex", "cliffhanger ending story plot tension"], ["vec", "what is a cliffhanger in storytelling and how does it create suspense"], ["vec", "how do writers use cliffhangers to keep readers or viewers engaged"], ["hyde", "A cliffhanger is a narrative device that ends a chapter, episode, or story at a moment of high suspense, leaving the outcome unresolved. It compels the audience to continue reading or watching. The term originates from serialized fiction where characters were literally left hanging from cliffs."]], "query": "what is cliffhanger?"} -{"output": [["lex", "volunteer civic initiatives community service"], ["lex", "volunteering local government community projects"], ["vec", "how can someone find and volunteer for civic engagement and community initiatives"], ["vec", "what are ways to get involved in local civic volunteer opportunities"], ["hyde", "Check your city's website or community board for volunteer openings on advisory committees, park cleanups, and voter registration drives. Organizations like VolunteerMatch and local nonprofits connect volunteers with civic projects. Attend town hall meetings to learn about current needs."]], "query": "how to volunteer for civic initiatives"} -{"output": [["lex", "Hinduism creation cycle Brahma Vishnu Shiva"], ["lex", "Hindu cosmology srishti sthiti pralaya"], ["vec", "how does Hinduism explain the cosmic cycle of creation, preservation, and destruction"], ["vec", "what is the Hindu view of the divine cycle involving Brahma, Vishnu, and Shiva"], ["hyde", "In Hindu cosmology, creation is cyclical. Brahma creates the universe, Vishnu preserves it, and Shiva destroys it so it can be reborn. Each cycle spans a kalpa (4.32 billion years). The universe undergoes endless cycles of srishti (creation), sthiti (preservation), and pralaya (dissolution)."]], "query": "how does hinduism view the divine cycle of creation?"} -{"output": [["lex", "consequentialism ethics utilitarianism outcomes"], ["lex", "consequentialist moral theory consequences actions"], ["vec", "what is consequentialist ethics and how does it judge the morality of actions"], ["vec", "how does consequentialism differ from deontological ethics in evaluating right and wrong"], ["hyde", "Consequentialism judges actions solely by their outcomes. The most influential form, utilitarianism (Bentham, Mill), holds that the right action maximizes overall happiness or well-being. Unlike deontology, which focuses on duties and rules, consequentialism permits any action if the results are good."]], "query": "what is consequentialist ethics"} -{"output": [["lex", "environmental awareness promotion education campaigns"], ["lex", "promote environmental sustainability community outreach"], ["vec", "how can individuals and organizations promote environmental awareness in their communities"], ["vec", "what are effective strategies for raising public awareness about environmental issues"], ["hyde", "Organize community cleanups, host documentary screenings, and partner with schools for environmental education programs. Use social media campaigns with clear calls to action. Start a local recycling or composting initiative. Create informational signage at parks and public spaces."]], "query": "how to promote environmental awareness?"} -{"output": [["lex", "self-love self-care practices mental health"], ["lex", "self-love habits self-compassion boundaries"], ["vec", "what are practical ways to practice self-love and self-compassion daily"], ["vec", "how to build self-love through healthy habits and positive self-talk"], ["hyde", "Practice self-love by setting boundaries, speaking to yourself with kindness, and prioritizing rest without guilt. Journal about what you appreciate about yourself. Replace self-criticism with curiosity: ask \"what do I need right now?\" instead of \"what's wrong with me?\""]], "query": "how to practice self-love"} -{"output": [["lex", "companion planting vegetables garden chart"], ["lex", "companion planting tomato basil marigold"], ["vec", "what is companion planting and which vegetables grow well together"], ["vec", "how does companion planting benefit vegetable gardens and deter pests"], ["hyde", "Companion planting pairs vegetables that benefit each other. Basil planted near tomatoes repels aphids and may improve flavor. Marigolds deter nematodes around most vegetables. The Three Sisters—corn, beans, and squash—is a classic trio: corn supports beans, beans fix nitrogen, squash shades soil."]], "query": "what is companion planting with vegetables"} -{"output": [["lex", "set achievable goals SMART goal setting"], ["lex", "goal setting strategy actionable realistic"], ["vec", "how to set realistic and achievable goals using the SMART framework"], ["vec", "what techniques help people set goals they can actually accomplish"], ["hyde", "Use the SMART framework: Specific (define exactly what you want), Measurable (quantify progress), Achievable (within your capabilities), Relevant (aligned with larger objectives), Time-bound (set a deadline). Break large goals into weekly milestones and track progress visually."]], "query": "how to set achievable goals?"} -{"output": [["lex", "animal behavior study ethology methods"], ["lex", "animal behavior research observation field experiments"], ["vec", "what methods do scientists use to study and analyze animal behavior"], ["vec", "how do ethologists observe and research animal behavior in the wild and in labs"], ["hyde", "Ethologists use direct observation, video tracking, and GPS telemetry to study animal behavior in natural habitats. Lab experiments control variables to test hypotheses about cognition and social behavior. Focal sampling follows one individual; scan sampling records group behavior at intervals."]], "query": "how do scientists study animal behavior"} -{"output": [["lex", "maintain motivation challenges resilience"], ["lex", "staying motivated difficult times strategies"], ["vec", "how to stay motivated when facing setbacks and difficult challenges"], ["vec", "what strategies help maintain motivation during tough periods in life or work"], ["hyde", "Break the challenge into small wins to maintain a sense of progress. Revisit your original purpose—why did you start? Celebrate incremental achievements. Build accountability through a partner or group. Accept setbacks as data rather than failure, and adjust your approach rather than your goal."]], "query": "how to maintain motivation through challenges?"} -{"output": [["lex", "philosophy of mind consciousness mental states"], ["lex", "philosophy of mind problem qualia dualism physicalism"], ["vec", "what is the philosophy of mind and what questions does it explore"], ["vec", "how does philosophy of mind address consciousness, mental states, and the mind-body problem"], ["hyde", "Philosophy of mind investigates the nature of consciousness, mental states, and their relationship to the physical brain. Central questions include the hard problem of consciousness (why subjective experience exists), whether mental states reduce to brain states, and the nature of intentionality and qualia."]], "query": "what is the philosophy of mind"} -{"output": [["lex", "enum class C++ Java strongly typed"], ["lex", "enum class Python enumeration members"], ["lex", "enum class scoped enumeration"], ["vec", "how to define and use enum classes in C++ or Java for type-safe enumerations"], ["vec", "what is the difference between an enum and an enum class in C++"], ["hyde", "In C++11, `enum class` creates a scoped, strongly typed enumeration. Unlike plain enums, values don't implicitly convert to int and must be accessed with the scope operator: `enum class Color { Red, Green, Blue }; Color c = Color::Red;`"]], "query": "enum class"} -{"output": [["lex", "sell art Etsy shop setup listing"], ["lex", "Etsy art shop pricing shipping prints"], ["vec", "how to set up an Etsy shop to sell original art and prints"], ["vec", "what tips help artists successfully sell artwork on Etsy"], ["hyde", "Create an Etsy seller account and set up your shop with a clear brand name and banner. Photograph art in natural light with a neutral background. Write detailed listings with keywords buyers search for. Price to cover materials, time, Etsy fees (6.5%), and shipping. Offer prints alongside originals."]], "query": "how to sell art on etsy?"} -{"output": [["lex", "virtue epistemology intellectual virtues knowledge"], ["lex", "virtue epistemology Sosa Zagzebski epistemic"], ["vec", "what is virtue epistemology and how does it differ from traditional theories of knowledge"], ["vec", "how does virtue epistemology evaluate knowledge based on intellectual character traits"], ["hyde", "Virtue epistemology evaluates beliefs based on the intellectual character of the knower rather than just the properties of the belief. Ernest Sosa's reliabilism treats virtues as reliable cognitive faculties; Linda Zagzebski's responsibilism focuses on traits like open-mindedness, intellectual courage, and thoroughness."]], "query": "what is virtue epistemology"} -{"output": [["lex", "ethical egoism moral theory self-interest"], ["lex", "ethical egoism Ayn Rand rational selfishness"], ["vec", "what is ethical egoism and how does it differ from psychological egoism"], ["vec", "how does ethical egoism argue that acting in self-interest is morally right"], ["hyde", "Ethical egoism holds that agents ought to act in their own self-interest. Unlike psychological egoism (a descriptive claim that people always act selfishly), ethical egoism is normative—it prescribes self-interest as the moral standard. Ayn Rand's rational self-interest is a well-known variant."]], "query": "what is ethical egoism"} -{"output": [["lex", "tech troubleshooting fix repair computer"], ["lex", "technology fix common problems software hardware"], ["lex", "tech support fix device issue"], ["vec", "how to troubleshoot and fix common technology problems with computers and devices"], ["vec", "what are basic tech fixes for common software and hardware issues"], ["hyde", "Start with a restart—it resolves most transient issues. Clear browser cache for web problems. Check cables and connections for hardware failures. Update drivers and firmware. For persistent crashes, check event logs and run diagnostics. Factory reset as a last resort after backing up data."]], "query": "tech fix"} -{"output": [["lex", "evaluate scientific sources credibility peer-reviewed"], ["lex", "scientific source evaluation criteria journal"], ["vec", "how to evaluate whether a scientific source or study is credible and reliable"], ["vec", "what criteria should you use to assess the quality of scientific research papers"], ["hyde", "Check if the study is published in a peer-reviewed journal with an impact factor. Examine the sample size, methodology, and statistical analysis. Look for conflicts of interest in funding disclosures. Verify the authors' credentials and institutional affiliations. Check citation count and whether results have been replicated."]], "query": "how to evaluate scientific sources"} -{"output": [["lex", "Taoism Daoism Lao Tzu Tao Te Ching"], ["lex", "Taoism philosophy wu wei yin yang"], ["vec", "what are the core beliefs and principles of Taoism"], ["vec", "what did Lao Tzu teach in the Tao Te Ching about the way and harmony with nature"], ["hyde", "Taoism (Daoism) is a Chinese philosophical and spiritual tradition rooted in the Tao Te Ching by Lao Tzu. The Tao (\"the Way\") is the fundamental, nameless force underlying all things. Core concepts include wu wei (effortless action), yin-yang balance, simplicity, and harmony with nature."]], "query": "what is taoism"} -{"output": [["lex", "neural network layers neurons weights backpropagation"], ["lex", "neural network deep learning forward pass activation"], ["vec", "how do artificial neural networks process data and learn from training"], ["vec", "what is the architecture and learning mechanism of a neural network"], ["hyde", "A neural network processes input through layers of interconnected neurons. Each neuron computes a weighted sum of its inputs, applies an activation function (ReLU, sigmoid), and passes the result forward. Training uses backpropagation to adjust weights by computing gradients of the loss function."]], "query": "how neural networks function"} -{"output": [["lex", "bonsai tree care maintenance watering pruning"], ["lex", "bonsai trimming repotting soil fertilizer"], ["vec", "how to properly care for and maintain a bonsai tree at home"], ["vec", "what are the watering, pruning, and soil requirements for bonsai trees"], ["hyde", "Water bonsai when the top half-inch of soil feels dry—never on a schedule. Place in bright indirect light for indoor species or full sun for outdoor varieties. Prune new growth to maintain shape. Repot every 2-3 years in spring using well-draining akadama-based soil. Fertilize biweekly during growing season."]], "query": "how to maintain a bonsai tree?"} -{"output": [["lex", "language philosophy linguistic turn Wittgenstein"], ["lex", "philosophy of language meaning reference semantics"], ["vec", "what role does language play in philosophical inquiry and analysis"], ["vec", "how did Wittgenstein and analytic philosophers view the relationship between language and thought"], ["hyde", "The linguistic turn of the 20th century made language central to philosophy. Wittgenstein argued that philosophical problems arise from misunderstandings of language. Analytic philosophers examine how meaning, reference, and truth conditions work. Ordinary language philosophy holds that everyday usage resolves many metaphysical puzzles."]], "query": "what role does language play in philosophy"} -{"output": [["lex", "organic pest control garden insects"], ["lex", "organic pesticide neem oil insecticidal soap"], ["vec", "how to control garden pests using organic and natural methods"], ["vec", "what organic pest control methods work for vegetable gardens"], ["hyde", "Spray neem oil or insecticidal soap to kill soft-bodied pests like aphids and whiteflies. Introduce beneficial insects: ladybugs eat aphids, parasitic wasps target caterpillars. Use row covers to physically exclude pests. Apply diatomaceous earth around plant bases for slugs and beetles."]], "query": "how to fight pests organically"} -{"output": [["lex", "research institutions universities role science"], ["lex", "research institutions funding labs innovation"], ["vec", "what role do research institutions and universities play in advancing science"], ["vec", "how do research institutions contribute to knowledge creation and innovation"], ["hyde", "Research institutions—universities, government labs, and private research organizations—drive scientific progress through funded investigations, peer-reviewed publications, and training of new researchers. They provide infrastructure (labs, equipment, libraries), facilitate collaboration, and translate findings into real-world applications."]], "query": "what is the role of research institutions"} -{"output": [["lex", "narrative ethics storytelling moral philosophy"], ["lex", "narrative ethics literature moral reasoning"], ["vec", "what is narrative ethics and how does storytelling relate to moral understanding"], ["vec", "how do narrative ethicists use stories and literature to explore moral questions"], ["hyde", "Narrative ethics holds that moral understanding is shaped by the stories we tell and hear. Rather than abstract principles, it emphasizes particular cases and lived experience. Literature, patient narratives in medicine, and personal testimony illuminate moral complexity that rules-based ethics may miss."]], "query": "what is narrative ethics"} -{"output": [["lex", "AIOps artificial intelligence IT operations"], ["lex", "AIOps monitoring anomaly detection automation"], ["lex", "AIOps MLOps machine learning operations"], ["vec", "what is AIOps and how does AI improve IT operations management"], ["vec", "how do AIOps platforms use machine learning for monitoring and incident response"], ["hyde", "AIOps (Artificial Intelligence for IT Operations) applies machine learning to IT operations data—logs, metrics, events—to detect anomalies, predict outages, and automate incident response. Platforms like Datadog, Splunk, and Moogsoft correlate alerts to reduce noise and speed up root cause analysis."]], "query": "ai ops"} -{"output": [["lex", "negotiate business deal tactics strategy"], ["lex", "business negotiation skills contract terms"], ["vec", "what are effective strategies for negotiating a business deal successfully"], ["vec", "how to prepare for and conduct a business negotiation to reach a favorable agreement"], ["hyde", "Prepare by researching the other party's priorities and constraints. Define your BATNA (best alternative to a negotiated agreement) and walk-away point. Open with an ambitious but defensible anchor. Listen more than you talk. Focus on interests, not positions, to find creative win-win solutions."]], "query": "how to negotiate a business deal"} -{"output": [["lex", "peaceful protest demonstration rights organizing"], ["lex", "nonviolent protest civil disobedience activism"], ["vec", "how to organize and participate in a peaceful protest effectively"], ["vec", "what are the principles and logistics of peaceful demonstration and nonviolent activism"], ["hyde", "Know your rights: peaceful assembly is protected by the First Amendment. Organize with clear goals, designated marshals, and a planned route. Coordinate with local authorities for permits. Bring water, ID, and emergency contacts. Stay nonviolent, document with video, and have legal observers present."]], "query": "how to protest peacefully"} -{"output": [["lex", "oil painting beginner supplies techniques"], ["lex", "oil painting start canvas brushes paints medium"], ["vec", "how to get started with oil painting as a beginner"], ["vec", "what supplies and techniques do beginners need to start oil painting"], ["hyde", "Start with a basic set of oil paints: titanium white, cadmium yellow, cadmium red, ultramarine blue, and burnt umber. Use medium-grade bristle brushes in sizes 4, 8, and 12. Work on pre-primed canvas. Thin early layers with odorless mineral spirits and use linseed oil for later layers (fat over lean)."]], "query": "how to start oil painting?"} -{"output": [["lex", "archetypes Carl Jung collective unconscious"], ["lex", "archetypes significance literature psychology"], ["vec", "what is the significance of archetypes in psychology and literature"], ["vec", "how did Carl Jung define archetypes and why do they appear across cultures"], ["hyde", "Carl Jung described archetypes as universal, inherited patterns in the collective unconscious—the Hero, the Shadow, the Trickster, the Great Mother. They recur across myths, dreams, and stories worldwide because they reflect fundamental human experiences and psychological structures shared by all cultures."]], "query": "what is the significance of archetypes?"} -{"output": [["lex", "oil painting color mixing palette technique"], ["lex", "mix oil paint colors complementary warm cool"], ["vec", "how to mix oil paint colors to achieve the right hues and values"], ["vec", "what is the proper technique for blending and mixing colors in oil painting"], ["hyde", "Mix on a glass or wood palette using a palette knife for clean blends. Start with the lighter color and add the darker one gradually. To mute a color, mix in its complement: add green to red, purple to yellow. Mix value (light/dark) separately from hue for better control."]], "query": "how to mix colors in oil painting?"} -{"output": [["lex", "good evil religion definition theology"], ["lex", "good evil Christianity Islam Buddhism Hinduism"], ["vec", "how do different world religions define and explain the concepts of good and evil"], ["vec", "what are the religious perspectives on good versus evil across Christianity, Islam, Buddhism, and Hinduism"], ["hyde", "Christianity frames evil as separation from God through sin, with goodness as alignment with divine will. Islam teaches that evil arises from disobeying Allah's commands. Buddhism sees evil as rooted in ignorance, greed, and hatred rather than a cosmic force. Hinduism links good and evil to dharma and karma."]], "query": "how do different religions define good and evil?"} -{"output": [["lex", "sailboat sailing types rigging"], ["lex", "sailboat buy beginner learn to sail"], ["lex", "sailboat parts hull keel mast"], ["vec", "what are the different types of sailboats and how do they work"], ["vec", "how to get started with sailboat sailing as a beginner"], ["hyde", "Sailboats are propelled by wind acting on sails. Common types include dinghies (small, single-hull), keelboats (weighted keel for stability), catamarans (twin hulls), and sloops (single mast, fore-and-aft rigged). Key parts include the hull, mast, boom, jib, mainsail, rudder, and keel."]], "query": "sail boat"} -{"output": [["lex", "CRISPR Cas9 gene editing mechanism"], ["lex", "CRISPR technology DNA guide RNA"], ["vec", "how does CRISPR-Cas9 gene editing technology work at the molecular level"], ["vec", "what is the mechanism by which CRISPR cuts and edits DNA sequences"], ["hyde", "CRISPR-Cas9 uses a guide RNA (gRNA) complementary to the target DNA sequence. The gRNA directs the Cas9 nuclease to the precise genomic location, where it creates a double-strand break. The cell's repair machinery then either disrupts the gene (NHEJ) or inserts a new sequence (HDR) using a provided template."]], "query": "how crispr technology works"} -{"output": [["lex", "haircut styles men women trends"], ["lex", "haircut salon barbershop near me"], ["lex", "haircut techniques layered fade trim"], ["vec", "what are the popular haircut styles and how to choose the right one"], ["vec", "how to communicate what haircut you want to a stylist or barber"], ["hyde", "Popular haircuts include the bob, pixie cut, and layers for women, and the fade, crew cut, and textured crop for men. Choose based on face shape: round faces suit angular cuts, long faces benefit from volume at the sides. Bring reference photos to your appointment for clear communication."]], "query": "hair cut"} -{"output": [["lex", "art portfolio development pieces selection"], ["lex", "art portfolio presentation layout artist"], ["vec", "how to build a strong art portfolio for school applications or professional work"], ["vec", "what should an art portfolio include and how should it be organized"], ["hyde", "Select 15-20 of your strongest, most cohesive pieces that demonstrate range and skill. Open and close with your best work. Show process sketches alongside finished pieces. Use consistent, high-quality photography. For digital portfolios, use platforms like Behance or a personal website with clean navigation."]], "query": "how to develop an art portfolio?"} -{"output": [["lex", "atmospheric science meteorology climate weather"], ["lex", "atmospheric science atmosphere composition dynamics"], ["vec", "what is atmospheric science and what topics does it study"], ["vec", "how does atmospheric science explain weather, climate, and the Earth's atmosphere"], ["hyde", "Atmospheric science studies the Earth's atmosphere—its composition, structure, and dynamics. Sub-fields include meteorology (weather forecasting), climatology (long-term patterns), atmospheric chemistry (ozone, pollutants), and atmospheric physics (radiation, cloud formation). It underpins weather prediction and climate change research."]], "query": "what is atmospheric science"} -{"output": [["lex", "mortgage application process requirements"], ["lex", "apply mortgage home loan pre-approval credit score"], ["vec", "what are the steps to apply for a home mortgage loan"], ["vec", "how to prepare your finances and documents to apply for a mortgage"], ["hyde", "Check your credit score (aim for 620+, 740+ for best rates). Save for a down payment of 3-20%. Get pre-approved with a lender by submitting W-2s, pay stubs, bank statements, and tax returns. Compare rates from multiple lenders. Once you find a home, submit the full application and await underwriting."]], "query": "how to apply for a mortgage"} -{"output": [["lex", "political poll analysis methodology"], ["lex", "polling data interpretation margin error"], ["lex", "election survey statistics"], ["vec", "what methods are used to analyze and interpret political polling data"], ["vec", "how to evaluate the accuracy and reliability of election polls"], ["vec", "understanding margin of error and sample size in political surveys"], ["hyde", "To analyze a political poll, start by examining the sample size, methodology, and margin of error. A poll of 1,000 likely voters with a ±3% margin means the true value falls within that range 95% of the time. Compare results across multiple polls using polling averages to reduce noise."]], "query": "how to analyze political polls"} -{"output": [["lex", "homeostasis regulation human body"], ["lex", "negative feedback loop physiology"], ["lex", "body temperature pH blood glucose regulation"], ["vec", "what mechanisms does the human body use to maintain internal stability"], ["vec", "how do feedback loops help regulate body temperature and blood sugar levels"], ["hyde", "The body maintains homeostasis through negative feedback loops. When blood glucose rises after a meal, the pancreas releases insulin, signaling cells to absorb glucose. When body temperature drops, the hypothalamus triggers shivering and vasoconstriction to conserve heat."]], "query": "how does the body maintain homeostasis"} -{"output": [["lex", "transplant seedlings garden"], ["lex", "seedling hardening off repotting"], ["lex", "moving seedlings outdoors soil"], ["vec", "what is the correct process for transplanting seedlings from pots into the garden"], ["vec", "when and how should you harden off and transplant young plants outdoors"], ["hyde", "Transplant seedlings after hardening them off for 7-10 days. Dig a hole slightly larger than the root ball, gently remove the seedling from its pot, and place it at the same depth it was growing. Water thoroughly and mulch around the base to retain moisture."]], "query": "how to transplant seedlings?"} -{"output": [["lex", "reading graphs charts data visualization"], ["lex", "interpret bar line pie chart"], ["lex", "graph axis scale data trends"], ["vec", "how do you read and interpret different types of graphs and charts correctly"], ["vec", "what should you look for when analyzing data presented in visual charts"], ["hyde", "To interpret a graph, first read the title and axis labels to understand what is being measured. Identify the scale and units. For line charts, look at trends over time. For bar charts, compare heights across categories. Always check whether the y-axis starts at zero, as truncated axes can exaggerate differences."]], "query": "how to interpret graphs and charts"} -{"output": [["lex", "sketchbook practice beginner drawing"], ["lex", "daily sketching habit art journal"], ["lex", "first sketchbook tips supplies"], ["vec", "how do beginners start and maintain a regular sketchbook practice"], ["vec", "what supplies and techniques should you use when starting your first sketchbook"], ["hyde", "Start your sketchbook by choosing a book with paper weight of at least 80gsm. Begin with simple observational drawings of everyday objects. Draw for 10-15 minutes daily without worrying about perfection. Use pencil, pen, or whatever feels comfortable. Date each page to track your progress."]], "query": "how to start a sketchbook?"} -{"output": [["lex", "jainism core teachings principles"], ["lex", "ahimsa anekantavada aparigraha jain"], ["lex", "jain dharma beliefs nonviolence"], ["vec", "what are the central beliefs and philosophical teachings of Jainism"], ["vec", "how do Jain principles like ahimsa and anekantavada guide ethical living"], ["hyde", "Jainism teaches three core principles: ahimsa (nonviolence toward all living beings), anekantavada (many-sidedness of truth), and aparigraha (non-attachment to possessions). The path to liberation involves the Three Jewels: right faith, right knowledge, and right conduct. Jains practice strict vegetarianism and asceticism."]], "query": "what are the main teachings of jainism?"} -{"output": [["lex", "living room curtain selection fabric"], ["lex", "curtain length style window treatment"], ["lex", "drapes color pattern room decor"], ["vec", "how do you choose the right curtains for a living room based on style and function"], ["vec", "what curtain fabric length and color work best for different living room windows"], ["hyde", "Choose curtains that hang 1-2 inches above the floor for a polished look. For a small living room, use light-colored sheer fabrics to maximize natural light. Mount the curtain rod 4-6 inches above the window frame and extend it 3-8 inches beyond each side to make windows appear larger."]], "query": "how to choose curtains for living room"} -{"output": [["lex", "macro photography technique close-up"], ["lex", "macro lens focus stacking lighting"], ["lex", "close-up photography camera settings"], ["vec", "what camera settings and equipment do you need for macro photography"], ["vec", "how to achieve sharp focus and good lighting in close-up macro shots"], ["hyde", "For macro photography, use a dedicated macro lens (60mm or 100mm) or extension tubes. Set your aperture to f/8-f/16 for sufficient depth of field. Use a tripod and remote shutter to eliminate camera shake. Focus stacking—taking multiple shots at different focus distances—produces sharp images throughout the subject."]], "query": "how to take macro photos"} -{"output": [["lex", "query letter writing literary agent"], ["lex", "book manuscript submission query format"], ["lex", "query letter hook synopsis comp titles"], ["vec", "how do you write an effective query letter to a literary agent for your novel"], ["vec", "what structure and elements should a query letter include for book submissions"], ["hyde", "A query letter has three paragraphs: the hook (a compelling one-sentence pitch), the mini-synopsis (250 words covering the protagonist, conflict, and stakes), and the bio (your credentials and comp titles). Address the agent by name, mention why you chose them, and keep the entire letter under one page."]], "query": "how to write a query letter?"} -{"output": [["lex", "plasmid DNA circular extrachromosomal"], ["lex", "plasmid bacteria gene transfer cloning"], ["lex", "plasmid vector molecular biology"], ["vec", "what are plasmids and what role do they play in bacterial genetics"], ["vec", "how are plasmids used as vectors in molecular biology and genetic engineering"], ["hyde", "Plasmids are small, circular, double-stranded DNA molecules found in bacteria that replicate independently of chromosomal DNA. They often carry genes for antibiotic resistance. In genetic engineering, plasmids serve as vectors to insert foreign genes into host cells for cloning and protein expression."]], "query": "what are plasmids"} -{"output": [["lex", "atomic clock time measurement precision"], ["lex", "cesium clock seconds SI definition"], ["lex", "timekeeping scientific instruments"], ["vec", "how do atomic clocks and other instruments allow scientists to measure time with extreme precision"], ["vec", "what is the scientific definition of a second and how is it measured"], ["hyde", "The SI second is defined by the cesium-133 atom, which oscillates 9,192,631,770 times per second. Atomic clocks use this transition frequency to achieve accuracy within one second over millions of years. Optical lattice clocks using strontium atoms are even more precise, losing less than one second over the age of the universe."]], "query": "how do scientists accurately measure time"} -{"output": [["lex", "professional networking career connections"], ["lex", "LinkedIn networking events industry contacts"], ["lex", "building professional relationships mentorship"], ["vec", "what are effective strategies for building and maintaining a professional network"], ["vec", "how can attending events and using LinkedIn help grow your career network"], ["hyde", "Build your professional network by attending industry conferences, joining professional associations, and engaging on LinkedIn. Follow up within 48 hours of meeting someone new. Offer value before asking for favors—share articles, make introductions, or provide feedback. Schedule regular coffee chats to maintain relationships."]], "query": "how to build a professional network?"} -{"output": [["lex", "sacred symbols religious meaning"], ["lex", "spiritual symbols cross om menorah lotus"], ["lex", "religious iconography symbolism significance"], ["vec", "what role do sacred symbols play in religious and spiritual traditions"], ["vec", "how do symbols like the cross, om, and menorah carry meaning in their respective faiths"], ["hyde", "Sacred symbols serve as tangible expressions of spiritual truths across religions. The Christian cross represents sacrifice and redemption, the Hindu Om embodies the primordial sound of creation, and the Jewish menorah symbolizes divine light. These symbols anchor believers' faith and create shared identity within communities."]], "query": "what is the significance of sacred symbols?"} -{"output": [["lex", "digital marketing career skills"], ["lex", "SEO social media analytics marketing job"], ["lex", "digital marketing certifications portfolio"], ["vec", "what skills and experience do you need to build a successful digital marketing career"], ["vec", "how to get started in digital marketing and advance to senior roles"], ["hyde", "A digital marketing career requires proficiency in SEO, paid advertising (Google Ads, Meta Ads), content marketing, email marketing, and analytics tools like Google Analytics. Build a portfolio with real campaigns. Earn certifications from Google, HubSpot, or Meta. Entry-level roles include marketing coordinator or social media specialist."]], "query": "how to succeed in a digital marketing career?"} -{"output": [["lex", "Europe trip planning itinerary budget"], ["lex", "European travel visa flights accommodations"], ["lex", "backpacking Europe route booking tips"], ["vec", "how do you plan and budget for a multi-country trip across Europe"], ["vec", "what are the steps for organizing flights, accommodations, and itineraries for European travel"], ["hyde", "Plan your Europe trip 3-6 months ahead. Book flights early for the best fares. Get a Eurail pass if visiting 3+ countries. Budget €50-150/day depending on the country. Book accommodations on Booking.com or Hostelworld. Check visa requirements—US citizens can stay 90 days in the Schengen Area without a visa."]], "query": "how to plan a trip to europe?"} -{"output": [["lex", "machine learning business applications"], ["lex", "ML AI enterprise automation prediction"], ["lex", "machine learning revenue customer analytics"], ["vec", "how are businesses using machine learning to improve operations and decision-making"], ["vec", "what impact does machine learning have on business revenue and efficiency"], ["hyde", "Machine learning transforms businesses through demand forecasting, customer churn prediction, fraud detection, and recommendation engines. Retailers use ML to optimize pricing and inventory. Banks deploy ML models for credit scoring. Companies using ML-driven analytics report 5-10% increases in revenue through personalized marketing."]], "query": "how machine learning influences businesses"} -{"output": [["lex", "memoir characteristics literary genre"], ["lex", "memoir vs autobiography personal narrative"], ["lex", "memoir writing elements structure"], ["vec", "what distinguishes a memoir from other forms of autobiographical writing"], ["vec", "what are the key literary features and structure of a memoir"], ["hyde", "A memoir focuses on a specific theme or period in the author's life, unlike an autobiography which covers an entire life chronologically. Key characteristics include a first-person narrative voice, emotional honesty, reflection on personal growth, vivid sensory details, and a thematic arc that gives the story universal resonance."]], "query": "what are the main characteristics of memoirs?"} -{"output": [["lex", "Sikh faith practices worship"], ["lex", "gurdwara langar five Ks Sikhism"], ["lex", "Sikh prayer Guru Granth Sahib"], ["vec", "what are the daily religious practices and rituals observed by Sikhs"], ["vec", "how do Sikhs worship in the gurdwara and observe the five Ks"], ["hyde", "Sikhs practice their faith through daily prayers (Nitnem), including Japji Sahib at dawn. They worship at the gurdwara, where the Guru Granth Sahib is read aloud. Baptized Sikhs wear the five Ks: kesh (uncut hair), kangha (comb), kara (steel bracelet), kachera (undergarment), and kirpan (ceremonial sword). Langar, the communal kitchen, serves free meals to all visitors."]], "query": "how do sikhs practice their faith"} -{"output": [["lex", "feminist ethics care theory foundations"], ["lex", "feminist moral philosophy gender justice"], ["lex", "ethics of care Gilligan Noddings feminist"], ["vec", "what are the core principles and philosophical foundations of feminist ethics"], ["vec", "how does feminist ethics differ from traditional moral philosophy in its approach to care and justice"], ["hyde", "Feminist ethics emerged from Carol Gilligan's critique of Kohlberg's moral development theory, arguing that women's moral reasoning emphasizes care and relationships rather than abstract principles of justice. Nel Noddings developed the ethics of care, centering moral life on attentiveness, responsibility, and responsiveness to the needs of particular others."]], "query": "what are the foundations of feminist ethics"} -{"output": [["lex", "antibiotics mechanism action bacteria"], ["lex", "antibiotic cell wall protein synthesis inhibition"], ["lex", "bactericidal bacteriostatic penicillin"], ["vec", "how do antibiotics kill or inhibit the growth of bacteria in the human body"], ["vec", "what are the different mechanisms by which antibiotics target bacterial cells"], ["hyde", "Antibiotics work by targeting structures unique to bacteria. Penicillin and cephalosporins inhibit cell wall synthesis, causing bacteria to burst. Tetracyclines block the 30S ribosomal subunit, preventing protein synthesis. Fluoroquinolones inhibit DNA gyrase, stopping bacterial DNA replication. Antibiotics are classified as bactericidal (kill bacteria) or bacteriostatic (stop growth)."]], "query": "how do antibiotics work"} -{"output": [["lex", "geothermal energy heat earth power"], ["lex", "geothermal power plant electricity generation"], ["lex", "geothermal renewable energy underground"], ["vec", "how does geothermal energy work and how is it used to generate electricity"], ["vec", "what are the advantages and limitations of geothermal energy as a renewable source"], ["hyde", "Geothermal energy harnesses heat from the Earth's interior. Hot water and steam from underground reservoirs drive turbines to generate electricity. Geothermal power plants operate at over 90% capacity factor, far higher than wind or solar. Iceland generates 25% of its electricity from geothermal sources."]], "query": "what is geothermal energy?"} -{"output": [["lex", "bill becomes law legislative process"], ["lex", "US Congress legislation committee vote"], ["lex", "bill passage House Senate president sign"], ["vec", "what are the steps a bill goes through in the US Congress to become a law"], ["vec", "how does the legislative process work from bill introduction to presidential signature"], ["hyde", "A bill is introduced in the House or Senate and assigned to a committee. The committee holds hearings, marks up the bill, and votes. If passed, it goes to the full chamber for debate and a vote. Both chambers must pass identical versions. Differences are resolved in a conference committee. The final bill goes to the President, who can sign it into law or veto it."]], "query": "how does a bill become a law"} -{"output": [["lex", "ethics vs morals difference"], ["lex", "ethics morals philosophy distinction"], ["lex", "moral principles ethical systems comparison"], ["vec", "what is the distinction between ethics and morals in philosophy"], ["vec", "how do personal morals differ from ethical systems and codes of conduct"], ["hyde", "Ethics refers to systematic, philosophical frameworks for determining right and wrong—such as utilitarianism or deontology. Morals are personal beliefs about right and wrong shaped by culture, religion, and upbringing. Ethics are prescriptive rules applied to groups (medical ethics, business ethics), while morals are individual convictions."]], "query": "what is the difference between ethics and morals"} -{"output": [["lex", "Silk Road ancient trade route"], ["lex", "Silk Road China Rome trade network"], ["lex", "Silk Road history commerce cultural exchange"], ["vec", "what was the historical Silk Road and what goods and ideas were traded along it"], ["vec", "how did the Silk Road connect civilizations between China and the Mediterranean"], ["hyde", "The Silk Road was a network of trade routes connecting China to the Mediterranean from the 2nd century BCE to the 15th century CE. Merchants traded silk, spices, gold, and jade. Beyond goods, the Silk Road facilitated the spread of Buddhism, Islam, papermaking, and gunpowder across Eurasia."]], "query": "what was the silk road"} -{"output": [["lex", "beauty philosophy aesthetics significance"], ["lex", "aesthetics Kant Plato beauty philosophical"], ["lex", "philosophy of beauty sublime art"], ["vec", "how have philosophers understood and defined the concept of beauty throughout history"], ["vec", "what is the philosophical significance of beauty in aesthetics from Plato to Kant"], ["hyde", "In Plato's Symposium, beauty is a ladder ascending from physical attraction to the Form of Beauty itself. Kant distinguished between the beautiful (harmonious, universal pleasure) and the sublime (overwhelming grandeur). For Hegel, beauty in art reveals truth through sensory form. Contemporary aesthetics debates whether beauty is objective or culturally constructed."]], "query": "what is the significance of beauty in philosophy"} -{"output": [["lex", "contact elected officials representatives"], ["lex", "write letter call congressman senator"], ["lex", "constituent advocacy elected official communication"], ["vec", "what are effective ways to communicate your concerns to elected officials"], ["vec", "how to write letters or make phone calls to your congressional representatives"], ["hyde", "The most effective way to reach your elected officials is a phone call to their district office. Identify yourself as a constituent, state the bill number, and clearly state your position in under 60 seconds. Personalized letters are more impactful than form emails. Attend town halls for face-to-face interaction."]], "query": "how to communicate with elected officials"} -{"output": [["lex", "phenomenology philosophy Husserl"], ["lex", "phenomenological method consciousness experience"], ["lex", "phenomenology Heidegger Merleau-Ponty intentionality"], ["vec", "what is phenomenology and how does it study conscious experience"], ["vec", "how did Husserl and Heidegger develop phenomenology as a philosophical method"], ["hyde", "Phenomenology is a philosophical method founded by Edmund Husserl that studies the structures of conscious experience as they appear to the subject. Through \"bracketing\" (epoché), the phenomenologist suspends assumptions about the external world to describe phenomena as they are experienced. Heidegger extended this into an analysis of Being-in-the-world."]], "query": "what is phenomenology"} -{"output": [["lex", "improve concentration focus techniques"], ["lex", "attention span deep work focus tips"], ["lex", "concentration exercises mindfulness pomodoro"], ["vec", "what techniques and habits can help you improve focus and concentration"], ["vec", "how can mindfulness and time management methods like Pomodoro improve attention"], ["hyde", "Improve concentration by eliminating distractions: silence notifications, use website blockers, and work in a quiet environment. The Pomodoro Technique—25 minutes of focused work followed by a 5-minute break—builds sustained attention. Regular exercise, adequate sleep (7-9 hours), and mindfulness meditation physically strengthen the brain's prefrontal cortex."]], "query": "how to enhance concentration"} -{"output": [["lex", "theory of relativity Einstein"], ["lex", "special general relativity spacetime gravity"], ["lex", "E=mc2 Einstein relativity physics"], ["vec", "what are Einstein's special and general theories of relativity and what do they explain"], ["vec", "how does the theory of relativity describe the relationship between space time and gravity"], ["hyde", "Einstein's special relativity (1905) states that the speed of light is constant for all observers and that time dilates at high velocities (E=mc²). General relativity (1915) describes gravity not as a force but as the curvature of spacetime caused by mass and energy. Massive objects bend spacetime, and objects follow curved paths."]], "query": "what is the theory of relativity"} -{"output": [["lex", "depth of field photography aperture"], ["lex", "DOF shallow deep focus bokeh"], ["lex", "aperture f-stop focal length depth field"], ["vec", "what is depth of field in photography and how does aperture affect it"], ["vec", "how do aperture, focal length, and distance control the depth of field in a photo"], ["hyde", "Depth of field (DOF) is the range of distance in a photo that appears acceptably sharp. A wide aperture (f/1.8) produces a shallow DOF with a blurred background (bokeh), ideal for portraits. A narrow aperture (f/16) produces deep DOF where everything is sharp, suited for landscapes. Focal length and subject distance also affect DOF."]], "query": "what is depth of field?"} -{"output": [["lex", "haiku poem writing syllable"], ["lex", "haiku 5-7-5 Japanese poetry"], ["lex", "haiku nature season kigo structure"], ["vec", "what are the rules and structure for writing a traditional haiku poem"], ["vec", "how do you compose a haiku with the 5-7-5 syllable pattern and seasonal reference"], ["hyde", "A haiku is a three-line Japanese poem with a 5-7-5 syllable structure. Traditional haiku includes a kigo (seasonal word) and a kireji (cutting word) that creates a pause or shift. Example: \"An old silent pond / A frog jumps into the pond— / Splash! Silence again.\" Focus on a single moment in nature observed with clarity."]], "query": "how to write a haiku"} -{"output": [["lex", "political misinformation combat fact-checking"], ["lex", "fake news disinformation media literacy"], ["lex", "countering political misinformation strategies"], ["vec", "what strategies can be used to identify and counter political misinformation"], ["vec", "how can media literacy and fact-checking help address false political claims"], ["hyde", "Combat political misinformation by checking claims against nonpartisan fact-checkers like PolitiFact, Snopes, and FactCheck.org. Verify the original source before sharing. Teach media literacy skills: examine the URL, author credentials, and whether other outlets confirm the story. Prebunking—warning people about manipulation techniques before exposure—is more effective than debunking after the fact."]], "query": "how to address misinformation in politics"} -{"output": [["lex", "philosophy of humor laughter theory"], ["lex", "incongruity superiority relief theory humor"], ["lex", "humor philosophy comedy Bergson"], ["vec", "what are the main philosophical theories that explain why things are funny"], ["vec", "how do incongruity theory, superiority theory, and relief theory explain humor"], ["hyde", "Three major theories explain humor. Superiority theory (Hobbes) says we laugh at others' misfortunes. Relief theory (Freud) says laughter releases nervous energy. Incongruity theory (Kant, Schopenhauer) says humor arises when expectations are violated—we laugh at the gap between what we expect and what occurs."]], "query": "what is the philosophy of humor?"} -{"output": [["lex", "determinism free will debate"], ["lex", "causal determinism libertarian compatibilism"], ["lex", "free will philosophy hard determinism"], ["vec", "how does philosophical determinism pose a challenge to the concept of free will"], ["vec", "can free will exist if every event is causally determined by prior events"], ["hyde", "Determinism holds that every event, including human choices, is the inevitable result of prior causes. If our decisions are fully determined by brain states, genetics, and environment, then free will appears illusory. Compatibilists like Hume argue free will means acting on one's desires without external coercion, which is compatible with determinism."]], "query": "how does determinism challenge free will"} -{"output": [["lex", "writing compelling story ending"], ["lex", "novel ending techniques resolution climax"], ["lex", "satisfying conclusion fiction writing"], ["vec", "what techniques do authors use to write powerful and satisfying story endings"], ["vec", "how to craft a compelling ending that resolves the plot and resonates emotionally"], ["hyde", "A compelling ending resolves the central conflict while delivering an emotional payoff. Techniques include the circular ending (returning to an opening image with new meaning), the surprise twist (recontextualizing everything), and the resonant final image. Avoid deus ex machina. The ending should feel both surprising and inevitable—earned by what came before."]], "query": "how to write compelling endings?"} -{"output": [["lex", "scientific presentation engaging tips"], ["lex", "science talk slides audience storytelling"], ["lex", "research presentation design delivery"], ["vec", "how can scientists make their research presentations more engaging and accessible"], ["vec", "what techniques improve the delivery and visual design of scientific talks"], ["hyde", "Make scientific presentations engaging by opening with a question or surprising finding rather than an outline slide. Use large visuals and minimal text—no more than 6 words per slide. Tell a story: setup the problem, build tension with the data, and deliver the conclusion as a punchline. Practice to stay under time and make eye contact."]], "query": "how to make scientific presentations engaging"} -{"output": [["lex", "graphic tablet drawing digital art"], ["lex", "Wacom drawing tablet pen pressure"], ["lex", "digital drawing tablet beginner setup"], ["vec", "how do you set up and start drawing with a graphic tablet for digital art"], ["vec", "what are tips for beginners learning to draw on a Wacom or similar tablet"], ["hyde", "Set up your graphic tablet by installing the driver software and calibrating pen pressure. Start in a drawing program like Clip Studio Paint or Krita. The key challenge is hand-eye coordination—you draw on the tablet but look at the screen. Practice simple lines and circles to build muscle memory. Adjust pressure sensitivity curves to match your drawing style."]], "query": "how to draw with a graphic tablet?"} -{"output": [["lex", "capsule wardrobe essentials minimalist"], ["lex", "capsule wardrobe build pieces mix match"], ["lex", "minimalist wardrobe basics clothing"], ["vec", "how do you create a capsule wardrobe with a minimal set of versatile clothing pieces"], ["vec", "what are the essential items and steps to build a functional capsule wardrobe"], ["hyde", "A capsule wardrobe consists of 30-40 versatile pieces that mix and match. Start by choosing a neutral color palette (black, navy, white, beige). Include 2-3 pairs of pants, 5-7 tops, 2 jackets, 2 pairs of shoes, and 1-2 dresses or suits. Remove items you haven't worn in a year. Invest in quality basics over trendy pieces."]], "query": "how to build a capsule wardrobe"} -{"output": [["lex", "Berlin Wall impact fall 1989"], ["lex", "Berlin Wall Cold War Germany division"], ["lex", "Berlin Wall consequences reunification"], ["vec", "what was the historical impact of the Berlin Wall on Germany and the Cold War"], ["vec", "how did the fall of the Berlin Wall in 1989 change Europe and global politics"], ["hyde", "The Berlin Wall divided East and West Berlin from 1961 to 1989, symbolizing the Iron Curtain between communist and capitalist worlds. Its fall on November 9, 1989, triggered German reunification in 1990 and accelerated the collapse of communist regimes across Eastern Europe, effectively ending the Cold War."]], "query": "what was the impact of the berlin wall?"} -{"output": [["lex", "classic literature novels canon"], ["lex", "classic books literary fiction great works"], ["lex", "classic literature reading list authors"], ["vec", "what are the most important works of classic literature and why are they significant"], ["vec", "which classic novels and authors are considered essential reading in the Western literary canon"], ["hyde", "Classic literature includes works that have stood the test of time for their artistic merit, universal themes, and cultural influence. Essential classics include Homer's Odyssey, Shakespeare's Hamlet, Austen's Pride and Prejudice, Dostoevsky's Crime and Punishment, and Fitzgerald's The Great Gatsby."]], "query": "classic literature"} -{"output": [["lex", "homemade slime recipe DIY"], ["lex", "slime glue borax contact solution"], ["lex", "make slime kids craft"], ["vec", "what ingredients and steps do you need to make slime at home"], ["vec", "how to make homemade slime using glue and borax or contact lens solution"], ["hyde", "Mix 1/2 cup of white PVA glue with 1/2 cup of liquid starch or 1 tablespoon of borax dissolved in 1 cup of water. Stir until the slime pulls away from the bowl. Knead with your hands for 2-3 minutes until smooth. Add food coloring or glitter before mixing for a custom look. Store in an airtight container."]], "query": "how to make slime at home"} -{"output": [["lex", "climate change ethics moral responsibility"], ["lex", "climate ethics justice intergenerational"], ["lex", "environmental ethics carbon emissions moral"], ["vec", "what are the ethical and moral dimensions of climate change and environmental responsibility"], ["vec", "how do philosophers approach questions of climate justice and intergenerational obligation"], ["hyde", "Climate ethics addresses who bears moral responsibility for carbon emissions and their consequences. Key questions include intergenerational justice (obligations to future generations), distributive justice (developing nations suffer most but polluted least), and the tragedy of the commons. Philosophers debate whether current generations owe a carbon debt to those who will inherit a warmer world."]], "query": "what is the ethics of climate change"} -{"output": [["lex", "leadership qualities traits effective"], ["lex", "leader skills communication vision integrity"], ["lex", "leadership characteristics management"], ["vec", "what personal qualities and traits define an effective leader"], ["vec", "which skills and characteristics are most important for strong leadership"], ["hyde", "Effective leaders demonstrate integrity, clear communication, empathy, and decisiveness. They articulate a compelling vision and inspire others to work toward shared goals. Key qualities include emotional intelligence, accountability, adaptability under pressure, and the ability to delegate while empowering team members to take ownership."]], "query": "what are leadership qualities"} -{"output": [["lex", "credit score vs credit report difference"], ["lex", "credit report FICO score bureaus"], ["lex", "credit score number credit report history"], ["vec", "what is the difference between a credit score and a credit report"], ["vec", "how does a credit report relate to the credit score number lenders use"], ["hyde", "A credit report is a detailed record of your credit history maintained by bureaus (Equifax, Experian, TransUnion). It lists accounts, payment history, balances, and inquiries. A credit score is a three-digit number (300-850) calculated from your credit report data. FICO scores weigh payment history (35%), amounts owed (30%), length of history (15%), new credit (10%), and credit mix (10%)."]], "query": "what is the difference between a credit score and a credit report"} -{"output": [["lex", "homemade pizza dough recipe"], ["lex", "pizza from scratch oven toppings"], ["lex", "make pizza dough sauce crust"], ["vec", "how do you make pizza from scratch at home with homemade dough and sauce"], ["vec", "what is the best recipe for homemade pizza dough and how do you bake it"], ["hyde", "Mix 3 cups flour, 1 packet yeast, 1 tsp salt, 1 tbsp olive oil, and 1 cup warm water. Knead for 10 minutes and let rise 1 hour. Stretch the dough on a floured surface, spread tomato sauce, add mozzarella and toppings. Bake at 475°F (245°C) on a preheated pizza stone for 10-12 minutes until the crust is golden."]], "query": "how to make homemade pizza"} -{"output": [["lex", "workplace productivity improvement strategies"], ["lex", "employee productivity time management office"], ["lex", "work efficiency focus deep work"], ["vec", "what strategies and techniques can improve productivity in the workplace"], ["vec", "how can employees and managers increase work output and reduce wasted time"], ["hyde", "Improve workplace productivity by eliminating unnecessary meetings, batching similar tasks together, and protecting blocks of uninterrupted focus time. Use the Eisenhower Matrix to prioritize tasks by urgency and importance. Managers should set clear goals, reduce bureaucratic overhead, and ensure employees have the tools and autonomy they need."]], "query": "how to improve workplace productivity"} -{"output": [["lex", "clergy role Christianity priest pastor"], ["lex", "Christian minister ordained church leadership"], ["lex", "priest pastor deacon church clergy duties"], ["vec", "what roles and responsibilities do clergy members serve in Christian churches"], ["vec", "how do priests, pastors, and deacons function within different Christian denominations"], ["hyde", "Christian clergy serve as spiritual leaders, administering sacraments, preaching sermons, and providing pastoral care. In Catholicism, ordained priests celebrate Mass, hear confessions, and perform baptisms. Protestant pastors focus on preaching and teaching Scripture. Deacons serve the community through charity and administrative support. The clergy structure varies widely across denominations."]], "query": "what is the role of clergy in christianity"} -{"output": [["lex", "virtue ethics Aristotle moral character"], ["lex", "virtue ethics eudaimonia character traits"], ["lex", "Aristotelian ethics virtues vices"], ["vec", "how does virtue ethics evaluate moral action based on character rather than rules"], ["vec", "what is Aristotle's approach to virtue ethics and how does it define the good life"], ["hyde", "Virtue ethics, rooted in Aristotle's Nicomachean Ethics, holds that moral action flows from virtuous character rather than following rules (deontology) or maximizing outcomes (consequentialism). Virtues like courage, temperance, and justice are developed through practice. The goal is eudaimonia—human flourishing—achieved by living according to reason and cultivating the mean between excess and deficiency."]], "query": "how does virtue ethics work"} -{"output": [["lex", "climate science challenges research"], ["lex", "climate modeling uncertainty data gaps"], ["lex", "climate change research limitations predictions"], ["vec", "what are the major scientific challenges in studying and predicting climate change"], ["vec", "why is climate modeling difficult and what uncertainties do climate scientists face"], ["hyde", "Climate science faces challenges including modeling complex feedback loops (clouds, ocean currents, ice sheets), limited historical data from pre-instrumental periods, and the chaotic nature of weather systems. Regional predictions are harder than global ones. Tipping points—thresholds beyond which changes become irreversible—are difficult to predict with current models."]], "query": "what are the challenges of climate science"} -{"output": [["lex", "reduce stress naturally techniques"], ["lex", "stress relief meditation exercise breathing"], ["lex", "natural stress management relaxation"], ["vec", "what natural methods and lifestyle changes can help reduce stress without medication"], ["vec", "how do exercise, meditation, and breathing techniques reduce stress levels"], ["hyde", "Reduce stress naturally by exercising 30 minutes daily—aerobic exercise lowers cortisol and releases endorphins. Practice deep breathing: inhale for 4 counts, hold for 7, exhale for 8. Meditate for 10 minutes each morning. Limit caffeine and alcohol, sleep 7-9 hours, and spend time in nature. Progressive muscle relaxation and journaling also help."]], "query": "how to reduce stress naturally"} -{"output": [["lex", "trail running beginner start"], ["lex", "trail running shoes gear technique"], ["lex", "off-road running trails tips"], ["vec", "how do beginners get started with trail running and what gear is needed"], ["vec", "what training tips and safety advice should new trail runners follow"], ["hyde", "Start trail running on well-marked, relatively flat trails. Invest in trail running shoes with lugged soles for traction. Run by effort, not pace—expect to be 1-2 minutes per mile slower than road pace. Walk the uphills, run the flats and downhills. Carry water on runs over 45 minutes. Watch your footing and shorten your stride on technical terrain."]], "query": "how to start trail running"} -{"output": [["lex", "literary essay writing analysis"], ["lex", "literary analysis thesis evidence essay"], ["lex", "English literature essay structure argument"], ["vec", "how do you write a strong literary analysis essay with a clear thesis and evidence"], ["vec", "what is the structure and approach for writing an essay analyzing a work of literature"], ["hyde", "A literary essay argues a specific thesis about a text using evidence from the work itself. Open with a hook and thesis statement. Each body paragraph should present a claim, textual evidence (quotations), and analysis explaining how the evidence supports your argument. Use close reading to examine language, imagery, symbolism, and structure. Conclude by synthesizing your argument."]], "query": "how to write a literary essay?"} -{"output": [["lex", "sustainable overview development goals SDGs UN"], ["lex", "SDG 2030 agenda United Nations"], ["lex", "UN sustainability goals poverty climate"], ["vec", "what are the United Nations Sustainable Development Goals and what do they aim to achieve"], ["vec", "how are the 17 SDGs structured and what progress has been made toward the 2030 agenda"], ["hyde", "The 17 Sustainable Development Goals (SDGs) were adopted by the United Nations in 2015 as a universal call to action by 2030. They include: No Poverty (SDG 1), Zero Hunger (SDG 2), Good Health (SDG 3), Quality Education (SDG 4), Gender Equality (SDG 5), Clean Water (SDG 6), and Climate Action (SDG 13), among others."]], "query": "sustainable development goals"} -{"output": [["lex", "GPS navigation outdoor use"], ["lex", "GPS coordinates waypoint route handheld"], ["lex", "GPS device map navigation hiking"], ["vec", "how do you use a GPS device or app for outdoor navigation and route finding"], ["vec", "how to read GPS coordinates and set waypoints for hiking or travel"], ["hyde", "To navigate with GPS, first mark your starting point as a waypoint. Enter your destination coordinates or select a point on the map. The GPS receiver triangulates your position using signals from at least 4 satellites. Follow the bearing and distance readings to your waypoint. Always carry a paper map and compass as backup in case of battery failure."]], "query": "how to navigate with gps"} -{"output": [["lex", "scientific experiment method steps"], ["lex", "scientific method hypothesis variables control"], ["lex", "experiment design procedure data collection"], ["vec", "what are the steps involved in designing and conducting a proper scientific experiment"], ["vec", "how do you set up controls, variables, and data collection for a science experiment"], ["hyde", "A scientific experiment follows these steps: 1) Ask a question, 2) Research background, 3) Form a hypothesis, 4) Design the experiment with independent, dependent, and controlled variables, 5) Collect data through repeated trials, 6) Analyze results using statistics, 7) Draw conclusions. Always include a control group and change only one variable at a time."]], "query": "how to conduct a scientific experiment"} -{"output": [["lex", "digital transformation strategy enterprise"], ["lex", "digital transformation implementation roadmap"], ["lex", "enterprise digitalization technology adoption"], ["vec", "how do organizations plan and implement a digital transformation strategy"], ["vec", "what are the key phases and challenges of enterprise digital transformation"], ["hyde", "Digital transformation strategy begins with assessing current technology maturity and identifying high-impact processes for digitization. Build a roadmap with quick wins (cloud migration, workflow automation) and long-term goals (data-driven decision making, AI integration). Assign executive sponsorship, train employees, and measure success with KPIs like cycle time reduction and customer satisfaction scores."]], "query": "digital transformation strategy implementation"} -{"output": [["lex", "improve sleep quality natural remedies"], ["lex", "sleep hygiene tips better rest"], ["lex", "insomnia natural treatment melatonin"], ["vec", "what natural methods and sleep hygiene habits improve the quality of sleep"], ["vec", "how can you fall asleep faster and sleep more deeply without medication"], ["hyde", "Improve sleep quality by maintaining a consistent schedule—go to bed and wake at the same time daily. Keep your bedroom cool (65-68°F), dark, and quiet. Avoid screens for 1 hour before bed since blue light suppresses melatonin. Limit caffeine after noon. Exercise regularly but not within 3 hours of bedtime. Try magnesium supplements or chamomile tea."]], "query": "how to improve sleep quality naturally?"} -{"output": [["lex", "customer loyalty retention strategies"], ["lex", "loyalty program repeat customers brand"], ["lex", "customer retention engagement satisfaction"], ["vec", "what strategies do businesses use to build long-term customer loyalty and retention"], ["vec", "how do loyalty programs and customer experience drive repeat business"], ["hyde", "Build customer loyalty by delivering consistent quality and exceeding expectations. Implement a points-based loyalty program offering meaningful rewards. Personalize communications using purchase history data. Respond to complaints within 24 hours and resolve them generously. Customers who feel valued spend 67% more than new customers. Track Net Promoter Score to measure loyalty over time."]], "query": "how to build customer loyalty"} -{"output": [["lex", "consequentialism ethics moral theory"], ["lex", "consequentialism utilitarianism outcomes"], ["lex", "consequentialist ethics Mill Bentham"], ["vec", "what is consequentialism and how does it evaluate the morality of actions"], ["vec", "how does consequentialist ethics judge right and wrong based on outcomes and consequences"], ["hyde", "Consequentialism is a moral theory holding that the rightness of an action depends solely on its outcomes. The most well-known form is utilitarianism (Bentham, Mill), which aims to maximize overall happiness or well-being. An action is morally right if it produces the best consequences for the greatest number of people, regardless of the actor's intentions."]], "query": "what is consequentialism"} -{"output": [["lex", "philosophy artificial intelligence AI ethics"], ["lex", "AI philosophy consciousness mind machine"], ["lex", "philosophy of AI Turing test Chinese room"], ["vec", "how do philosophers analyze questions about artificial intelligence and machine consciousness"], ["vec", "what philosophical problems does AI raise about minds, consciousness, and moral status"], ["hyde", "Philosophers approach AI through questions of consciousness (can machines be conscious?), the Chinese Room argument (Searle argued symbol manipulation isn't understanding), the Turing test (behavioral equivalence), and moral status (should sentient AI have rights?). The alignment problem—ensuring AI systems pursue human values—has become a central concern in philosophy of technology."]], "query": "how does philosophy approach artificial intelligence?"} -{"output": [["lex", "reduce sugar intake diet"], ["lex", "cut sugar cravings low sugar eating"], ["lex", "sugar consumption health alternatives"], ["vec", "what practical strategies help reduce daily sugar consumption and manage cravings"], ["vec", "how can you cut back on added sugar in your diet without feeling deprived"], ["hyde", "Reduce sugar intake by reading nutrition labels—sugar hides in sauces, bread, and yogurt under names like dextrose, maltose, and high-fructose corn syrup. Replace sugary drinks with water or sparkling water. Eat whole fruit instead of juice. Gradually reduce sugar in coffee over 2 weeks. Protein and fiber at each meal stabilize blood sugar and reduce cravings."]], "query": "how to reduce sugar intake"} -{"output": [["lex", "building resilience mental toughness"], ["lex", "emotional resilience coping skills adversity"], ["lex", "psychological resilience strategies stress"], ["vec", "how can individuals build emotional and psychological resilience to handle adversity"], ["vec", "what habits and mindset shifts help develop personal resilience and mental toughness"], ["hyde", "Building resilience involves developing a growth mindset, maintaining social connections, and practicing self-care. Reframe setbacks as learning opportunities. Cultivate problem-solving skills rather than ruminating on what went wrong. Regular exercise, adequate sleep, and mindfulness strengthen your capacity to recover from stress. Resilient people accept what they cannot control and focus energy on what they can."]], "query": "building resilience"} -{"output": [["lex", "town hall meeting attend participate"], ["lex", "local government town hall public forum"], ["lex", "town hall meeting preparation questions"], ["vec", "how do you find and attend a local town hall meeting to participate in government"], ["vec", "what should you prepare before attending a town hall meeting with your representative"], ["hyde", "Find town hall meetings through your representative's website, social media, or local newspaper. Arrive early to get a seat. Prepare a concise question or statement under 60 seconds. Introduce yourself as a constituent and mention your town. Be respectful and specific—reference a bill number or policy. Many representatives also hold virtual town halls you can join online."]], "query": "how to attend a town hall meeting"} -{"output": [["lex", "Google Sheets spreadsheet formulas"], ["lex", "Google Sheets tutorial functions tips"], ["lex", "Google Sheets pivot table VLOOKUP"], ["vec", "how to use Google Sheets for data analysis with formulas and functions"], ["vec", "what are the most useful Google Sheets features, formulas, and keyboard shortcuts"], ["hyde", "Google Sheets is a free cloud-based spreadsheet application. Key functions include VLOOKUP for searching data across columns, SUMIF for conditional totals, and QUERY for SQL-like data filtering. Use Ctrl+/ to view keyboard shortcuts. Create pivot tables via Data > Pivot table. Share sheets with collaborators for real-time editing."]], "query": "google sheets"} -{"output": [["lex", "manage digital distractions focus"], ["lex", "phone screen time notification blocking"], ["lex", "digital distraction productivity apps"], ["vec", "how can you reduce digital distractions from phones and social media to stay focused"], ["vec", "what tools and strategies help manage screen time and notification overload"], ["hyde", "Manage digital distractions by turning off non-essential notifications. Use app blockers like Freedom or Cold Turkey during focus periods. Set your phone to Do Not Disturb and place it in another room. Schedule specific times to check email and social media rather than responding in real-time. Use Screen Time (iOS) or Digital Wellbeing (Android) to track and limit usage."]], "query": "how to manage digital distractions?"} -{"output": [["lex", "stem cells types function biology"], ["lex", "stem cell embryonic adult pluripotent"], ["lex", "stem cell therapy regenerative medicine"], ["vec", "what are stem cells and what makes them different from regular cells in the body"], ["vec", "how are stem cells used in medical research and regenerative medicine"], ["hyde", "Stem cells are undifferentiated cells that can self-renew and differentiate into specialized cell types. Embryonic stem cells are pluripotent—they can become any cell type. Adult stem cells are multipotent, limited to specific tissues (e.g., hematopoietic stem cells produce blood cells). Induced pluripotent stem cells (iPSCs) are adult cells reprogrammed to an embryonic-like state."]], "query": "what are stem cells"} -{"output": [["lex", "literary geography narrative place setting"], ["lex", "geography literature landscape sense of place"], ["lex", "spatial narrative setting fiction geography"], ["vec", "how does the geography and physical setting of a story influence its narrative and themes"], ["vec", "what role does sense of place and landscape play in shaping literary narratives"], ["hyde", "Literary geography examines how real and imagined places shape narrative meaning. Faulkner's Yoknapatawpha County embodies Southern decay and racial tension. Hardy's Wessex landscapes mirror characters' emotional states. Setting is not just backdrop—it constrains plot, shapes character psychology, and carries symbolic weight. Urban and rural spaces generate distinct narrative possibilities."]], "query": "how does literary geography influence narratives?"} -{"output": [["lex", "causes World War II WWII origins"], ["lex", "WWII causes Treaty Versailles Hitler aggression"], ["lex", "World War 2 causes appeasement fascism"], ["vec", "what were the main political and economic causes that led to World War II"], ["vec", "how did the Treaty of Versailles, fascism, and appeasement contribute to the outbreak of WWII"], ["hyde", "World War II resulted from multiple causes: the punitive Treaty of Versailles (1919) imposed crippling reparations on Germany, fueling resentment. The Great Depression created economic desperation exploited by fascist movements. Hitler's expansionist aggression—remilitarizing the Rhineland, annexing Austria, and invading Czechoslovakia—met with appeasement from Britain and France until the invasion of Poland in September 1939."]], "query": "what were the causes of world war ii"} -{"output": [["lex", "faith role spirituality belief"], ["lex", "spiritual faith trust divine religious"], ["lex", "faith spirituality meaning transcendence"], ["vec", "what role does faith play in spiritual practice and personal transcendence"], ["vec", "how does faith relate to spiritual growth and the search for meaning"], ["hyde", "Faith in spirituality serves as the foundation for trust in a reality beyond the material world. It enables surrender to uncertainty and provides a framework for interpreting suffering and purpose. Unlike dogmatic belief, spiritual faith often involves personal experience—a felt sense of connection to something greater that sustains practice through doubt and difficulty."]], "query": "what is the role of faith in spirituality"} -{"output": [["lex", "political campaign contribution donate volunteer"], ["lex", "volunteer political campaign canvassing"], ["lex", "campaign donation fundraising grassroots"], ["vec", "how can individuals contribute to political campaigns through donations or volunteering"], ["vec", "what are the different ways to get involved in a political campaign as a volunteer"], ["hyde", "Contribute to political campaigns by donating through the candidate's official website (individual contributions are limited to $3,300 per election per candidate in federal races). Volunteer to canvass door-to-door, phone bank, or text bank. Attend campaign events, host a house party, or share the candidate's message on social media. Small-dollar donations are increasingly impactful."]], "query": "how to contribute to political campaigns"} -{"output": [["lex", "meditation spirituality importance practice"], ["lex", "spiritual meditation mindfulness contemplation"], ["lex", "meditation enlightenment inner peace spiritual"], ["vec", "why is meditation considered essential to many spiritual traditions and practices"], ["vec", "how does meditation contribute to spiritual growth and inner transformation"], ["hyde", "Meditation is central to nearly every spiritual tradition. In Buddhism, vipassana meditation cultivates insight into impermanence. Hindu dhyana aims for union with Brahman. Christian contemplative prayer seeks direct experience of God. Across traditions, meditation quiets mental chatter, develops present-moment awareness, and opens practitioners to transcendent experience."]], "query": "what is the importance of meditation in spirituality?"} -{"output": [["lex", "prune fruit trees technique timing"], ["lex", "fruit tree pruning winter dormant cuts"], ["lex", "apple pear tree pruning branches"], ["vec", "when and how should you prune fruit trees for better growth and fruit production"], ["vec", "what pruning techniques are used for apple, pear, and other fruit trees"], ["hyde", "Prune fruit trees during late winter dormancy (January-March) before buds break. Remove dead, diseased, and crossing branches first. Open the center of the tree to allow sunlight and air circulation. Make cuts at a 45-degree angle just above an outward-facing bud. Remove water sprouts (vertical shoots) and suckers from the base. Never remove more than 25% of the canopy in one season."]], "query": "how to prune fruit trees?"} -{"output": [["lex", "conservation biology biodiversity preservation"], ["lex", "conservation biology endangered species habitat"], ["lex", "wildlife conservation ecology management"], ["vec", "what is conservation biology and what are its main goals and methods"], ["vec", "how do conservation biologists work to protect endangered species and biodiversity"], ["hyde", "Conservation biology is the scientific study of preserving biodiversity and preventing extinction. It combines ecology, genetics, and landscape management to protect threatened species and ecosystems. Key approaches include habitat restoration, establishing wildlife corridors, captive breeding programs, and designating protected areas. The field was formalized in the 1980s by Michael Soulé."]], "query": "what is conservation biology"} -{"output": [["lex", "Hajj Muslim pilgrimage Mecca rituals"], ["lex", "Hajj rites Kaaba Arafat Mina Islam"], ["lex", "Islamic pilgrimage Hajj steps obligations"], ["vec", "what are the rituals and steps Muslims follow during the Hajj pilgrimage to Mecca"], ["vec", "how do Muslims prepare for and perform the Hajj pilgrimage"], ["hyde", "Hajj occurs annually during Dhul Hijjah, the 12th month of the Islamic calendar. Pilgrims enter a state of ihram (ritual purity) and wear simple white garments. They perform tawaf (circling the Kaaba seven times), sa'i (walking between Safa and Marwah), stand at Arafat in prayer, and stone the pillars at Mina. Hajj concludes with Eid al-Adha, the Festival of Sacrifice."]], "query": "how do muslims observe hajj?"} -{"output": [["lex", "digital overview economy transformation trends"], ["lex", "digital economy e-commerce fintech platform"], ["lex", "economic digitalization technology market 2025"], ["vec", "how is the digital economy transforming traditional industries and business models"], ["vec", "what are the key drivers and trends of digital economic transformation"], ["hyde", "The digital economy encompasses all economic activity enabled by digital technologies. E-commerce, fintech, cloud computing, and platform businesses (Uber, Airbnb) have disrupted traditional industries. By 2025, the digital economy accounts for over 15% of global GDP. Key drivers include mobile internet penetration, AI automation, and the shift to subscription-based and data-driven business models."]], "query": "digital economy transformation"} -{"output": [["lex", "philosophy systemic injustice structural oppression"], ["lex", "social justice philosophy racial gender inequality"], ["lex", "systemic injustice Rawls critical race theory"], ["vec", "how do philosophers analyze and propose solutions to systemic injustice and structural oppression"], ["vec", "what philosophical frameworks address racial, gender, and economic systemic inequality"], ["hyde", "Philosophers address systemic injustice through multiple frameworks. Rawls's veil of ignorance argues just institutions would be designed without knowing one's social position. Critical race theory examines how legal and social structures perpetuate racial inequality. Iris Marion Young distinguished five faces of oppression: exploitation, marginalization, powerlessness, cultural imperialism, and violence."]], "query": "how does philosophy address systemic injustice?"} -{"output": [["lex", "political speech analysis rhetoric"], ["lex", "speech analysis persuasion ethos pathos logos"], ["lex", "rhetorical analysis political discourse"], ["vec", "what techniques are used to analyze the rhetoric and persuasive strategies in political speeches"], ["vec", "how do you evaluate a political speech for logical arguments, emotional appeals, and credibility"], ["hyde", "Analyze a political speech by examining its rhetorical appeals: ethos (credibility—does the speaker establish authority?), pathos (emotion—what feelings are evoked?), and logos (logic—are arguments supported by evidence?). Identify rhetorical devices like repetition, anaphora, and metaphor. Consider the audience, context, and what the speaker wants listeners to do."]], "query": "how to analyze a political speech"} -{"output": [["lex", "clean energy support renewable initiatives"], ["lex", "renewable energy advocacy solar wind policy"], ["lex", "clean energy action community support"], ["vec", "how can individuals and communities support clean energy initiatives and policies"], ["vec", "what actions can people take to promote renewable energy adoption in their area"], ["hyde", "Support clean energy by installing solar panels or subscribing to community solar. Switch to a green electricity provider. Contact elected officials to support renewable energy legislation and tax credits. Invest in clean energy funds. Drive electric or hybrid vehicles. Advocate for local building codes that require energy efficiency standards. Join or donate to organizations like the Sierra Club or local clean energy cooperatives."]], "query": "how to support clean energy initiatives?"} -{"output": [["lex", "car starting problems diagnosis troubleshoot"], ["lex", "car won't start battery starter ignition"], ["lex", "engine cranks no start fuel spark"], ["vec", "how do you diagnose why a car won't start and identify the root cause"], ["vec", "what are the common reasons a car fails to start and how to troubleshoot them"], ["hyde", "If the car clicks but won't crank, the battery is likely dead—test with a multimeter (should read 12.6V). If the engine cranks but won't start, check fuel delivery (listen for the fuel pump whine) and spark (pull a plug and check for spark). A no-crank, no-click condition often points to a failed starter motor or corroded battery terminals."]], "query": "how to diagnose car starting problems?"} -{"output": [["lex", "identify personal values beliefs self-reflection"], ["lex", "core values assessment life priorities"], ["lex", "personal values exercise self-awareness"], ["vec", "how can you identify and clarify your core personal values and beliefs"], ["vec", "what exercises and reflection methods help discover what you truly value in life"], ["hyde", "Identify your core values by reflecting on peak experiences—moments when you felt most fulfilled and authentic. Write down 10-15 values (integrity, creativity, family, freedom) and narrow to your top 5. Ask: what angers you when it's violated? What would you fight for? A values card sort exercise—ranking printed values—can clarify priorities you struggle to articulate."]], "query": "how to identify personal values and beliefs?"} -{"output": [["lex", "gnostic gospels significance Nag Hammadi"], ["lex", "gnostic texts Gospel Thomas early Christianity"], ["lex", "gnostic gospels meaning heresy Christian"], ["vec", "what are the gnostic gospels and why are they significant for understanding early Christianity"], ["vec", "how did the Nag Hammadi discovery change our knowledge of gnostic Christian texts"], ["hyde", "The gnostic gospels are early Christian texts discovered at Nag Hammadi, Egypt in 1945. They include the Gospel of Thomas, Gospel of Philip, and Gospel of Truth. These texts reveal diverse beliefs in early Christianity—including the idea that salvation comes through secret knowledge (gnosis) rather than faith alone. They were excluded from the biblical canon as heretical by the 4th century church."]], "query": "what is the significance of the gnostic gospels?"} -{"output": [["lex", "Russia train travel Trans-Siberian railway"], ["lex", "Russian railway routes tickets booking"], ["lex", "Trans-Siberian Express Moscow Vladivostok"], ["vec", "how to travel by train in Russia and what are the major railway routes"], ["vec", "what is the Trans-Siberian Railway and how do you book tickets for Russian trains"], ["hyde", "The Trans-Siberian Railway is the longest railway line in the world, spanning 9,289 km from Moscow to Vladivostok over 6 days. Book tickets through Russian Railways (RZD) at rzd.ru or through agents like RealRussia. Classes include platzkart (open berth), kupe (4-person compartment), and SV (2-person sleeper). Bring your own food for long journeys."]], "query": "russia train"} -{"output": [["lex", "book review writing effective structure"], ["lex", "write book review summary critique"], ["lex", "book review template opinion analysis"], ["vec", "how do you write a thoughtful and effective book review with summary and analysis"], ["vec", "what structure and elements make a strong book review for publication or school"], ["hyde", "An effective book review opens with the book's title, author, genre, and a one-sentence summary. Discuss the main themes and the author's writing style. Include specific examples and short quotations. Evaluate strengths and weaknesses honestly. Avoid spoilers for fiction. End with a recommendation and who would enjoy the book. Aim for 500-800 words."]], "query": "how do you write an effective book review?"} -{"output": [["lex", "self-compassion practice exercises"], ["lex", "self-compassion Kristin Neff mindfulness"], ["lex", "self-kindness inner critic self-care"], ["vec", "what are practical ways to practice self-compassion and quiet your inner critic"], ["vec", "how does Kristin Neff's framework for self-compassion work in daily life"], ["hyde", "Kristin Neff defines self-compassion as three components: self-kindness (treating yourself as you would a friend), common humanity (recognizing suffering is shared), and mindfulness (acknowledging pain without over-identifying). Practice by placing your hand on your heart when distressed and saying: \"This is a moment of suffering. Suffering is part of life. May I be kind to myself.\""]], "query": "how to practice self-compassion?"} -{"output": [["lex", "pilgrimage religion significance spiritual"], ["lex", "religious pilgrimage Mecca Jerusalem Varanasi"], ["lex", "pilgrimage sacred journey faith tradition"], ["vec", "why is pilgrimage important across different religious traditions"], ["vec", "what spiritual significance does the act of pilgrimage carry in major world religions"], ["hyde", "Pilgrimage holds deep significance across religions. Muslims perform Hajj to Mecca as one of the Five Pillars. Christians journey to Jerusalem, Rome, and Santiago de Compostela. Hindus bathe in the Ganges at Varanasi. The physical journey symbolizes an inner spiritual transformation—leaving ordinary life, enduring hardship, and arriving at a sacred place of renewal and encounter with the divine."]], "query": "what is the significance of pilgrimage in religion?"} -{"output": [["lex", "API documentation reference endpoints"], ["lex", "REST API docs developer guide"], ["lex", "API documentation Swagger OpenAPI"], ["vec", "how to read and use API documentation for integrating with a web service"], ["vec", "what tools and formats are used for creating and hosting API documentation"], ["hyde", "API documentation describes available endpoints, request/response formats, authentication methods, and error codes. RESTful APIs typically document each endpoint with its HTTP method (GET, POST, PUT, DELETE), URL path, query parameters, request body schema, and example responses. Tools like Swagger/OpenAPI generate interactive docs where developers can test endpoints directly."]], "query": "api doc"} -{"output": [["lex", "boil egg perfectly soft hard"], ["lex", "boiled egg timing minutes technique"], ["lex", "perfect hard soft boiled egg recipe"], ["vec", "how long do you boil an egg for soft-boiled and hard-boiled results"], ["vec", "what is the best technique for boiling eggs so they peel easily and cook perfectly"], ["hyde", "Place eggs in a single layer in a pot and cover with cold water by 1 inch. Bring to a rolling boil, then remove from heat and cover. For soft-boiled: 6-7 minutes. For medium: 9-10 minutes. For hard-boiled: 12-13 minutes. Transfer immediately to an ice bath for 5 minutes. Older eggs (7-10 days) peel more easily than fresh ones."]], "query": "how to boil an egg perfectly"} -{"output": [["lex", "home office setup design workspace"], ["lex", "home office desk chair ergonomic"], ["lex", "work from home office organization"], ["vec", "how do you set up a productive and ergonomic home office workspace"], ["vec", "what furniture, lighting, and layout create the best home office environment"], ["hyde", "Set up your home office in a quiet room with natural light. Invest in an ergonomic chair with lumbar support and a desk at elbow height (28-30 inches). Position your monitor at arm's length with the top at eye level. Use a desk lamp with 4000-5000K color temperature. Keep cables organized and add a plant—studies show greenery reduces stress and improves focus."]], "query": "how to create a home office space"} -{"output": [["lex", "laws of thermodynamics basic physics"], ["lex", "thermodynamics first second third law entropy"], ["lex", "thermodynamic laws energy heat transfer"], ["vec", "what are the four laws of thermodynamics and what does each one describe"], ["vec", "how do the laws of thermodynamics govern energy transfer and entropy"], ["hyde", "The zeroth law establishes thermal equilibrium: if A and B are each in equilibrium with C, they are in equilibrium with each other. The first law states energy cannot be created or destroyed (conservation of energy). The second law says entropy in a closed system always increases—heat flows from hot to cold, never the reverse. The third law states entropy approaches zero as temperature approaches absolute zero."]], "query": "what are the basic laws of thermodynamics"} -{"output": [["lex", "home yoga space setup room"], ["lex", "yoga room design mat props space"], ["lex", "home yoga studio create practice area"], ["vec", "how do you set up a dedicated yoga practice space in your home"], ["vec", "what equipment and room setup do you need for a home yoga studio"], ["hyde", "Create a home yoga space in an area with at least 6x8 feet of clear floor space. Use a non-slip yoga mat (6mm thickness for comfort). Add blocks, a strap, and a bolster for supported poses. Keep the space clutter-free and at a comfortable temperature (68-72°F). Soft natural light and a small speaker for calming music enhance the atmosphere."]], "query": "how to create a home yoga space"} -{"output": [["lex", "Bible Christian scripture holy book"], ["lex", "Bible Old New Testament books"], ["lex", "Bible history composition canon"], ["vec", "what is the Bible and how is it organized into Old and New Testaments"], ["vec", "how was the Bible composed and compiled over time as a sacred text"], ["hyde", "The Bible is the sacred scripture of Christianity, consisting of the Old Testament (39 books in Protestant tradition, 46 in Catholic) and the New Testament (27 books). The Old Testament includes the Torah, historical books, poetry, and prophets, written primarily in Hebrew. The New Testament contains the Gospels, Acts, Epistles, and Revelation, written in Greek during the 1st century CE."]], "query": "what is the bible?"} -{"output": [["lex", "virtue ethics vs deontology consequentialism"], ["lex", "virtue ethics comparison ethical theories"], ["lex", "Aristotle virtue ethics Kant Mill contrast"], ["vec", "how does virtue ethics differ from deontological and consequentialist moral theories"], ["vec", "what makes virtue ethics unique compared to rule-based and outcome-based ethical frameworks"], ["hyde", "Virtue ethics (Aristotle) asks \"What kind of person should I be?\" rather than \"What should I do?\" Deontology (Kant) focuses on following moral rules regardless of outcomes. Consequentialism (Mill) judges actions by their results. Virtue ethics emphasizes developing moral character through habit and practical wisdom, while the others prescribe universal principles or calculations."]], "query": "how does virtue ethics differ from other ethical theories"} -{"output": [["lex", "genetic research medicine impact"], ["lex", "genomics personalized medicine gene therapy"], ["lex", "genetic testing pharmacogenomics CRISPR"], ["vec", "how has genetic research transformed medical treatments and diagnosis"], ["vec", "what advances in genomics and gene therapy are changing the future of medicine"], ["hyde", "Genetic research has revolutionized medicine through pharmacogenomics (tailoring drug dosages to genetic profiles), gene therapy (correcting defective genes, as in the FDA-approved Luxturna for inherited blindness), and CRISPR gene editing (potential cures for sickle cell disease). Genetic testing identifies cancer risk (BRCA1/2 mutations) enabling early screening and prevention."]], "query": "how genetic research impacts medicine"} -{"output": [["lex", "fix car scratches paint repair"], ["lex", "car scratch removal polish compound"], ["lex", "auto paint scratch repair DIY"], ["vec", "how do you repair and remove scratches from a car's paint finish at home"], ["vec", "what products and techniques fix different types of car paint scratches"], ["hyde", "Car scratches fall into three categories: clear coat scratches (light, fingernail doesn't catch), base coat scratches (deeper, white visible), and primer/metal scratches (deepest). For clear coat scratches, use rubbing compound followed by polish. For deeper scratches, apply touch-up paint matching your car's color code (found on the door jamb sticker), then clear coat and wet sand with 2000-grit."]], "query": "how to fix car scratches?"} -{"output": [["lex", "digital currency cryptocurrency blockchain"], ["lex", "Bitcoin cryptocurrency how it works"], ["lex", "digital currency blockchain mining wallet"], ["vec", "how do digital currencies like Bitcoin use blockchain technology to process transactions"], ["vec", "what is the technical process behind cryptocurrency transactions and mining"], ["hyde", "Digital currencies operate on blockchain technology—a decentralized ledger distributed across thousands of computers. When you send Bitcoin, the transaction is broadcast to the network. Miners validate transactions by solving cryptographic puzzles (proof of work), adding them to a block. Each block links to the previous one, creating an immutable chain. Wallets store private keys that prove ownership."]], "query": "how digital currencies work"} -{"output": [["lex", "existentialism philosophy Sartre Kierkegaard"], ["lex", "existentialism existence precedes essence freedom"], ["lex", "existentialist philosophy meaning absurd"], ["vec", "what is existentialism and what are its core philosophical claims about human existence"], ["vec", "how did Sartre, Kierkegaard, and Camus develop existentialist philosophy"], ["hyde", "Existentialism holds that existence precedes essence—humans are not born with a fixed nature but create meaning through choices and actions. Kierkegaard emphasized individual faith and anxiety. Sartre declared we are \"condemned to be free\"—radical freedom brings radical responsibility. Camus confronted the absurd: life has no inherent meaning, yet we must live as if it does."]], "query": "what is existentialism"} -{"output": [["lex", "Marxist philosophy key concepts"], ["lex", "Marx dialectical materialism class struggle surplus"], ["lex", "Marxism alienation historical materialism ideology"], ["vec", "what are the central ideas and concepts in Karl Marx's philosophical framework"], ["vec", "how do dialectical materialism, class struggle, and alienation function in Marxist thought"], ["hyde", "Key concepts in Marxist philosophy include historical materialism (material conditions drive historical change), dialectical materialism (contradictions between productive forces and relations of production), class struggle (bourgeoisie vs. proletariat), alienation (workers separated from their labor's product), surplus value (profit extracted from unpaid labor), and ideology (ruling class ideas that justify the status quo)."]], "query": "what are the key concepts in marxist philosophy"} -{"output": [["lex", "emotional support resources help"], ["lex", "finding emotional support therapy counseling"], ["lex", "mental health support groups crisis helpline"], ["vec", "where can someone find emotional support during difficult times or mental health challenges"], ["vec", "what resources are available for people seeking emotional support and counseling"], ["hyde", "Find emotional support through multiple channels: talk to a trusted friend or family member. Contact a therapist through Psychology Today's directory or your insurance provider. Call the 988 Suicide and Crisis Lifeline (dial 988) for immediate help. Join support groups through NAMI or local community centers. Online therapy platforms like BetterHelp and Talkspace offer accessible counseling."]], "query": "how to find emotional support"} -{"output": [["lex", "relationship goals healthy couple"], ["lex", "relationship goals communication trust partnership"], ["lex", "healthy relationship habits couples"], ["vec", "what are realistic and healthy relationship goals for couples to work toward"], ["vec", "how do couples build a strong relationship through communication and shared goals"], ["hyde", "Healthy relationship goals include open and honest communication, maintaining individual identities while building shared experiences, resolving conflicts respectfully without contempt or stonewalling, expressing appreciation daily, supporting each other's personal growth, maintaining physical intimacy, and aligning on major life decisions like finances, children, and career priorities."]], "query": "relationship goals"} -{"output": [["lex", "media role politics influence"], ["lex", "political media coverage news bias"], ["lex", "media politics democracy journalism fourth estate"], ["vec", "what role does the media play in shaping political discourse and public opinion"], ["vec", "how does news coverage and media bias influence political outcomes and democracy"], ["hyde", "The media serves as the \"fourth estate\" in democracy—informing citizens, holding officials accountable, and setting the public agenda. Media framing shapes which issues voters prioritize. Agenda-setting theory shows that what the media covers becomes what the public considers important. The rise of partisan media and social media algorithms has increased polarization by creating ideological echo chambers."]], "query": "what is the role of media in politics"} -{"output": [["lex", "stream of consciousness literary technique"], ["lex", "stream of consciousness narrative style"], ["vec", "what does stream of consciousness mean as a writing technique in literature"], ["vec", "how does stream of consciousness narration work in novels and fiction"], ["hyde", "Stream of consciousness is a narrative technique that presents a character's continuous flow of thoughts, feelings, and sensory impressions as they occur. Pioneered by writers like Virginia Woolf and James Joyce, it mimics the unstructured way the human mind processes experience."]], "query": "what is stream of consciousness"} -{"output": [["lex", "budget travel tips cheap flights accommodations"], ["lex", "affordable travel planning money saving"], ["vec", "where can I find reliable tips for traveling on a tight budget"], ["vec", "what are the best resources for planning cheap vacations and budget trips"], ["hyde", "To travel on a budget, book flights midweek, use fare comparison tools like Google Flights or Skyscanner, stay in hostels or use house-sitting platforms, and eat at local markets instead of tourist restaurants."]], "query": "where to find budget travel tips"} -{"output": [["lex", "fallibilism epistemology philosophy"], ["lex", "fallibilism knowledge certainty"], ["vec", "what does fallibilism mean in philosophy and epistemology"], ["vec", "how does fallibilism challenge the idea that knowledge requires absolute certainty"], ["hyde", "Fallibilism is the philosophical doctrine that no belief or claim can ever be conclusively justified or proven beyond all doubt. Associated with Charles Sanders Peirce and Karl Popper, it holds that all human knowledge is provisional and subject to revision."]], "query": "what is fallibilism"} -{"output": [["lex", "authentication flow OAuth JWT"], ["lex", "authorization code flow token exchange"], ["lex", "auth login session management"], ["vec", "how does an authentication and authorization flow work in web applications"], ["vec", "what are the steps in an OAuth 2.0 authorization code flow"], ["hyde", "The OAuth 2.0 authorization code flow begins when the client redirects the user to the authorization server. After login, the server returns an authorization code, which the client exchanges for an access token and refresh token via the token endpoint."]], "query": "auth flow"} -{"output": [["lex", "scientific research datasets open data repositories"], ["lex", "public datasets academic research download"], ["vec", "where can researchers find free datasets for scientific studies"], ["vec", "what are the best open data repositories for academic and scientific research"], ["hyde", "Public research datasets are available from repositories such as Kaggle, the UCI Machine Learning Repository, NASA's Open Data Portal, NOAA Climate Data, and institutional data archives like Harvard Dataverse and Zenodo."]], "query": "where to find datasets for scientific research"} -{"output": [["lex", "UI build frontend framework components"], ["lex", "user interface build tooling bundler"], ["lex", "UI component library development"], ["vec", "how to build a user interface for a web or mobile application"], ["vec", "what tools and frameworks are used to build modern frontend UIs"], ["hyde", "To build a responsive UI, start by choosing a component framework such as React, Vue, or Svelte. Use a build tool like Vite or Webpack to bundle assets, and style with CSS modules or Tailwind CSS for rapid layout development."]], "query": "ui build"} -{"output": [["lex", "water conservation home tips"], ["lex", "reduce household water usage"], ["vec", "what are practical ways to conserve water at home and reduce water bills"], ["vec", "how can I use less water in my house for everyday tasks"], ["hyde", "Fix leaky faucets promptly—a single drip can waste over 3,000 gallons per year. Install low-flow showerheads and dual-flush toilets, run dishwashers and washing machines only with full loads, and water your garden early in the morning to minimize evaporation."]], "query": "how to conserve water at home?"} -{"output": [["lex", "state legislation tracking bill search"], ["lex", "state law lookup legislative database"], ["vec", "how can I find and track state legislation and bills currently being considered"], ["vec", "what websites or tools let you look up state laws and legislative history"], ["hyde", "To track state legislation, visit your state legislature's official website, which provides bill text, status, and voting records. Tools like LegiScan and the National Conference of State Legislatures (NCSL) aggregate bills across all 50 states."]], "query": "how to obtain information on state legislation"} -{"output": [["lex", "hiking shoes boots trail footwear"], ["lex", "best hiking boots waterproof ankle support"], ["vec", "what type of shoes or boots should I wear for hiking on trails"], ["vec", "how to choose the right hiking footwear for different terrain and conditions"], ["hyde", "For day hikes on well-maintained trails, lightweight hiking shoes with good tread provide enough support. For rocky or wet terrain, mid-cut waterproof boots with ankle support and Vibram soles offer better protection and stability."]], "query": "what shoes for hiking?"} -{"output": [["lex", "empathy moral decision-making ethics"], ["lex", "empathy role ethical judgment"], ["vec", "how does empathy influence the way people make moral and ethical decisions"], ["vec", "what role does feeling empathy play in moral reasoning and ethical behavior"], ["hyde", "Empathy allows individuals to imagine the experiences of others, which directly influences moral judgment. Studies show that people who score higher on empathy scales are more likely to make prosocial decisions, though critics like Paul Bloom argue empathy can also bias moral reasoning."]], "query": "what is the role of empathy in moral decision-making"} -{"output": [["lex", "improve self-worth self-esteem building"], ["lex", "boost self-confidence self-value exercises"], ["vec", "what are effective strategies to improve your sense of self-worth and self-esteem"], ["vec", "how can someone build stronger self-worth through daily habits and mindset shifts"], ["hyde", "To improve self-worth, start by identifying and challenging negative self-talk. Practice self-compassion, set small achievable goals, keep a journal of accomplishments, and surround yourself with supportive people. Cognitive behavioral techniques can help reframe core beliefs about your value."]], "query": "how to improve self-worth?"} -{"output": [["lex", "cryptography encryption decryption"], ["lex", "cryptographic algorithms symmetric asymmetric"], ["vec", "what is cryptography and how does it protect data through encryption"], ["vec", "how do cryptographic systems work to secure communications and information"], ["hyde", "Cryptography is the science of encoding and decoding information to prevent unauthorized access. It uses algorithms like AES (symmetric) and RSA (asymmetric) to encrypt plaintext into ciphertext. Only parties with the correct key can decrypt the message back to its original form."]], "query": "what is cryptography"} -{"output": [["lex", "photography reflections water glass mirror"], ["lex", "reflection photography techniques composition"], ["vec", "what techniques help capture sharp and creative reflection photographs"], ["vec", "how to photograph reflections in water, mirrors, and glass surfaces"], ["hyde", "To photograph reflections, use a polarizing filter to control glare and increase clarity. Shoot at a low angle to maximize the reflected image in water. For mirror or glass reflections, focus manually on the reflected subject rather than the surface itself."]], "query": "how to photograph reflections"} -{"output": [["lex", "black hole formation stellar collapse"], ["lex", "black holes neutron star supernova"], ["vec", "how do black holes form from dying stars and gravitational collapse"], ["vec", "what is the process by which a massive star becomes a black hole"], ["hyde", "Black holes form when a massive star—typically more than 20 solar masses—exhausts its nuclear fuel and can no longer support itself against gravitational collapse. The core implodes past the neutron star stage, compressing into a singularity surrounded by an event horizon."]], "query": "how do black holes form"} -{"output": [["lex", "literature review research methodology"], ["lex", "academic literature review systematic search"], ["vec", "how do you conduct a thorough literature review for an academic research paper"], ["vec", "what are the steps to search, organize, and synthesize sources in a literature review"], ["hyde", "Begin by defining your research question, then search databases like PubMed, Google Scholar, and Web of Science using targeted keywords. Screen abstracts for relevance, organize selected papers by theme, and synthesize findings to identify gaps in existing knowledge."]], "query": "how to conduct literature review in research"} -{"output": [["lex", "scientific models simulation prediction"], ["lex", "scientific modeling research methodology"], ["vec", "how do scientists use models to understand and predict natural phenomena"], ["vec", "what types of models do scientists build to test hypotheses and simulate systems"], ["hyde", "Scientists use mathematical, computational, and physical models to represent complex systems. Climate models simulate atmospheric interactions, molecular models predict protein folding, and epidemiological models forecast disease spread. Models are validated against observed data and refined iteratively."]], "query": "how do scientists use models"} -{"output": [["lex", "home staging tips selling house"], ["lex", "stage house real estate curb appeal"], ["vec", "how do you stage a home to make it more appealing to potential buyers"], ["vec", "what are the key steps to prepare and stage a house before listing it for sale"], ["hyde", "Declutter every room, remove personal photos, and use neutral paint colors. Arrange furniture to maximize space and natural light. Add fresh flowers, clean all surfaces, and improve curb appeal with trimmed landscaping and a freshly painted front door."]], "query": "how to stage a home for sale"} -{"output": [["lex", "rim repair bent wheel fix"], ["lex", "alloy rim curb damage repair"], ["lex", "car wheel rim straightening"], ["vec", "how to fix a bent or damaged car wheel rim"], ["vec", "can a curb-damaged alloy rim be repaired and how much does it cost"], ["hyde", "Minor curb rash on alloy rims can be sanded, filled with body filler, and repainted at home. Bent rims require professional straightening on a hydraulic press. If the rim has cracks, replacement is safer than repair."]], "query": "rim fix"} -{"output": [["lex", "speculative fiction genre definition"], ["lex", "speculative fiction sci-fi fantasy dystopia"], ["vec", "what is speculative fiction and what genres does it encompass"], ["vec", "how is speculative fiction different from science fiction and fantasy"], ["hyde", "Speculative fiction is an umbrella genre that includes science fiction, fantasy, horror, dystopian, and alternate history literature. It explores \"what if\" scenarios by altering known reality—imagining different technologies, social structures, or natural laws."]], "query": "what is speculative fiction?"} -{"output": [["lex", "algorithms computer science data structures"], ["lex", "algorithm sorting searching complexity"], ["vec", "what are algorithms in computer science and why are they fundamental"], ["vec", "how do computer science algorithms solve problems through step-by-step procedures"], ["hyde", "An algorithm is a finite sequence of well-defined instructions for solving a class of problems or performing a computation. Common examples include sorting algorithms (quicksort, mergesort), search algorithms (binary search), and graph algorithms (Dijkstra's shortest path)."]], "query": "what are algorithms in computer science"} -{"output": [["lex", "car loan payment calculator formula"], ["lex", "auto loan monthly payment interest rate"], ["vec", "how do you calculate monthly car loan payments based on principal, interest rate, and term"], ["vec", "what formula is used to determine monthly auto loan payments"], ["hyde", "The monthly car loan payment is calculated using the formula: M = P × [r(1+r)^n] / [(1+r)^n − 1], where P is the principal, r is the monthly interest rate (annual rate divided by 12), and n is the total number of monthly payments."]], "query": "how to calculate car loan payments?"} -{"output": [["lex", "electronics recycling e-waste disposal"], ["lex", "recycle old computers phones e-waste"], ["vec", "how and where can I recycle old electronics like phones, computers, and TVs"], ["vec", "what is the proper way to dispose of electronic waste responsibly"], ["hyde", "Many retailers like Best Buy and Staples offer free electronics drop-off recycling. Check Earth911.org for local e-waste facilities. Before recycling, wipe personal data from devices. Never throw electronics in regular trash—they contain lead, mercury, and other hazardous materials."]], "query": "how to recycle electronics?"} -{"output": [["lex", "anti-hero literary significance character"], ["lex", "anti-hero fiction protagonist flawed"], ["vec", "what is the literary significance of the anti-hero as a character type in fiction"], ["vec", "why are anti-heroes important in storytelling and what do they represent"], ["hyde", "The anti-hero challenges traditional notions of heroism by embodying flawed, morally ambiguous traits. Characters like Raskolnikov, Walter White, and Deadpool resonate because they reflect the complexity of human nature, blurring the line between virtue and vice."]], "query": "what is the significance of the anti-hero?"} -{"output": [["lex", "Ramadan significance Islam fasting"], ["lex", "Ramadan holy month Muslim observance"], ["vec", "what is the spiritual and cultural significance of Ramadan in Islam"], ["vec", "why do Muslims observe Ramadan and what does the month represent"], ["hyde", "Ramadan is the ninth month of the Islamic lunar calendar, during which Muslims fast from dawn to sunset. It commemorates the first revelation of the Quran to Prophet Muhammad. The fast cultivates self-discipline, empathy for the hungry, and spiritual closeness to God."]], "query": "what is the significance of ramadan"} -{"output": [["lex", "landscaping stones buy garden rocks"], ["lex", "landscape stone supply yard near me"], ["vec", "where can I buy landscaping stones and decorative rocks for my yard"], ["vec", "what are the best places to find affordable landscaping stones and pavers"], ["hyde", "Landscaping stones can be purchased from home improvement stores like Home Depot and Lowe's, local stone yards, and quarries. For bulk orders, landscape supply companies deliver directly. River rock, flagstone, and pea gravel are popular choices for garden paths and borders."]], "query": "where to find landscaping stones?"} -{"output": [["lex", "watch movies online streaming platforms 2026"], ["lex", "latest movies streaming services new releases"], ["vec", "where can I watch the latest movies online through streaming services in 2026"], ["vec", "which streaming platforms have the newest movie releases available to watch"], ["hyde", "New theatrical releases typically arrive on streaming platforms 45-90 days after their cinema debut. Netflix, Amazon Prime Video, Disney+, Apple TV+, and Max each acquire exclusive titles. Check JustWatch.com to see which service currently streams a specific movie."]], "query": "where to watch latest movies online"} -{"output": [["lex", "contemporary art definition movement"], ["lex", "contemporary art 21st century modern"], ["vec", "what defines contemporary art and how is it different from modern art"], ["vec", "what are the key characteristics and themes of contemporary art"], ["hyde", "Contemporary art refers to art produced from the late 20th century to the present day. Unlike modern art (roughly 1860s–1970s), contemporary art encompasses a wide range of media—installation, video, digital, and performance—and often engages with identity, globalization, and technology."]], "query": "what is contemporary art?"} -{"output": [["lex", "Easter significance Christianity resurrection"], ["lex", "Easter religious meaning Christian holiday"], ["vec", "what is the religious and cultural significance of Easter in Christianity"], ["vec", "why is Easter considered the most important Christian holiday"], ["hyde", "Easter celebrates the resurrection of Jesus Christ on the third day after his crucifixion, as described in the New Testament Gospels. It is the most important feast in Christianity, marking the fulfillment of prophecy and the foundation of Christian faith in life after death."]], "query": "what is the significance of easter"} -{"output": [["lex", "peel and stick wallpaper installation"], ["lex", "self-adhesive wallpaper apply walls"], ["vec", "what are the steps to properly install peel and stick wallpaper on a wall"], ["vec", "how do you apply self-adhesive wallpaper without bubbles or wrinkles"], ["hyde", "Clean the wall surface and let it dry completely. Start at the top, peeling back a few inches of backing at a time. Use a smoothing tool to press the wallpaper flat, working from the center outward to remove air bubbles. Trim excess at the ceiling and baseboard with a sharp blade."]], "query": "how to install peel and stick wallpaper"} -{"output": [["lex", "behavioral science research methods"], ["lex", "behavioral psychology experiments observation"], ["vec", "what methods do behavioral scientists use to study and measure human behavior"], ["vec", "how do behavioral researchers design experiments and observational studies"], ["hyde", "Behavioral scientists study behavior through controlled experiments, field observations, surveys, and neuroimaging. Randomized controlled trials isolate variables, while observational studies capture behavior in natural settings. Eye-tracking and fMRI provide physiological data on decision-making processes."]], "query": "how do behavioral scientists study behavior"} -{"output": [["lex", "soccer training drills exercises"], ["lex", "football practice drills passing shooting"], ["vec", "what are effective soccer training drills for improving skills and fitness"], ["vec", "which soccer drills help players improve dribbling, passing, and shooting"], ["hyde", "Set up a cone dribbling course with 10 cones spaced 2 meters apart. Players weave through using inside and outside touches at speed. For passing accuracy, pair players 15 meters apart and practice one-touch passes, alternating feet. Finish sessions with 1v1 attacking drills near the box."]], "query": "soccer training drills"} -{"output": [["lex", "stock market investing beginner guide"], ["lex", "invest stocks brokerage portfolio"], ["vec", "how do beginners start investing in the stock market and building a portfolio"], ["vec", "what are the basic steps to open a brokerage account and buy stocks"], ["hyde", "To start investing, open a brokerage account with a platform like Fidelity, Schwab, or Vanguard. Begin with low-cost index funds that track the S&P 500 for broad diversification. Invest regularly through dollar-cost averaging and avoid trying to time the market."]], "query": "how to invest in the stock market"} -{"output": [["lex", "prophets Christianity role Bible"], ["lex", "Christian prophets Old Testament New Testament"], ["vec", "what role do prophets play in Christian theology and scripture"], ["vec", "how are prophets understood in Christianity compared to other Abrahamic religions"], ["hyde", "In Christianity, prophets are individuals called by God to deliver divine messages and foretell events. Old Testament prophets like Isaiah and Jeremiah predicted the coming of the Messiah. In the New Testament, Jesus is seen as the ultimate fulfillment of prophetic tradition."]], "query": "what is the role of prophets in christianity?"} -{"output": [["lex", "no-dig garden method sheet mulching"], ["lex", "no-dig gardening lasagna layering technique"], ["vec", "what is a no-dig garden and how do you build one without tilling the soil"], ["vec", "how does the no-dig gardening method work to improve soil health"], ["hyde", "A no-dig garden is built by layering organic materials—cardboard, compost, straw, and leaf mold—directly on top of existing ground. This preserves soil structure, encourages worm activity, suppresses weeds, and builds fertile topsoil without the labor of digging or tilling."]], "query": "what is a no-dig garden?"} -{"output": [["lex", "raise startup capital funding sources"], ["lex", "startup fundraising seed investors venture capital"], ["vec", "what are the main ways to raise capital for a new startup company"], ["vec", "how do founders raise seed funding and early-stage investment for a startup"], ["hyde", "Startup capital can come from bootstrapping, friends and family, angel investors, venture capital firms, crowdfunding platforms like Kickstarter, or government grants. Prepare a pitch deck with your business model, market size, traction metrics, and financial projections before approaching investors."]], "query": "how to raise startup capital"} -{"output": [["lex", "save money tips budgeting strategies"], ["lex", "effective saving habits personal finance"], ["vec", "what are effective strategies and habits for saving money consistently"], ["vec", "how can I create a budget and save more money each month"], ["hyde", "Follow the 50/30/20 rule: allocate 50% of income to needs, 30% to wants, and 20% to savings. Automate transfers to a high-yield savings account on payday. Track spending with an app, cancel unused subscriptions, and build a 3-6 month emergency fund before investing."]], "query": "how to save money effectively"} -{"output": [["lex", "problem of evil philosophy theodicy"], ["lex", "problem of evil God suffering"], ["vec", "what is the philosophical problem of evil and how does it challenge belief in God"], ["vec", "how do philosophers and theologians respond to the problem of evil and suffering"], ["hyde", "The problem of evil asks: if an omnipotent, omniscient, and benevolent God exists, why does suffering occur? Epicurus first formulated this dilemma. Theodicies like the free will defense and soul-making theodicy attempt to reconcile God's existence with the reality of evil."]], "query": "what is the problem of evil"} -{"output": [["lex", "register to vote online voter registration"], ["lex", "online voter registration state website"], ["vec", "how can I register to vote online in my state"], ["vec", "what do I need to register to vote through an online voter registration system"], ["hyde", "Most U.S. states offer online voter registration at vote.org or through the secretary of state's website. You'll need your state-issued ID number or last four digits of your Social Security number, your date of birth, and current residential address."]], "query": "how to register to vote online"} -{"output": [["lex", "principles of evolution natural selection"], ["lex", "evolution theory variation inheritance selection"], ["vec", "what are the core principles of biological evolution by natural selection"], ["vec", "how do variation, inheritance, and selection drive the process of evolution"], ["hyde", "Evolution operates through four key principles: variation (individuals differ genetically), inheritance (traits pass from parents to offspring), selection (individuals better adapted to their environment survive and reproduce more), and time (changes accumulate across generations, leading to speciation)."]], "query": "what are the principles of evolution"} -{"output": [["lex", "Ten Commandments Bible Exodus Deuteronomy"], ["lex", "Ten Commandments meaning list"], ["vec", "what are the Ten Commandments and what does each one mean"], ["vec", "how are the Ten Commandments explained in the Bible and interpreted by different faiths"], ["hyde", "The Ten Commandments, given to Moses on Mount Sinai, include: (1) You shall have no other gods before me, (2) You shall not make idols, (3) You shall not take the Lord's name in vain, (4) Remember the Sabbath, (5) Honor your father and mother, (6) You shall not murder."]], "query": "explain the ten commandments"} -{"output": [["lex", "portrait posing techniques photography"], ["lex", "portrait photography poses guide"], ["vec", "what are effective ways to pose people for flattering portrait photographs"], ["vec", "how do professional photographers direct subjects into natural-looking portrait poses"], ["hyde", "Have your subject shift their weight to one foot and angle their body 45 degrees from the camera. Turn the chin slightly down and toward the light. For hands, give them something to hold or rest them naturally. Ask them to breathe out before the shot to relax their expression."]], "query": "how to pose people for portraits"} -{"output": [["lex", "CSS grid layout template columns rows"], ["lex", "CSS grid container gap alignment"], ["lex", "CSS grid-template-areas responsive"], ["vec", "how to create page layouts using CSS grid with rows and columns"], ["vec", "what are the key CSS grid properties for building responsive layouts"], ["hyde", ".container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } .item-wide { grid-column: span 2; } CSS Grid allows two-dimensional layout control with explicit row and column definitions, making it ideal for full-page layouts."]], "query": "css grid"} -{"output": [["lex", "plastic-free kitchen alternatives"], ["lex", "reduce plastic kitchen reusable containers"], ["vec", "how can I eliminate single-use plastics from my kitchen"], ["vec", "what are the best plastic-free alternatives for food storage and kitchen items"], ["hyde", "Replace plastic wrap with beeswax wraps or silicone lids. Store food in glass jars or stainless steel containers. Use bar dish soap instead of bottled liquid soap. Buy in bulk using cloth bags, and choose wooden or bamboo utensils over plastic ones."]], "query": "how to go plastic-free in the kitchen?"} -{"output": [["lex", "Confucius teachings Confucianism philosophy"], ["lex", "Confucian ethics filial piety ren li"], ["vec", "what are the main teachings and ethical principles of Confucius"], ["vec", "how did Confucius define virtue, proper conduct, and social harmony"], ["hyde", "Confucius emphasized ren (benevolence), li (ritual propriety), xiao (filial piety), and junzi (the ideal of a morally cultivated person). He taught that social harmony comes from fulfilling one's role in relationships—ruler to subject, parent to child, husband to wife, elder to younger, and friend to friend."]], "query": "what are the teachings of confucius?"} -{"output": [["lex", "performance art definition live medium"], ["lex", "performance art artists examples history"], ["vec", "what is performance art and how does it differ from traditional visual art"], ["vec", "what are the defining characteristics and famous examples of performance art"], ["hyde", "Performance art is a live, time-based art form in which the artist's body and actions are the medium. Emerging in the 1960s and 70s, artists like Marina Abramović, Yoko Ono, and Joseph Beuys blurred boundaries between art and life, often engaging audiences directly."]], "query": "what is performance art?"} -{"output": [["lex", "vaccines immune system antibodies mechanism"], ["lex", "how vaccines work immunization"], ["vec", "how do vaccines train the immune system to fight diseases"], ["vec", "what is the biological mechanism by which vaccines provide immunity"], ["hyde", "Vaccines introduce a weakened, inactivated, or fragment form of a pathogen (or its mRNA blueprint) into the body. The immune system recognizes it as foreign, produces antibodies, and creates memory cells. If exposed to the real pathogen later, the immune system responds rapidly."]], "query": "how do vaccines work"} -{"output": [["lex", "AI-driven marketing automation personalization"], ["lex", "artificial intelligence marketing campaigns analytics"], ["vec", "how is artificial intelligence being used to drive marketing strategies and campaigns"], ["vec", "what AI tools and techniques improve marketing personalization and customer targeting"], ["hyde", "AI-driven marketing uses machine learning to segment audiences, predict customer behavior, and personalize content at scale. Tools like predictive analytics, chatbots, and recommendation engines increase conversion rates. A/B testing is automated, and ad spend is optimized in real time by algorithms."]], "query": "ai-driven marketing"} -{"output": [["lex", "scientific research career path academia"], ["lex", "career scientist PhD research position"], ["vec", "what steps should I take to pursue a career in scientific research"], ["vec", "what education and experience are needed to become a professional researcher in science"], ["hyde", "A career in scientific research typically starts with a bachelor's degree in a STEM field, followed by a PhD program where you specialize in a research area. After completing your doctorate, postdoctoral positions provide additional training before applying for faculty or industry research roles."]], "query": "how to pursue a career in scientific research"} -{"output": [["lex", "cryptocurrency trading buy sell exchange"], ["lex", "crypto trading Bitcoin Ethereum strategies"], ["vec", "what is cryptocurrency trading and how do people buy and sell digital currencies"], ["vec", "how does cryptocurrency trading work on exchanges like Coinbase and Binance"], ["hyde", "Cryptocurrency trading involves buying and selling digital assets like Bitcoin and Ethereum on exchanges. Traders use market orders, limit orders, and stop-losses. Strategies range from long-term holding (HODLing) to day trading based on technical analysis of price charts and volume indicators."]], "query": "what is cryptocurrency trading?"} -{"output": [["lex", "calculus applications real world uses"], ["lex", "calculus derivatives integrals physics engineering"], ["vec", "what are the real-world applications of calculus in science and engineering"], ["vec", "how is calculus used in physics, economics, and other fields"], ["hyde", "Calculus is used to model rates of change and accumulation. In physics, derivatives describe velocity and acceleration; integrals calculate areas and volumes. Engineers use calculus to design structures, economists model marginal cost and revenue, and biologists model population growth with differential equations."]], "query": "what is calculus used for"} -{"output": [["lex", "moral philosophy human rights ethics"], ["lex", "philosophical foundations human rights natural rights"], ["vec", "how does moral philosophy provide a foundation for human rights"], ["vec", "what ethical theories support the concept of universal human rights"], ["hyde", "Moral philosophy grounds human rights through several frameworks: natural law theory holds rights are inherent to human nature, Kantian ethics argues every person deserves dignity as a rational agent, and utilitarianism supports rights as instruments that maximize overall well-being."]], "query": "how does moral philosophy address human rights"} -{"output": [["lex", "choose writing genre fiction nonfiction"], ["lex", "writing genre selection author style"], ["vec", "how should a writer choose the best genre for their writing style and interests"], ["vec", "what factors help an author decide which literary genre to write in"], ["hyde", "Consider what you love to read—your favorite genre as a reader often translates well. Experiment by writing short pieces in different genres: fantasy, mystery, literary fiction, memoir. Pay attention to which genre energizes you and where your voice feels most natural."]], "query": "how to choose a writing genre?"} -{"output": [["lex", "personal statement writing tips college application"], ["lex", "standout personal statement essay graduate school"], ["vec", "how do you write a compelling personal statement for college or graduate school admissions"], ["vec", "what makes a personal statement stand out to admissions committees"], ["hyde", "Open with a vivid, specific anecdote—not a generic quote. Show rather than tell by describing experiences that shaped your goals. Connect your past to your intended field of study. Be authentic; admissions officers read thousands of essays and recognize genuine voice immediately."]], "query": "how to write a standout personal statement"} -{"output": [["lex", "improve sleep quality tips habits"], ["lex", "better sleep hygiene insomnia remedies"], ["vec", "what are proven ways to improve sleep quality and fall asleep faster"], ["vec", "how can I develop better sleep habits to get more restful sleep"], ["hyde", "Maintain a consistent sleep schedule, even on weekends. Keep your bedroom cool (65-68°F), dark, and quiet. Avoid screens for 30 minutes before bed. Limit caffeine after noon. Regular exercise improves sleep, but finish workouts at least 3 hours before bedtime."]], "query": "how to improve sleep quality"} -{"output": [["lex", "global affairs news sources current events"], ["lex", "world news reliable sources daily updates"], ["vec", "what are the best ways to stay informed about global affairs and world news"], ["vec", "which news sources and tools help you keep up with international current events"], ["hyde", "Follow reputable outlets like Reuters, AP News, BBC World, and The Economist for balanced global coverage. Use RSS readers or news aggregator apps like Feedly. Subscribe to daily briefing newsletters such as Morning Brew or The Daily from the New York Times."]], "query": "how to stay updated on global affairs"} -{"output": [["lex", "Renaissance architecture characteristics features"], ["lex", "Renaissance architecture columns dome symmetry"], ["vec", "what are the defining characteristics of Renaissance architecture in Europe"], ["vec", "how did Renaissance architects use symmetry, columns, and domes in their buildings"], ["hyde", "Renaissance architecture, flourishing in 15th-16th century Italy, revived classical Greek and Roman forms. Key features include symmetrical facades, round arches, columns with Corinthian capitals, hemispherical domes (as in Brunelleschi's Florence Cathedral), and harmonious proportions based on geometry."]], "query": "what are the characteristics of renaissance architecture?"} -{"output": [["lex", "color modes photography RGB CMYK sRGB"], ["lex", "photography color space Adobe RGB ProPhoto"], ["vec", "what are the different color modes and color spaces used in digital photography"], ["vec", "how do RGB, sRGB, Adobe RGB, and CMYK color modes affect photo editing and printing"], ["hyde", "Digital photographs use RGB color mode for screens, with sRGB as the standard web color space and Adobe RGB offering a wider gamut for print work. CMYK is used for commercial printing. ProPhoto RGB captures the widest range but requires careful color management to avoid banding."]], "query": "what are color modes in photography?"} -{"output": [["lex", "zen garden create Japanese rock garden"], ["lex", "zen garden design sand gravel stones"], ["vec", "how do you design and create a traditional Japanese zen rock garden"], ["vec", "what materials and layout principles are used in building a zen garden"], ["hyde", "A zen garden (karesansui) uses raked white gravel or sand to represent water, with carefully placed rocks symbolizing mountains or islands. Rake parallel lines for calm or concentric circles around rocks. Keep the design minimal—moss, a few stones, and clean gravel on a flat rectangular area."]], "query": "how to create a zen garden?"} -{"output": [["lex", "mountain peak climbing summit elevation"], ["lex", "highest mountain peaks world list"], ["lex", "mountain peak hiking trails"], ["vec", "what are the highest mountain peaks in the world and their elevations"], ["vec", "how to plan a hike or climb to a mountain peak summit"], ["hyde", "Mount Everest stands at 8,849 meters (29,032 ft), the highest peak on Earth. K2 at 8,611 m and Kangchenjunga at 8,586 m follow. For trekkers, peaks like Mont Blanc (4,808 m) and Mount Kilimanjaro (5,895 m) are accessible without technical climbing experience."]], "query": "mountain peak"} -{"output": [["lex", "campaign finance laws compliance regulations"], ["lex", "campaign finance rules FEC political donations"], ["vec", "how do political candidates and organizations comply with campaign finance laws"], ["vec", "what are the key campaign finance regulations and reporting requirements in the U.S."], ["hyde", "Campaign finance laws require candidates to register with the FEC, disclose all contributions and expenditures, and adhere to contribution limits. Individual donors can give up to $3,300 per candidate per election. PACs and Super PACs have separate rules. File quarterly reports electronically."]], "query": "how to follow campaign finance laws"} -{"output": [["lex", "education reform advocacy strategies"], ["lex", "advocate education policy change"], ["vec", "how can individuals effectively advocate for education reform in their community"], ["vec", "what strategies work for pushing education policy changes at the local and state level"], ["hyde", "Start by attending school board meetings and building relationships with elected officials. Join or form coalitions with parent groups, teachers' unions, and nonprofits. Write op-eds, organize town halls, and use data on student outcomes to make evidence-based arguments for specific policy changes."]], "query": "how to advocate for education reform"} -{"output": [["lex", "philosophical arguments logic premises conclusion"], ["lex", "philosophical reasoning deductive inductive"], ["vec", "how are philosophical arguments structured with premises and conclusions"], ["vec", "what makes a philosophical argument valid or sound in logic"], ["hyde", "A philosophical argument consists of premises (claims assumed to be true) and a conclusion that follows from them. In a deductive argument, if the premises are true and the form is valid, the conclusion must be true. An argument is sound when it is both valid and its premises are actually true."]], "query": "how do philosophical arguments work"} -{"output": [["lex", "roof repair fix leak shingles"], ["lex", "roof damage repair DIY contractor"], ["lex", "fix roof leak flashing"], ["vec", "how to repair a damaged or leaking roof at home"], ["vec", "when should you DIY a roof fix versus hiring a professional roofer"], ["hyde", "For minor roof leaks, locate the source from the attic during rain. Replace cracked or missing shingles by lifting surrounding shingles, removing nails, and sliding in a new one. Apply roofing cement under flashing for small gaps. For structural damage or large areas, hire a licensed roofer."]], "query": "fix roof"} -{"output": [["lex", "CSR initiatives corporate social responsibility implementation"], ["lex", "corporate social responsibility programs strategy"], ["vec", "how do companies implement corporate social responsibility initiatives effectively"], ["vec", "what steps should a business take to launch a CSR program"], ["hyde", "Start by conducting a materiality assessment to identify social and environmental issues relevant to your business and stakeholders. Set measurable goals aligned with the UN Sustainable Development Goals. Allocate budget, assign a dedicated CSR team, and report progress annually using GRI standards."]], "query": "how to implement csr initiatives"} -{"output": [["lex", "meditation beginners guide mindfulness"], ["lex", "beginner meditation techniques breathing"], ["vec", "how do beginners start a daily meditation practice from scratch"], ["vec", "what are simple meditation techniques for people who have never meditated before"], ["hyde", "Sit comfortably with your back straight. Close your eyes and focus on your breath—notice each inhale and exhale. When thoughts arise, gently return attention to your breathing without judgment. Start with 5 minutes daily and gradually increase. Consistency matters more than duration."]], "query": "how to meditate for beginners"} -{"output": [["lex", "boost immune system natural remedies"], ["lex", "strengthen immune system diet exercise sleep"], ["vec", "what natural methods help strengthen the immune system"], ["vec", "which foods, supplements, and lifestyle habits boost immune function naturally"], ["hyde", "Eat a diet rich in fruits, vegetables, and lean protein to supply vitamins C, D, and zinc. Exercise moderately for 30 minutes most days. Sleep 7-9 hours per night. Manage stress through meditation or yoga. Fermented foods like yogurt and kimchi support gut health, which is linked to immune function."]], "query": "how to boost immune system naturally"} -{"output": [["lex", "bake cake from scratch recipe"], ["lex", "homemade cake recipe flour butter eggs"], ["vec", "how do you bake a basic cake from scratch without a box mix"], ["vec", "what is a simple recipe for baking a homemade vanilla or chocolate cake"], ["hyde", "Preheat oven to 350°F (175°C). Mix 2 cups flour, 1.5 cups sugar, 3 eggs, 1 cup butter, 1 cup milk, 2 tsp baking powder, 1 tsp vanilla. Pour into greased 9-inch pans and bake 30-35 minutes until a toothpick comes out clean. Cool before frosting."]], "query": "how to bake a cake from scratch"} -{"output": [["lex", "Hindu festivals Diwali Holi Navratri"], ["lex", "Hinduism religious festivals celebrations"], ["vec", "what are the major festivals celebrated in Hinduism and their significance"], ["vec", "which Hindu festivals are the most widely observed and what do they celebrate"], ["hyde", "Diwali, the festival of lights, celebrates the triumph of light over darkness and honors Lakshmi. Holi marks the arrival of spring with colored powders. Navratri is a nine-night festival honoring the goddess Durga. Ganesh Chaturthi celebrates the birth of Lord Ganesha with elaborate processions."]], "query": "what are the main festivals in hinduism"} -{"output": [["lex", "replace car air filter engine cabin"], ["lex", "car air filter replacement DIY steps"], ["vec", "how do you replace the engine air filter in a car yourself"], ["vec", "what are the steps to change a car's air filter at home without a mechanic"], ["hyde", "Open the hood and locate the air filter housing—usually a black plastic box near the engine. Unclip the latches, remove the old filter, and note its orientation. Insert the new filter with the rubber rim facing up, close the housing, and secure the clips. Replace every 12,000-15,000 miles."]], "query": "how to replace car air filter?"} -{"output": [["lex", "digital transformation strategy enterprise"], ["lex", "digital transformation cloud automation AI"], ["vec", "what strategies do organizations use to drive successful digital transformation"], ["vec", "how do enterprises plan and execute a digital transformation initiative"], ["hyde", "A digital transformation strategy begins with assessing current processes and identifying bottlenecks. Prioritize quick wins like automating manual workflows. Migrate infrastructure to cloud platforms, adopt data analytics for decision-making, and invest in employee training. Measure ROI with KPIs tied to business outcomes."]], "query": "digital transformation strategies"} -{"output": [["lex", "argue climate action policy advocacy"], ["lex", "climate change argument evidence persuasion"], ["vec", "how can you make a compelling argument for urgent climate action"], ["vec", "what evidence and reasoning support the case for strong climate change policies"], ["hyde", "The scientific consensus is clear: global temperatures have risen 1.1°C since pre-industrial levels, causing more extreme weather, rising seas, and ecosystem collapse. Economic analyses show that the cost of inaction—estimated at $23 trillion by 2050—far exceeds the investment needed for a clean energy transition."]], "query": "how to argument for climate action"} -{"output": [["lex", "human activity climate change greenhouse gas emissions"], ["lex", "anthropogenic climate change fossil fuels deforestation"], ["vec", "how do human activities like burning fossil fuels contribute to climate change"], ["vec", "what is the scientific evidence linking human activity to global warming"], ["hyde", "Human activities—primarily burning fossil fuels for energy, deforestation, and industrial agriculture—release greenhouse gases like CO2 and methane into the atmosphere. Since 1850, atmospheric CO2 has risen from 280 to over 420 ppm, trapping heat and raising global average temperatures by 1.1°C."]], "query": "how does human activity affect climate change"} -{"output": [["lex", "wildlife-friendly garden habitat plants"], ["lex", "garden attract birds bees butterflies"], ["vec", "how can I design a garden that attracts and supports local wildlife"], ["vec", "what plants and features make a garden friendly to birds, bees, and butterflies"], ["hyde", "Plant native flowering species to attract pollinators—coneflower, milkweed, and lavender support bees and butterflies. Add a shallow water dish, leave leaf litter for insects, install nest boxes for birds, and avoid pesticides. A log pile provides habitat for beetles, frogs, and hedgehogs."]], "query": "how to create a wildlife-friendly garden?"} -{"output": [["lex", "long hike preparation gear checklist"], ["lex", "hiking preparation training nutrition hydration"], ["vec", "how should I prepare physically and logistically for a long day hike or multi-day trek"], ["vec", "what gear, training, and planning is needed before a long hiking trip"], ["hyde", "Train by walking with a loaded pack for progressively longer distances over 4-6 weeks. Pack the ten essentials: navigation, sun protection, insulation, illumination, first aid, fire, tools, nutrition, hydration, and shelter. Check the weather forecast and file a trip plan with someone you trust."]], "query": "how to prepare for a long hike"} -{"output": [["lex", "Photoshop digital painting brushes techniques"], ["lex", "digital painting Photoshop tutorial layers"], ["vec", "how do you use Adobe Photoshop for digital painting and illustration"], ["vec", "what Photoshop tools, brushes, and techniques are essential for digital painting"], ["hyde", "In Photoshop, start a digital painting by creating a new canvas at 300 DPI. Use the Brush tool (B) with pressure sensitivity enabled on a graphics tablet. Block in shapes on separate layers, then refine details. Use layer blend modes like Multiply for shadows and Screen for highlights."]], "query": "how to use photoshop for digital painting?"} -{"output": [["lex", "Kubernetes latest version changes release notes 2025 2026"], ["lex", "Kubernetes new features changelog update"], ["vec", "what are the notable changes and new features in the latest Kubernetes release"], ["vec", "what major features were added or deprecated in the most recent Kubernetes version in 2025 or 2026"], ["hyde", "Kubernetes v1.32 introduced improvements to sidecar containers (now GA), enhanced pod scheduling with dynamic resource allocation, graduated the Gateway API to stable, and deprecated legacy in-tree cloud provider integrations in favor of external cloud controller managers."]], "query": "what changed in kubernetes latest version"} -{"output": [["lex", "e-commerce electronic commerce online shopping"], ["lex", "e-commerce platform business model"], ["vec", "what is e-commerce and how do online businesses sell products and services"], ["vec", "how does electronic commerce work from storefront to payment processing"], ["hyde", "E-commerce (electronic commerce) is the buying and selling of goods or services over the internet. Business models include B2C (Amazon, Shopify stores), B2B (Alibaba), C2C (eBay, Etsy), and D2C (brands selling directly). Transactions are processed through payment gateways like Stripe or PayPal."]], "query": "what is e-commerce?"} -{"output": [["lex", "the good life philosophy eudaimonia ethics"], ["lex", "philosophical good life Aristotle virtue happiness"], ["vec", "what does the concept of the good life mean in philosophy and ethics"], ["vec", "how did Aristotle and other philosophers define what it means to live a good life"], ["hyde", "In Aristotelian ethics, the good life (eudaimonia) is achieved through the practice of virtue and the exercise of reason over a complete lifetime. It is not mere pleasure but a state of flourishing—living in accordance with one's highest capacities within a community."]], "query": "what is meant by 'the good life' in philosophy"} -{"output": [["lex", "federal legislation tracking Congress bills"], ["lex", "federal law lookup Congress.gov bill status"], ["vec", "how can I find information about federal legislation and bills in the U.S. Congress"], ["vec", "what resources are available to track federal bills and laws through the legislative process"], ["hyde", "Congress.gov is the official source for federal legislation. Search by bill number, keyword, or sponsor. Each bill page shows full text, status, cosponsors, committee actions, and vote records. GovTrack.us and ProPublica's Congress API provide additional analysis and tracking tools."]], "query": "how to obtain information on federal legislation"} -{"output": [["lex", "classical music elements melody harmony rhythm"], ["lex", "classical music composition structure form"], ["vec", "what are the fundamental elements and structures of classical music"], ["vec", "how do melody, harmony, rhythm, and form work together in classical music compositions"], ["hyde", "Classical music is built on melody (a sequence of notes forming a theme), harmony (chords supporting the melody), rhythm (the timing and pattern of notes), dynamics (volume changes), and form (the structure, such as sonata, rondo, or theme and variations)."]], "query": "what are the elements of classical music?"} -{"output": [["lex", "Celtic traditions customs festivals Ireland Scotland"], ["lex", "Celtic culture Samhain Beltane druids"], ["vec", "what are the traditional customs and cultural practices of the Celtic peoples"], ["vec", "which Celtic traditions like Samhain and Beltane are still observed today"], ["hyde", "Celtic traditions include seasonal festivals marking the agricultural calendar: Samhain (Oct 31) honored the dead and the start of winter, Imbolc (Feb 1) marked spring's return, Beltane (May 1) celebrated fertility with bonfires, and Lughnasadh (Aug 1) was the harvest festival. Many survive in Irish and Scottish culture today."]], "query": "what are celtic traditions and customs"} -{"output": [["lex", "hash code function programming"], ["lex", "hashCode Java hash table implementation"], ["lex", "cryptographic hash function SHA MD5"], ["vec", "what is a hash code and how are hash functions used in programming"], ["vec", "how does the hashCode method work in Java for hash tables and collections"], ["hyde", "A hash code is an integer value computed from an object's data, used to quickly locate it in a hash table. In Java, every object has a hashCode() method. For HashMap, objects with equal hashCodes go to the same bucket, and equals() resolves collisions. Override both hashCode() and equals() together."]], "query": "hash code"} -{"output": [["lex", "artificial intelligence AI machine learning"], ["lex", "artificial intelligence definition applications"], ["vec", "what is artificial intelligence and how does it work at a fundamental level"], ["vec", "what are the main types and applications of artificial intelligence technology"], ["hyde", "Artificial intelligence (AI) is the simulation of human intelligence by computer systems. It encompasses machine learning (learning from data), natural language processing (understanding language), and computer vision (interpreting images). AI systems are trained on large datasets to recognize patterns and make predictions."]], "query": "what is artificial intelligence"} -{"output": [["lex", "interfaith dialogue religious traditions"], ["lex", "interfaith dialogue ecumenism interreligious"], ["vec", "what is interfaith dialogue and why is it important for religious communities"], ["vec", "how do different religious groups engage in interfaith dialogue to promote understanding"], ["hyde", "Interfaith dialogue is the cooperative interaction between people of different religious traditions, aimed at mutual understanding rather than conversion. Organizations like the Parliament of the World's Religions bring together leaders from Christianity, Islam, Judaism, Hinduism, Buddhism, and others to discuss shared values and address social issues."]], "query": "what is interfaith dialogue?"} -{"output": [["lex", "Darwin theory evolution natural selection"], ["lex", "Darwin Origin of Species evolution"], ["vec", "what is Charles Darwin's theory of evolution by natural selection"], ["vec", "how did Darwin explain the origin of species through natural selection and adaptation"], ["hyde", "In On the Origin of Species (1859), Charles Darwin proposed that species evolve over generations through natural selection. Organisms with traits better suited to their environment survive and reproduce more, passing those advantageous traits to offspring. Over time, this leads to new species."]], "query": "what is darwin's theory of evolution"} -{"output": [["lex", "permaculture gardening design principles"], ["lex", "permaculture garden sustainable agriculture"], ["vec", "what is permaculture gardening and how does it apply ecological design principles"], ["vec", "how do you design a permaculture garden that mimics natural ecosystems"], ["hyde", "Permaculture gardening applies ecological design principles to create self-sustaining food systems. It uses zones radiating from the home, guilds of companion plants, water harvesting with swales, and polyculture instead of monoculture. The goal is a garden that produces food with minimal external inputs."]], "query": "what is permaculture gardening?"} -{"output": [["lex", "gratitude practice daily journal techniques"], ["lex", "practicing gratitude mental health benefits"], ["vec", "what are effective ways to practice gratitude in everyday life"], ["vec", "how does a daily gratitude practice improve mental health and well-being"], ["hyde", "Keep a gratitude journal and write three specific things you're grateful for each night—not vague statements, but concrete moments. Write a gratitude letter to someone who impacted you. During meals, pause to appreciate the food. Research shows consistent gratitude practice reduces anxiety and improves sleep."]], "query": "how to practice gratitude"} -{"output": [["lex", "digital credentials badges certificates verification"], ["lex", "digital credentials blockchain verifiable"], ["vec", "what are digital credentials and how are they used to verify qualifications"], ["vec", "how do digital badges and verifiable credentials work for education and employment"], ["hyde", "Digital credentials are electronic records that verify a person's qualifications, skills, or achievements. They include digital badges, certificates, and micro-credentials issued by platforms like Credly or Accredible. Verifiable credentials use cryptographic signatures so employers can instantly confirm authenticity without contacting the issuer."]], "query": "what are digital credentials?"} -{"output": [["lex", "culture ethics moral values influence"], ["lex", "cultural relativism ethics cross-cultural morality"], ["vec", "how does culture shape people's ethical beliefs and moral values"], ["vec", "what is the relationship between cultural norms and ethical decision-making"], ["hyde", "Culture shapes ethics by defining what a society considers right or wrong. Collectivist cultures may prioritize group harmony and duty to family, while individualist cultures emphasize personal autonomy and rights. Cultural relativism argues that moral standards are culturally defined, while universalists hold that some ethical principles transcend culture."]], "query": "how does culture influence ethics"} -{"output": [["lex", "stream of consciousness writing technique"], ["lex", "stream of consciousness Joyce Woolf literature"], ["vec", "what is the stream of consciousness technique in literature and who pioneered it"], ["vec", "how do authors use stream of consciousness to portray inner thoughts in fiction"], ["hyde", "Stream of consciousness is a literary method that captures the continuous flow of a character's thoughts, memories, and perceptions without conventional structure. James Joyce's Ulysses and Virginia Woolf's Mrs Dalloway are landmark examples, using free-flowing prose, associative leaps, and minimal punctuation."]], "query": "what is stream of consciousness?"} -{"output": [["lex", "body systems interaction physiology"], ["lex", "human body organ systems coordination"], ["vec", "how do the different organ systems in the human body work together to maintain health"], ["vec", "what are examples of body systems interacting with each other in human physiology"], ["hyde", "The circulatory system delivers oxygen absorbed by the respiratory system to muscles controlled by the nervous system. The digestive system breaks down nutrients that the circulatory system distributes. The endocrine system releases hormones that regulate metabolism, growth, and the immune response."]], "query": "how do body systems work together"} -{"output": [["lex", "sustainable development principles environmental social economic"], ["lex", "sustainable development goals UN SDGs"], ["vec", "what are the core principles of sustainable development and why do they matter"], ["vec", "how do the three pillars of sustainable development balance environmental, social, and economic needs"], ["hyde", "Sustainable development meets present needs without compromising future generations' ability to meet theirs (Brundtland Report, 1987). Its three pillars are environmental protection, social equity, and economic viability. The UN's 17 Sustainable Development Goals (SDGs) provide a framework for global action through 2030."]], "query": "what are the principles of sustainable development"} -{"output": [["lex", "evaluate startup ideas validation framework"], ["lex", "startup idea assessment market viability"], ["vec", "how do entrepreneurs evaluate whether a startup idea is worth pursuing"], ["vec", "what frameworks and criteria help assess the viability of a new startup idea"], ["hyde", "Evaluate a startup idea on four dimensions: problem severity (is this a hair-on-fire problem?), market size (TAM > $1B?), competitive landscape (what's the unfair advantage?), and founder-market fit (do you have unique insight?). Validate by talking to 50+ potential customers before writing any code."]], "query": "how to evaluate startup ideas"} -{"output": [["lex", "business plan writing template sections"], ["lex", "business plan executive summary financial projections"], ["vec", "how do you write a comprehensive business plan for a new company"], ["vec", "what sections and information should be included in a startup business plan"], ["hyde", "A business plan includes: executive summary, company description, market analysis, organization structure, product/service line, marketing strategy, funding request, and financial projections. Start with a clear problem statement and your unique solution. Include 3-year revenue forecasts with assumptions clearly stated."]], "query": "how to write a business plan"} -{"output": [["lex", "greenhouse gases CO2 methane atmosphere"], ["lex", "greenhouse gas effect global warming climate"], ["vec", "what are greenhouse gases and how do they contribute to global warming"], ["vec", "which gases trap heat in Earth's atmosphere and cause the greenhouse effect"], ["hyde", "Greenhouse gases—including carbon dioxide (CO2), methane (CH4), nitrous oxide (N2O), and fluorinated gases—trap infrared radiation in the atmosphere, warming the planet. CO2 is the most abundant from fossil fuel combustion. Methane, though shorter-lived, is 80 times more potent over 20 years."]], "query": "what are greenhouse gases?"} -{"output": [["lex", "sacredness religion sacred concept interpretation"], ["lex", "sacred space rituals holy religious traditions"], ["vec", "how do different world religions define and interpret the concept of sacredness"], ["vec", "what does sacredness mean across Christianity, Islam, Hinduism, Buddhism, and indigenous traditions"], ["hyde", "In Christianity, sacredness is conferred by God's presence—churches, sacraments, and scripture are holy. In Hinduism, sacred rivers like the Ganges and temples house divine energy. Indigenous traditions see sacredness in natural features—mountains, groves, and animals. Islam treats the Quran and Mecca as inviolably sacred."]], "query": "how do religions interpret the concept of sacredness?"} -{"output": [["lex", "introduce solid foods baby age months"], ["lex", "baby first foods solids weaning schedule"], ["vec", "at what age should you start introducing solid foods to a baby"], ["vec", "what are the signs a baby is ready for solid foods and what foods to start with"], ["hyde", "Most pediatricians recommend introducing solid foods around 6 months of age. Signs of readiness include sitting up with support, showing interest in food, and loss of the tongue-thrust reflex. Start with single-ingredient purees like sweet potato, avocado, or iron-fortified cereal, one new food every 3-5 days."]], "query": "when to introduce solid foods to a baby?"} -{"output": [["lex", "Renaissance literature authors works"], ["lex", "Renaissance literary period Shakespeare Petrarch humanism"], ["vec", "what are the major works and characteristics of Renaissance literature"], ["vec", "how did Renaissance humanism influence literature in Europe during the 14th-17th centuries"], ["hyde", "Renaissance literature (14th-17th century) was shaped by humanism's emphasis on individual experience and classical learning. Key figures include Petrarch (sonnets), Boccaccio (Decameron), Shakespeare (plays and sonnets), Cervantes (Don Quixote), and Machiavelli (The Prince). Vernacular languages replaced Latin as the literary standard."]], "query": "renaissance literature"} -{"output": [["lex", "digital twins industry transformation simulation"], ["lex", "digital twin technology manufacturing IoT"], ["vec", "how are digital twins being used to transform industries like manufacturing and healthcare"], ["vec", "what is digital twin technology and how does it improve operational efficiency in industry"], ["hyde", "A digital twin is a virtual replica of a physical asset, process, or system, updated in real time with IoT sensor data. In manufacturing, digital twins simulate production lines to predict failures. In healthcare, patient-specific organ models guide surgical planning. Energy companies use them to optimize wind turbine performance."]], "query": "how digital twins transform industries"} -{"output": [["lex", "resilience training programs mental toughness"], ["lex", "resilience building workplace employee training"], ["vec", "what are resilience training programs and how do they build mental toughness"], ["vec", "how do organizations implement resilience training for employees and teams"], ["hyde", "Resilience training programs teach participants to manage stress, adapt to adversity, and recover from setbacks. Common frameworks include cognitive behavioral techniques, mindfulness practices, and strengths-based coaching. The U.S. Army's Master Resilience Training and Penn Resilience Program are widely studied evidence-based models."]], "query": "resilience training programs"} -{"output": [["lex", "jump-start car battery jumper cables"], ["lex", "jump start dead car battery steps"], ["vec", "what is the correct procedure to jump-start a car with a dead battery?"], ["vec", "how do you connect jumper cables between two cars to restart a dead battery?"], ["hyde", "To jump-start a car, connect the red clamp to the dead battery positive terminal, then to the donor battery positive. Connect black to donor negative, then to unpainted metal on the dead car. Start the donor car, wait 2 minutes, then start the dead car."]], "query": "how to jump-start a car?"} -{"output": [["lex", "google maps directions navigation"], ["lex", "google maps route planner"], ["lex", "google maps API embed"], ["vec", "how to use Google Maps for turn-by-turn driving directions"], ["vec", "what features does Google Maps offer for route planning and navigation?"], ["hyde", "Open Google Maps on your phone or browser, type your destination in the search bar, and tap \"Directions.\" Choose driving, transit, walking, or cycling. The app will show estimated travel time and alternative routes."]], "query": "google maps"} -{"output": [["lex", "smooth sailing techniques"], ["lex", "sailboat trim wind conditions"], ["lex", "reduce boat heeling pitching"], ["vec", "how do you achieve smooth sailing on a sailboat in varying wind conditions?"], ["vec", "what techniques help reduce choppy motion and maintain a comfortable ride while sailing?"], ["hyde", "To sail smoothly, keep the boat balanced by adjusting the mainsheet and jib trim. Ease the sails slightly in gusts to reduce heeling, and steer at an angle that minimizes pitching through waves."]], "query": "sail smooth"} -{"output": [["lex", "value proposition canvas template"], ["lex", "unique value proposition statement"], ["lex", "customer value proposition examples"], ["vec", "how do you write a compelling value proposition for a product or service?"], ["vec", "what framework helps define a unique value proposition that resonates with target customers?"], ["hyde", "A strong value proposition clearly states what your product does, who it's for, and why it's better than alternatives. Use this formula: We help [target customer] achieve [desired outcome] by [unique approach], unlike [competitors] who [limitation]."]], "query": "how to create a value proposition"} -{"output": [["lex", "buy used cars online marketplace"], ["lex", "certified pre-owned cars website"], ["lex", "online used car dealers Carvana AutoTrader"], ["vec", "what are the best websites for buying used cars online with delivery?"], ["vec", "which online platforms sell certified pre-owned vehicles with warranties?"], ["hyde", "Popular online used car marketplaces include Carvana, CarMax, AutoTrader, and Cars.com. Carvana offers home delivery and a 7-day return policy. CarMax provides no-haggle pricing and certified inspections on all vehicles."]], "query": "where to buy used cars online"} -{"output": [["lex", "zoroastrianism practices rituals worship"], ["lex", "zoroastrian fire temple prayer"], ["lex", "zoroastrian navjote purity rituals"], ["vec", "what are the core religious practices and rituals observed in Zoroastrianism?"], ["vec", "how do Zoroastrians worship and what daily rituals do they follow?"], ["hyde", "Zoroastrians pray five times daily (the five Gahs) facing a source of light. The sacred fire is maintained in fire temples as a symbol of Ahura Mazda's truth. Key rituals include the Navjote initiation ceremony, wearing the sudreh and kusti, and maintaining ritual purity."]], "query": "what are the main practices in zoroastrianism?"} -{"output": [["lex", "increase daily physical activity steps"], ["lex", "exercise habits sedentary lifestyle"], ["lex", "walking more daily movement tips"], ["vec", "what are practical ways to add more physical activity to a sedentary daily routine?"], ["vec", "how can someone gradually increase their daily step count and movement throughout the day?"], ["hyde", "Take the stairs instead of the elevator, park farther from entrances, and set a timer to stand and walk every 30 minutes. Aim for 10,000 steps daily by adding short walks after meals. Even 5-minute movement breaks reduce the health risks of prolonged sitting."]], "query": "how to increase daily physical activity"} -{"output": [["lex", "bioethics cloning human reproductive therapeutic"], ["lex", "ethical issues cloning debate"], ["lex", "cloning moral arguments bioethics"], ["vec", "what ethical arguments do bioethicists raise for and against human cloning?"], ["vec", "how does the field of bioethics evaluate therapeutic versus reproductive cloning?"], ["hyde", "Bioethicists distinguish between reproductive cloning, which aims to create a new human being, and therapeutic cloning, which produces embryonic stem cells for medical research. Most bioethicists oppose reproductive cloning due to safety risks, concerns about human dignity, and the commodification of life."]], "query": "how does bioethics address cloning"} -{"output": [["lex", "genetic engineering DNA modification"], ["lex", "gene editing CRISPR recombinant DNA"], ["lex", "genetically modified organisms GMO"], ["vec", "what is genetic engineering and how does it work to modify an organism's DNA?"], ["vec", "what are the main techniques used in genetic engineering such as CRISPR and recombinant DNA?"], ["hyde", "Genetic engineering is the direct manipulation of an organism's DNA using biotechnology. Scientists can insert, delete, or modify genes to alter traits. Key techniques include recombinant DNA technology, which combines DNA from different sources, and CRISPR-Cas9, which allows precise editing at specific locations in the genome."]], "query": "what is genetic engineering"} -{"output": [["lex", "test drive car checklist"], ["lex", "car test drive tips what to check"], ["lex", "dealership test drive questions"], ["vec", "what should you look for and evaluate during a car test drive?"], ["vec", "how do you properly test drive a vehicle before buying it?"], ["hyde", "During a test drive, check acceleration, braking response, and steering feel. Drive on highways, local roads, and over bumps. Listen for unusual noises. Test the infotainment system, climate control, and visibility from all mirrors. Make sure the seats are comfortable and adjust to your driving position."]], "query": "how to test drive a car?"} -{"output": [["lex", "philosophy of death mortality"], ["lex", "existentialism death Heidegger Epicurus"], ["lex", "philosophical views afterlife mortality"], ["vec", "how have major philosophers throughout history approached the concept of death and mortality?"], ["vec", "what do existentialist and ancient philosophers say about the meaning of death?"], ["hyde", "Epicurus argued that death is nothing to fear because when death exists, we do not. Heidegger saw death as central to authentic existence, calling it \"Being-toward-death.\" The Stoics taught that meditating on mortality (memento mori) leads to a more purposeful life."]], "query": "how do philosophers approach death"} -{"output": [["lex", "capital Japan Tokyo"], ["lex", "Tokyo capital city Japan"], ["vec", "what city is the capital of Japan?"], ["vec", "when did Tokyo become the capital of Japan?"], ["hyde", "Tokyo is the capital city of Japan. It became the capital in 1868 when Emperor Meiji moved the imperial seat from Kyoto. Tokyo, located on the eastern coast of Honshu, is the most populous metropolitan area in the world with over 37 million residents."]], "query": "what is the capital of japan"} -{"output": [["lex", "afterlife beliefs religions Christianity Islam Buddhism"], ["lex", "heaven hell reincarnation afterlife"], ["lex", "religious views life after death"], ["vec", "how do different world religions view the afterlife and what happens after death?"], ["vec", "what role does belief in the afterlife play in Christianity, Islam, Hinduism, and Buddhism?"], ["hyde", "In Christianity, the afterlife involves heaven or hell based on faith and deeds. Islam teaches judgment day followed by paradise (Jannah) or hellfire. Hinduism and Buddhism believe in reincarnation, where the soul is reborn based on karma until achieving moksha or nirvana."]], "query": "what is the significance of the afterlife in different faiths?"} -{"output": [["lex", "3D printing additive manufacturing process"], ["lex", "FDM SLA 3D printer filament resin"], ["lex", "3D printing layer by layer CAD model"], ["vec", "how does 3D printing work to create objects layer by layer from a digital model?"], ["vec", "what are the main types of 3D printing technologies such as FDM and SLA?"], ["hyde", "3D printing, or additive manufacturing, builds objects layer by layer from a digital CAD file. The most common method, FDM (Fused Deposition Modeling), melts plastic filament and extrudes it through a nozzle. SLA (Stereolithography) uses a UV laser to cure liquid resin into solid layers."]], "query": "what is 3d printing and how does it work"} -{"output": [["lex", "contact congressperson phone email address"], ["lex", "find elected representative congress"], ["lex", "write letter senator representative"], ["vec", "how can I find and contact my U.S. congressional representative or senator?"], ["vec", "what is the best way to reach out to my congressperson about an issue?"], ["hyde", "Visit house.gov and enter your zip code to find your U.S. Representative. For senators, go to senate.gov. You can call their D.C. or district office, send an email through their website contact form, or mail a letter. Calling the Capitol switchboard at (202) 224-3121 connects you to any member's office."]], "query": "how do i contact my congressperson"} -{"output": [["lex", "stream of consciousness writing technique"], ["lex", "stream of consciousness literature Joyce Woolf"], ["lex", "interior monologue narrative style"], ["vec", "what is stream of consciousness as a literary writing technique?"], ["vec", "how did authors like James Joyce and Virginia Woolf use stream of consciousness in their novels?"], ["hyde", "Stream of consciousness is a narrative technique that presents a character's continuous flow of thoughts, feelings, and associations without conventional structure. James Joyce's \"Ulysses\" and Virginia Woolf's \"Mrs Dalloway\" are landmark examples, using long unpunctuated passages to mimic the way the mind actually works."]], "query": "what is stream of consciousness writing?"} -{"output": [["lex", "ring light setup photography video"], ["lex", "ring light placement distance camera"], ["lex", "ring light selfie video lighting"], ["vec", "how do you set up and position a ring light for video recording or photography?"], ["vec", "what are the best settings and distance for using a ring light for selfies and video calls?"], ["hyde", "Place the ring light directly in front of your face at eye level, with the camera positioned in the center of the ring. Keep the light 12-24 inches from your face for an even, shadow-free glow. Adjust brightness to avoid overexposure. The circular catchlights in the eyes are a signature look."]], "query": "how to use a ring light"} -{"output": [["lex", "civic duties voting jury duty community"], ["lex", "civic engagement participation democracy"], ["lex", "citizen responsibilities voting volunteering"], ["vec", "what are the main civic duties citizens should participate in beyond voting?"], ["vec", "how can someone actively engage in civic responsibilities in their local community?"], ["hyde", "Civic duties include voting in elections, serving on a jury when called, staying informed about local issues, attending town hall meetings, volunteering for community organizations, and contacting elected officials about policy concerns. Voting in local elections has the most direct impact on your daily life."]], "query": "how to engage in civic duties"} -{"output": [["lex", "living in Spain expat lifestyle"], ["lex", "Spain cost of living culture daily life"], ["lex", "move to Spain quality of life"], ["vec", "what is daily life like for someone living in Spain as an expat or resident?"], ["vec", "what is the cost of living and quality of life in Spain compared to other European countries?"], ["hyde", "Life in Spain revolves around a later schedule than most of Europe. Lunch is the main meal, typically eaten between 2-3 PM, and dinner is served after 9 PM. The cost of living is lower than in northern Europe, with affordable housing outside Madrid and Barcelona. The climate, healthcare system, and social culture attract many expats."]], "query": "spain life"} -{"output": [["lex", "AI-driven analytics machine learning data"], ["lex", "artificial intelligence business analytics platform"], ["lex", "AI predictive analytics tools"], ["vec", "how are AI and machine learning used to power data analytics and business intelligence?"], ["vec", "what AI-driven analytics platforms help businesses make data-driven predictions?"], ["hyde", "AI-driven analytics uses machine learning algorithms to automatically detect patterns, anomalies, and trends in large datasets. Unlike traditional BI tools, AI analytics can generate predictive forecasts, perform natural language queries, and surface insights without manual configuration."]], "query": "ai-driven analytics"} -{"output": [["lex", "vintage home accessories shop online"], ["lex", "retro home decor antique store"], ["lex", "vintage furniture accessories Etsy eBay"], ["vec", "where can I buy vintage and antique home decor accessories online?"], ["vec", "what are the best stores and websites for finding retro and vintage home furnishings?"], ["hyde", "Shop vintage home accessories on Etsy, Chairish, and 1stDibs for curated antique finds. Local estate sales and flea markets often have unique pieces at lower prices. Ruby Lane specializes in antiques, while eBay offers a wide selection of retro decor from various eras."]], "query": "where to buy vintage home accessories"} -{"output": [["lex", "join political party registration"], ["lex", "register Democrat Republican party membership"], ["lex", "political party membership sign up"], ["vec", "how do you officially join or register with a political party in the United States?"], ["vec", "what is the process for becoming a member of a political party?"], ["hyde", "To join a political party in the U.S., register with your state's election office by selecting a party affiliation on your voter registration form. You can register online, by mail, or at your local DMV. Some states allow you to change party affiliation at any time, while others have deadlines before primary elections."]], "query": "how to join a political party"} -{"output": [["lex", "quit smoking methods nicotine"], ["lex", "stop smoking cessation plan"], ["lex", "nicotine replacement therapy patches gum"], ["vec", "what are the most effective methods and strategies to quit smoking permanently?"], ["vec", "how do nicotine replacement therapies and medications help people stop smoking?"], ["hyde", "The most effective approach combines nicotine replacement therapy (patches, gum, or lozenges) with behavioral support. Prescription medications like varenicline (Chantix) and bupropion can double quit rates. Set a quit date, identify triggers, and call 1-800-QUIT-NOW for free coaching."]], "query": "how to quit smoking?"} -{"output": [["lex", "phenomenological existentialism Heidegger Sartre"], ["lex", "phenomenology existentialism lived experience"], ["lex", "existential phenomenology philosophy"], ["vec", "what is phenomenological existentialism and how does it differ from other branches of existentialism?"], ["vec", "how did Heidegger and Sartre combine phenomenology with existentialist philosophy?"], ["hyde", "Phenomenological existentialism applies Husserl's phenomenological method to existential questions about human existence. Heidegger's \"Being and Time\" analyzes Dasein (being-there) through the structures of lived experience. Sartre extended this in \"Being and Nothingness,\" arguing that consciousness is always directed toward objects and that existence precedes essence."]], "query": "what is phenomenological existentialism"} -{"output": [["lex", "install car seat covers DIY"], ["lex", "car seat cover fitting instructions"], ["lex", "universal seat covers installation steps"], ["vec", "what is the step-by-step process for installing car seat covers?"], ["vec", "how do you fit universal car seat covers on front and rear seats?"], ["hyde", "Pull the seat cover over the top of the headrest and stretch it down over the backrest. Tuck the excess fabric into the gap between the seat and backrest. Hook the elastic straps underneath the seat and clip them together. For bucket seats, align the cover's seams with the seat contours before securing."]], "query": "how to install car seat covers?"} -{"output": [["lex", "drug development process phases clinical trials"], ["lex", "pharmaceutical drug approval FDA pipeline"], ["lex", "preclinical clinical trial Phase 1 2 3"], ["vec", "what are the stages of the scientific process for developing and approving a new pharmaceutical drug?"], ["vec", "how does a drug go from laboratory discovery through clinical trials to FDA approval?"], ["hyde", "Drug development follows a pipeline: discovery and preclinical testing (3-6 years), Phase I trials testing safety in small groups, Phase II trials evaluating efficacy, Phase III large-scale trials confirming effectiveness, and FDA review. The entire process typically takes 10-15 years and costs over $1 billion."]], "query": "what is the scientific process for drug development"} -{"output": [["lex", "climate change global warming greenhouse gases"], ["lex", "climate change causes effects CO2"], ["lex", "global temperature rise fossil fuels"], ["vec", "what is climate change and what are its primary causes and effects on the planet?"], ["vec", "how do greenhouse gas emissions from fossil fuels contribute to global climate change?"], ["hyde", "Climate change refers to long-term shifts in global temperatures and weather patterns. Since the Industrial Revolution, burning fossil fuels has released CO2 and other greenhouse gases that trap heat in the atmosphere, raising the average global temperature by about 1.1°C. This causes rising sea levels, extreme weather, and ecosystem disruption."]], "query": "what is climate change"} -{"output": [["lex", "sell car privately steps title transfer"], ["lex", "private car sale listing price"], ["lex", "sell used car by owner paperwork"], ["vec", "what are the steps to sell a car privately without a dealer?"], ["vec", "what paperwork and documentation do you need to sell a car to a private buyer?"], ["hyde", "To sell a car privately, first determine a fair price using Kelley Blue Book or Edmunds. Gather the title, maintenance records, and smog certificate. List the car on Craigslist, Facebook Marketplace, or AutoTrader. When meeting buyers, accept cashier's checks or cash. Sign the title over and file a release of liability with your DMV."]], "query": "how to sell a car privately?"} -{"output": [["lex", "analyze political candidate stance positions"], ["lex", "candidate policy positions voting record"], ["lex", "compare political candidates issues"], ["vec", "how do you research and analyze a political candidate's policy positions and voting record?"], ["vec", "what tools and resources help voters compare political candidates on key issues?"], ["hyde", "Review the candidate's official website for stated policy positions. Check their voting record on congress.gov or VoteSmart.org. Compare their stances on key issues using tools like ISideWith or BallotReady. Look for consistency between their statements and votes, and check campaign finance records on OpenSecrets."]], "query": "how to analyze a political candidate's stance"} -{"output": [["lex", "lean startup methodology MVP"], ["lex", "lean startup build measure learn"], ["lex", "Eric Ries lean startup principles"], ["vec", "what is the lean startup methodology and how does the build-measure-learn cycle work?"], ["vec", "how does the lean startup approach use minimum viable products to validate business ideas?"], ["hyde", "The lean startup methodology, developed by Eric Ries, emphasizes rapid iteration through the Build-Measure-Learn feedback loop. Start by building a Minimum Viable Product (MVP), measure how customers respond using actionable metrics, and learn whether to pivot or persevere. The goal is to reduce waste by validating assumptions before investing heavily."]], "query": "what is lean startup methodology"} -{"output": [["lex", "Renaissance period history art culture"], ["lex", "Renaissance 14th 15th 16th century Italy Europe"], ["lex", "Renaissance art Leonardo Michelangelo humanism"], ["vec", "what was the Renaissance period and what were its major cultural and artistic achievements?"], ["vec", "how did the Renaissance transform European art, science, and intellectual thought?"], ["hyde", "The Renaissance was a cultural movement spanning roughly the 14th to 17th centuries, originating in Florence, Italy. It marked a revival of classical Greek and Roman learning, emphasizing humanism, individualism, and secular inquiry. Major figures include Leonardo da Vinci, Michelangelo, and Galileo."]], "query": "what is the renaissance"} -{"output": [["lex", "interfaith respect tolerance"], ["lex", "respecting different faiths religions"], ["lex", "religious tolerance diversity beliefs"], ["vec", "how can people show respect for different religious faiths and beliefs?"], ["vec", "what does interfaith respect and dialogue look like in diverse communities?"], ["hyde", "Respecting others' faith means listening without judgment, learning about different religious traditions, and recognizing that spiritual beliefs are deeply personal. Interfaith dialogue builds mutual understanding by focusing on shared values like compassion, justice, and community while honoring theological differences."]], "query": "faith respect"} -{"output": [["lex", "heirloom seed suppliers catalog"], ["lex", "buy heirloom seeds online non-GMO"], ["lex", "heirloom vegetable seed company"], ["vec", "where can I buy heirloom and non-GMO seeds from reputable suppliers?"], ["vec", "what are the best heirloom seed companies that sell open-pollinated vegetable seeds?"], ["hyde", "Top heirloom seed suppliers include Baker Creek Heirloom Seeds, Seed Savers Exchange, and Johnny's Selected Seeds. Baker Creek offers over 1,800 open-pollinated varieties with free shipping. Seed Savers Exchange is a nonprofit dedicated to preserving rare heirloom varieties through their seed bank and catalog."]], "query": "where to find heirloom seed suppliers?"} -{"output": [["lex", "Christian Easter celebration traditions"], ["lex", "Easter Sunday church service resurrection"], ["lex", "Holy Week Good Friday Easter customs"], ["vec", "how do Christians celebrate Easter and what are the main traditions of Holy Week?"], ["vec", "what religious services and customs do Christians observe during the Easter season?"], ["hyde", "Christians celebrate Easter as the resurrection of Jesus Christ on the third day after his crucifixion. Holy Week begins with Palm Sunday, followed by Maundy Thursday communion, Good Friday services, and Easter Sunday worship. Many churches hold sunrise services, and traditions include Easter egg hunts, lilies, and special meals."]], "query": "how do christians celebrate easter"} -{"output": [["lex", "exchange-traded funds ETFs investing"], ["lex", "ETF index fund stock market"], ["lex", "ETF vs mutual fund comparison"], ["vec", "what are exchange-traded funds (ETFs) and how do they work as an investment?"], ["vec", "how do ETFs differ from mutual funds and what are their advantages for investors?"], ["hyde", "An exchange-traded fund (ETF) is a basket of securities that trades on a stock exchange like a single stock. ETFs typically track an index like the S&P 500 and offer diversification at a low expense ratio. Unlike mutual funds, ETFs can be bought and sold throughout the trading day at market price."]], "query": "what are exchange-traded funds (etfs)"} -{"output": [["lex", "enhance creativity techniques exercises"], ["lex", "boost creative thinking brainstorming"], ["lex", "creativity habits daily practice"], ["vec", "what are proven techniques and exercises to enhance creative thinking?"], ["vec", "how can someone develop daily habits that boost creativity and generate new ideas?"], ["hyde", "To enhance creativity, practice divergent thinking by generating many ideas without judgment. Keep a daily journal, expose yourself to new experiences, and set aside unstructured time for daydreaming. Research shows that walking, adequate sleep, and constraints can all stimulate creative problem-solving."]], "query": "how to enhance creativity?"} -{"output": [["lex", "Taoist philosophy Taoism key concepts"], ["lex", "Tao Te Ching wu wei Taoism"], ["lex", "Taoism yin yang natural harmony"], ["vec", "what are the central concepts and key features of Taoist philosophy?"], ["vec", "how does Taoism emphasize living in harmony with the Tao and the concept of wu wei?"], ["hyde", "Taoism centers on the Tao (the Way), an ineffable force that underlies all existence. Key concepts include wu wei (non-action or effortless action), living in harmony with nature, and the balance of yin and yang. The Tao Te Ching by Laozi and the Zhuangzi are the foundational texts."]], "query": "what are the key features of taoist philosophy?"} -{"output": [["lex", "scientific data visualization charts graphs"], ["lex", "data visualization tools matplotlib Python"], ["lex", "scientific figure plotting techniques"], ["vec", "what are effective techniques for visualizing scientific data in charts and graphs?"], ["vec", "which tools and software are best for creating publication-quality scientific data visualizations?"], ["hyde", "Choose chart types that match your data: scatter plots for correlations, bar charts for comparisons, line plots for time series, and heatmaps for matrices. Use matplotlib or ggplot2 for publication figures. Minimize chart junk, label axes clearly, and use colorblind-friendly palettes like viridis."]], "query": "how to effectively visualize scientific data"} -{"output": [["lex", "watch live NBA games streaming"], ["lex", "NBA League Pass live stream TV"], ["lex", "NBA games broadcast ESPN TNT"], ["vec", "where can I watch live NBA basketball games online or on TV?"], ["vec", "what streaming services and TV channels broadcast live NBA games in 2025-2026?"], ["hyde", "Live NBA games air on ESPN, TNT, and ABC during the regular season. NBA League Pass streams all out-of-market games. Streaming options include Sling TV, YouTube TV, and Hulu + Live TV for cable-free access. The NBA app offers free highlights and select live games on mobile."]], "query": "where to watch live nba games?"} -{"output": [["lex", "Industrial Revolution impact society economy"], ["lex", "Industrial Revolution social changes urbanization"], ["lex", "Industrial Revolution labor factories 18th 19th century"], ["vec", "how did the Industrial Revolution transform society, economy, and daily life?"], ["vec", "what were the major social and economic impacts of the Industrial Revolution on workers and cities?"], ["hyde", "The Industrial Revolution (1760-1840) shifted economies from agrarian to industrial, triggering mass urbanization as workers moved to factory cities. It created a new working class, child labor, and pollution, but also raised living standards over time, enabled mass production, and spurred technological innovation in transportation and communication."]], "query": "what was the impact of the industrial revolution on society?"} -{"output": [["lex", "gaining wisdom life experience"], ["lex", "wisdom philosophy personal growth"], ["lex", "how to become wiser decision making"], ["vec", "how does a person gain wisdom through life experience and reflection?"], ["vec", "what do philosophers and psychologists say about how wisdom is acquired?"], ["hyde", "Wisdom is gained through a combination of diverse life experience, reflective thinking, and learning from mistakes. Psychologist Paul Baltes identified wisdom as expert knowledge about the fundamental pragmatics of life, including understanding uncertainty, managing emotions, and balancing competing interests."]], "query": "wisdom gain"} -{"output": [["lex", "local government role responsibilities"], ["lex", "city county municipal government services"], ["lex", "local government functions zoning schools police"], ["vec", "what are the main roles and responsibilities of local government in a community?"], ["vec", "how does local city and county government provide public services and manage community affairs?"], ["hyde", "Local governments provide essential services including public schools, police and fire departments, road maintenance, water and sewer systems, zoning and land use planning, parks, and public transit. City councils and county boards set local taxes, pass ordinances, and approve budgets that directly affect residents' daily lives."]], "query": "what is the role of local government"} -{"output": [["lex", "metaphysical ethics philosophy morality"], ["lex", "metaphysics ethics moral realism"], ["lex", "metaethics ontology moral facts"], ["vec", "what is metaphysical ethics and how does it relate to the nature of moral reality?"], ["vec", "how does metaphysics inform ethical theory and questions about whether moral facts exist?"], ["hyde", "Metaphysical ethics, closely related to metaethics, examines the ontological status of moral values. It asks whether moral facts exist independently of human minds (moral realism) or are human constructions (anti-realism). This branch investigates the metaphysical foundations that underlie ethical claims, such as whether \"goodness\" is a real property in the world."]], "query": "what is metaphysical ethics"} -{"output": [["lex", "empiricism philosophy knowledge experience"], ["lex", "empiricism Locke Hume sensory evidence"], ["lex", "empiricism vs rationalism epistemology"], ["vec", "what is empiricism in philosophy and how does it claim knowledge is acquired through experience?"], ["vec", "how did philosophers like John Locke and David Hume develop the theory of empiricism?"], ["hyde", "Empiricism is the philosophical theory that all knowledge is derived from sensory experience rather than innate ideas. John Locke argued the mind starts as a \"tabula rasa\" (blank slate), and David Hume extended this by arguing that even causal relationships are known only through observation and habit, not reason alone."]], "query": "what is empiricism"} -{"output": [["lex", "epistemology philosophy knowledge"], ["lex", "epistemology theory of knowledge justified belief"], ["lex", "epistemology truth belief justification"], ["vec", "what is epistemology and what questions does it address about knowledge and belief?"], ["vec", "how does epistemology study the nature, sources, and limits of human knowledge?"], ["hyde", "Epistemology is the branch of philosophy concerned with the nature, scope, and limits of knowledge. It examines questions like: What is knowledge? How is it different from mere belief? What counts as justification? The classic definition from Plato is that knowledge is justified true belief, though this was challenged by Gettier in 1963."]], "query": "what is epistemology"} -{"output": [["lex", "community spirituality religious fellowship"], ["lex", "spiritual community congregation sangha"], ["lex", "communal worship spiritual practice"], ["vec", "why is community considered important in spiritual and religious practice?"], ["vec", "how does belonging to a spiritual community enhance personal faith and practice?"], ["hyde", "Spiritual communities provide shared worship, accountability, and mutual support that deepen individual faith. In Christianity, the church body gathers for fellowship; in Buddhism, the sangha is one of the Three Jewels; in Judaism, a minyan of ten is required for communal prayer. Communal practice reinforces commitment and provides belonging."]], "query": "what is the significance of community in spirituality?"} -{"output": [["lex", "memoir vs autobiography difference"], ["lex", "memoir autobiography literary genre"], ["lex", "memoir personal narrative autobiography life story"], ["vec", "what is the difference between a memoir and an autobiography as literary genres?"], ["vec", "how does a memoir's scope and focus differ from a full autobiography?"], ["hyde", "An autobiography covers the author's entire life chronologically, from birth to the present. A memoir focuses on a specific theme, period, or set of experiences from the author's life, emphasizing emotional truth and reflection. Memoirs are often more literary and thematic, while autobiographies are more comprehensive and factual."]], "query": "what is the difference between memoir and autobiography?"} -{"output": [["lex", "allegory literary device significance"], ["lex", "allegory examples literature symbolism"], ["lex", "allegorical writing Pilgrim's Progress Animal Farm"], ["vec", "what is an allegory in literature and why is it a significant literary device?"], ["vec", "how do authors use allegory to convey deeper moral or political meanings through symbolic narratives?"], ["hyde", "An allegory is a narrative in which characters, events, and settings symbolically represent abstract ideas or moral concepts. Orwell's \"Animal Farm\" allegorizes the Russian Revolution; Bunyan's \"Pilgrim's Progress\" represents the Christian spiritual journey. Allegory allows writers to critique society, explore complex ideas, and engage readers on multiple levels."]], "query": "what is the significance of allegory?"} -{"output": [["lex", "portrait photography tips lighting posing"], ["lex", "portrait photo camera settings lens"], ["lex", "headshot portrait natural light composition"], ["vec", "what are the best tips for taking professional-quality portrait photographs?"], ["vec", "how should you set up lighting, posing, and camera settings for portrait photography?"], ["hyde", "Use an 85mm or 50mm lens at f/1.8-f/2.8 to create a pleasing background blur. Position your subject near a window for soft natural light, or use a reflector to fill shadows. Focus on the nearest eye, shoot at eye level, and direct your subject to angle their body 45 degrees to the camera."]], "query": "portrait photography tips"} -{"output": [["lex", "build passive income streams"], ["lex", "passive income ideas investments dividends"], ["lex", "earn passive income rental property online"], ["vec", "what are the most reliable ways to build passive income streams?"], ["vec", "how can someone start generating passive income through investments, rental property, or online businesses?"], ["hyde", "Common passive income sources include dividend stocks yielding 3-5% annually, rental properties generating monthly cash flow, index fund investments, creating digital products or online courses, and building affiliate marketing websites. Start by investing in a low-cost S&P 500 index fund and reinvesting dividends."]], "query": "how to build passive income"} -{"output": [["lex", "choose camera DSLR mirrorless beginner"], ["lex", "camera buying guide sensor megapixels"], ["lex", "best camera photography type budget"], ["vec", "how do you choose the right camera for your photography needs and budget?"], ["vec", "what factors should you consider when deciding between DSLR and mirrorless cameras?"], ["hyde", "Decide what you'll shoot most: landscapes, portraits, video, or street photography. Mirrorless cameras are lighter with faster autofocus, while DSLRs offer longer battery life and more lens options. Key specs to compare: sensor size (full-frame vs APS-C), megapixels, autofocus points, and video capabilities. Budget $500-1000 for a capable starter body."]], "query": "how to choose the right camera"} -{"output": [["lex", "Great Barrier Reef significance ecosystem"], ["lex", "Great Barrier Reef coral biodiversity Australia"], ["lex", "Great Barrier Reef marine life conservation"], ["vec", "why is the Great Barrier Reef ecologically significant and important to protect?"], ["vec", "what makes the Great Barrier Reef the world's largest coral reef system and why is it under threat?"], ["hyde", "The Great Barrier Reef, stretching over 2,300 km along Australia's northeast coast, is the world's largest coral reef system and is visible from space. It supports over 1,500 fish species, 400 coral species, and countless marine organisms. It's a UNESCO World Heritage Site threatened by coral bleaching from rising ocean temperatures."]], "query": "what is the significance of the great barrier reef?"} -{"output": [["lex", "Holi festival celebration traditions India"], ["lex", "Holi festival of colors powder"], ["lex", "how to celebrate Holi customs food"], ["vec", "how is the Holi festival celebrated and what are its main traditions and customs?"], ["vec", "what are the traditional ways to celebrate Holi with colors, food, and bonfires?"], ["hyde", "Holi is celebrated over two days: Holika Dahan (bonfire night) and Rangwali Holi (color day). On the morning of Holi, people gather outdoors to throw colored powders (gulal) and spray colored water at each other. Traditional foods include gujiya (sweet dumplings), thandai (spiced milk drink), and puran poli."]], "query": "how to celebrate holi festival"} -{"output": [["lex", "negotiate salary offer tips"], ["lex", "salary negotiation techniques counter offer"], ["lex", "job offer salary negotiation script"], ["vec", "what are effective strategies for negotiating a higher salary during a job offer?"], ["vec", "how do you prepare for and conduct a successful salary negotiation?"], ["hyde", "Research the market rate for your role on Glassdoor, Levels.fyi, or Payscale before negotiating. When you receive an offer, express enthusiasm, then say \"I was hoping for something closer to [target].\" Always negotiate based on market data and your value, not personal needs. Aim 10-20% above the initial offer."]], "query": "how to negotiate a salary?"} -{"output": [["lex", "sacred geometry patterns symbols"], ["lex", "sacred geometry golden ratio Fibonacci"], ["lex", "sacred geometry Flower of Life Metatron"], ["vec", "what is sacred geometry and what mathematical patterns are considered sacred?"], ["vec", "how do sacred geometry concepts like the golden ratio and Flower of Life appear in nature and architecture?"], ["hyde", "Sacred geometry assigns symbolic and spiritual meaning to geometric shapes and proportions found in nature. Key patterns include the Flower of Life (overlapping circles), Metatron's Cube, the golden ratio (1.618), and the Fibonacci spiral. These patterns appear in sunflower seeds, nautilus shells, and ancient temple architecture."]], "query": "what is sacred geometry?"} -{"output": [["lex", "political corruption bribery abuse of power"], ["lex", "government corruption examples types"], ["lex", "political corruption embezzlement nepotism"], ["vec", "what is political corruption and what forms does it take in government?"], ["vec", "how does political corruption such as bribery and embezzlement undermine democratic governance?"], ["hyde", "Political corruption is the abuse of public office for private gain. Forms include bribery (accepting payments for favorable decisions), embezzlement of public funds, nepotism (appointing relatives to positions), patronage, and vote-buying. Transparency International's Corruption Perceptions Index ranks countries by perceived levels of public sector corruption."]], "query": "what is political corruption"} -{"output": [["lex", "Islam rituals Five Pillars worship"], ["lex", "Islamic prayer salat fasting Ramadan"], ["lex", "Muslim rituals hajj pilgrimage zakat"], ["vec", "what are the main rituals and religious practices in Islam?"], ["vec", "how do Muslims observe the Five Pillars of Islam including prayer, fasting, and pilgrimage?"], ["hyde", "The Five Pillars of Islam form the core rituals: Shahada (declaration of faith), Salat (five daily prayers facing Mecca), Zakat (annual charitable giving of 2.5% of wealth), Sawm (fasting during Ramadan from dawn to sunset), and Hajj (pilgrimage to Mecca at least once in a lifetime)."]], "query": "what are the rituals of islam"} -{"output": [["lex", "neural networks deep learning artificial"], ["lex", "neural network architecture layers neurons"], ["lex", "convolutional recurrent neural network CNN RNN"], ["vec", "how do artificial neural networks work and what are the different types of architectures?"], ["vec", "what are the basic components of a neural network including layers, weights, and activation functions?"], ["hyde", "A neural network consists of layers of interconnected nodes (neurons). Input data passes through hidden layers where each connection has a weight. Each neuron applies an activation function (like ReLU or sigmoid) to the weighted sum of its inputs. During training, backpropagation adjusts weights to minimize the loss function."]], "query": "neural networks"} -{"output": [["lex", "trolley problem ethics thought experiment"], ["lex", "trolley problem utilitarianism moral dilemma"], ["lex", "trolley problem Philippa Foot"], ["vec", "what is the trolley problem and why is it important in ethical philosophy?"], ["vec", "how does the trolley problem illustrate the conflict between utilitarian and deontological ethics?"], ["hyde", "The trolley problem, introduced by Philippa Foot in 1967, asks: a runaway trolley will kill five people unless you pull a lever to divert it onto a track where it will kill one person. Do you pull the lever? Utilitarians say yes (saving more lives), while deontologists argue that actively causing someone's death is morally different from allowing deaths to occur."]], "query": "what is the trolley problem"} -{"output": [["lex", "digital transformation business strategy"], ["lex", "digital transformation enterprise technology cloud"], ["lex", "business digitization automation workflows"], ["vec", "how are businesses implementing digital transformation to modernize their operations and strategy?"], ["vec", "what technologies drive digital transformation in enterprises, including cloud computing and automation?"], ["hyde", "Digital transformation involves integrating digital technology into all areas of a business, changing how it operates and delivers value. Key components include migrating to cloud infrastructure, automating manual processes, adopting data analytics for decision-making, and building digital customer experiences. McKinsey reports that 70% of transformation efforts fall short of their goals."]], "query": "digital transformation in businesses"} -{"output": [["lex", "protect business data security cybersecurity"], ["lex", "data protection encryption backup strategy"], ["lex", "business data security firewall access control"], ["vec", "what are the most important steps to protect sensitive business data from breaches and loss?"], ["vec", "how should a business implement data protection measures including encryption, backups, and access controls?"], ["hyde", "Protect business data with layered security: encrypt data at rest and in transit using AES-256, implement role-based access controls, enable multi-factor authentication for all accounts, maintain automated offsite backups with the 3-2-1 rule, and train employees on phishing awareness. Conduct regular security audits and penetration testing."]], "query": "how to protect business data"} -{"output": [["lex", "cellular respiration ATP glucose"], ["lex", "cellular respiration glycolysis Krebs cycle"], ["lex", "aerobic respiration mitochondria electron transport"], ["vec", "what is cellular respiration and how do cells convert glucose into ATP energy?"], ["vec", "what are the three stages of cellular respiration: glycolysis, the Krebs cycle, and the electron transport chain?"], ["hyde", "Cellular respiration is the metabolic process by which cells break down glucose (C6H12O6) to produce ATP. It occurs in three stages: glycolysis (in the cytoplasm, producing 2 ATP), the Krebs cycle (in the mitochondrial matrix, producing 2 ATP), and the electron transport chain (on the inner mitochondrial membrane, producing 34 ATP)."]], "query": "what is cellular respiration"} -{"output": [["lex", "technology impact scientific research tools"], ["lex", "technology advances science instruments computing"], ["lex", "AI machine learning scientific discovery"], ["vec", "how has modern technology transformed the way scientific research is conducted?"], ["vec", "what role do computing, AI, and advanced instruments play in accelerating scientific discovery?"], ["hyde", "Technology has transformed scientific research through high-throughput sequencing (enabling genomics), electron microscopy (revealing molecular structures), supercomputers (running complex simulations), and machine learning (identifying patterns in massive datasets). AI tools like AlphaFold have predicted protein structures that took decades to solve experimentally."]], "query": "how technology impacts scientific research"} -{"output": [["lex", "wearable technology evolution smartwatch fitness"], ["lex", "wearable tech health monitoring sensors 2025 2026"], ["lex", "wearable devices Apple Watch Garmin health tracking"], ["vec", "how is wearable technology evolving in terms of health monitoring and smart features?"], ["vec", "what are the latest advances in wearable devices for fitness tracking and medical diagnostics?"], ["hyde", "Wearable technology has evolved from basic step counters to sophisticated health monitors. Modern smartwatches track heart rate, blood oxygen, ECG, sleep stages, and skin temperature. Emerging features include continuous glucose monitoring, blood pressure sensing, and AI-powered health alerts that can detect atrial fibrillation and sleep apnea."]], "query": "how wearable technology is evolving"} -{"output": [["lex", "compassion ethics moral philosophy"], ["lex", "compassion morality empathy ethical theory"], ["lex", "ethics of care compassion Schopenhauer"], ["vec", "why is compassion considered a central virtue in ethical philosophy?"], ["vec", "how do ethical theories incorporate compassion as a foundation for moral behavior?"], ["hyde", "Schopenhauer argued that compassion (Mitleid) is the foundation of all morality, as it allows us to recognize the suffering of others as our own. The ethics of care, developed by Carol Gilligan and Nel Noddings, places compassionate relationships at the center of moral reasoning, contrasting with abstract rule-based approaches like Kantianism."]], "query": "what is the significance of compassion in ethics?"} -{"output": [["lex", "principle of double effect ethics"], ["lex", "double effect doctrine Aquinas moral philosophy"], ["lex", "double effect intended foreseen consequences"], ["vec", "what is the principle of double effect and how does it apply in moral philosophy?"], ["vec", "how does the doctrine of double effect distinguish between intended and foreseen consequences of an action?"], ["hyde", "The principle of double effect, originating from Thomas Aquinas, holds that an action with both good and bad effects is morally permissible if: (1) the action itself is not wrong, (2) the bad effect is not intended, (3) the bad effect is not the means to the good effect, and (4) the good effect outweighs the bad. It's commonly applied in medical ethics and just war theory."]], "query": "what is the principle of double effect"} -{"output": [["lex", "interior design trends 2025 2026"], ["lex", "interior design trends colors materials"], ["lex", "home decor trends furniture styles"], ["vec", "what are the newest interior design trends for homes in 2025 and 2026?"], ["vec", "which colors, materials, and furniture styles are trending in interior design right now?"], ["hyde", "Top interior design trends for 2025-2026 include warm earth tones replacing cool grays, curved furniture and organic shapes, bold textured walls, sustainable and natural materials like rattan and stone, statement lighting, and maximalist layering. Warm woods, bouclé fabrics, and vintage-inspired pieces continue to dominate living spaces."]], "query": "what are the latest trends in interior design"} -{"output": [["lex", "research candidates before voting election"], ["lex", "voter guide candidate positions issues"], ["lex", "candidate research voting record platform"], ["vec", "how can voters research political candidates and their positions before an election?"], ["vec", "what resources help voters compare candidates' platforms and voting records before casting a ballot?"], ["hyde", "Before voting, check nonpartisan voter guides from Vote411.org (League of Women Voters) or BallotReady. Review candidates' official websites for policy positions, and check voting records on VoteSmart.org. Read local newspaper endorsements, watch candidate debates, and verify claims on fact-checking sites like PolitiFact."]], "query": "how to research candidates before voting"} -{"output": [["lex", "Roman Empire cultural impact legacy"], ["lex", "Roman Empire influence law language architecture"], ["lex", "Rome culture art Latin Western civilization"], ["vec", "how did the Roman Empire shape Western culture, law, and language?"], ["vec", "what lasting cultural impacts did the Roman Empire have on architecture, government, and society?"], ["hyde", "The Roman Empire's cultural legacy includes Latin (the root of Romance languages), Roman law (the basis of civil law systems worldwide), architectural innovations like arches, aqueducts, and concrete, republican government concepts, road networks, and the spread of Christianity. Roman art, literature, and engineering influenced Western civilization for centuries."]], "query": "how did the roman empire impact culture?"} -{"output": [["lex", "monotheism one God religion"], ["lex", "monotheism Christianity Islam Judaism"], ["lex", "monotheism definition history theology"], ["vec", "what is monotheism and which major world religions practice the belief in one God?"], ["vec", "how did monotheism develop historically and what distinguishes it from polytheism?"], ["hyde", "Monotheism is the belief in a single, all-powerful God. The three major monotheistic religions are Judaism, Christianity, and Islam, all tracing their roots to Abraham. Judaism was among the earliest monotheistic faiths, emerging around 2000 BCE. Monotheism contrasts with polytheism (many gods) and differs from henotheism (one chief god among many)."]], "query": "explain monotheism"} -{"output": [["lex", "replace windshield wipers installation"], ["lex", "change wiper blades car DIY"], ["lex", "windshield wiper replacement size"], ["vec", "how do you replace windshield wiper blades on a car step by step?"], ["vec", "what size windshield wipers does my car need and how do I install them?"], ["hyde", "Lift the wiper arm away from the windshield. Press the small tab where the blade meets the arm and slide the old blade off the hook. Slide the new blade onto the J-hook until it clicks into place. Lower the arm back gently. Check your owner's manual or an auto parts store's fit guide for the correct blade size."]], "query": "how to replace windshield wipers?"} -{"output": [["lex", "tectonic plates Earth crust geology"], ["lex", "plate tectonics continental drift boundaries"], ["lex", "tectonic plates earthquake volcano subduction"], ["vec", "what are tectonic plates and how does plate tectonics explain earthquakes and volcanic activity?"], ["vec", "how do tectonic plates move and interact at convergent, divergent, and transform boundaries?"], ["hyde", "Tectonic plates are massive slabs of Earth's lithosphere that float on the semi-fluid asthenosphere. There are 15 major plates that move 1-10 cm per year. At convergent boundaries, plates collide causing mountains and subduction zones; at divergent boundaries, plates separate creating mid-ocean ridges; at transform boundaries, plates slide past each other causing earthquakes."]], "query": "what are tectonic plates"} -{"output": [["lex", "Airbnb bookings reservations how to"], ["lex", "Airbnb book rental property listing"], ["lex", "Airbnb booking tips cancellation policy"], ["vec", "how do you book a rental property on Airbnb and what should you know before reserving?"], ["vec", "what are the Airbnb booking policies including cancellation, fees, and payment?"], ["hyde", "To book on Airbnb, search by destination and dates, filter by price, type, and amenities, and review photos and guest reviews. Request to book or use Instant Book listings for immediate confirmation. Airbnb charges a service fee of 14-16%. Check the cancellation policy (Flexible, Moderate, or Strict) before confirming."]], "query": "airbnb bookings"} -{"output": [["lex", "develop writing voice style"], ["lex", "writing voice tone author style"], ["lex", "find unique writing voice techniques"], ["vec", "how does a writer develop their own unique writing voice and style?"], ["vec", "what exercises and practices help writers find and strengthen their authentic voice?"], ["hyde", "Developing a writing voice requires reading widely, writing consistently, and paying attention to what feels natural. Write the way you think and speak. Experiment with sentence length, word choice, and rhythm. Read your work aloud to hear your voice. Imitate writers you admire, then gradually let your own patterns emerge through regular practice."]], "query": "how do you develop a writing voice?"} -{"output": [["lex", "devotion religion religious worship"], ["lex", "devotion faith prayer bhakti piety"], ["lex", "religious devotion spiritual practice"], ["vec", "what does devotion mean in a religious context and how is it practiced across faiths?"], ["vec", "how do different religions express devotion through prayer, worship, and spiritual discipline?"], ["hyde", "Religious devotion refers to profound love, loyalty, and dedication to God or a divine reality, expressed through prayer, worship, and spiritual practice. In Hinduism, bhakti (devotion) is a path to liberation through loving surrender to a deity. In Christianity, devotion involves daily prayer, scripture reading, and sacramental participation."]], "query": "what is devotion in religious context"} -{"output": [["lex", "skepticism philosophy epistemology doubt"], ["lex", "philosophical skepticism Pyrrhonism Descartes"], ["lex", "skepticism knowledge certainty questioning"], ["vec", "what is philosophical skepticism and how does it question the possibility of knowledge?"], ["vec", "how did Pyrrhonian skepticism and Cartesian doubt influence Western philosophical thought?"], ["hyde", "Philosophical skepticism questions whether certain knowledge is possible. Pyrrhonian skepticism (from Pyrrho of Elis) suspends judgment on all claims, arguing that for every argument there is an equally strong counterargument. Descartes used methodological doubt—doubting everything that could be doubted—to arrive at \"cogito ergo sum\" as an indubitable foundation."]], "query": "what is skepticism in philosophy"} -{"output": [["lex", "fix teeth dental repair options"], ["lex", "broken chipped teeth treatment dentist"], ["lex", "dental restoration crowns veneers bonding"], ["vec", "what are the options for fixing damaged, chipped, or broken teeth?"], ["vec", "how do dentists repair teeth using crowns, veneers, bonding, and other dental treatments?"], ["hyde", "Common dental repairs include bonding (composite resin applied to chipped teeth, $100-400), porcelain veneers (thin shells covering the front surface, $500-2500 per tooth), crowns (caps covering the entire tooth, $800-1500), and dental implants for missing teeth ($3000-5000). Treatment depends on the extent of damage."]], "query": "fix teeth"} -{"output": [["lex", "social media photography tips Instagram"], ["lex", "phone photography social media lighting composition"], ["lex", "Instagram photo tips editing filters"], ["vec", "what are the best photography tips for creating engaging social media content?"], ["vec", "how do you take better photos for Instagram and other social media platforms using a phone?"], ["hyde", "Shoot during golden hour (the hour after sunrise or before sunset) for warm, flattering light. Use the rule of thirds grid on your phone camera. Keep backgrounds clean and uncluttered. Edit consistently using the same preset or filter for a cohesive feed. Shoot in natural light whenever possible and avoid using flash."]], "query": "what are social media photography tips?"} -{"output": [["lex", "gerrymandering redistricting electoral districts"], ["lex", "gerrymandering political manipulation voting"], ["lex", "gerrymandering packing cracking congressional"], ["vec", "what is gerrymandering and how does it manipulate electoral district boundaries?"], ["vec", "how does gerrymandering use techniques like packing and cracking to influence election outcomes?"], ["hyde", "Gerrymandering is the manipulation of electoral district boundaries to favor a particular political party. Two main techniques are \"packing\" (concentrating opposition voters into a few districts) and \"cracking\" (spreading them across many districts to dilute their vote). The term dates to 1812 when Governor Elbridge Gerry approved a district shaped like a salamander."]], "query": "what is gerrymandering"} -{"output": [["lex", "arts moral understanding ethics"], ["lex", "art literature ethics empathy"], ["lex", "arts moral education philosophical perspective"], ["vec", "how do the arts such as literature, film, and visual art contribute to moral understanding?"], ["vec", "in what ways do artistic works cultivate empathy and ethical awareness in audiences?"], ["hyde", "Literature, theater, and film place audiences in the shoes of characters facing moral dilemmas, cultivating empathy and ethical reflection. Martha Nussbaum argues that novels develop moral imagination by exposing readers to lives unlike their own. Art invites us to confront injustice, question assumptions, and feel the weight of ethical choices."]], "query": "how do the arts contribute to moral understanding?"} -{"output": [["lex", "Jainism beliefs principles religion"], ["lex", "Jainism ahimsa non-violence karma"], ["lex", "Jain philosophy anekantavada moksha"], ["vec", "what are the core beliefs and principles of Jainism as a religion?"], ["vec", "how does Jainism emphasize non-violence (ahimsa) and what are its main philosophical tenets?"], ["hyde", "Jainism's core beliefs include ahimsa (non-violence toward all living beings), anekantavada (many-sidedness of truth), and aparigraha (non-attachment). Jains believe the soul (jiva) accumulates karma through actions and must purify itself through ethical living, asceticism, and meditation to achieve moksha (liberation from the cycle of rebirth)."]], "query": "what are the main beliefs of jainism?"} -{"output": [["lex", "philosophers define happiness philosophy"], ["lex", "happiness eudaimonia Aristotle hedonism"], ["lex", "philosophical theories happiness well-being"], ["vec", "how have major philosophers throughout history defined happiness and well-being?"], ["vec", "what is the difference between Aristotle's eudaimonia and hedonistic views of happiness?"], ["hyde", "Aristotle defined happiness (eudaimonia) as flourishing through virtuous activity over a complete life, not mere pleasure. Epicurus identified happiness with ataraxia (tranquility) and the absence of pain. Utilitarians like Mill equated happiness with pleasure but distinguished higher (intellectual) from lower (bodily) pleasures. Modern positive psychology studies happiness as subjective well-being."]], "query": "how do philosophers define happiness"} -{"output": [["lex", "train dog sit command"], ["lex", "dog training sit positive reinforcement"], ["lex", "teach puppy sit treat method"], ["vec", "what is the step-by-step method for training a dog to sit on command?"], ["vec", "how do you use positive reinforcement to teach a dog or puppy the sit command?"], ["hyde", "Hold a treat close to your dog's nose, then slowly move your hand up so the dog's head follows the treat and their bottom lowers. The moment they sit, say \"sit,\" give the treat, and praise them. Repeat 5-10 times per session, 2-3 sessions daily. Within a week, most dogs learn to sit on verbal command alone."]], "query": "how to train a dog to sit"} -{"output": [["lex", "family-friendly restaurant kids menu"], ["lex", "choose restaurant families children"], ["lex", "kid-friendly dining options reviews"], ["vec", "how do you find and choose a family-friendly restaurant suitable for dining with children?"], ["vec", "what features make a restaurant good for families with young kids?"], ["hyde", "Look for restaurants with a dedicated kids' menu, high chairs, and a casual atmosphere that tolerates noise. Check Google or Yelp reviews filtered for \"family-friendly.\" Booth seating, crayons or activity sheets, and an early dinner option are good signs. Fast-casual restaurants often work well since kids don't have to wait long for food."]], "query": "how to choose a family-friendly restaurant?"} -{"output": [["lex", "historical context literature analysis"], ["lex", "historical context literary criticism period"], ["lex", "literature historical background social conditions"], ["vec", "what does historical context mean when analyzing and interpreting a work of literature?"], ["vec", "how does understanding the historical period and social conditions help interpret literary texts?"], ["hyde", "Historical context in literature refers to the social, political, economic, and cultural conditions during the time a work was written. Understanding that \"1984\" was written in 1948 during the rise of totalitarian states deepens its meaning. Historical context helps readers interpret themes, character motivations, and the author's intent within their time period."]], "query": "what is historical context in literature?"} -{"output": [["lex", "buy mid-century modern furniture store"], ["lex", "mid-century modern furniture online vintage"], ["lex", "MCM furniture West Elm Design Within Reach"], ["vec", "where can I buy authentic or reproduction mid-century modern furniture?"], ["vec", "what are the best stores and websites for purchasing mid-century modern style furniture?"], ["hyde", "Shop mid-century modern furniture at West Elm, Design Within Reach (DWR), and Article for contemporary reproductions. For vintage originals, check Chairish, 1stDibs, and local estate sales. IKEA offers affordable MCM-inspired pieces. Facebook Marketplace and Craigslist often have authentic Eames, Knoll, and Herman Miller pieces at lower prices."]], "query": "where to buy mid-century modern furniture"} -{"output": [["lex", "transition kids new school tips"], ["lex", "children changing schools adjustment"], ["lex", "help child new school anxiety transfer"], ["vec", "how can parents help their children transition smoothly to a new school?"], ["vec", "what strategies help kids adjust emotionally and socially when changing schools?"], ["hyde", "Visit the new school together before the first day so the building feels familiar. Meet the teacher and tour the classroom. Maintain routines at home for stability. Encourage your child to talk about their feelings and validate their anxiety. Arrange playdates with new classmates early on, and stay in contact with teachers during the first few weeks."]], "query": "how to transition kids to new schools?"} -{"output": [["lex", "graphic design visual communication"], ["lex", "graphic design typography layout color"], ["lex", "graphic design tools Adobe Figma"], ["vec", "what is graphic design and what skills and tools does a graphic designer use?"], ["vec", "how does graphic design combine typography, color, and layout to communicate visually?"], ["hyde", "Graphic design is the craft of creating visual content to communicate messages. Designers use typography, color theory, layout, and imagery to create logos, websites, posters, packaging, and more. Key tools include Adobe Photoshop, Illustrator, InDesign, and Figma. The field spans print design, web/UI design, branding, and motion graphics."]], "query": "what is graphic design?"} -{"output": [["lex", "latest iPhone model 2025 2026"], ["lex", "newest iPhone Apple release"], ["lex", "iPhone 17 features specs"], ["vec", "what is the latest iPhone model released by Apple and what are its key features?"], ["vec", "what are the specs and improvements in the newest iPhone compared to previous models?"], ["hyde", "The iPhone 16 series launched in September 2024 with the A18 chip, a dedicated Camera Control button, and Apple Intelligence features. The iPhone 16 Pro and Pro Max feature a 48MP main camera, titanium design, and improved battery life. The iPhone 17 lineup is expected in September 2025."]], "query": "what is the latest iphone model"} -{"output": [["lex", "open access research papers free"], ["lex", "open access journals articles database"], ["lex", "free academic papers PubMed arXiv"], ["vec", "where can I find free open access research papers and academic articles?"], ["vec", "what databases and websites provide open access to peer-reviewed scientific papers?"], ["hyde", "Access free research papers through PubMed Central (biomedical), arXiv (physics, math, CS), SSRN (social sciences), and DOAJ (Directory of Open Access Journals). Google Scholar often links to free PDF versions. Unpaywall is a browser extension that finds legal free versions of paywalled papers. Many universities also maintain institutional repositories."]], "query": "where to find open access research papers"} -{"output": [["lex", "improve interpersonal skills communication"], ["lex", "interpersonal skills active listening empathy"], ["lex", "people skills social interaction workplace"], ["vec", "what are effective ways to improve interpersonal and communication skills?"], ["vec", "how can someone develop better listening, empathy, and social skills in personal and professional settings?"], ["hyde", "Improve interpersonal skills by practicing active listening: maintain eye contact, avoid interrupting, and paraphrase what you heard. Ask open-ended questions to show genuine interest. Develop empathy by considering others' perspectives before responding. Practice assertive communication—express your needs clearly while respecting others. Seek feedback on how you come across."]], "query": "how to improve interpersonal skills"} -{"output": [["lex", "mathematical model equations simulation"], ["lex", "math modeling real-world applications"], ["lex", "mathematical model differential equations optimization"], ["vec", "what is a mathematical model and how is it used to represent real-world systems?"], ["vec", "how do mathematicians build models using equations to simulate and predict outcomes?"], ["hyde", "A mathematical model uses equations and formulas to represent the behavior of a real-world system. For example, the SIR model uses differential equations to predict disease spread: dS/dt = -βSI, dI/dt = βSI - γI, dR/dt = γI. Models are validated by comparing predictions to observed data and refined iteratively."]], "query": "math model"} -{"output": [["lex", "digital transformation definition strategy"], ["lex", "digital transformation technology business process"], ["lex", "digital transformation cloud automation data-driven"], ["vec", "what is digital transformation and how does it change how organizations operate?"], ["vec", "what are the key components and stages of digital transformation in a business?"], ["hyde", "Digital transformation is the process of using digital technologies to fundamentally change how an organization operates and delivers value. It goes beyond digitizing existing processes—it involves rethinking business models, customer experiences, and operational workflows using cloud computing, AI, data analytics, and automation."]], "query": "what is digital transformation"} -{"output": [["lex", "improve project outcomes management"], ["lex", "project success factors planning execution"], ["lex", "project management methodology agile results"], ["vec", "what strategies and practices improve project outcomes and increase the chance of success?"], ["vec", "how can project managers improve delivery, stakeholder satisfaction, and results?"], ["hyde", "Improve project outcomes by defining clear objectives and success criteria upfront, engaging stakeholders early and often, breaking work into short iterations with regular checkpoints, and managing risks proactively. Use retrospectives to learn from each phase. Projects with clear scope, executive sponsorship, and empowered teams are 2-3x more likely to succeed."]], "query": "how to improve project outcomes"} -{"output": [["lex", "ethics happiness philosophy relationship"], ["lex", "virtue ethics happiness eudaimonia Aristotle"], ["lex", "morality well-being ethical living"], ["vec", "what is the philosophical relationship between living ethically and being happy?"], ["vec", "how does Aristotle argue that virtue and ethics are connected to happiness and human flourishing?"], ["hyde", "Aristotle argued that happiness (eudaimonia) is achieved through virtuous living—not pleasure alone, but the active exercise of reason and moral virtue over a lifetime. The Stoics similarly held that virtue is sufficient for happiness. Utilitarianism inverts this: moral actions are those that maximize total happiness. The question of whether being moral makes you happy remains debated."]], "query": "what is the relationship between ethics and happiness?"} -{"output": [["lex", "philosophy truth nature theories"], ["lex", "correspondence coherence pragmatic theory truth"], ["lex", "truth philosophy epistemology logic"], ["vec", "how do philosophical theories explain the nature of truth and what makes a statement true?"], ["vec", "what are the main theories of truth in philosophy such as correspondence, coherence, and pragmatic theories?"], ["hyde", "Philosophy examines truth through several theories. The correspondence theory holds that truth is agreement between a proposition and reality. The coherence theory says a statement is true if it fits consistently within a system of beliefs. The pragmatic theory (James, Dewey) defines truth as what works in practice. Deflationary theories argue that \"true\" adds nothing beyond the assertion itself."]], "query": "how does philosophy explore the nature of truth?"} -{"output": [["lex", "raindrop formation size shape"], ["lex", "raindrop water cycle precipitation"], ["lex", "rain droplet physics terminal velocity"], ["vec", "how do raindrops form and what determines their size and shape as they fall?"], ["vec", "what is the science behind raindrop formation in the water cycle and precipitation?"], ["hyde", "Raindrops form when water vapor condenses around tiny particles (condensation nuclei) in clouds. As droplets collide and merge, they grow heavy enough to fall. Contrary to the teardrop image, falling raindrops are actually shaped like hamburger buns—flattened on the bottom by air resistance. Average raindrops are 1-2mm in diameter and fall at about 20 mph."]], "query": "rain drop"} -{"output": [["lex", "magical realism literary genre"], ["lex", "magical realism Garcia Marquez literature"], ["lex", "magical realism Latin American fiction examples"], ["vec", "what is magical realism as a literary genre and what are its defining characteristics?"], ["vec", "how do authors like Gabriel Garcia Marquez blend the magical and mundane in magical realism?"], ["hyde", "Magical realism is a literary genre in which supernatural elements appear in an otherwise realistic setting, treated as ordinary by the characters. Gabriel Garcia Marquez's \"One Hundred Years of Solitude\" is the quintessential example, where events like a character ascending to heaven while hanging laundry are narrated matter-of-factly alongside everyday life in Macondo."]], "query": "what is magical realism?"} -{"output": [["lex", "write film review movie critique"], ["lex", "film review structure format examples"], ["lex", "movie review writing tips analysis"], ["vec", "how do you write a well-structured and engaging film review?"], ["vec", "what elements should be included in a film review such as plot summary, analysis, and rating?"], ["hyde", "Start with a hook—a striking observation about the film. Provide a brief, spoiler-free plot summary (2-3 sentences). Evaluate the directing, acting, cinematography, screenplay, and score. Support your opinion with specific scenes or examples. Address who would enjoy the film and rate it on your chosen scale. Keep the review between 400-800 words."]], "query": "how to write a film review"} -{"output": [["lex", "current inflation rate CPI 2025 2026"], ["lex", "inflation rate United States economy"], ["lex", "consumer price index inflation percentage"], ["vec", "what is the current U.S. inflation rate and how is it measured by the CPI?"], ["vec", "what is the latest consumer price index data showing the annual inflation rate?"], ["hyde", "The U.S. Bureau of Labor Statistics measures inflation through the Consumer Price Index (CPI), which tracks the average change in prices paid by consumers for goods and services. The annual inflation rate is calculated by comparing the current CPI to the same month one year prior. Check bls.gov/cpi for the latest monthly release."]], "query": "what is the current inflation rate"} -{"output": [["lex", "dialogue function purpose communication"], ["lex", "dialogue conversation role"], ["vec", "what purpose does dialogue serve in communication and storytelling"], ["vec", "how does dialogue function in literature and everyday interaction"], ["hyde", "Dialogue serves multiple functions: it conveys information between characters, reveals personality and motivation, advances the plot, and creates tension. In everyday communication, dialogue enables mutual understanding and negotiation of meaning."]], "query": "what is the function of dialogue?"} -{"output": [["lex", "peer review importance scientific publishing"], ["lex", "peer review process academic research"], ["vec", "why is peer review important in academic and scientific publishing"], ["vec", "how does the peer review process ensure quality in research papers"], ["hyde", "Peer review is the cornerstone of scientific publishing. Before a paper is accepted, independent experts evaluate the methodology, data analysis, and conclusions. This process catches errors, prevents fraudulent claims, and maintains the credibility of published research."]], "query": "what is the importance of peer review"} -{"output": [["lex", "printing press impact history Gutenberg"], ["lex", "printing press effects literacy knowledge"], ["vec", "how did the invention of the printing press change society and the spread of knowledge"], ["vec", "what were the historical consequences of Gutenberg's printing press"], ["hyde", "Gutenberg's printing press, invented around 1440, revolutionized the production of books. By making texts affordable and widely available, it increased literacy rates, enabled the Protestant Reformation, and accelerated the Scientific Revolution across Europe."]], "query": "what is the impact of the printing press"} -{"output": [["lex", "open science definition principles"], ["lex", "open access open data research transparency"], ["vec", "what does open science mean and what are its core principles"], ["vec", "how does open science promote transparency and accessibility in research"], ["hyde", "Open science is a movement to make scientific research, data, and dissemination accessible to all. It encompasses open access publishing, open data sharing, open-source software, and transparent methodologies, aiming to accelerate discovery through collaboration."]], "query": "what is open science"} -{"output": [["lex", "swimming classes lessons beginner"], ["lex", "swim class schedule enrollment"], ["vec", "where can I find swimming classes for beginners or children"], ["vec", "what should I expect from a swimming lesson and how to enroll"], ["hyde", "Our swim classes are available for all ages and skill levels. Beginner classes focus on water safety, floating, and basic strokes. Intermediate classes cover freestyle, backstroke, and treading water. Sessions run 30-45 minutes with certified instructors."]], "query": "swim class"} -{"output": [["lex", "Bhagavad Gita Hindu scripture meaning"], ["lex", "Bhagavad Gita Krishna Arjuna teachings"], ["vec", "what is the Bhagavad Gita and what are its central teachings"], ["vec", "what role does the Bhagavad Gita play in Hindu philosophy and practice"], ["hyde", "The Bhagavad Gita is a 700-verse Hindu scripture that forms part of the Mahabharata epic. It is a dialogue between Prince Arjuna and the god Krishna, addressing duty (dharma), devotion (bhakti), knowledge (jnana), and selfless action (karma yoga)."]], "query": "what is the bhagavad gita"} -{"output": [["lex", "photosynthesis process plants chlorophyll"], ["lex", "light reactions Calvin cycle carbon dioxide"], ["vec", "how do plants convert sunlight into energy through photosynthesis"], ["vec", "what are the steps of photosynthesis in plant cells"], ["hyde", "Photosynthesis occurs in chloroplasts. In the light reactions, chlorophyll absorbs sunlight to split water molecules, producing ATP and NADPH. In the Calvin cycle, these molecules drive the fixation of CO2 into glucose, releasing oxygen as a byproduct."]], "query": "how does plant photosynthesis work"} -{"output": [["lex", "black hole definition physics space"], ["lex", "black hole event horizon singularity"], ["vec", "what is a black hole and how does it form in space"], ["vec", "how do black holes work according to general relativity"], ["hyde", "A black hole is a region in space where gravity is so intense that nothing, not even light, can escape. It forms when a massive star collapses at the end of its life. The boundary is called the event horizon, beyond which lies the singularity."]], "query": "what is a black hole"} -{"output": [["lex", "ecosystem function energy flow nutrient cycling"], ["lex", "ecosystems trophic levels food web"], ["vec", "how do ecosystems function through energy flow and nutrient cycling"], ["vec", "what are the key processes that keep ecosystems balanced and healthy"], ["hyde", "Ecosystems function through interconnected processes: producers capture solar energy via photosynthesis, consumers transfer energy through food webs, and decomposers recycle nutrients back into the soil. Water, carbon, and nitrogen cycle continuously through biotic and abiotic components."]], "query": "how ecosystems function"} -{"output": [["lex", "increase home resale value renovations"], ["lex", "home improvement ROI property value"], ["vec", "what home improvements increase resale value the most"], ["vec", "how can I boost my home's market price before selling"], ["hyde", "Kitchen and bathroom remodels offer the highest ROI, typically recovering 60-80% of costs. Other high-value improvements include replacing the front door, adding a deck, and upgrading to energy-efficient windows. Fresh paint and curb appeal landscaping are low-cost, high-impact upgrades."]], "query": "how to increase home resale value"} -{"output": [["lex", "scientific study design methodology"], ["lex", "research design controls variables sample size"], ["vec", "how do you design a rigorous and effective scientific study"], ["vec", "what steps are involved in planning a well-controlled research experiment"], ["hyde", "An effective study begins with a clear hypothesis and defined variables. Choose an appropriate design (randomized controlled trial, cohort, etc.), calculate the required sample size for statistical power, establish controls, and pre-register your protocol to reduce bias."]], "query": "how to design an effective scientific study"} -{"output": [["lex", "campfire setup build fire outdoors"], ["lex", "campfire fire pit kindling tinder logs"], ["vec", "how do you properly build and start a campfire outdoors"], ["vec", "what materials and steps are needed to set up a safe campfire"], ["hyde", "To build a campfire, clear a fire ring down to bare soil. Place a tinder bundle of dry leaves or paper in the center. Stack small kindling sticks in a teepee shape around it. Light the tinder and gradually add larger logs as the fire grows. Keep water nearby to extinguish."]], "query": "how to set up a campfire"} -{"output": [["lex", "digital marketing courses online training"], ["lex", "learn digital marketing SEO social media"], ["vec", "where can I take courses to learn digital marketing skills"], ["vec", "what are the best online platforms for learning SEO, social media, and digital advertising"], ["hyde", "Google Digital Garage offers a free Fundamentals of Digital Marketing course with certification. HubSpot Academy covers inbound marketing and content strategy. Coursera and Udemy feature paid courses on SEO, PPC, email marketing, and social media advertising."]], "query": "where to learn digital marketing"} -{"output": [["lex", "car dent removal DIY repair"], ["lex", "paintless dent repair PDR technique"], ["vec", "how can I remove dents from my car at home without repainting"], ["vec", "what are the methods for fixing small dents on a car body"], ["hyde", "For small dents, try the boiling water method on plastic bumpers or use a suction cup dent puller. Paintless dent repair (PDR) uses metal rods to push dents out from behind the panel. For deeper dents, apply body filler, sand smooth, and repaint."]], "query": "how to remove car dents?"} -{"output": [["lex", "moral code definition ethics principles"], ["lex", "moral code rules behavior right wrong"], ["vec", "what is a moral code and how does it guide human behavior"], ["vec", "how do societies and individuals develop a set of moral principles"], ["hyde", "A moral code is a set of principles or rules that define right and wrong conduct. It may be derived from religious teachings, cultural traditions, philosophical reasoning, or personal reflection. Examples include the Ten Commandments, Kantian ethics, and utilitarianism."]], "query": "what is a moral code"} -{"output": [["lex", "cloud computing definition services"], ["lex", "cloud computing IaaS PaaS SaaS"], ["vec", "what is cloud computing and how do cloud services work"], ["vec", "what are the different types of cloud computing services like IaaS, PaaS, and SaaS"], ["hyde", "Cloud computing delivers computing resources—servers, storage, databases, networking, and software—over the internet on a pay-as-you-go basis. The three main service models are Infrastructure as a Service (IaaS), Platform as a Service (PaaS), and Software as a Service (SaaS)."]], "query": "what is cloud computing"} -{"output": [["lex", "meditation practice techniques beginners"], ["lex", "mindfulness meditation breathing focus"], ["vec", "how do I start a daily meditation practice as a beginner"], ["vec", "what are simple meditation techniques for reducing stress and improving focus"], ["hyde", "Start with 5-10 minutes daily. Sit comfortably, close your eyes, and focus on your breath. When thoughts arise, notice them without judgment and gently return attention to breathing. Guided meditation apps like Headspace or Insight Timer can help beginners build consistency."]], "query": "how to practice meditation"} -{"output": [["lex", "xeriscaping drought-tolerant landscaping water conservation"], ["lex", "xeriscape garden design dry climate plants"], ["vec", "what is xeriscaping and how does it reduce water usage in landscaping"], ["vec", "how do you design a xeriscape garden with drought-resistant plants"], ["hyde", "Xeriscaping is a landscaping approach that minimizes water use by selecting drought-tolerant native plants, improving soil with compost, using efficient drip irrigation, applying mulch to retain moisture, and reducing lawn area. It originated in arid regions of the western United States."]], "query": "what is xeriscaping?"} -{"output": [["lex", "Buddhism beliefs Four Noble Truths Eightfold Path"], ["lex", "Buddhist teachings karma dharma nirvana"], ["vec", "what are the core beliefs and teachings of Buddhism"], ["vec", "what do Buddhists believe about suffering, enlightenment, and the path to nirvana"], ["hyde", "Buddhism is founded on the Four Noble Truths: life involves suffering (dukkha), suffering arises from craving (tanha), suffering can end (nirodha), and the path to its end is the Noble Eightfold Path. Key concepts include karma, rebirth, impermanence (anicca), and non-self (anatta)."]], "query": "what are the main beliefs of buddhism"} -{"output": [["lex", "reduce carbon footprint emissions tips"], ["lex", "lower carbon footprint energy transportation diet"], ["vec", "what are effective ways to reduce my personal carbon footprint"], ["vec", "how can individuals lower their greenhouse gas emissions in daily life"], ["hyde", "The biggest personal reductions come from driving less or switching to an EV, flying less frequently, eating less red meat, improving home insulation, and switching to renewable energy. A plant-rich diet can cut food-related emissions by up to 50%."]], "query": "how to reduce carbon footprint?"} -{"output": [["lex", "save child education fund college"], ["lex", "529 plan education savings account"], ["vec", "how should I save money for my child's college education"], ["vec", "what are the best investment accounts for saving for a child's education"], ["hyde", "A 529 plan is one of the most tax-advantaged ways to save for education. Contributions grow tax-free, and withdrawals for qualified expenses (tuition, books, room and board) are also tax-free. Many states offer additional tax deductions for contributions."]], "query": "how to save for a child's education?"} -{"output": [["lex", "learn Python programming beginner tutorial"], ["lex", "Python programming course exercises projects"], ["vec", "what is the most effective way to learn Python programming from scratch"], ["vec", "which Python courses and resources are best for beginners learning to code"], ["hyde", "Start with an interactive tutorial like Python.org's official tutorial or Codecademy's Python course. Practice daily on sites like LeetCode or HackerRank. Build small projects—a calculator, web scraper, or to-do app—to solidify concepts. Read \"Automate the Boring Stuff with Python\" for practical applications."]], "query": "what is the best way to learn python programming?"} -{"output": [["lex", "grow roses cuttings propagation"], ["lex", "rose cutting rooting hormone planting"], ["vec", "how do you propagate roses from stem cuttings at home"], ["vec", "what is the step-by-step process for rooting rose cuttings"], ["hyde", "Take a 6-8 inch cutting from a healthy rose stem just below a leaf node. Remove lower leaves, dip the cut end in rooting hormone, and insert into moist potting mix. Cover with a plastic bag to maintain humidity. Roots typically form in 4-8 weeks. Transplant once established."]], "query": "how to grow roses from cuttings?"} -{"output": [["lex", "sustainable architecture green building design"], ["lex", "sustainable building materials energy efficient"], ["vec", "what is sustainable architecture and what design principles does it follow"], ["vec", "how do architects design energy-efficient and environmentally friendly buildings"], ["hyde", "Sustainable architecture minimizes environmental impact through passive solar design, natural ventilation, high-performance insulation, and renewable energy integration. Materials like cross-laminated timber, recycled steel, and low-VOC finishes reduce embodied carbon."]], "query": "sustainable architecture"} -{"output": [["lex", "moral luck philosophy concept"], ["lex", "moral luck Thomas Nagel Bernard Williams"], ["vec", "what is the philosophical concept of moral luck and why is it controversial"], ["vec", "how does moral luck challenge our ideas about responsibility and blame"], ["hyde", "Moral luck, introduced by Thomas Nagel and Bernard Williams in 1976, refers to situations where moral judgment depends on factors beyond a person's control. A drunk driver who arrives home safely is judged differently from one who kills a pedestrian, despite identical recklessness."]], "query": "what is the concept of moral luck"} -{"output": [["lex", "async task wait await"], ["lex", "task wait timeout concurrency"], ["vec", "how to wait for an asynchronous task to complete in programming"], ["vec", "how to use await or task wait for concurrent operations"], ["hyde", "Use `await task` in async/await patterns to wait for completion. In C#, `Task.Wait()` blocks synchronously while `await` yields control. In Python, `await asyncio.gather(*tasks)` waits for multiple coroutines. Use timeouts to prevent indefinite blocking."]], "query": "task wait"} -{"output": [["lex", "climate science research findings 2025 2026"], ["lex", "climate change latest studies temperature emissions"], ["vec", "what are the most recent scientific findings about climate change in 2025-2026"], ["vec", "what do the latest climate science studies reveal about global warming trends"], ["hyde", "Recent studies in 2025 confirm that global average temperatures have exceeded 1.5°C above pre-industrial levels. Ocean heat content reached record highs, and Arctic sea ice extent continued its decline. New research links accelerated ice sheet loss in Greenland and Antarctica to rising sea levels."]], "query": "latest findings in climate science"} -{"output": [["lex", "lose weight fast safe methods"], ["lex", "weight loss diet exercise calorie deficit"], ["vec", "what are safe and effective methods to lose weight quickly"], ["vec", "how can I create a calorie deficit to lose weight without harming my health"], ["hyde", "Safe weight loss is 1-2 pounds per week through a calorie deficit of 500-1000 calories daily. Combine a protein-rich diet with strength training and cardio. Avoid crash diets—they cause muscle loss and metabolic slowdown. Drink water, sleep 7-9 hours, and track food intake for accountability."]], "query": "how to lose weight fast?"} -{"output": [["lex", "Ukraine country history conflict"], ["lex", "Ukraine war geopolitics Kyiv"], ["vec", "what is the current situation in Ukraine and the ongoing conflict"], ["vec", "what is the history and geopolitical context of Ukraine"], ["hyde", "Ukraine is a country in Eastern Europe with a population of approximately 44 million. Since February 2022, it has been engaged in a full-scale war following Russia's invasion. Kyiv is the capital. Ukraine has deep historical ties to both European and post-Soviet geopolitics."]], "query": "ukraine"} -{"output": [["lex", "HTTP client library request"], ["lex", "HTTP client fetch API REST"], ["vec", "how to make HTTP requests using an HTTP client library"], ["vec", "which HTTP client libraries are available for making API calls in different languages"], ["hyde", "An HTTP client sends requests to web servers and processes responses. In JavaScript, use `fetch()` or `axios`. In Python, use `requests` or `httpx`. In Go, use `net/http`. Typical methods include GET, POST, PUT, DELETE. Set headers, handle timeouts, and parse JSON responses."]], "query": "http client"} -{"output": [["lex", "vlog smartphone video recording tips"], ["lex", "smartphone vlogging equipment setup"], ["vec", "how do I start vlogging using only my smartphone"], ["vec", "what equipment and techniques make smartphone vlogs look professional"], ["hyde", "To vlog with a smartphone, use the rear camera for higher quality. Invest in a small tripod or gimbal for stability, a clip-on microphone for clear audio, and a ring light for indoor filming. Shoot in 1080p or 4K, frame at eye level, and edit with apps like CapCut or InShot."]], "query": "how to vlog with a smartphone"} -{"output": [["lex", "short story elements plot character setting"], ["lex", "short story structure literary elements"], ["vec", "what are the key literary elements that make up a short story"], ["vec", "how are plot, character, setting, and theme used in short story writing"], ["hyde", "The essential elements of a short story are plot (the sequence of events), character (the people involved), setting (time and place), conflict (the central struggle), theme (the underlying message), and point of view (the narrative perspective). Short stories typically focus on a single incident."]], "query": "what are the elements of short stories?"} -{"output": [["lex", "car key fob fix repair battery replacement"], ["lex", "key fob not working reprogram"], ["vec", "how do I fix a car key fob that stopped working"], ["vec", "how to replace the battery or reprogram a car key fob"], ["hyde", "If your key fob stops working, replace the battery first—open the case with a flat screwdriver and swap in a new CR2032 or CR2025 coin cell. If it still fails, reprogram it: consult your owner's manual for the key-turn sequence or visit a dealer for re-pairing."]], "query": "how to fix car key fob?"} -{"output": [["lex", "grow orchids indoors care guide"], ["lex", "orchid indoor growing light water humidity"], ["vec", "how do you care for orchids when growing them indoors"], ["vec", "what light, water, and humidity conditions do indoor orchids need"], ["hyde", "Phalaenopsis orchids thrive indoors with bright indirect light, such as an east-facing window. Water once a week by soaking the roots, then draining completely. Maintain 50-70% humidity with a pebble tray. Fertilize biweekly with diluted orchid fertilizer. Repot every 1-2 years in bark medium."]], "query": "how to grow orchids indoors?"} -{"output": [["lex", "scientific presentation preparation slides"], ["lex", "research talk conference presentation tips"], ["vec", "how do you prepare and deliver an effective scientific presentation"], ["vec", "what are tips for creating clear slides for a research conference talk"], ["hyde", "Structure your talk as: introduction with context, methods, key results, and conclusions. Use one main idea per slide. Minimize text—use figures and graphs. Practice timing (typically 12 minutes for a 15-minute slot). Anticipate questions about methodology and limitations."]], "query": "how to prepare a scientific presentation"} -{"output": [["lex", "artificial intelligence AI machine learning"], ["lex", "AI deep learning neural networks LLM"], ["vec", "what is artificial intelligence and how does modern AI technology work"], ["vec", "what are the main branches and applications of artificial intelligence"], ["hyde", "Artificial intelligence (AI) refers to computer systems that perform tasks typically requiring human intelligence, such as recognizing speech, making decisions, and translating languages. Modern AI relies on machine learning, particularly deep neural networks and large language models (LLMs)."]], "query": "ai"} -{"output": [["lex", "research proposal writing guide"], ["lex", "research proposal structure sections"], ["vec", "how do you write a strong research proposal for a grant or thesis"], ["vec", "what sections and elements should a research proposal include"], ["hyde", "A research proposal typically includes: title, abstract, introduction with background and significance, literature review, research questions or hypotheses, methodology, timeline, budget, and references. Clearly state the gap your research will fill and justify the chosen methods."]], "query": "how to write a research proposal"} -{"output": [["lex", "stop negative self-talk techniques"], ["lex", "negative self-talk cognitive behavioral therapy"], ["vec", "how can I stop negative self-talk and replace it with positive thinking"], ["vec", "what psychological techniques help overcome critical inner dialogue"], ["hyde", "Cognitive behavioral therapy (CBT) teaches you to identify and challenge negative automatic thoughts. When you catch yourself thinking \"I always fail,\" reframe it: \"I struggled this time, but I've succeeded before.\" Keep a thought journal, practice self-compassion, and label thoughts as thoughts, not facts."]], "query": "how to stop negative self-talk?"} -{"output": [["lex", "scientific collaboration research advancement"], ["lex", "interdisciplinary research teamwork co-authorship"], ["vec", "how does collaboration between scientists accelerate research progress"], ["vec", "why is interdisciplinary teamwork important in advancing scientific discovery"], ["hyde", "Multi-institutional collaboration allows researchers to share equipment, data, and expertise across disciplines. The Human Genome Project involved 20 institutions across six countries. Studies show that co-authored papers receive more citations and have higher reproducibility than single-author work."]], "query": "how scientific collaboration advances research"} -{"output": [["lex", "business performance metrics KPIs"], ["lex", "measure business performance revenue profit"], ["vec", "what key performance indicators are used to measure business success"], ["vec", "how do companies track and evaluate their business performance"], ["hyde", "Key business performance metrics include revenue growth rate, net profit margin, customer acquisition cost (CAC), customer lifetime value (CLV), employee productivity, and return on investment (ROI). Use dashboards and quarterly reviews to track KPIs against targets."]], "query": "how to measure business performance"} -{"output": [["lex", "volunteer political campaign election"], ["lex", "campaign volunteering canvassing phone banking"], ["vec", "how can I sign up to volunteer for a political campaign"], ["vec", "what kinds of volunteer work are available on political campaigns"], ["hyde", "To volunteer, visit the candidate's website and fill out the volunteer form. Common roles include canvassing door-to-door, phone banking, text banking, organizing events, and driving voters to polls on election day. Most campaigns welcome volunteers of all experience levels."]], "query": "how to volunteer for a political campaign"} -{"output": [["lex", "chocolate cake recipe bake from scratch"], ["lex", "baking chocolate cake ingredients instructions"], ["vec", "how do I bake a moist chocolate cake from scratch at home"], ["vec", "what is a simple recipe for homemade chocolate cake"], ["hyde", "Preheat oven to 350°F. Mix 2 cups flour, 2 cups sugar, 3/4 cup cocoa powder, 2 tsp baking soda, and 1 tsp salt. Add 2 eggs, 1 cup buttermilk, 1 cup hot coffee, and 1/2 cup oil. Pour into greased pans and bake 30-35 minutes. Frost with chocolate ganache."]], "query": "how to bake a chocolate cake?"} -{"output": [["lex", "mystics spirituality mystical experience"], ["lex", "mysticism spiritual practice contemplation"], ["vec", "how do mystics across traditions approach spiritual experience and union with the divine"], ["vec", "what practices and beliefs characterize mystical approaches to spirituality"], ["hyde", "Mystics seek direct, personal experience of the divine through contemplation, prayer, and meditation. Christian mystics like Meister Eckhart pursued union with God; Sufi mystics practice dhikr (remembrance of God); and Hindu mystics use yoga and devotion to experience Brahman."]], "query": "how do mystics approach spirituality?"} -{"output": [["lex", "cultural festivals community bonding social cohesion"], ["lex", "festivals community identity traditions"], ["vec", "how do cultural festivals strengthen community bonds and social cohesion"], ["vec", "what role do cultural celebrations play in bringing communities together"], ["hyde", "Cultural festivals create shared experiences that reinforce collective identity. Studies show communities with regular festivals report higher levels of social trust and neighborly interaction. Events like Diwali, Carnival, and Lunar New Year bring together diverse groups through food, music, and ritual."]], "query": "how cultural festivals affect community bonding"} -{"output": [["lex", "follow election results live tracking"], ["lex", "election night results coverage 2026"], ["vec", "how can I follow live election results on election night"], ["vec", "what websites and apps provide real-time election result tracking"], ["hyde", "Follow live election results on the Associated Press (AP) election page, which aggregates official county-level results. Major outlets like CNN, NYT, and BBC offer interactive maps. Sign up for push notifications from news apps. Official state election websites post certified results."]], "query": "how to follow election results"} -{"output": [["lex", "sell car dealership trade-in value"], ["lex", "selling car dealer offer negotiation"], ["vec", "how do I sell my used car to a dealership and get a fair price"], ["vec", "what steps should I follow when trading in or selling a car to a dealer"], ["hyde", "Get your car's market value from Kelley Blue Book or Edmunds before visiting a dealer. Clean the car, gather maintenance records, and bring the title. Get quotes from multiple dealers. The dealer will inspect the car, run a vehicle history report, and make an offer based on condition and mileage."]], "query": "how to sell a car to a dealership?"} -{"output": [["lex", "conductor physics electrical conductivity"], ["lex", "electrical conductor materials electrons"], ["vec", "what is an electrical conductor and how does it work in physics"], ["vec", "what makes certain materials good conductors of electricity"], ["hyde", "An electrical conductor is a material that allows electric current to flow freely through it. Metals like copper, silver, and aluminum are excellent conductors because they have free electrons in their outer shells that move easily when a voltage is applied. Conductivity depends on temperature and material structure."]], "query": "what is a conductor in physics"} -{"output": [["lex", "civil disobedience significance history"], ["lex", "civil disobedience Thoreau MLK Gandhi nonviolent protest"], ["vec", "why is civil disobedience significant in political and social movements"], ["vec", "how have acts of civil disobedience changed laws and society throughout history"], ["hyde", "Civil disobedience—the deliberate, nonviolent refusal to obey unjust laws—has driven major social change. Thoreau coined the term in 1849; Gandhi used it to help end British rule in India; and Martin Luther King Jr. employed it during the American civil rights movement to challenge segregation."]], "query": "what is the significance of civil disobedience?"} -{"output": [["lex", "understand research articles reading papers"], ["lex", "read scientific journal article structure"], ["vec", "how do I read and understand scientific research articles effectively"], ["vec", "what strategy helps beginners comprehend academic journal papers"], ["hyde", "Start by reading the abstract for the main findings. Then read the introduction for context and the conclusion for takeaways. Next, examine figures and tables. Finally, read methods and results in detail. Look up unfamiliar terms. Read the paper multiple times—comprehension improves with each pass."]], "query": "how to understand research articles"} -{"output": [["lex", "401k start retirement plan employer"], ["lex", "401k enrollment contribution match"], ["vec", "how do I set up and start contributing to a 401(k) retirement plan"], ["vec", "what are the steps to enroll in my employer's 401(k) plan"], ["hyde", "Enroll through your employer's HR or benefits portal. Choose a contribution percentage—aim for at least enough to get the full employer match (typically 3-6% of salary). Select investment funds based on your retirement timeline. For 2026, the contribution limit is $23,500 ($31,000 if over 50)."]], "query": "how to start a 401(k)"} -{"output": [["lex", "grassroots campaign organizing strategy"], ["lex", "grassroots organizing community mobilization"], ["vec", "how do you organize a grassroots political or community campaign from scratch"], ["vec", "what are the key steps in building a grassroots movement for a cause"], ["hyde", "Start by defining your goal and identifying your base—who cares about this issue? Build a leadership team, create a volunteer database, and develop talking points. Use door-to-door canvassing, community meetings, social media, and petitions to grow support. Track commitments and follow up consistently."]], "query": "how to organize a grassroots campaign"} -{"output": [["lex", "Sikhism fundamental teachings beliefs"], ["lex", "Sikh Guru Nanak five articles of faith"], ["vec", "what are the core beliefs and teachings of Sikhism"], ["vec", "what did Guru Nanak and the Sikh Gurus teach about God and living"], ["hyde", "Sikhism, founded by Guru Nanak in the 15th century Punjab, teaches belief in one God (Ik Onkar), equality of all people, honest living (kirat karni), sharing with others (vand chakko), and remembrance of God (naam japna). The Guru Granth Sahib is the eternal Guru and holy scripture."]], "query": "what are the fundamental teachings of sikhism?"} -{"output": [["lex", "Aboriginal Dreamtime stories Australian Indigenous"], ["lex", "Dreamtime creation mythology Aboriginal culture"], ["vec", "what are Aboriginal Australian Dreamtime stories and what do they represent"], ["vec", "how do Dreamtime stories explain creation and law in Aboriginal culture"], ["hyde", "Dreamtime (or Dreaming) stories are the foundational narratives of Aboriginal Australian peoples. They describe how ancestral beings shaped the land, created animals and plants, and established laws and customs. These stories are passed down through oral tradition, song, dance, and art, and remain central to Indigenous identity."]], "query": "what are aboriginal dreamtime stories"} -{"output": [["lex", "meaning of life philosophy existentialism"], ["lex", "philosophers purpose existence meaning"], ["vec", "how have different philosophers addressed the question of life's meaning"], ["vec", "what do existentialist and other philosophical traditions say about the purpose of life"], ["hyde", "Existentialists like Sartre argued life has no inherent meaning—we must create it through our choices. Aristotle proposed eudaimonia (flourishing) as life's purpose. Camus explored the absurd, suggesting we must find meaning despite an indifferent universe. Eastern philosophy often points to liberation from suffering."]], "query": "how do philosophers approach the meaning of life"} -{"output": [["lex", "compost home DIY composting bin"], ["lex", "composting kitchen scraps yard waste"], ["vec", "how do I start composting food scraps and yard waste at home"], ["vec", "what is the step-by-step process for making compost in a backyard bin"], ["hyde", "Layer brown materials (dried leaves, cardboard) and green materials (kitchen scraps, grass clippings) in a 3:1 ratio. Keep the pile moist like a wrung-out sponge. Turn it every 1-2 weeks with a pitchfork. Avoid meat, dairy, and oils. Finished compost is dark, crumbly, and earthy-smelling in 2-6 months."]], "query": "how to make compost at home?"} -{"output": [["lex", "reduce food waste tips prevention"], ["lex", "food waste reduction meal planning storage"], ["vec", "how can I reduce food waste at home through planning and storage"], ["vec", "what strategies help households throw away less food"], ["hyde", "Plan meals weekly and shop with a list to avoid overbuying. Store produce properly—leafy greens in airtight containers, herbs in water. Use FIFO (first in, first out) in your fridge. Freeze leftovers and overripe fruit. Compost scraps you can't eat. The average household wastes 30% of purchased food."]], "query": "how to reduce food waste?"} -{"output": [["lex", "Native American culture history learn"], ["lex", "Indigenous peoples traditions tribal nations"], ["vec", "how can I respectfully learn about Native American culture and history"], ["vec", "what are good resources for understanding Indigenous peoples' traditions and heritage"], ["hyde", "Visit the National Museum of the American Indian (Smithsonian) or local tribal cultural centers. Read works by Native authors like Joy Harjo, Tommy Orange, and Robin Wall Kimmerer. Attend powwows and cultural events when open to the public. Learn which tribal nations are indigenous to your area."]], "query": "how to learn about native american culture"} -{"output": [["lex", "town hall meeting participate attend"], ["lex", "town hall public meeting local government"], ["vec", "how do I attend and participate in a local town hall meeting"], ["vec", "what should I know before speaking at a town hall meeting"], ["hyde", "Check your local government website or social media for upcoming town hall schedules. Arrive early and sign up to speak if required. Prepare a concise statement (usually 2-3 minutes). Stay respectful and on-topic. Bring supporting data or personal stories to strengthen your point."]], "query": "how to participate in a town hall meeting"} -{"output": [["lex", "photo backdrop choose background photography"], ["lex", "photography backdrop portrait studio"], ["vec", "how do I choose the right backdrop for portrait or studio photography"], ["vec", "what factors should I consider when selecting a photo backdrop"], ["hyde", "Choose a backdrop that complements your subject without competing for attention. Solid colors (white, gray, black) are versatile for portraits. Muslin provides a painterly texture. For outdoor shoots, look for uncluttered backgrounds with good depth. Consider the color of your subject's clothing to avoid clashing."]], "query": "how to choose a photo backdrop"} -{"output": [["lex", "nature of God Christianity Trinity"], ["lex", "Christian God attributes Father Son Holy Spirit"], ["vec", "how does Christianity describe the nature and attributes of God"], ["vec", "what is the doctrine of the Trinity in Christian theology"], ["hyde", "Christianity teaches that God is one being existing as three persons: the Father, the Son (Jesus Christ), and the Holy Spirit. This is the doctrine of the Trinity. God is described as omniscient, omnipotent, omnipresent, eternal, and perfectly good. God is both transcendent and personally involved in creation."]], "query": "what is the nature of god in christianity"} -{"output": [["lex", "scale business growth strategies"], ["lex", "business scaling operations revenue expansion"], ["vec", "how do you scale a business effectively while managing growth challenges"], ["vec", "what strategies help companies expand operations and increase revenue"], ["hyde", "Scaling requires repeatable processes, automation, and a strong team. Standardize operations with SOPs, invest in technology to reduce manual work, and hire ahead of demand. Monitor unit economics—ensure customer acquisition cost stays below lifetime value. Secure funding for growth through revenue, debt, or equity."]], "query": "how to scale a business"} -{"output": [["lex", "yoga benefits health practice"], ["lex", "yoga physical mental health flexibility stress"], ["vec", "what is yoga and what physical and mental health benefits does it provide"], ["vec", "how does regular yoga practice improve flexibility, strength, and well-being"], ["hyde", "Yoga is an ancient practice combining physical postures (asanas), breathing techniques (pranayama), and meditation. Regular practice improves flexibility, builds strength, reduces stress and anxiety, lowers blood pressure, and enhances sleep quality. Styles range from gentle Hatha to vigorous Vinyasa and Ashtanga."]], "query": "what is yoga and its benefits"} -{"output": [["lex", "self-limiting beliefs overcome remove"], ["lex", "limiting beliefs mindset change techniques"], ["vec", "how can I identify and overcome self-limiting beliefs that hold me back"], ["vec", "what techniques help replace self-limiting beliefs with empowering ones"], ["hyde", "Identify limiting beliefs by noticing recurring thoughts like \"I'm not smart enough\" or \"I don't deserve success.\" Challenge each belief: what evidence supports it? What evidence contradicts it? Replace it with a realistic affirmation. Take small actions that disprove the belief to build new neural pathways."]], "query": "how to get rid of self-limiting beliefs?"} -{"output": [["lex", "seasons geography Earth axial tilt"], ["lex", "seasons latitude hemisphere climate"], ["vec", "how does geography and Earth's axial tilt determine the seasons"], ["vec", "why do different parts of the world experience different seasons at the same time"], ["hyde", "Seasons result from Earth's 23.5° axial tilt. As Earth orbits the Sun, the Northern and Southern Hemispheres alternately tilt toward or away from the Sun, varying the angle and duration of sunlight. Near the equator, seasons are minimal; at higher latitudes, seasonal variation is extreme."]], "query": "how are seasons determined by geography"} -{"output": [["lex", "scalable business model design"], ["lex", "business model scalability revenue growth"], ["vec", "how do you design a business model that scales efficiently with growth"], ["vec", "what makes a business model scalable and what are common scalable model types"], ["hyde", "A scalable business model increases revenue without proportional increases in costs. SaaS, marketplace, and platform models are inherently scalable. Key elements: low marginal cost per customer, automation of delivery, network effects, and recurring revenue. Test with a minimum viable product before scaling."]], "query": "how to create a scalable business model"} -{"output": [["lex", "pets children anxiety reduction"], ["lex", "pet therapy kids stress mental health"], ["vec", "can having pets help reduce anxiety and stress in children"], ["vec", "what research shows about the effect of pets on children's mental health"], ["hyde", "Studies show that children with pets exhibit lower cortisol levels and reduced anxiety. A 2015 study in Preventing Chronic Disease found that children living with dogs had significantly lower rates of childhood anxiety. Petting an animal for 10 minutes reduces cortisol and increases oxytocin levels."]], "query": "can pets help reduce kids' anxiety?"} -{"output": [["lex", "date parse string format"], ["lex", "date parsing datetime library"], ["vec", "how to parse date strings into date objects in programming"], ["vec", "which libraries handle date parsing and formatting in JavaScript or Python"], ["hyde", "In JavaScript, use `new Date('2025-01-15')` or `Date.parse()` for ISO strings. For complex formats, use `date-fns` parse function or `dayjs('12/25/2025', 'MM/DD/YYYY')`. In Python, use `datetime.strptime('2025-01-15', '%Y-%m-%d')` or the `dateutil.parser.parse()` function for flexible parsing."]], "query": "date parse"} -{"output": [["lex", "Christians observe Lent fasting prayer"], ["lex", "Lent Christian observance Ash Wednesday Easter"], ["vec", "how do Christians observe the season of Lent before Easter"], ["vec", "what are the traditional Lenten practices of fasting, prayer, and almsgiving"], ["hyde", "Lent is a 40-day period before Easter beginning on Ash Wednesday. Christians observe it through fasting (abstaining from certain foods or luxuries), increased prayer, and almsgiving (charitable giving). Many give up a habit or take on a spiritual discipline. Catholic tradition requires abstaining from meat on Fridays."]], "query": "how do christians observe lent?"} -{"output": [["lex", "literary short stories fiction genre"], ["lex", "short story literary fiction writers"], ["vec", "what defines literary short stories as distinct from other fiction genres"], ["vec", "what are the characteristics of literary short fiction and who are notable writers in the genre"], ["hyde", "Literary short stories prioritize character development, thematic depth, and prose style over plot-driven entertainment. They often explore the human condition through interior conflict and ambiguity. Notable practitioners include Anton Chekhov, Alice Munro, Raymond Carver, and Jorge Luis Borges."]], "query": "what are literary short stories?"} -{"output": [["lex", "Thailand country travel Southeast Asia"], ["lex", "Thailand Bangkok culture tourism"], ["vec", "what should I know about Thailand as a travel destination or country"], ["vec", "what are the key facts about Thailand's culture, geography, and tourist attractions"], ["hyde", "Thailand is a Southeast Asian country known for tropical beaches, ornate temples, and rich cuisine. Bangkok is the capital. Popular destinations include Chiang Mai, Phuket, and the islands of Koh Samui and Phi Phi. Thai food staples include pad thai, green curry, and tom yum soup."]], "query": "thailand"} -{"output": [["lex", "trampoline flip backflip technique"], ["lex", "trampoline flip tutorial safety"], ["vec", "how do I safely learn to do a backflip on a trampoline"], ["vec", "what is the proper technique for doing flips on a trampoline"], ["hyde", "Start by mastering high, controlled bounces. Practice tucking your knees to your chest mid-air. For a backflip, bounce high, throw your arms back, tuck tightly, and spot your landing. Always practice on a trampoline with safety nets and a spotter. Progress from seat drops to back drops before attempting flips."]], "query": "how to do a flip on a trampoline"} -{"output": [["lex", "time management work productivity"], ["lex", "efficient time work techniques scheduling"], ["vec", "how can I manage my time more efficiently at work to increase productivity"], ["vec", "what time management techniques help get more done during the workday"], ["hyde", "Use time-blocking to schedule focused work in 90-minute intervals. Prioritize with the Eisenhower Matrix: do urgent-important tasks first, schedule important-not-urgent ones, delegate urgent-not-important tasks, and eliminate the rest. Batch similar tasks, limit meetings, and turn off notifications during deep work."]], "query": "how to efficiently use time at work?"} -{"output": [["lex", "venture capital funding investment startups"], ["lex", "VC funding rounds Series A seed"], ["vec", "what is venture capital and how does VC funding work for startups"], ["vec", "what are the different stages of venture capital funding from seed to Series C"], ["hyde", "Venture capital is equity financing provided to high-growth startups in exchange for ownership stakes. Funding stages include pre-seed, seed ($500K-$2M), Series A ($2-15M), Series B ($15-50M), and later rounds. VCs evaluate the team, market size, traction, and scalability before investing."]], "query": "what is venture capital funding"} -{"output": [["lex", "app build compile deploy"], ["lex", "mobile app build process configuration"], ["vec", "how to build and compile a mobile or web application for deployment"], ["vec", "what are the steps in the app build process and common build tools"], ["hyde", "For mobile apps, use `xcodebuild` (iOS) or `./gradlew assembleRelease` (Android). For web apps, run `npm run build` or `vite build` to bundle and optimize assets. Configure environment variables, set the build target, and use CI/CD pipelines (GitHub Actions, CircleCI) for automated builds."]], "query": "app build"} -{"output": [["lex", "build strong relationships communication trust"], ["lex", "healthy relationships skills connection"], ["vec", "how do you build and maintain strong personal relationships"], ["vec", "what habits and communication skills help strengthen relationships"], ["hyde", "Strong relationships are built on trust, open communication, and mutual respect. Practice active listening—give full attention without planning your response. Express appreciation regularly. Handle conflicts by addressing issues directly without blame. Invest quality time and show up consistently during both good and hard times."]], "query": "how to build strong relationships?"} -{"output": [["lex", "prenatal classes start when pregnancy"], ["lex", "childbirth education classes timing"], ["vec", "when during pregnancy should I start taking prenatal classes"], ["vec", "what is the recommended timing for beginning childbirth education classes"], ["hyde", "Most experts recommend starting prenatal classes during the second trimester, around weeks 20-24, and completing them by week 36. Early classes cover nutrition, exercise, and fetal development. Later classes focus on labor stages, breathing techniques, pain management options, breastfeeding, and newborn care."]], "query": "when to start prenatal classes?"} -{"output": [["lex", "kitchen cabinet hardware handles knobs"], ["lex", "cabinet hardware style finish selection"], ["vec", "how do I choose the right handles and knobs for kitchen cabinets"], ["vec", "what styles and finishes of kitchen cabinet hardware work with different designs"], ["hyde", "Match hardware to your kitchen style: brushed nickel or stainless for modern kitchens, oil-rubbed bronze for traditional, brass for transitional. Use pulls (3-4 inches) on drawers and knobs on doors. Test ergonomics before buying in bulk. Standard mounting holes are 3 or 3.75 inches apart."]], "query": "how to choose kitchen cabinet hardware"} -{"output": [["lex", "Torah significance Judaism sacred text"], ["lex", "Torah five books Moses Jewish law"], ["vec", "what is the Torah and why is it significant in Judaism"], ["vec", "what role does the Torah play in Jewish religious life and law"], ["hyde", "The Torah comprises the five books of Moses (Genesis, Exodus, Leviticus, Numbers, Deuteronomy) and is the most sacred text in Judaism. It contains the 613 commandments (mitzvot), the creation narrative, and the covenant between God and the Israelites. It is read publicly in synagogue every week."]], "query": "what is the significance of the torah?"} -{"output": [["lex", "test mock unit testing"], ["lex", "mock object stub spy testing"], ["vec", "how to use mocks and stubs in unit testing"], ["vec", "what are mock objects and how do they help isolate components in tests"], ["hyde", "Mocks replace real dependencies with controlled objects during testing. In Python, use `unittest.mock.patch()` to replace a function. In JavaScript, use `jest.fn()` or `jest.spyOn()`. Mocks verify that methods were called with expected arguments. Stubs return fixed values; spies track calls without replacing behavior."]], "query": "test mock"} -{"output": [["lex", "culture influence identity formation"], ["lex", "cultural identity socialization values"], ["vec", "how does culture shape a person's sense of identity"], ["vec", "in what ways do cultural values and traditions influence who we become"], ["hyde", "Culture shapes identity through language, traditions, values, and social norms internalized from childhood. Family, community, religion, and media all transmit cultural frameworks. Identity is constructed through negotiation between personal experiences and cultural expectations, creating a sense of belonging and self-understanding."]], "query": "how does culture influence identity?"} -{"output": [["lex", "good listener active listening skills"], ["lex", "listening skills empathy communication"], ["vec", "how can I become a better and more active listener in conversations"], ["vec", "what techniques improve listening skills and show empathy"], ["hyde", "Active listening means giving full attention: maintain eye contact, put away distractions, and don't interrupt. Reflect back what you heard (\"It sounds like you're saying...\"). Ask open-ended questions to show interest. Avoid jumping to advice—sometimes people just need to feel heard. Validate their emotions."]], "query": "how to be a good listener"} -{"output": [["lex", "public speaking skills improve presentation"], ["lex", "public speaking confidence practice tips"], ["vec", "how can I improve my public speaking and overcome stage fright"], ["vec", "what techniques help deliver confident and engaging presentations"], ["hyde", "Join Toastmasters for regular practice in a supportive environment. Record yourself speaking and review for filler words and pacing. Structure talks with a clear opening hook, three key points, and a memorable close. Practice in front of friends. Manage nerves through deep breathing and visualization beforehand."]], "query": "how to improve public speaking skills"} -{"output": [["lex", "log debug logging level"], ["lex", "debug logging output configuration"], ["vec", "how to configure debug-level logging in an application"], ["vec", "how to use log debug statements for troubleshooting code"], ["hyde", "Set the log level to DEBUG to capture detailed diagnostic output. In Python: `logging.basicConfig(level=logging.DEBUG)`. In Node.js with winston: `logger.level = 'debug'`. In Java with SLF4J: configure logback.xml with ``. Use debug logs for variable values, flow tracing, and conditional paths."]], "query": "log debug"} -{"output": [["lex", "Large Hadron Collider LHC CERN"], ["lex", "LHC particle accelerator Higgs boson"], ["vec", "what is the Large Hadron Collider and what has it discovered"], ["vec", "how does the LHC at CERN work to study particle physics"], ["hyde", "The Large Hadron Collider (LHC) at CERN near Geneva is the world's largest and most powerful particle accelerator. It accelerates protons to near light speed in a 27-kilometer ring and collides them to study fundamental particles. In 2012, it confirmed the existence of the Higgs boson."]], "query": "what is the large hadron collider"} -{"output": [["lex", "worship practices significance religion"], ["lex", "worship rituals prayer spiritual meaning"], ["vec", "what is the significance of worship practices across different religions"], ["vec", "why do religious communities engage in rituals, prayer, and worship"], ["hyde", "Worship practices—prayer, ritual, song, and meditation—serve to connect individuals with the divine, reinforce communal identity, and express gratitude and devotion. In Christianity, worship centers on liturgy and sacraments; in Islam, the five daily prayers (salat); in Hinduism, puja and temple ceremonies."]], "query": "what is the significance of worship practices?"} -{"output": [["lex", "fair trade products certification"], ["lex", "fair trade coffee chocolate ethical"], ["vec", "what are fair trade products and how does fair trade certification work"], ["vec", "what does the fair trade label mean for farmers and consumers"], ["hyde", "Fair trade products are goods certified to meet standards ensuring producers in developing countries receive fair prices, safe working conditions, and sustainable practices. Common fair trade products include coffee, chocolate, tea, bananas, and cotton. Look for the Fairtrade International or Fair Trade USA label."]], "query": "what are fair trade products?"} -{"output": [["lex", "community ethics significance moral philosophy"], ["lex", "communitarian ethics social responsibility"], ["vec", "what role does community play in ethical theory and moral life"], ["vec", "how does communitarian philosophy view the relationship between community and ethics"], ["hyde", "Communitarian ethics argues that moral reasoning is rooted in community values and shared traditions, not just individual rights. Philosophers like Alasdair MacIntyre and Charles Taylor emphasize that virtues and moral identity are shaped by the communities in which we participate."]], "query": "what is the significance of community in ethics"} -{"output": [["lex", "index funds investing passive"], ["lex", "index fund S&P 500 ETF low cost"], ["vec", "what are index funds and why are they popular for investing"], ["vec", "how do index funds work and what are their advantages over actively managed funds"], ["hyde", "An index fund is a type of mutual fund or ETF that tracks a market index like the S&P 500. It holds all (or a representative sample of) the stocks in that index. Index funds offer broad diversification, low expense ratios (typically 0.03-0.20%), and historically outperform most actively managed funds."]], "query": "what are index funds"} -{"output": [["lex", "Hinduism religion beliefs practices"], ["lex", "Hindu dharma gods Vedas karma reincarnation"], ["vec", "what is Hinduism and what are its main beliefs and practices"], ["vec", "what do Hindus believe about God, karma, and the cycle of rebirth"], ["hyde", "Hinduism is one of the world's oldest religions, originating in the Indian subcontinent. It encompasses diverse beliefs but key concepts include dharma (duty), karma (action and consequence), samsara (cycle of rebirth), and moksha (liberation). Sacred texts include the Vedas, Upanishads, and Bhagavad Gita."]], "query": "what is hinduism"} -{"output": [["lex", "Sufism Islamic mysticism spiritual"], ["lex", "Sufi practices dhikr whirling dervishes"], ["vec", "what is Sufism and how does it relate to Islam"], ["vec", "what are the spiritual practices and beliefs of Sufi mystics"], ["hyde", "Sufism is the mystical dimension of Islam, emphasizing the inward search for God and the purification of the soul. Sufis practice dhikr (repetitive remembrance of God), meditation, and poetry to achieve closeness to the divine. Rumi and Al-Ghazali are among the most famous Sufi masters."]], "query": "what is sufism?"} -{"output": [["lex", "outline novel plot structure"], ["lex", "novel outline writing planning chapters"], ["vec", "how do I create an outline for writing a novel"], ["vec", "what methods do authors use to plan and structure a novel before writing"], ["hyde", "Start with a one-sentence premise, then expand to a paragraph summary. Use the three-act structure: setup, confrontation, resolution. Create character profiles with goals and arcs. Write a chapter-by-chapter outline with scene goals. Methods include the Snowflake Method, Save the Cat beat sheet, or index cards on a corkboard."]], "query": "how to outline a novel"} -{"output": [["lex", "WHO World Health Organization pandemic role"], ["lex", "WHO pandemic response disease outbreak"], ["vec", "what role does the World Health Organization play during pandemics"], ["vec", "how does the WHO coordinate international responses to disease outbreaks"], ["hyde", "The World Health Organization (WHO) coordinates international pandemic response by issuing health guidelines, declaring Public Health Emergencies of International Concern (PHEIC), distributing vaccines through COVAX, providing technical assistance to countries, and monitoring disease surveillance data from member states."]], "query": "what is the role of the who in pandemics"} -{"output": [["lex", "glacier formation process ice"], ["lex", "glaciers formed snow compaction accumulation"], ["vec", "how do glaciers form from accumulated snow and ice over time"], ["vec", "what is the process of glacier formation and movement"], ["hyde", "Glaciers form when annual snowfall exceeds snowmelt over many years. The accumulated snow compresses into firn (granular ice) and eventually into dense glacial ice. When the ice mass becomes thick enough, gravity causes it to flow slowly downhill. This process takes decades to centuries."]], "query": "how are glaciers formed"} -{"output": [["lex", "research reproducibility replication methods"], ["lex", "reproducible research data sharing protocols"], ["vec", "how do researchers ensure their studies are reproducible by others"], ["vec", "what practices improve the reproducibility and replication of scientific research"], ["hyde", "Ensure reproducibility by pre-registering your study, sharing raw data and analysis code in public repositories (e.g., GitHub, Zenodo), documenting every methodological step, using version control, and providing computational environments (Docker containers). Report all results, including null findings."]], "query": "how to ensure research reproducibility"} -{"output": [["lex", "angels religions Christianity Islam Judaism"], ["lex", "angels religious beliefs spiritual beings"], ["vec", "how do different religions like Christianity, Islam, and Judaism view angels"], ["vec", "what roles do angels play across major world religions"], ["hyde", "In Christianity, angels are messengers of God (e.g., Gabriel, Michael) who serve as protectors and intermediaries. Islam teaches that angels (mala'ika) are created from light and include Jibril (Gabriel) who delivered the Quran. Judaism describes angels as divine agents carrying out God's will in the Hebrew Bible."]], "query": "how do different religions view angels?"} -{"output": [["lex", "social contract theory governance political philosophy"], ["lex", "social contract Hobbes Locke Rousseau"], ["vec", "how does social contract theory explain the legitimacy of government"], ["vec", "what did Hobbes, Locke, and Rousseau argue about the social contract and governance"], ["hyde", "Social contract theory holds that governments derive legitimacy from the consent of the governed. Hobbes argued people surrender freedoms to a sovereign for security. Locke emphasized natural rights to life, liberty, and property, with government protecting them. Rousseau proposed the general will as the basis for collective governance."]], "query": "how does the social contract theory explain governance"} -{"output": [["lex", "trekking poles hiking technique"], ["lex", "trekking poles adjustment grip walking"], ["vec", "how do you properly use trekking poles while hiking"], ["vec", "what is the correct technique for adjusting and using trekking poles on trails"], ["hyde", "Adjust pole length so your elbow is at 90° on flat ground. Shorten poles for uphill, lengthen for downhill. Plant the pole opposite your stepping foot. Use wrist straps for support—push down through the strap, not the grip. On steep descents, poles reduce knee impact by up to 25%."]], "query": "how to use trekking poles"} -{"output": [["lex", "blockchain technology distributed ledger"], ["lex", "blockchain cryptography decentralized consensus"], ["vec", "how does blockchain technology work at a technical level"], ["vec", "what are the key components of blockchain like blocks, hashing, and consensus mechanisms"], ["hyde", "A blockchain is a distributed ledger where transactions are grouped into blocks. Each block contains a cryptographic hash of the previous block, creating an immutable chain. Nodes validate transactions through consensus mechanisms like Proof of Work or Proof of Stake. No central authority controls the network."]], "query": "how does blockchain technology work"} -{"output": [["lex", "wildflower meadow planting seeds"], ["lex", "plant wildflower meadow soil preparation native"], ["vec", "how do I plant and establish a wildflower meadow in my yard"], ["vec", "what steps are needed to create a wildflower meadow from seed"], ["hyde", "Clear existing vegetation by mowing low and raking away debris. Loosen the top inch of soil. Mix wildflower seeds with sand for even distribution and scatter in fall or early spring. Press seeds into soil but don't cover them—most need light to germinate. Water gently until established. Avoid fertilizer, which favors grasses."]], "query": "how to plant a wildflower meadow?"} -{"output": [["lex", "civil political discussion respectful debate"], ["lex", "political conversation etiquette disagreement"], ["vec", "how can I have respectful and productive political discussions with people who disagree"], ["vec", "what strategies help keep political conversations civil and constructive"], ["hyde", "Start by listening to understand, not to rebut. Ask questions like \"What experiences led you to that view?\" Avoid personal attacks and generalizations. Find common ground before addressing differences. Use \"I\" statements instead of \"you always\" accusations. Accept that changing minds takes time and repeated respectful engagement."]], "query": "how to engage in civil political discussions"} -{"output": [["lex", "super bowl 2024 streaming channel"], ["lex", "super bowl LVIII broadcast network"], ["lex", "watch super bowl 2024 live"], ["vec", "what channel or streaming service is broadcasting Super Bowl 2024"], ["vec", "where can I watch the 2024 Super Bowl LVIII game live online"], ["hyde", "Super Bowl LVIII airs on CBS on February 11, 2024. You can stream it live on Paramount+ or through the CBS Sports app. Kickoff is at 6:30 PM ET from Allegiant Stadium in Las Vegas."]], "query": "where to watch super bowl 2024"} -{"output": [["lex", "mind-body problem philosophy"], ["lex", "dualism consciousness physicalism"], ["lex", "mental states physical brain"], ["vec", "what is the philosophical mind-body problem and why is it difficult to solve"], ["vec", "how do philosophers explain the relationship between consciousness and the physical brain"], ["hyde", "The mind-body problem asks how mental states like thoughts, feelings, and consciousness relate to physical states of the brain. Descartes proposed substance dualism, arguing mind and body are fundamentally different substances."]], "query": "what is the mind-body problem"} -{"output": [["lex", "scientific findings report writing"], ["lex", "research results publication format"], ["lex", "academic paper methodology results"], ["vec", "how should scientists structure and report their research findings in a paper"], ["vec", "what is the standard format for reporting results in a scientific publication"], ["hyde", "When reporting scientific findings, organize your paper into Introduction, Methods, Results, and Discussion (IMRaD). Present results with tables and figures, include statistical analyses, and state findings objectively before interpreting them."]], "query": "how to report scientific findings"} -{"output": [["lex", "software unit testing framework"], ["lex", "code testing automated tests"], ["lex", "test-driven development TDD"], ["vec", "how to write and run automated tests for software code"], ["vec", "what are the common approaches to testing code including unit tests and integration tests"], ["hyde", "Unit tests verify individual functions in isolation. Use a testing framework like Jest, pytest, or JUnit to write assertions that check expected outputs against actual results. Run tests with `npm test` or `pytest`."]], "query": "code test"} -{"output": [["lex", "human rights definition universal declaration"], ["lex", "fundamental human rights UDHR"], ["lex", "civil political economic social rights"], ["vec", "what are human rights and what does the Universal Declaration of Human Rights guarantee"], ["vec", "what fundamental freedoms and protections are considered universal human rights"], ["hyde", "Human rights are inherent rights belonging to every person regardless of nationality, sex, ethnicity, or religion. The Universal Declaration of Human Rights (1948) established 30 articles covering civil, political, economic, social, and cultural rights."]], "query": "what is human rights"} -{"output": [["lex", "DNA function genetic information"], ["lex", "deoxyribonucleic acid protein synthesis"], ["lex", "DNA replication transcription translation"], ["vec", "what role does DNA play in storing and transmitting genetic information in cells"], ["vec", "how does DNA encode instructions for building proteins in living organisms"], ["hyde", "DNA stores the genetic instructions needed for the development and functioning of all living organisms. It encodes genes as sequences of nucleotide bases (A, T, G, C) that are transcribed into RNA and translated into proteins."]], "query": "what is the function of dna"} -{"output": [["lex", "cause advocacy strategies campaigning"], ["lex", "grassroots advocacy organizing"], ["lex", "political advocacy lobbying petition"], ["vec", "what are effective ways to advocate and campaign for a social or political cause"], ["vec", "how can individuals organize and mobilize support for a cause they care about"], ["hyde", "Start by clearly defining your cause and goals. Build a coalition of supporters, create a compelling message, and use multiple channels: social media, petitions, letters to legislators, public events, and media outreach to amplify your message."]], "query": "how to advocate for a cause"} -{"output": [["lex", "grow blueberries home garden"], ["lex", "blueberry bush planting acidic soil"], ["lex", "container blueberry growing care"], ["vec", "how do I plant and care for blueberry bushes in my home garden"], ["vec", "what soil pH and conditions do blueberries need to grow well at home"], ["hyde", "Blueberries thrive in acidic soil with a pH of 4.5-5.5. Plant in full sun with well-drained soil amended with peat moss. Space bushes 4-6 feet apart and mulch with pine needles. Water regularly and prune dead wood in late winter."]], "query": "how to grow blueberries at home?"} -{"output": [["lex", "stock market volatility causes"], ["lex", "financial market fluctuations economic factors"], ["lex", "market volatility interest rates inflation"], ["vec", "what economic and geopolitical factors cause stock market volatility"], ["vec", "why do financial markets experience sudden price swings and instability"], ["hyde", "Market volatility is driven by economic data releases, interest rate changes, geopolitical events, earnings surprises, and investor sentiment. High uncertainty about inflation, central bank policy, or political instability increases price fluctuations across asset classes."]], "query": "what causes market volatility"} -{"output": [["lex", "spiritual leadership organizations values"], ["lex", "spiritual leadership workplace meaning purpose"], ["vec", "how does spiritual leadership influence organizations and their members"], ["vec", "what role does spiritual leadership play in providing meaning and purpose at work"], ["hyde", "Spiritual leadership theory proposes that leaders who foster a sense of calling, meaning, and membership create more engaged and productive organizations. It emphasizes vision, altruistic love, and hope as core values that transcend traditional management."]], "query": "what is the importance of spiritual leadership?"} -{"output": [["lex", "Paris Agreement climate change 2015"], ["lex", "Paris climate accord greenhouse gas emissions"], ["lex", "Paris Agreement temperature goals"], ["vec", "what is the Paris Agreement and what are its goals for addressing climate change"], ["vec", "what commitments did countries make under the 2015 Paris climate accord"], ["hyde", "The Paris Agreement is a legally binding international treaty on climate change adopted in 2015. Its goal is to limit global warming to well below 2°C, preferably 1.5°C, above pre-industrial levels. Countries submit nationally determined contributions (NDCs) outlining emission reduction targets."]], "query": "what is the paris agreement"} -{"output": [["lex", "customer engagement strategies retention"], ["lex", "increase customer interaction loyalty"], ["lex", "customer engagement marketing personalization"], ["vec", "what strategies can businesses use to improve customer engagement and loyalty"], ["vec", "how can companies create more meaningful interactions with their customers"], ["hyde", "Personalize communications using customer data and segmentation. Implement loyalty programs, respond promptly on social media, send targeted email campaigns, and gather feedback through surveys. Omnichannel engagement ensures consistent experience across touchpoints."]], "query": "how to enhance customer engagement"} -{"output": [["lex", "encourage children reading habits"], ["lex", "kids reading motivation tips"], ["lex", "children literacy books engagement"], ["vec", "what strategies help encourage children to develop a love of reading"], ["vec", "how can parents motivate reluctant children to read more books"], ["hyde", "Read aloud to children daily from an early age. Let them choose their own books based on interests. Create a cozy reading nook, visit the library regularly, and set a family reading time. Avoid using reading as punishment; make it enjoyable."]], "query": "how to encourage children to read?"} -{"output": [["lex", "base jumping extreme sport parachute"], ["lex", "BASE jump fixed object skydiving"], ["lex", "base jumping wingsuit cliff"], ["vec", "what is BASE jumping and how does it differ from skydiving"], ["vec", "what does BASE stand for and what are the risks of base jumping"], ["hyde", "BASE jumping involves parachuting from fixed objects: Buildings, Antennas, Spans (bridges), and Earth (cliffs). Unlike skydiving from aircraft, BASE jumps occur at much lower altitudes, giving jumpers only seconds to deploy their parachute."]], "query": "what is base jumping?"} -{"output": [["lex", "clean car engine bay degreaser"], ["lex", "engine bay detailing wash"], ["lex", "engine compartment cleaning steps"], ["vec", "what is the safest way to clean and degrease a car engine bay"], ["vec", "step by step process to clean under the hood of a car"], ["hyde", "Cover sensitive electrical components with plastic bags. Apply engine degreaser to the entire bay, let it sit 5-10 minutes, then agitate with a brush. Rinse with low-pressure water, avoiding direct spray on the alternator, fuse box, and air intake."]], "query": "how to clean car engine bay?"} -{"output": [["lex", "sibling rivalry management parenting"], ["lex", "brothers sisters fighting conflict"], ["lex", "sibling jealousy fairness strategies"], ["vec", "how can parents effectively manage fighting and rivalry between siblings"], ["vec", "what are proven strategies to reduce sibling conflict and jealousy"], ["hyde", "Avoid comparing siblings to each other. Give each child individual attention and acknowledge their unique strengths. Teach conflict resolution skills rather than always intervening. Set clear family rules about respectful behavior and let children solve minor disputes themselves."]], "query": "how to manage sibling rivalry?"} -{"output": [["lex", "build raised garden bed DIY"], ["lex", "raised bed construction lumber soil"], ["lex", "raised garden bed plans dimensions"], ["vec", "how do I build a raised garden bed from wood step by step"], ["vec", "what materials and dimensions work best for a DIY raised garden bed"], ["hyde", "Cut four boards of untreated cedar or redwood to size: two at 4 feet and two at 8 feet for a standard 4x8 bed. Screw corners together with deck screws. Place on level ground, line the bottom with cardboard, and fill with a mix of topsoil, compost, and peat moss."]], "query": "how to build a raised garden bed?"} -{"output": [["lex", "G7 group of seven nations"], ["lex", "G7 summit member countries"], ["lex", "G7 economic political alliance"], ["vec", "what is the G7 and which countries are members of this international group"], ["vec", "what role does the Group of Seven play in global economic and political governance"], ["hyde", "The G7 (Group of Seven) is an intergovernmental forum of seven major advanced economies: Canada, France, Germany, Italy, Japan, the United Kingdom, and the United States. The EU also participates. Members meet annually to discuss global economic policy, security, and trade."]], "query": "what is the g7"} -{"output": [["lex", "choice ethics moral philosophy"], ["lex", "free will moral responsibility"], ["lex", "ethical decision-making autonomy"], ["vec", "what role does personal choice play in moral philosophy and ethical responsibility"], ["vec", "how do ethicists view free will and autonomous choice in determining moral accountability"], ["hyde", "Choice is central to ethics because moral responsibility presupposes the ability to choose freely. Aristotle argued that virtuous action requires deliberate choice (prohairesis). Without genuine alternatives, praise and blame lose their foundation."]], "query": "what is the role of choice in ethics?"} -{"output": [["lex", "home repair DIY fix"], ["lex", "house maintenance common repairs"], ["lex", "home improvement handyman tasks"], ["vec", "how to do common home repairs and fixes yourself"], ["vec", "what are typical household problems and how to fix them without a professional"], ["hyde", "Common DIY home repairs include fixing leaky faucets, patching drywall holes, unclogging drains, replacing light switches, re-caulking bathrooms, and fixing squeaky doors. Most require only basic tools: screwdriver, pliers, wrench, and putty knife."]], "query": "home fix"} -{"output": [["lex", "hiking clothing layers gear"], ["lex", "hiking outfit shoes weather"], ["lex", "what to wear hiking trail"], ["vec", "what is the best clothing to wear for a day hike in different weather conditions"], ["vec", "how should I layer my clothes for hiking to stay comfortable"], ["hyde", "Dress in moisture-wicking layers: a synthetic or merino wool base layer, an insulating mid layer like fleece, and a waterproof shell. Wear sturdy hiking boots or trail shoes with wool socks. Avoid cotton, which retains moisture and causes chafing."]], "query": "what should i wear hiking?"} -{"output": [["lex", "Jainism main tenets principles"], ["lex", "Jain beliefs ahimsa non-violence"], ["lex", "Jainism five vows anekantavada"], ["vec", "what are the core beliefs and principles of the Jain religion"], ["vec", "what are the five main vows and philosophical tenets of Jainism"], ["hyde", "Jainism centers on three jewels: right faith, right knowledge, and right conduct. Its five vows are ahimsa (non-violence), satya (truth), asteya (non-stealing), brahmacharya (chastity), and aparigraha (non-attachment). Jains believe in karma and the soul's liberation through self-discipline."]], "query": "what are the main tenets of jainism?"} -{"output": [["lex", "universal healthcare single payer system"], ["lex", "universal health coverage public insurance"], ["lex", "universal healthcare countries policy"], ["vec", "what is universal healthcare and how do different countries implement it"], ["vec", "how does a universal healthcare system provide coverage to all citizens"], ["hyde", "Universal healthcare ensures all residents have access to medical services without financial hardship. Models vary: single-payer systems (Canada), national health services (UK's NHS), and mandatory insurance systems (Germany). Funding comes through taxes or mandatory premiums."]], "query": "what is universal healthcare"} -{"output": [["lex", "buy rare plant seeds online"], ["lex", "rare exotic seed suppliers shop"], ["lex", "unusual heirloom seeds catalog"], ["vec", "where can I purchase rare and exotic plant seeds online"], ["vec", "what are reputable suppliers for hard-to-find and unusual plant seeds"], ["hyde", "Specialty seed suppliers for rare plants include Baker Creek Heirloom Seeds, Chiltern Seeds, Plant World Seeds, and Rare Seeds. Online marketplaces like Etsy also have independent growers selling unusual varieties. Check import regulations for international orders."]], "query": "where to buy rare plant seeds?"} -{"output": [["lex", "beginner kayaking first time tips"], ["lex", "kayak basics paddling technique"], ["lex", "learn kayaking beginner guide"], ["vec", "what should a beginner know before going kayaking for the first time"], ["vec", "how do I paddle and balance a kayak as a first-time kayaker"], ["hyde", "For your first kayak outing, choose calm, flat water like a lake or slow river. Adjust the foot pegs so your knees are slightly bent. Hold the paddle with hands shoulder-width apart, knuckles aligned with the blade edge. Use torso rotation, not just arms, for each stroke."]], "query": "how to kayak for the first time"} -{"output": [["lex", "Rumi poetry teachings themes"], ["lex", "Rumi Sufi mysticism divine love"], ["lex", "Rumi Masnavi spiritual wisdom"], ["vec", "what are the central spiritual and philosophical themes in Rumi's poems"], ["vec", "what does Rumi teach about love, the soul, and union with the divine"], ["hyde", "Rumi's poetry centers on divine love as the path to spiritual union with God. His Masnavi explores themes of longing, surrender, and the dissolution of the ego. He uses metaphors of wine, the beloved, and the reed flute to express the soul's yearning for its source."]], "query": "what are the major teachings in rumi's poetry?"} -{"output": [["lex", "pilgrimage purpose religious spiritual"], ["lex", "pilgrimage meaning journey sacred site"], ["vec", "what is the spiritual purpose of making a pilgrimage to a sacred site"], ["vec", "why do people of different religions undertake pilgrimages"], ["hyde", "A pilgrimage is a sacred journey to a holy site undertaken for spiritual renewal, penance, or devotion. In Islam, Hajj to Mecca is obligatory. Christians walk the Camino de Santiago. Hindus visit Varanasi. The journey itself is seen as transformative, not just the destination."]], "query": "what is the purpose of a pilgrimage"} -{"output": [["lex", "Craigslist ads posting classified"], ["lex", "Craigslist listings buy sell"], ["lex", "Craigslist marketplace local ads"], ["vec", "how to post and browse classified ads on Craigslist"], ["vec", "how does Craigslist work for buying, selling, and listing items locally"], ["hyde", "To post a Craigslist ad, go to craigslist.org, select your city, and click \"create a posting.\" Choose a category (for sale, housing, jobs, services), write a clear title and description, add photos, and set your price. Most postings are free for individuals."]], "query": "craigslist ads"} -{"output": [["lex", "primary election definition process"], ["lex", "primary election presidential nomination"], ["lex", "open closed primary voting"], ["vec", "what is a primary election and how does it determine party nominees"], ["vec", "how do primary elections work in the United States political system"], ["hyde", "A primary election is a vote held by a political party to choose its candidates for the general election. In a closed primary, only registered party members can vote. In an open primary, any registered voter may participate regardless of party affiliation."]], "query": "what is a primary election"} -{"output": [["lex", "Catholic Church Middle Ages role"], ["lex", "medieval church political power papacy"], ["lex", "Catholic Church feudalism education medieval"], ["vec", "what political, social, and cultural role did the Catholic Church play during the Middle Ages"], ["vec", "how did the Catholic Church influence governance, education, and daily life in medieval Europe"], ["hyde", "The Catholic Church was the dominant institution in medieval Europe. It controlled vast lands, collected tithes, and wielded political power through the papacy. The Church ran schools and universities, preserved classical texts in monasteries, and regulated moral life through canon law and sacraments."]], "query": "what was the role of the catholic church in the middle ages?"} -{"output": [["lex", "hospital bag labor delivery packing list"], ["lex", "what to bring hospital birth bag"], ["lex", "labor bag essentials mother baby"], ["vec", "what items should I pack in my hospital bag before going into labor"], ["vec", "what is a complete packing checklist for the hospital for giving birth"], ["hyde", "Hospital bag essentials for labor: ID and insurance card, birth plan, comfortable robe or gown, slippers, toiletries, phone charger, going-home outfit for you and baby, car seat, nursing bra, newborn diapers, snacks, and a pillow from home."]], "query": "what to pack in a hospital bag for labor?"} -{"output": [["lex", "international trade agreements local economy impact"], ["lex", "trade deal tariff local jobs wages"], ["lex", "free trade agreement economic effects"], ["vec", "how do international trade agreements impact jobs and economies at the local level"], ["vec", "what are the positive and negative effects of free trade agreements on local industries"], ["hyde", "Trade agreements lower tariffs and open markets, which can reduce consumer prices and expand exports. However, local industries that cannot compete with cheaper imports may shrink, leading to job losses in manufacturing regions. The net effect depends on the economy's structure and adjustment policies."]], "query": "how international trade agreements affect local economies"} -{"output": [["lex", "Ring of Fire Pacific Ocean volcanoes"], ["lex", "Pacific Ring of Fire earthquakes tectonic"], ["lex", "ring of fire map plate boundaries"], ["vec", "what is the Pacific Ring of Fire and why does it have so many earthquakes and volcanoes"], ["vec", "which tectonic plates form the Ring of Fire around the Pacific Ocean"], ["hyde", "The Ring of Fire is a 40,000 km horseshoe-shaped zone around the Pacific Ocean where about 75% of the world's volcanoes and 90% of earthquakes occur. It follows boundaries of tectonic plates including the Pacific, Nazca, and Philippine Sea plates."]], "query": "what is the ring of fire"} -{"output": [["lex", "moral relativism absolutism difference"], ["lex", "ethical relativism vs moral absolutism"], ["lex", "relativism absolutism philosophy comparison"], ["vec", "what is the philosophical difference between moral relativism and moral absolutism"], ["vec", "how do relativists and absolutists disagree about the nature of moral truth"], ["hyde", "Moral absolutism holds that certain actions are universally right or wrong regardless of context or culture. Moral relativism argues that moral judgments are not universal but depend on cultural, social, or personal frameworks. Absolutists point to human rights; relativists emphasize cultural diversity."]], "query": "how does relativism differ from absolutism"} -{"output": [["lex", "rainwater harvesting garden setup"], ["lex", "rain barrel collection irrigation"], ["lex", "harvest rainwater system DIY"], ["vec", "how can I set up a rainwater collection system to water my garden"], ["vec", "what equipment do I need to harvest rainwater for garden irrigation"], ["hyde", "Install a rain barrel or cistern under a downspout to collect roof runoff. Use a first-flush diverter to discard initial dirty water. A screen keeps debris and mosquitoes out. Connect a spigot or hose at the bottom for gravity-fed garden irrigation. A 1,000 sq ft roof yields ~600 gallons per inch of rain."]], "query": "how to harvest rainwater for gardening?"} -{"output": [["lex", "sacred tree symbolism religion"], ["lex", "tree of life world tree spiritual traditions"], ["lex", "sacred trees Buddhism Hinduism Christianity Norse"], ["vec", "what role do sacred trees play in the religious symbolism of different faiths"], ["vec", "how are trees like the Bodhi tree and Yggdrasil significant in world religions"], ["hyde", "Sacred trees appear across religions: the Bodhi tree where Buddha attained enlightenment, the Tree of Life in Genesis, Yggdrasil in Norse mythology connecting the nine worlds, and the banyan in Hinduism symbolizing eternal life. Trees represent growth, connection between earth and heaven, and renewal."]], "query": "what is the significance of the sacred tree in various faiths?"} -{"output": [["lex", "code dependency management"], ["lex", "software dependency package manager"], ["lex", "dependency resolution version conflicts"], ["vec", "how to manage code dependencies and packages in a software project"], ["vec", "what tools help resolve and manage dependencies in programming"], ["hyde", "Dependency management tools track and install external libraries your code relies on. Package managers like npm (JavaScript), pip (Python), and cargo (Rust) resolve version conflicts, maintain lock files, and ensure reproducible builds across environments."]], "query": "code dep"} -{"output": [["lex", "rebirth Buddhism reincarnation concept"], ["lex", "Buddhist rebirth samsara karma cycle"], ["lex", "rebirth reincarnation Buddhism difference"], ["vec", "how does Buddhism explain the concept of rebirth and the cycle of samsara"], ["vec", "what is the difference between rebirth in Buddhism and reincarnation in Hinduism"], ["hyde", "In Buddhism, rebirth is not the transmigration of a fixed soul but the continuation of a stream of consciousness shaped by karma. Beings cycle through samsara—the realms of existence—until achieving nirvana. Unlike Hindu reincarnation, Buddhism denies a permanent self (anatta) that transfers between lives."]], "query": "what is the concept of rebirth in buddhism?"} -{"output": [["lex", "cultural iconography symbols art"], ["lex", "iconographic symbols meaning culture"], ["lex", "visual symbolism iconography history"], ["vec", "what is cultural iconography and how are visual symbols used to convey meaning across cultures"], ["vec", "how do art historians study and interpret iconographic symbols in different cultural traditions"], ["hyde", "Cultural iconography studies the identification and interpretation of visual symbols in art and media. Icons like the Christian cross, Buddhist lotus, or American bald eagle carry layered meanings shaped by history, religion, and politics. Erwin Panofsky formalized iconographic analysis in three levels."]], "query": "cultural iconography"} -{"output": [["lex", "AI research trends 2025 2026"], ["lex", "artificial intelligence latest developments"], ["lex", "machine learning LLM multimodal research"], ["vec", "what are the most important current trends and breakthroughs in AI research in 2025-2026"], ["vec", "what directions is artificial intelligence research heading in areas like large language models and multimodal AI"], ["hyde", "Key AI research trends in 2025-2026 include scaling reasoning models, multimodal foundation models combining text, image, and video, AI agents that use tools autonomously, efficient fine-tuning methods like LoRA, and alignment research on safety and interpretability."]], "query": "current trends in ai research"} -{"output": [["lex", "AI healthcare applications medical"], ["lex", "artificial intelligence diagnosis treatment"], ["lex", "machine learning medical imaging drug discovery"], ["vec", "how is artificial intelligence being applied in healthcare for diagnosis and treatment"], ["vec", "what are the main uses of AI and machine learning in the medical field"], ["hyde", "AI in healthcare is used for medical image analysis (detecting tumors in radiology scans), drug discovery (predicting molecular interactions), clinical decision support, electronic health record analysis, robotic surgery assistance, and predicting patient outcomes in intensive care."]], "query": "how artificial intelligence is used in healthcare"} -{"output": [["lex", "gothic literature definition genre"], ["lex", "gothic fiction horror romance 18th century"], ["lex", "gothic novel characteristics examples"], ["vec", "what defines gothic literature as a genre and what are its key characteristics"], ["vec", "what are the origins and major works of gothic fiction"], ["hyde", "Gothic literature is a genre that combines horror, romance, and mystery, originating with Horace Walpole's The Castle of Otranto (1764). Characteristics include gloomy settings (castles, ruins), supernatural elements, heightened emotion, and themes of decay, madness, and the sublime."]], "query": "what is gothic literature?"} -{"output": [["lex", "foster inclusivity interactions communication"], ["lex", "inclusive language behavior workplace"], ["lex", "diversity inclusion interpersonal skills"], ["vec", "how can I be more inclusive in my daily interactions with diverse people"], ["vec", "what communication strategies foster inclusivity and make everyone feel welcome"], ["hyde", "Use people's correct names and pronouns. Practice active listening without interrupting. Avoid assumptions based on appearance. Invite quieter voices into conversations. Be aware of cultural differences in communication styles. Acknowledge and address microaggressions when they occur."]], "query": "how to foster inclusivity in interactions?"} -{"output": [["lex", "prune hydrangeas when how"], ["lex", "hydrangea pruning guide timing"], ["lex", "cut back hydrangea old new wood"], ["vec", "when and how should I prune different types of hydrangeas"], ["vec", "what is the correct pruning technique for hydrangeas that bloom on old versus new wood"], ["hyde", "Pruning depends on the hydrangea type. Bigleaf (H. macrophylla) and oakleaf hydrangeas bloom on old wood—prune just after flowering in summer. Panicle (H. paniculata) and smooth (H. arborescens) bloom on new wood—prune in late winter. Remove dead stems to the base and cut back to a pair of healthy buds."]], "query": "how to prune hydrangeas?"} -{"output": [["lex", "moral ambiguity philosophy ethics"], ["lex", "ethical dilemma moral uncertainty philosophers"], ["lex", "moral gray area philosophical perspectives"], ["vec", "how do different philosophical traditions deal with situations of moral ambiguity"], ["vec", "what do philosophers say about making ethical decisions when right and wrong are unclear"], ["hyde", "Philosophers address moral ambiguity through competing frameworks. Utilitarians weigh outcomes, deontologists look to duties and rules, and virtue ethicists ask what a person of good character would do. Moral particularists argue each situation is unique and cannot be reduced to universal principles."]], "query": "how do philosophers address moral ambiguity"} -{"output": [["lex", "bildungsroman definition coming-of-age novel"], ["lex", "bildungsroman literary genre examples"], ["lex", "bildungsroman character development growth"], ["vec", "what is a bildungsroman and what are the defining features of this literary genre"], ["vec", "what are famous examples of bildungsroman or coming-of-age novels in literature"], ["hyde", "A bildungsroman is a novel that follows the psychological and moral growth of a protagonist from youth to adulthood. The genre originated in German literature with Goethe's Wilhelm Meister's Apprenticeship. Classic examples include Jane Eyre, David Copperfield, and The Catcher in the Rye."]], "query": "what is a bildungsroman"} -{"output": [["lex", "Thai cooking class online course"], ["lex", "learn Thai cuisine virtual cooking"], ["lex", "Thai food cooking lesson video"], ["vec", "where can I take online Thai cooking classes to learn authentic Thai cuisine"], ["vec", "what are the best virtual courses for learning to cook Thai food at home"], ["hyde", "Online Thai cooking classes teach dishes like pad thai, green curry, tom yum soup, and mango sticky rice. Platforms include Udemy, Skillshare, and dedicated sites like Hot Thai Kitchen. Live Zoom classes with Thai chefs offer real-time guidance on techniques and ingredient sourcing."]], "query": "thai cooking classes online"} -{"output": [["lex", "automation employment impact jobs"], ["lex", "automation job displacement workforce"], ["lex", "robots AI replacing workers labor market"], ["vec", "how does increasing automation and robotics affect employment and job availability"], ["vec", "what impact does workplace automation have on different types of jobs and wages"], ["hyde", "Automation displaces routine manual and cognitive tasks but creates new roles in technology maintenance, programming, and oversight. Studies estimate 14% of jobs are highly automatable. Workers in manufacturing, data entry, and transportation face the highest displacement risk, while creative and interpersonal roles are less affected."]], "query": "how automation affects employment"} -{"output": [["lex", "moral compass definition ethics"], ["lex", "moral compass inner sense right wrong"], ["lex", "personal values moral guidance"], ["vec", "what does it mean to have a moral compass and how does it guide ethical behavior"], ["vec", "how do people develop an internal sense of right and wrong known as a moral compass"], ["hyde", "A moral compass is a person's internal sense of right and wrong that guides their decisions and behavior. It is shaped by upbringing, culture, religious beliefs, education, and personal experience. It acts as an ethical guide when facing difficult choices without clear external rules."]], "query": "what is a moral compass"} -{"output": [["lex", "set financial goals planning budget"], ["lex", "financial goal setting SMART savings"], ["lex", "personal finance goals short long term"], ["vec", "how do I set effective short-term and long-term financial goals"], ["vec", "what is a step-by-step process for creating and achieving personal financial goals"], ["hyde", "Set SMART financial goals: Specific (save $10,000), Measurable (track monthly), Achievable (based on income), Relevant (emergency fund), Time-bound (within 12 months). Categorize into short-term (under 1 year), medium-term (1-5 years), and long-term (5+ years) goals. Automate savings to stay on track."]], "query": "how to set financial goals"} -{"output": [["lex", "improve car gas mileage fuel economy"], ["lex", "better fuel efficiency driving tips"], ["lex", "increase MPG car maintenance"], ["vec", "what are the best ways to improve a car's gas mileage and fuel efficiency"], ["vec", "what driving habits and car maintenance steps help reduce fuel consumption"], ["hyde", "Keep tires inflated to the recommended PSI—underinflation increases rolling resistance. Drive at steady speeds using cruise control, avoid rapid acceleration, and reduce idling. Remove excess weight and roof racks. Replace air filters and spark plugs on schedule. Properly inflated tires alone can improve MPG by 3%."]], "query": "how to improve car gas mileage?"} -{"output": [["lex", "embrace change positive mindset"], ["lex", "adapting change personal growth resilience"], ["lex", "coping with change acceptance"], ["vec", "how can I learn to embrace change in life with a positive attitude"], ["vec", "what psychological strategies help people adapt to change instead of resisting it"], ["hyde", "Reframe change as an opportunity for growth rather than a threat. Practice mindfulness to stay present instead of worrying about the unknown. Set small, manageable goals during transitions. Build a support network and reflect on past changes you navigated successfully to build confidence."]], "query": "how to embrace change positively?"} -{"output": [["lex", "develop patience self-control techniques"], ["lex", "building patience mindfulness practice"], ["lex", "patience skills emotional regulation"], ["vec", "what techniques can help a person develop more patience in daily life"], ["vec", "how do you train yourself to be more patient and less reactive"], ["hyde", "Practice the pause: when you feel impatient, take three deep breaths before responding. Mindfulness meditation trains present-moment awareness and reduces reactivity. Reframe waiting as an opportunity. Set realistic expectations and practice delaying gratification with small exercises."]], "query": "how to develop patience?"} -{"output": [["lex", "design survey scientific research methodology"], ["lex", "research questionnaire design validity"], ["lex", "survey instrument Likert scale sampling"], ["vec", "how should researchers design valid and reliable surveys for scientific studies"], ["vec", "what are the principles of good questionnaire design in scientific research"], ["hyde", "Design surveys by first defining clear research questions. Use validated scales where available. Write neutral, unambiguous items avoiding leading questions. Include a mix of Likert-scale and open-ended questions. Pilot test with a small sample, assess reliability (Cronbach's alpha), and use random sampling for generalizability."]], "query": "how to design surveys for scientific research"} -{"output": [["lex", "natural garden pest control organic"], ["lex", "garden pests organic remedies"], ["lex", "beneficial insects companion planting pest"], ["vec", "what are natural and organic methods to get rid of garden pests without chemicals"], ["vec", "how can I control insects and pests in my garden using companion planting and beneficial insects"], ["hyde", "Introduce beneficial insects like ladybugs and lacewings to eat aphids. Plant marigolds and basil as companion plants to repel pests. Spray diluted neem oil or insecticidal soap on affected leaves. Use diatomaceous earth around plant bases. Hand-pick slugs and caterpillars in the evening."]], "query": "how to get rid of garden pests naturally?"} -{"output": [["lex", "green roof construction installation"], ["lex", "build living roof layers materials"], ["lex", "green roof waterproof membrane substrate plants"], ["vec", "how do you build a green roof on a residential or commercial building"], ["vec", "what are the structural layers and materials needed for a green roof installation"], ["hyde", "A green roof consists of layers: waterproof membrane, root barrier, drainage layer (gravel or drainage mat), filter fabric, lightweight growing substrate (4-6 inches for extensive, 6-24 for intensive), and drought-tolerant plants like sedums. The roof must support 15-30 lbs/sqft when saturated."]], "query": "how to build a green roof"} -{"output": [["lex", "sacred texts Judaism Torah Talmud"], ["lex", "Jewish scripture Hebrew Bible Tanakh"], ["lex", "Judaism holy books Mishnah"], ["vec", "what are the main sacred texts and scriptures in the Jewish religious tradition"], ["vec", "what is the Torah and what other texts are considered holy in Judaism"], ["hyde", "The primary sacred text of Judaism is the Torah (Five Books of Moses), part of the Tanakh (Hebrew Bible), which also includes Nevi'im (Prophets) and Ketuvim (Writings). The Talmud, comprising the Mishnah and Gemara, contains rabbinic commentary and Jewish law (halakha)."]], "query": "what are the sacred texts of judaism"} -{"output": [["lex", "technology impact communication changes"], ["lex", "digital communication evolution internet social media"], ["lex", "technology transformed how people communicate"], ["vec", "how has technology changed the way people communicate over the last few decades"], ["vec", "what are the major effects of digital technology and the internet on human communication"], ["hyde", "Technology has transformed communication from letters and landlines to instant messaging, video calls, and social media. Email replaced postal mail for business. Smartphones made communication continuous. Social media platforms enabled global, public conversations but also raised concerns about misinformation and reduced face-to-face interaction."]], "query": "how technology has impacted communication"} -{"output": [["lex", "voting rights law history"], ["lex", "Voting Rights Act suffrage amendments"], ["lex", "voter rights eligibility protection"], ["vec", "what are voting rights in the United States and how have they evolved over time"], ["vec", "what laws protect citizens' right to vote and prevent voter discrimination"], ["hyde", "Voting rights in the US expanded through constitutional amendments: the 15th (race, 1870), 19th (women, 1920), and 26th (age 18, 1971). The Voting Rights Act of 1965 prohibited racial discrimination in voting, including literacy tests and poll taxes, and required federal oversight of elections in certain jurisdictions."]], "query": "what are the voting rights"} -{"output": [["lex", "wedding overview photography package pricing"], ["lex", "wedding photographer booking services"], ["lex", "wedding photo package hours albums"], ["vec", "what is typically included in a wedding photography package and how much does it cost"], ["vec", "how to choose the right wedding photographer and package for your budget"], ["hyde", "Our wedding photography packages start at $2,500 for 6 hours of coverage with one photographer, 300+ edited digital images, and an online gallery. Premium packages include a second shooter, engagement session, 10x10 album, and 8-10 hours of coverage for $4,500."]], "query": "wedding photography package"} -{"output": [["lex", "political division community healing"], ["lex", "political polarization bridging divides dialogue"], ["lex", "community political disagreement civil discourse"], ["vec", "how can communities address political divisions and find common ground"], ["vec", "what strategies help reduce political polarization and promote civil dialogue at the local level"], ["hyde", "Host structured community dialogues where participants follow ground rules: listen without interrupting, speak from personal experience, and seek understanding over agreement. Focus on shared local issues—schools, infrastructure, safety—rather than national partisan topics. Train facilitators in conflict mediation techniques."]], "query": "how to address political division in communities"} -{"output": [["lex", "clean car headlights restore foggy"], ["lex", "headlight restoration oxidation yellowing"], ["lex", "headlight lens cleaning toothpaste sanding"], ["vec", "how do I clean and restore foggy or yellowed car headlights"], ["vec", "what is the best method for removing oxidation from plastic headlight lenses"], ["hyde", "Sand the headlight lens with wet sandpaper, starting at 800 grit and progressing to 2000 and 3000 grit. Polish with a rubbing compound or plastic polish. Apply a UV-resistant clear coat to prevent future yellowing. Toothpaste works as a mild abrasive for light haze."]], "query": "how to clean car headlights?"} -{"output": [["lex", "gothic literature characteristics define"], ["lex", "gothic fiction genre elements tropes"], ["lex", "gothic novel dark romantic supernatural"], ["vec", "what are the defining features and conventions of gothic literature as a literary genre"], ["vec", "what themes, settings, and narrative techniques characterize gothic fiction"], ["hyde", "Gothic literature is defined by dark, atmospheric settings (ruined castles, monasteries), supernatural or uncanny events, psychological terror, and themes of isolation, decay, and transgression. Protagonists often face hidden secrets and tyrannical figures. Key works include Frankenstein, Dracula, and The Turn of the Screw."]], "query": "what defines gothic literature"} -{"output": [["lex", "cultural heritage photography documentation"], ["lex", "photography preserving culture traditions"], ["lex", "cultural heritage visual documentation ethnographic"], ["vec", "why is photography important for preserving and documenting cultural heritage"], ["vec", "how has photography been used to record and protect cultural traditions and historical sites"], ["hyde", "Photography plays a vital role in documenting cultural heritage—recording endangered architectural sites, traditional crafts, ceremonies, and oral traditions before they disappear. Organizations like UNESCO use photographic archives to catalog World Heritage Sites and support restoration efforts."]], "query": "what is the importance of cultural heritage in photography?"} -{"output": [["lex", "logical positivism Vienna Circle philosophy"], ["lex", "logical positivism verification principle"], ["lex", "logical empiricism analytic philosophy"], ["vec", "what is logical positivism and what did the Vienna Circle philosophers argue"], ["vec", "how does the verification principle define meaningful statements in logical positivism"], ["hyde", "Logical positivism, developed by the Vienna Circle in the 1920s-30s, holds that only statements verifiable through empirical observation or logical proof are meaningful. Metaphysical, ethical, and aesthetic claims are considered cognitively meaningless. Key figures include Carnap, Schlick, and Ayer."]], "query": "what is logical positivism"} -{"output": [["lex", "self-improvement plan personal development"], ["lex", "personal growth plan goals habits"], ["lex", "self-improvement roadmap steps"], ["vec", "how do I create an effective self-improvement plan with clear goals and actionable steps"], ["vec", "what steps should I follow to build a personal development plan that I can stick to"], ["hyde", "Start by assessing your current strengths and weaknesses across life areas: health, career, relationships, finances, and personal growth. Set 2-3 SMART goals per area. Break each goal into weekly habits and milestones. Track progress in a journal and review monthly. Adjust the plan based on what's working."]], "query": "how to create a self-improvement plan?"} -{"output": [["lex", "robotics industry transformation manufacturing"], ["lex", "industrial robots automation sectors"], ["lex", "robotics applications logistics healthcare agriculture"], ["vec", "how is robotics transforming industries like manufacturing, healthcare, and logistics"], ["vec", "what impact are advanced robots and automation having on different industrial sectors"], ["hyde", "Robotics is transforming manufacturing with collaborative robots (cobots) that work alongside humans on assembly lines. In logistics, warehouse robots from companies like Amazon Robotics sort and move packages. Surgical robots like da Vinci enable minimally invasive procedures. Agricultural robots handle harvesting and weeding autonomously."]], "query": "how robotics is transforming industries"} -{"output": [["lex", "famous photographers history notable"], ["lex", "iconic photographers Ansel Adams Cartier-Bresson"], ["lex", "renowned photographers influential works"], ["vec", "who are the most famous and influential photographers in history"], ["vec", "which photographers are known for iconic images that shaped the art of photography"], ["hyde", "Ansel Adams is known for dramatic black-and-white landscapes of the American West. Henri Cartier-Bresson pioneered street photography and the decisive moment. Dorothea Lange documented the Great Depression. Annie Leibovitz is renowned for celebrity portraiture. Sebastião Salgado captures powerful social documentary images."]], "query": "famous photographers"} -{"output": [["lex", "climate change global politics geopolitics"], ["lex", "climate change international relations policy"], ["lex", "climate politics diplomacy conflict resources"], ["vec", "how does climate change influence international relations and global political dynamics"], ["vec", "what are the geopolitical consequences of climate change including resource conflicts and migration"], ["hyde", "Climate change reshapes global politics through resource competition (water, arable land), climate-driven migration, and diplomatic tensions over emissions targets. Arctic ice melt opens new shipping routes and territorial disputes. Island nations face existential threats, driving climate justice advocacy at the UN."]], "query": "how does climate change affect global politics"} -{"output": [["lex", "organize scientific conference planning"], ["lex", "academic conference logistics program committee"], ["lex", "scientific meeting venue call for papers"], ["vec", "what are the steps to organizing a successful scientific conference"], ["vec", "how do you plan an academic conference including call for papers, venue, and scheduling"], ["hyde", "Start 12-18 months ahead. Form a program committee, select a venue, set dates, and issue a call for papers. Use a submission system like EasyChair. Arrange keynote speakers, peer review, and session scheduling. Handle registration, catering, AV equipment, and proceedings publication."]], "query": "how to organize a scientific conference"} -{"output": [["lex", "fix leaking faucet repair dripping"], ["lex", "faucet leak washer cartridge replacement"], ["lex", "kitchen bathroom faucet drip fix"], ["vec", "how do I fix a dripping faucet in my kitchen or bathroom"], ["vec", "what are the steps to repair a leaking faucet by replacing the washer or cartridge"], ["hyde", "Turn off the water supply valves under the sink. Remove the faucet handle by unscrewing the decorative cap and handle screw. Pull out the cartridge or stem and inspect the rubber washer or O-ring. Replace worn parts, reassemble, and turn the water back on. Most leaks are caused by a degraded washer."]], "query": "how to fix a leaking faucet"} -{"output": [["lex", "social media influence behavior psychology"], ["lex", "social media impact mental health habits"], ["lex", "social media behavioral effects users"], ["vec", "how does social media use influence people's behavior, opinions, and mental health"], ["vec", "what psychological effects does regular social media use have on user behavior"], ["hyde", "Social media influences behavior through social comparison, echo chambers, and dopamine-driven feedback loops. Users curate idealized self-presentations, leading to anxiety and low self-esteem in viewers. Algorithmic content feeds reinforce existing beliefs and can radicalize opinions through filter bubbles."]], "query": "how social media influences behavior"} -{"output": [["lex", "intertextuality literary theory texts"], ["lex", "intertextuality allusion reference literature"], ["lex", "Kristeva Barthes intertextuality meaning"], ["vec", "how does intertextuality work as a concept in literary theory and criticism"], ["vec", "what does intertextuality mean and how do texts reference and build on other texts"], ["hyde", "Intertextuality, coined by Julia Kristeva, describes how every text is shaped by and references other texts. Meaning is not contained in a single work but emerges from its relationships with prior texts through allusion, quotation, parody, and genre conventions. Roland Barthes argued the reader constructs meaning from these textual connections."]], "query": "how does intertextuality work?"} -{"output": [["lex", "Stoicism inner peace philosophy"], ["lex", "Stoic philosophy tranquility Marcus Aurelius Epictetus"], ["lex", "Stoic practices equanimity calm"], ["vec", "how do Stoic philosophical principles help achieve inner peace and tranquility"], ["vec", "what Stoic practices and teachings from Marcus Aurelius and Epictetus promote emotional calm"], ["hyde", "Stoicism teaches inner peace through the dichotomy of control: focus only on what you can influence (your thoughts and actions) and accept what you cannot (external events). Marcus Aurelius wrote in Meditations that disturbance comes not from things themselves but from our judgments about them."]], "query": "how does stoicism inspire inner peace"} -{"output": [["lex", "install car stereo aftermarket head unit"], ["lex", "car stereo replacement wiring harness"], ["lex", "car radio installation dash kit"], ["vec", "how do I install an aftermarket car stereo and connect the wiring"], ["vec", "what tools and adapters do I need to replace a factory car radio with a new head unit"], ["hyde", "Disconnect the battery. Remove the factory stereo using DIN removal tools or dash panel screws. Connect the aftermarket wiring harness adapter to the car's plug—match wire colors (red=accessory, yellow=battery, black=ground). Mount the new head unit in a dash kit, slide it in, and reconnect the battery."]], "query": "how to install a car stereo?"} -{"output": [["lex", "art class painting drawing course"], ["lex", "art classes beginners local online"], ["lex", "learn art lessons studio workshop"], ["vec", "where can I find art classes for beginners to learn painting or drawing"], ["vec", "what types of art classes are available online and in person for adults"], ["hyde", "Beginner art classes cover fundamentals like drawing, color theory, and composition. Options include community college courses, local studio workshops, and online platforms like Skillshare and Domestika. Classes range from watercolor and acrylic painting to charcoal drawing and digital illustration."]], "query": "art class"} -{"output": [["lex", "ahimsa non-violence concept Hinduism Jainism Buddhism"], ["lex", "ahimsa meaning Indian philosophy"], ["lex", "ahimsa Gandhi non-harm"], ["vec", "what is the concept of ahimsa and how is non-violence practiced in Indian religions"], ["vec", "how did Gandhi apply the principle of ahimsa in his philosophy and political movement"], ["hyde", "Ahimsa means non-violence or non-harm and is a central principle in Hinduism, Jainism, and Buddhism. In Jainism, ahimsa extends to all living beings, including insects. Gandhi adopted ahimsa as the foundation of his political resistance, using nonviolent civil disobedience against British colonial rule."]], "query": "what is the concept of ahimsa"} -{"output": [["lex", "Byzantine Empire history Eastern Roman"], ["lex", "Byzantine Empire Constantinople medieval"], ["lex", "Byzantine Empire culture government fall 1453"], ["vec", "what was the Byzantine Empire and how did it continue from the Roman Empire"], ["vec", "what were the major achievements and eventual fall of the Byzantine Empire"], ["hyde", "The Byzantine Empire was the continuation of the Eastern Roman Empire, centered on Constantinople (modern Istanbul). It lasted from 330 CE to 1453 CE when it fell to the Ottoman Turks. It preserved Greek and Roman culture, developed Eastern Orthodox Christianity, and Justinian's legal code influenced European law."]], "query": "what was the byzantine empire"} -{"output": [["lex", "run for public office campaign steps"], ["lex", "running for election candidate requirements"], ["lex", "political campaign filing candidacy"], ["vec", "what are the steps to running for public office in the United States"], ["vec", "how do I start a political campaign and file as a candidate for local or state office"], ["hyde", "To run for public office, first research eligibility requirements (age, residency, citizenship) for your target seat. File candidacy paperwork with the local election office by the deadline. Build a campaign team, set a budget, raise funds, and collect any required petition signatures. Develop a platform and begin voter outreach."]], "query": "how to run for public office"} -{"output": [["lex", "contact local government officials representatives"], ["lex", "reach city council county officials email phone"], ["lex", "local elected officials contact information"], ["vec", "how can I find contact information for and reach out to my local government representatives"], ["vec", "what is the best way to contact city council members or county officials about local issues"], ["hyde", "Find your local officials through your city or county website's \"elected officials\" page or use usa.gov's elected officials lookup tool. Contact methods include email, phone calls to their office, attending public town hall meetings, and submitting comments during city council sessions."]], "query": "how to contact local government officials"} -{"output": [["lex", "metaphysics of morality moral philosophy"], ["lex", "metaethics moral realism anti-realism"], ["lex", "metaphysical foundations ethics moral facts"], ["vec", "what is the metaphysics of morality and how does it address the nature of moral facts"], ["vec", "how do metaethicists debate whether moral truths exist objectively or are constructed"], ["hyde", "The metaphysics of morality examines whether moral facts exist independently of human minds (moral realism) or are constructed by societies and individuals (anti-realism). Moral realists argue that \"murder is wrong\" is objectively true. Constructivists and expressivists argue moral claims express attitudes or social agreements, not metaphysical truths."]], "query": "what is the metaphysics of morality"} -{"output": [["lex", "latest climate change research 2025 2026"], ["lex", "recent climate science findings studies"], ["lex", "climate change new research global warming"], ["vec", "what are the latest scientific findings and research on climate change in 2025-2026"], ["vec", "what do recent climate studies say about global warming trends and projections"], ["hyde", "Recent research in 2025 shows global temperatures exceeded 1.5°C above pre-industrial levels for a full calendar year. Studies in Nature Climate Change report accelerating ice sheet loss in Greenland and West Antarctica. New modeling suggests tipping points for the Amazon rainforest may be closer than previously estimated."]], "query": "latest research on climate change"} -{"output": [["lex", "eco-friendly furniture sustainable shop"], ["lex", "sustainable furniture store green materials"], ["lex", "eco furniture reclaimed wood organic"], ["vec", "where can I buy eco-friendly and sustainably made furniture"], ["vec", "what brands and stores sell furniture made from sustainable or recycled materials"], ["hyde", "Eco-friendly furniture brands include West Elm (FSC-certified wood), Medley (organic fabrics, solid wood), and Sabai (recycled and recyclable materials). Thrift stores and Habitat for Humanity ReStores sell secondhand furniture. Look for FSC certification, non-toxic finishes, and reclaimed or recycled materials."]], "query": "where to find eco-friendly furniture"} -{"output": [["lex", "stay informed politics news sources"], ["lex", "follow political news reliable media"], ["lex", "political awareness current events tracking"], ["vec", "how can I stay well-informed about politics and current political events"], ["vec", "what are reliable sources and strategies for keeping up with political news"], ["hyde", "Read multiple news sources across the political spectrum: AP News and Reuters for wire reporting, then compare coverage from different outlets. Subscribe to newsletters like The Morning (NYT) or Axios AM. Follow legislative trackers like Congress.gov. Attend local government meetings and candidate forums."]], "query": "how to stay informed about politics"} -{"output": [["lex", "Tao Te Ching Laozi Taoism text"], ["lex", "Tao Te Ching Daodejing philosophy"], ["lex", "Tao Te Ching teachings Dao virtue"], ["vec", "what is the Tao Te Ching and what does it teach about the Dao and living wisely"], ["vec", "who wrote the Tao Te Ching and what are its main philosophical ideas"], ["hyde", "The Tao Te Ching, attributed to Laozi (6th century BCE), is the foundational text of Taoism. Its 81 short chapters describe the Dao (the Way)—an ineffable cosmic principle—and De (virtue/power). It advocates wu wei (effortless action), simplicity, humility, and living in harmony with nature."]], "query": "what is the tao te ching"} -{"output": [["lex", "AI ethics artificial intelligence ethical issues"], ["lex", "ethics of AI bias fairness accountability"], ["lex", "AI ethics alignment safety"], ["vec", "what are the major ethical issues and concerns surrounding artificial intelligence"], ["vec", "how do ethicists address bias, fairness, transparency, and safety in AI systems"], ["hyde", "AI ethics addresses bias in training data that leads to discriminatory outputs, lack of transparency in black-box models, accountability when AI causes harm, privacy concerns from mass data collection, and the alignment problem of ensuring AI systems act according to human values. Frameworks include fairness, accountability, and transparency (FAccT)."]], "query": "what is the ethics of ai"} -{"output": [["lex", "realism idealism philosophy difference"], ["lex", "realism vs idealism metaphysics epistemology"], ["lex", "philosophical realism idealism comparison"], ["vec", "what is the philosophical difference between realism and idealism in metaphysics"], ["vec", "how do realists and idealists disagree about the nature of reality and perception"], ["hyde", "Realism holds that an external world exists independently of our minds and perceptions. Idealism argues that reality is fundamentally mental or mind-dependent. Plato's Forms represent a kind of realism about abstract objects, while Berkeley argued that to exist is to be perceived (esse est percipi)."]], "query": "what is the difference between realism and idealism"} -{"output": [["lex", "prevent garden soil erosion methods"], ["lex", "soil erosion control garden mulch ground cover"], ["lex", "garden erosion prevention retaining wall"], ["vec", "how can I prevent soil erosion in my garden or yard"], ["vec", "what methods and ground covers help stop soil from washing away in a garden"], ["hyde", "Prevent soil erosion by mulching garden beds with 2-3 inches of wood chips or straw. Plant ground covers like creeping thyme or clover on slopes. Install retaining walls or terraces on steep grades. Use rain gardens to absorb runoff. Avoid leaving soil bare between seasons—plant cover crops like rye or clover."]], "query": "how to prevent garden soil erosion?"} -{"output": [["lex", "write scientific research paper structure"], ["lex", "scientific paper writing IMRaD format"], ["lex", "academic research paper methodology results discussion"], ["vec", "how do you write a scientific research paper following the standard academic format"], ["vec", "what is the structure and process for writing a research paper for journal publication"], ["hyde", "A scientific research paper follows the IMRaD structure: Introduction (background, hypothesis, objectives), Methods (detailed procedures for reproducibility), Results (data presented with figures and tables), and Discussion (interpretation, limitations, implications). Include an abstract, references in the journal's required citation style, and acknowledgments."]], "query": "how to write a scientific research paper"} -{"output": [["lex", "diversify investment portfolio strategy"], ["lex", "portfolio diversification asset allocation"], ["lex", "investment diversification stocks bonds ETFs"], ["vec", "how should I diversify my investment portfolio across different asset classes"], ["vec", "what is a good strategy for spreading risk through portfolio diversification"], ["hyde", "Diversify across asset classes: stocks, bonds, real estate, and commodities. Within stocks, spread across sectors (tech, healthcare, energy) and geographies (US, international, emerging markets). Use index funds or ETFs for broad exposure. A common allocation is 60% stocks, 30% bonds, 10% alternatives, adjusted by age and risk tolerance."]], "query": "how to diversify investment portfolio"} -{"output": [["lex", "social media business marketing strategy"], ["lex", "social media marketing business growth"], ["lex", "business social media content engagement"], ["vec", "how can small businesses effectively use social media platforms for marketing and growth"], ["vec", "what strategies work best for using social media to promote a business and attract customers"], ["hyde", "Choose platforms where your target audience is active: Instagram for visual products, LinkedIn for B2B, TikTok for younger demographics. Post consistently, mix promotional content with value-added posts (tips, behind-the-scenes). Use analytics to track engagement. Run targeted ads with clear CTAs and A/B test creative assets."]], "query": "how to use social media for business"} -{"output": [["lex", "zero waste lifestyle definition"], ["lex", "zero waste reduce reuse recycle"], ["lex", "zero waste living tips practices"], ["vec", "what is the zero waste movement and how do people reduce waste in daily life"], ["vec", "what does zero waste mean and what are practical ways to minimize household waste"], ["hyde", "Zero waste is a philosophy and lifestyle aiming to send nothing to landfills by reducing consumption, reusing items, recycling, and composting. Practical steps include using reusable bags, bottles, and containers, buying in bulk, composting food scraps, and choosing products with minimal or recyclable packaging."]], "query": "what is zero waste?"} -{"output": [["lex", "civil society governance role function"], ["lex", "civil society organizations NGOs democratic governance"], ["lex", "civil society accountability transparency"], ["vec", "what role does civil society play in democratic governance and government accountability"], ["vec", "how do non-governmental organizations and civic groups contribute to governance"], ["hyde", "Civil society organizations—NGOs, advocacy groups, media, and community organizations—serve as intermediaries between citizens and government. They monitor government transparency, advocate for policy changes, provide public services, and mobilize civic participation. A strong civil society holds government accountable and strengthens democracy."]], "query": "what is the role of civil society in governance"} -{"output": [["lex", "Diwali meaning festival of lights"], ["lex", "Diwali Hindu celebration significance"], ["lex", "Diwali traditions Lakshmi Rama"], ["vec", "what is Diwali and what does the festival of lights celebrate in Hindu tradition"], ["vec", "what is the religious and cultural significance of the Diwali festival"], ["hyde", "Diwali, the festival of lights, is celebrated by Hindus, Jains, and Sikhs over five days in autumn. It symbolizes the victory of light over darkness and good over evil. Hindus celebrate Lord Rama's return to Ayodhya and honor Lakshmi, goddess of prosperity. Traditions include lighting diyas, fireworks, rangoli art, and sharing sweets."]], "query": "what is the meaning of diwali"} -{"output": [["lex", "political debate definition election"], ["lex", "political debate format candidates issues"], ["lex", "political debate presidential election"], ["vec", "what is a political debate and how do candidates discuss issues in structured debates"], ["vec", "how are political debates organized and what role do they play in elections"], ["hyde", "A political debate is a structured event where candidates for elected office discuss policy positions and respond to questions from moderators and sometimes the audience. Debates follow agreed-upon formats with time limits for responses and rebuttals. They allow voters to compare candidates' positions on key issues directly."]], "query": "what is a political debate"} -{"output": [["lex", "macro photography techniques close-up"], ["lex", "macro photography lens equipment"], ["lex", "macro photography insects flowers detail"], ["vec", "what is macro photography and what equipment and techniques does it require"], ["vec", "how do I take high-quality macro photographs of small subjects like insects and flowers"], ["hyde", "Macro photography captures subjects at 1:1 magnification or greater, revealing details invisible to the naked eye. Use a dedicated macro lens (100mm is popular) or extension tubes. Shoot at f/8-f/16 for sufficient depth of field. Use a tripod and focus stacking to get the entire subject sharp."]], "query": "macro photography"} -{"output": [["lex", "Enlightenment 18th century intellectual movement"], ["lex", "Age of Enlightenment reason philosophy"], ["lex", "Enlightenment thinkers Voltaire Locke Kant"], ["vec", "what was the Enlightenment and how did it change Western philosophy and politics"], ["vec", "who were the key Enlightenment thinkers and what ideas did they promote"], ["hyde", "The Enlightenment was an 18th-century intellectual movement emphasizing reason, science, individual liberty, and skepticism of authority. Key thinkers include John Locke (natural rights), Voltaire (free speech), Montesquieu (separation of powers), and Kant (\"dare to know\"). It directly influenced the American and French Revolutions."]], "query": "what was the enlightenment"} -{"output": [["lex", "free will philosophy determinism"], ["lex", "philosophers free will debate libertarian compatibilist"], ["lex", "free will hard determinism compatibilism"], ["vec", "how do different philosophers interpret the problem of free will and determinism"], ["vec", "what are the main philosophical positions on whether humans have free will"], ["hyde", "Three main positions dominate: hard determinism (all events are causally determined, free will is an illusion), libertarianism (genuine free will exists and is incompatible with determinism), and compatibilism (free will and determinism can coexist—you act freely when acting on your own desires without external coercion). Hume and Frankfurt defend compatibilism."]], "query": "how do philosophers interpret free will"} -{"output": [["lex", "engaged local politics civic participation"], ["lex", "local politics involvement community"], ["lex", "civic engagement local government attend meetings"], ["vec", "how can I stay actively engaged and involved in local politics and government"], ["vec", "what are practical ways to participate in local political decision-making"], ["hyde", "Attend city council and school board meetings, which are open to the public. Subscribe to your local government's agenda notifications. Join neighborhood associations or civic groups. Vote in every local election—municipal and school board elections often have low turnout, amplifying each vote's impact."]], "query": "how to stay engaged in local politics"} -{"output": [["lex", "paint abstract landscape technique"], ["lex", "abstract landscape painting acrylic oil"], ["lex", "abstract landscape art color composition"], ["vec", "how do I paint abstract landscape art using acrylic or oil paints"], ["vec", "what techniques and approaches do artists use when painting abstract landscapes"], ["hyde", "Start with a loose underpainting to block in the horizon and major shapes. Use a palette knife or large brush for expressive marks. Simplify landscape elements—hills, sky, water—into geometric shapes and bold color fields. Layer transparent glazes over opaque areas. Let the painting suggest the landscape rather than depict it literally."]], "query": "how to paint abstract landscapes?"} -{"output": [["lex", "small apartment decorating ideas"], ["lex", "tiny apartment interior design"], ["lex", "space-saving furniture small rooms"], ["vec", "what are the best ways to decorate and furnish a small apartment to maximize space?"], ["vec", "interior design tips for making a compact apartment look bigger and more stylish"], ["hyde", "Use mirrors and light colors to make a small apartment feel larger. Choose multi-functional furniture like a storage ottoman or a fold-down desk. Vertical shelving frees up floor space while adding display areas."]], "query": "how to decorate a small apartment"} -{"output": [["lex", "allegory literary device definition"], ["lex", "allegory examples literature"], ["vec", "what does allegory mean as a literary device and how is it used in storytelling?"], ["vec", "how do authors use allegory to convey hidden meanings through characters and events?"], ["hyde", "An allegory is a narrative in which characters, events, and settings represent abstract ideas or moral qualities. For example, George Orwell's Animal Farm is an allegory for the Russian Revolution, with farm animals standing in for political figures."]], "query": "what is an allegory"} -{"output": [["lex", "wildlife photography techniques"], ["lex", "wildlife photography camera gear"], ["lex", "photographing animals in nature"], ["vec", "what is wildlife photography and what skills and equipment does it require?"], ["vec", "how do photographers capture images of wild animals in their natural habitats?"], ["hyde", "Wildlife photography involves capturing images of animals in their natural environments. Photographers typically use long telephoto lenses (300mm-600mm) and fast shutter speeds to freeze motion. Patience and knowledge of animal behavior are essential for getting close without disturbing subjects."]], "query": "what is wildlife photography?"} -{"output": [["lex", "chaos theory mathematics"], ["lex", "butterfly effect deterministic systems"], ["lex", "nonlinear dynamics sensitive dependence"], ["vec", "what is chaos theory and how does it explain unpredictable behavior in deterministic systems?"], ["vec", "how does the butterfly effect relate to chaos theory in mathematics and physics?"], ["hyde", "Chaos theory studies deterministic systems that are highly sensitive to initial conditions. A tiny change in starting values can produce vastly different outcomes over time — the so-called butterfly effect. The Lorenz attractor, discovered in 1963, was one of the first examples of chaotic behavior in weather modeling."]], "query": "what is chaos theory"} -{"output": [["lex", "research ethics scientific integrity"], ["lex", "ethical guidelines human subjects research"], ["lex", "scientific misconduct fraud prevention"], ["vec", "why are ethical standards important in conducting scientific research?"], ["vec", "how do ethics committees and institutional review boards regulate scientific experiments?"], ["hyde", "Ethics in scientific research ensures the integrity of findings and the protection of human and animal subjects. Researchers must obtain informed consent, avoid fabrication or falsification of data, and disclose conflicts of interest. Institutional Review Boards (IRBs) review proposed studies before they begin."]], "query": "what is the role of ethics in scientific research"} -{"output": [["lex", "low light video settings camera"], ["lex", "filming dark environments ISO aperture"], ["lex", "low light videography tips"], ["vec", "what camera settings and techniques produce the best video quality in low light conditions?"], ["vec", "how do filmmakers shoot usable footage in dark or dimly lit environments?"], ["hyde", "For low light video, open your aperture to f/1.4–f/2.8 and lower your shutter speed to 1/50 for 24fps footage. Raise ISO gradually — modern cameras handle ISO 3200–6400 with acceptable noise. Use a fast prime lens and add practical lights in the scene when possible."]], "query": "how to shoot video in low light"} -{"output": [["lex", "compositional balance art design"], ["lex", "symmetrical asymmetrical balance visual"], ["lex", "balance principles composition photography"], ["vec", "what does compositional balance mean in art, photography, and graphic design?"], ["vec", "how do artists achieve visual balance through symmetrical and asymmetrical arrangements?"], ["hyde", "Compositional balance refers to the distribution of visual weight within an image or artwork. Symmetrical balance places equal elements on both sides of a central axis, while asymmetrical balance uses contrasting elements — such as a large shape offset by a smaller, brighter one — to create dynamic equilibrium."]], "query": "what is compositional balance?"} -{"output": [["lex", "lobbyists influence legislation policy"], ["lex", "lobbying congress lawmaking"], ["lex", "corporate lobbying political spending"], ["vec", "how do lobbyists influence the legislative process and shape laws passed by government?"], ["vec", "what impact does corporate and special interest lobbying have on policy outcomes?"], ["hyde", "Lobbyists meet with lawmakers, draft model legislation, and organize campaign contributions to influence policy outcomes. In the U.S., spending on lobbying exceeded $4 billion annually. Critics argue this gives wealthy interests disproportionate power, while proponents say lobbyists provide expertise legislators need."]], "query": "what is the impact of lobbyists on legislation"} -{"output": [["lex", "compass navigation orienteering"], ["lex", "magnetic compass bearing map reading"], ["lex", "compass declination true north"], ["vec", "how do you use a magnetic compass and topographic map to navigate outdoors?"], ["vec", "what are the steps for taking a bearing with a compass and following it in the field?"], ["hyde", "Hold the compass flat and rotate the bezel until the orienting arrow aligns with the magnetic needle pointing north. Place the compass on your map, align the edge with your start and destination, and rotate the bezel to match the map's grid lines. Adjust for magnetic declination, then follow the bearing."]], "query": "how to navigate with a compass"} -{"output": [["lex", "genetic drift population genetics"], ["lex", "bottleneck effect founder effect allele frequency"], ["vec", "what is genetic drift and how does it cause random changes in allele frequencies in small populations?"], ["vec", "how do the bottleneck effect and founder effect relate to genetic drift in evolution?"], ["hyde", "Genetic drift is a mechanism of evolution where allele frequencies change randomly from one generation to the next due to chance sampling. Its effects are strongest in small populations. The bottleneck effect occurs when a population is drastically reduced, and the founder effect occurs when a small group colonizes a new area."]], "query": "what is genetic drift"} -{"output": [["lex", "Alhambra palace Granada Spain"], ["lex", "Alhambra Islamic architecture Nasrid"], ["lex", "Alhambra historical significance"], ["vec", "why is the Alhambra in Granada, Spain considered a masterpiece of Islamic architecture?"], ["vec", "what is the cultural and historical significance of the Alhambra palace?"], ["hyde", "The Alhambra is a palace and fortress complex in Granada, Spain, built primarily by the Nasrid dynasty in the 13th and 14th centuries. Its intricate stucco work, muqarnas ceilings, and geometric tile patterns represent the pinnacle of Moorish art in Europe. The Court of the Lions features 124 marble columns surrounding a central fountain."]], "query": "what is the significance of the alhambra?"} -{"output": [["lex", "human brain function neuroscience"], ["lex", "brain regions neurons synapses"], ["lex", "cerebral cortex brain anatomy"], ["vec", "how does the human brain process information through neurons and different brain regions?"], ["vec", "what are the major parts of the brain and their roles in cognition, memory, and movement?"], ["hyde", "The human brain contains approximately 86 billion neurons that communicate via electrical and chemical signals across synapses. The cerebral cortex handles higher-order functions like reasoning and language. The hippocampus is critical for forming new memories, while the cerebellum coordinates movement and balance."]], "query": "how the human brain functions"} -{"output": [["lex", "love religion Christianity Islam Buddhism"], ["lex", "divine love spiritual traditions"], ["lex", "religious teachings about love"], ["vec", "how do different world religions like Christianity, Islam, Hinduism, and Buddhism define and teach about love?"], ["vec", "what role does love play in the spiritual teachings of major religions?"], ["hyde", "In Christianity, love (agape) is the highest virtue — \"God is love\" (1 John 4:8). Islam teaches that Allah is Al-Wadud, the Loving, and compassion toward others is a core duty. In Buddhism, metta (loving-kindness) is cultivated through meditation. Hinduism describes divine love (bhakti) as devotion to God."]], "query": "how is love viewed in different religions?"} -{"output": [["lex", "literary symbolism examples"], ["lex", "symbolism in literature meaning"], ["lex", "symbolic imagery fiction poetry"], ["vec", "what is symbolism as a literary device and how do authors use symbols to convey deeper meaning?"], ["vec", "how do readers identify and interpret symbols in novels, poems, and short stories?"], ["hyde", "Literary symbolism is the use of objects, characters, or events to represent abstract ideas beyond their literal meaning. In The Great Gatsby, the green light symbolizes Gatsby's unattainable dream. The conch shell in Lord of the Flies represents order and democratic authority."]], "query": "what is literary symbolism?"} -{"output": [["lex", "ethics versus law differences"], ["lex", "morality legality relationship"], ["lex", "ethical standards legal requirements"], ["vec", "how do ethics and law relate to each other, and where do they diverge?"], ["vec", "can something be legal but unethical, or illegal but morally justified?"], ["hyde", "Ethics and law overlap but are distinct. Laws are formal rules enforced by the state, while ethics are moral principles guiding individual conduct. Something can be legal yet unethical — such as exploitative pricing — or illegal yet ethically defensible, as in acts of civil disobedience against unjust laws."]], "query": "what is the relationship between ethics and law?"} -{"output": [["lex", "JSON parse load file"], ["lex", "JSON.parse read file"], ["lex", "json load Python JavaScript"], ["vec", "how do you load and parse a JSON file in Python or JavaScript?"], ["vec", "what functions are used to read JSON data from a file or string?"], ["hyde", "In Python, use json.load(f) to read from a file object and json.loads(s) to parse a string. In JavaScript, use JSON.parse(str) to convert a JSON string into an object, or fetch a file and call response.json() to parse the result."]], "query": "json load"} -{"output": [["lex", "remove oil stains clothing"], ["lex", "grease stain removal fabric"], ["lex", "oil stain laundry treatment"], ["vec", "what is the best method for removing oil and grease stains from clothing fabric?"], ["vec", "how do you get cooking oil or motor oil stains out of clothes at home?"], ["hyde", "Apply dish soap or liquid detergent directly to the oil stain and gently rub it in. Let it sit for 10-15 minutes, then wash in the hottest water safe for the fabric. For stubborn stains, sprinkle baking soda or cornstarch on the spot to absorb excess oil before treating."]], "query": "how to remove oil stains from clothes"} -{"output": [["lex", "greenhouse supplies store online"], ["lex", "buy greenhouse panels heaters shelving"], ["lex", "greenhouse gardening equipment"], ["vec", "where can I purchase greenhouse supplies like panels, heaters, ventilation, and shelving?"], ["vec", "what are the best online and local stores for buying greenhouse building materials and accessories?"], ["hyde", "Greenhouse supplies are available at garden centers like Home Depot and Lowe's, as well as specialty retailers like Greenhouse Megastore and Bootstrap Farmer. Online, Amazon carries polycarbonate panels, shade cloth, heating mats, and ventilation fans. For commercial-grade supplies, contact manufacturers like Rimol Greenhouses directly."]], "query": "where to buy greenhouse supplies?"} -{"output": [["lex", "climbing roses trellis support"], ["lex", "train climbing roses wall fence"], ["lex", "rose arbor lattice structure"], ["vec", "what structures and techniques are used to support and train climbing roses?"], ["vec", "how do you attach and guide climbing roses along a trellis, wall, or arbor?"], ["hyde", "Install a sturdy trellis, arbor, or wire system at least 3 inches from the wall to allow air circulation. Tie canes horizontally with soft plant ties to encourage lateral growth and more blooms. Prune in late winter, removing dead wood and shortening side shoots to 2-3 buds."]], "query": "how to support climbing roses?"} -{"output": [["lex", "debt management repayment plan"], ["lex", "pay off debt strategies snowball avalanche"], ["lex", "credit card debt consolidation"], ["vec", "what are the most effective strategies for managing and paying off personal debt?"], ["vec", "how does the debt snowball versus debt avalanche method work for debt repayment?"], ["hyde", "List all debts with their balances, interest rates, and minimum payments. With the avalanche method, pay extra toward the highest-interest debt first to save the most money. With the snowball method, pay off the smallest balance first for psychological momentum. Consider consolidation loans if you qualify for a lower rate."]], "query": "how to manage debt"} -{"output": [["lex", "sailing adventure trips voyages"], ["lex", "sailing vacation destinations cruises"], ["lex", "ocean sailing expedition"], ["vec", "what are some popular sailing adventure destinations and voyages around the world?"], ["vec", "how do people plan and prepare for multi-day sailing trips and ocean crossings?"], ["hyde", "Popular sailing adventures include island-hopping in the Greek Cyclades, crossing the Atlantic via the trade winds from the Canary Islands to the Caribbean, and navigating the fjords of Norway. Charter companies offer bareboat and crewed options for all experience levels, from weekend coastal cruises to month-long blue water passages."]], "query": "sailing adventures"} -{"output": [["lex", "paint flow viscosity consistency"], ["lex", "acrylic paint flow medium pouring"], ["lex", "paint flow rate spray gun"], ["vec", "how do you control paint flow and viscosity for acrylic pouring or spray application?"], ["vec", "what is a flow medium and how does it affect paint consistency?"], ["hyde", "Paint flow refers to how freely paint moves and levels on a surface. For acrylic pouring, mix paint with a flow medium like Floetrol at a 2:1 ratio to achieve a honey-like consistency. For spray guns, thin paint to the manufacturer's recommended viscosity using a flow cup to measure."]], "query": "paint flow"} -{"output": [["lex", "budget plan personal monthly"], ["lex", "create budget spreadsheet expenses income"], ["lex", "50/30/20 budgeting rule"], ["vec", "how do you create a personal monthly budget plan to track income and expenses?"], ["vec", "what steps are involved in building a budget and sticking to it?"], ["hyde", "Start by listing your monthly after-tax income. Track all expenses for one month, categorizing them as needs, wants, and savings. Apply the 50/30/20 rule: 50% to necessities, 30% to discretionary spending, and 20% to savings and debt repayment. Use a spreadsheet or app like YNAB to monitor progress."]], "query": "how to create a budget plan"} -{"output": [["lex", "research funding application grant"], ["lex", "apply grant NIH NSF proposal"], ["lex", "research grant writing tips"], ["vec", "what is the process for applying for academic or scientific research funding grants?"], ["vec", "how do researchers write successful grant proposals for agencies like NIH and NSF?"], ["hyde", "Identify funding agencies that match your research area — NIH for biomedical, NSF for science and engineering, NEH for humanities. Read the request for proposals (RFP) carefully. Write a clear specific aims page, include preliminary data, and describe your methodology in detail. Submit through the agency's online portal before the deadline."]], "query": "how to apply for research funding"} -{"output": [["lex", "improve credit score FICO"], ["lex", "raise credit score fast tips"], ["lex", "credit score factors payment history"], ["vec", "what are the most effective ways to raise your credit score quickly?"], ["vec", "which factors affect your FICO credit score the most and how can you improve them?"], ["hyde", "Pay all bills on time — payment history accounts for 35% of your FICO score. Keep credit utilization below 30% of your total credit limit. Avoid opening too many new accounts at once. Check your credit report for errors and dispute inaccuracies. Keeping old accounts open increases your average account age."]], "query": "how to improve credit score"} -{"output": [["lex", "literary criticism theory analysis"], ["lex", "literary criticism schools formalism structuralism"], ["lex", "literary analysis methods approaches"], ["vec", "what is literary criticism and what are its major schools of thought?"], ["vec", "how do literary critics analyze and interpret works of literature using different theoretical frameworks?"], ["hyde", "Literary criticism is the study, evaluation, and interpretation of literature. Major approaches include formalism (focusing on the text itself), structuralism (analyzing underlying structures), feminist criticism (examining gender representation), and post-colonialism (exploring power dynamics). Each lens offers a different way to interpret a work's meaning."]], "query": "what is literary criticism?"} -{"output": [["lex", "ethical theories social issues applied ethics"], ["lex", "utilitarianism deontology social justice"], ["lex", "ethics poverty inequality healthcare"], ["vec", "how are ethical theories like utilitarianism and deontology applied to real-world social issues?"], ["vec", "what ethical frameworks do philosophers use to analyze problems like poverty, inequality, and healthcare?"], ["hyde", "Utilitarian ethics evaluates social policies by their overall consequences — a policy is just if it maximizes well-being for the greatest number. Deontological ethics focuses on rights and duties regardless of outcome. Applying these frameworks to issues like healthcare access reveals tensions between collective welfare and individual rights."]], "query": "how do ethical theories apply to social issues"} -{"output": [["lex", "buy affordable art prints online"], ["lex", "cheap art prints posters wall decor"], ["lex", "art print shops Etsy Society6"], ["vec", "where can I buy affordable and high-quality art prints for home decoration?"], ["vec", "what are the best online stores for purchasing inexpensive art prints and posters?"], ["hyde", "Affordable art prints are available on Society6, Redbubble, and Etsy, where independent artists sell prints starting at $15–$30. IKEA offers framed prints under $20. For museum-quality reproductions, check Artsy or Saatchi Art's prints section. King & McGaw specializes in licensed fine art reproductions at mid-range prices."]], "query": "where to buy affordable art prints"} -{"output": [["lex", "critique literary work analysis"], ["lex", "literary critique essay writing"], ["lex", "evaluate novel poem fiction"], ["vec", "what steps do you follow to write a literary critique of a novel or poem?"], ["vec", "how do you analyze and evaluate the strengths and weaknesses of a literary work?"], ["hyde", "To critique a literary work, start by reading it closely and noting your initial reactions. Identify the theme, narrative structure, character development, and use of literary devices. Evaluate how effectively the author conveys their message. Support your assessment with specific textual evidence and quotations from the work."]], "query": "how do you critique a literary work?"} -{"output": [["lex", "principles democracy government"], ["lex", "democratic principles rule of law elections"], ["lex", "democracy separation of powers rights"], ["vec", "what are the fundamental principles that define a democratic system of government?"], ["vec", "how do free elections, rule of law, and separation of powers form the foundation of democracy?"], ["hyde", "The core principles of democracy include popular sovereignty (power derives from the people), free and fair elections, rule of law, separation of powers among branches of government, protection of individual rights and civil liberties, and majority rule with minority rights. An independent judiciary ensures laws are applied equally."]], "query": "what are the principles of democracy"} -{"output": [["lex", "grow tomatoes home garden"], ["lex", "tomato plant care watering sunlight"], ["lex", "container tomatoes growing tips"], ["vec", "how do you grow tomato plants at home in a garden bed or container?"], ["vec", "what soil, sunlight, and watering conditions do tomato plants need to produce fruit?"], ["hyde", "Plant tomato seedlings after the last frost in a spot receiving 6-8 hours of direct sunlight. Use well-draining soil amended with compost. Water deeply at the base 1-2 inches per week. Stake or cage plants for support. Feed with a balanced fertilizer every two weeks once fruit begins to set."]], "query": "how to grow tomatoes at home?"} -{"output": [["lex", "fix loud exhaust car muffler"], ["lex", "exhaust leak repair pipe"], ["lex", "muffler replacement noisy exhaust"], ["vec", "how do you diagnose and fix a loud or rattling car exhaust system?"], ["vec", "what causes a car exhaust to become loud and how do you repair or replace the muffler?"], ["hyde", "A loud exhaust is usually caused by a hole in the muffler, a cracked exhaust pipe, or a failed gasket at the manifold. For small holes, apply exhaust repair tape or paste as a temporary fix. For larger damage, replace the affected section. A rusted-through muffler should be replaced entirely — bolt-on universal mufflers cost $30–$80."]], "query": "how to fix a loud exhaust?"} -{"output": [["lex", "kinetic art sculpture movement"], ["lex", "kinetic art artists Calder Tinguely"], ["lex", "moving art installation mechanical"], ["vec", "what is kinetic art and how do artists create sculptures and installations that move?"], ["vec", "who are the most famous kinetic artists and what are their notable works?"], ["hyde", "Kinetic art is a genre of art that incorporates real or apparent movement. Alexander Calder pioneered the mobile — hanging sculptures that move with air currents. Jean Tinguely built complex mechanical assemblages that rattled and spun. Modern kinetic artists use motors, wind, and magnets to create motion."]], "query": "what is kinetic art?"} -{"output": [["lex", "async web framework server"], ["lex", "asynchronous HTTP request JavaScript Python"], ["lex", "async await web API"], ["vec", "how do asynchronous programming patterns work in web development and API requests?"], ["vec", "what are the best async web frameworks for building non-blocking HTTP servers?"], ["hyde", "Asynchronous web programming allows a server to handle multiple requests concurrently without blocking. In Python, frameworks like FastAPI and aiohttp use async/await syntax with an event loop. In JavaScript, Express with async handlers or Fastify process requests non-blockingly. This improves throughput for I/O-bound workloads."]], "query": "async web"} -{"output": [["lex", "philosophy nonviolence ahimsa pacifism"], ["lex", "nonviolence Gandhi King civil disobedience"], ["vec", "what is the philosophical basis for nonviolence as practiced by Gandhi and Martin Luther King Jr.?"], ["vec", "how does the concept of ahimsa relate to the broader philosophy of nonviolent resistance?"], ["hyde", "Nonviolence (ahimsa) as a philosophy holds that physical force is never justified as a means of conflict resolution. Mahatma Gandhi developed satyagraha — truth-force — as a method of nonviolent resistance against British colonial rule. Martin Luther King Jr. adapted these principles to the American civil rights movement."]], "query": "what is the philosophy of nonviolence"} -{"output": [["lex", "sects of Islam Sunni Shia Sufi"], ["lex", "Islamic denominations branches"], ["lex", "Sunni Shia differences beliefs"], ["vec", "what are the major sects and branches within Islam and how do they differ?"], ["vec", "what caused the split between Sunni and Shia Muslims and what are their key theological differences?"], ["hyde", "The two main sects of Islam are Sunni (approximately 85-90% of Muslims) and Shia (10-15%). The split originated from a disagreement over succession after Prophet Muhammad's death in 632 CE. Sunnis accepted Abu Bakr as caliph, while Shia believed leadership belonged to Ali, Muhammad's cousin and son-in-law. Sufism is a mystical tradition found within both branches."]], "query": "what are the main sects of islam?"} -{"output": [["lex", "charcoal drawing techniques"], ["lex", "vine compressed charcoal sketching"], ["lex", "charcoal shading blending paper"], ["vec", "what are the techniques for drawing and shading with charcoal on paper?"], ["vec", "what types of charcoal are used for drawing and how do they differ in effect?"], ["hyde", "Vine charcoal is soft and ideal for light sketching and easy erasing. Compressed charcoal is denser, producing darker, richer marks. Hold the charcoal on its side for broad strokes and use the tip for fine lines. Blend with a tortillon or chamois cloth. Fix finished drawings with spray fixative to prevent smudging."]], "query": "how to use charcoal for drawing?"} -{"output": [["lex", "mindfulness meditation practice"], ["lex", "mindfulness definition awareness present moment"], ["lex", "mindfulness stress reduction MBSR"], ["vec", "what is mindfulness and how is it practiced as a form of meditation?"], ["vec", "what are the psychological and health benefits of practicing mindfulness regularly?"], ["hyde", "Mindfulness is the practice of paying attention to the present moment without judgment. It involves observing thoughts, feelings, and sensations as they arise and letting them pass. Jon Kabat-Zinn developed Mindfulness-Based Stress Reduction (MBSR), an eight-week program shown to reduce anxiety, depression, and chronic pain."]], "query": "what is mindfulness"} -{"output": [["lex", "Ukraine conflict war 2025 2026 updates"], ["lex", "Ukraine Russia war latest news"], ["lex", "Ukraine ceasefire negotiations frontline"], ["vec", "what are the most recent developments in the Russia-Ukraine war as of 2025-2026?"], ["vec", "what is the current status of the Ukraine conflict including ceasefire talks and territorial changes?"], ["hyde", "As fighting continues along the eastern front, diplomatic efforts have intensified with multiple rounds of negotiations. Ukraine's forces have focused on defensive operations in the Donetsk region while maintaining pressure on supply lines. International support continues with new aid packages and sanctions enforcement."]], "query": "latest updates on the ukraine conflict"} -{"output": [["lex", "git push remote origin"], ["lex", "git push branch upstream"], ["lex", "git push force rejected"], ["vec", "how do you push commits to a remote repository using git push?"], ["vec", "what do you do when git push is rejected and how do you set upstream tracking branches?"], ["hyde", "Use `git push origin main` to push your local main branch to the remote. For a new branch, use `git push -u origin feature-branch` to set the upstream tracking reference. If the push is rejected because the remote has new commits, run `git pull --rebase` first, then push again."]], "query": "git push"} -{"output": [["lex", "hedonism philosophy pleasure"], ["lex", "hedonism Epicurus ethical theory"], ["lex", "hedonistic ethics pleasure pain"], ["vec", "what is hedonism as a philosophical doctrine about pleasure and the good life?"], ["vec", "how did Epicurus define hedonism and how does it differ from popular conceptions of pleasure-seeking?"], ["hyde", "Hedonism is the philosophical view that pleasure is the highest good and the proper aim of human life. Epicurus distinguished between kinetic pleasures (active enjoyment) and katastematic pleasures (the absence of pain). He argued that simple pleasures, friendship, and tranquility produce the most lasting happiness — not excess or indulgence."]], "query": "what is hedonism"} -{"output": [["lex", "mathematical model definition"], ["lex", "mathematical modeling equations simulation"], ["lex", "applied mathematics modeling real world"], ["vec", "what is a mathematical model and how is it used to represent real-world systems?"], ["vec", "how do scientists and engineers build mathematical models to simulate and predict phenomena?"], ["hyde", "A mathematical model uses equations and variables to represent a real-world system. For example, the SIR model uses differential equations to predict infectious disease spread: dS/dt = -βSI, dI/dt = βSI - γI, dR/dt = γI. Models are validated by comparing predictions against observed data and refined iteratively."]], "query": "what is a mathematical model"} -{"output": [["lex", "grow herb garden home indoor outdoor"], ["lex", "herb garden planting basil cilantro thyme"], ["lex", "container herb garden windowsill"], ["vec", "how do you start and maintain an herb garden at home, indoors or outdoors?"], ["vec", "which herbs grow best together and what soil and light conditions do they need?"], ["hyde", "Start with easy herbs like basil, parsley, mint, rosemary, and thyme. Plant in well-draining soil with 6+ hours of sunlight. Herbs in containers need pots with drainage holes and regular watering when the top inch of soil is dry. Harvest regularly by pinching stems above leaf nodes to encourage bushy growth."]], "query": "how to grow an herb garden"} -{"output": [["lex", "evaluate scientific claim evidence"], ["lex", "critical thinking scientific evidence peer review"], ["lex", "assess scientific study credibility"], ["vec", "how do you critically evaluate whether a scientific claim is supported by credible evidence?"], ["vec", "what criteria should you use to judge the reliability of a scientific study or finding?"], ["hyde", "Check if the claim is published in a peer-reviewed journal. Look at the sample size, methodology, and whether results have been replicated independently. Consider whether the source has conflicts of interest. Distinguish between correlation and causation. Evaluate the statistical significance and effect size reported in the study."]], "query": "how to evaluate a scientific claim"} -{"output": [["lex", "virtue signaling definition examples"], ["lex", "virtue signaling social media politics"], ["vec", "what does virtue signaling mean and how is the term used in political and social discourse?"], ["vec", "how do people use virtue signaling to publicly express moral values without substantive action?"], ["hyde", "Virtue signaling refers to the public expression of moral values or opinions primarily intended to demonstrate one's good character rather than to effect change. The term is often used critically to describe performative displays on social media — such as posting a hashtag or changing a profile picture — without taking meaningful action on the issue."]], "query": "what is virtue signaling?"} -{"output": [["lex", "impact investing ESG social return"], ["lex", "impact investing funds sustainable"], ["lex", "socially responsible investing SRI"], ["vec", "what is impact investing and how does it generate both financial returns and social or environmental benefit?"], ["vec", "how does impact investing differ from traditional investing and ESG strategies?"], ["hyde", "Impact investing directs capital toward companies and projects that generate measurable social or environmental benefits alongside financial returns. Unlike ESG screening, which excludes harmful sectors, impact investing actively targets positive outcomes — such as affordable housing, renewable energy, or microfinance. The Global Impact Investing Network (GIIN) estimates the market at over $1 trillion."]], "query": "what is impact investing?"} -{"output": [["lex", "stellar cartography star mapping"], ["lex", "star chart celestial mapping catalog"], ["lex", "astronomical survey stellar positions"], ["vec", "what is stellar cartography and how do astronomers map the positions and movements of stars?"], ["vec", "what tools and surveys are used to create detailed maps of stars in the galaxy?"], ["hyde", "Stellar cartography is the science of mapping the positions, distances, and motions of stars. The ESA's Gaia mission has cataloged over 1.8 billion stars with precise positions and parallax measurements. Stellar maps use right ascension and declination coordinates, with distances measured in parsecs from trigonometric parallax."]], "query": "stellar cartography"} -{"output": [["lex", "hedge funds investment strategy"], ["lex", "hedge fund accredited investors returns"], ["lex", "hedge fund management fee structure"], ["vec", "what are hedge funds and how do they differ from mutual funds and other investment vehicles?"], ["vec", "what strategies do hedge funds use to generate returns and manage risk?"], ["hyde", "A hedge fund is a pooled investment fund that employs diverse strategies — including long/short equity, arbitrage, and derivatives trading — to generate returns for accredited investors. Unlike mutual funds, hedge funds face fewer regulatory restrictions and typically charge a 2% management fee plus 20% of profits (the \"2 and 20\" model)."]], "query": "what are hedge funds?"} -{"output": [["lex", "GitHub repository create manage"], ["lex", "GitHub repo clone push pull"], ["lex", "git repository hosting GitHub"], ["vec", "how do you create and manage a repository on GitHub for version control?"], ["vec", "what are the basic operations for working with a GitHub repository including cloning, pushing, and pull requests?"], ["hyde", "To create a GitHub repository, click \"New repository\" on github.com, name it, and choose public or private visibility. Clone it locally with `git clone https://github.com/user/repo.git`. Add files, commit changes, and push with `git push origin main`. Collaborate through pull requests and code reviews."]], "query": "github repository"} -{"output": [["lex", "enhance social impact community"], ["lex", "positive social impact strategies nonprofit"], ["lex", "social change community engagement"], ["vec", "what are effective strategies for individuals and organizations to create positive social impact?"], ["vec", "how can nonprofits and businesses measure and increase their social impact in communities?"], ["hyde", "To enhance social impact, define clear measurable goals aligned with community needs. Use a theory of change to map how activities lead to outcomes. Partner with local organizations for culturally informed approaches. Measure results with both quantitative metrics (people served, outcomes achieved) and qualitative feedback from beneficiaries."]], "query": "how to enhance positive social impact?"} -{"output": [["lex", "negotiate rent price landlord"], ["lex", "rent negotiation apartment lease"], ["lex", "lower rent strategies tenant"], ["vec", "how do you negotiate a lower rent price with your landlord when signing or renewing a lease?"], ["vec", "what tactics and arguments can tenants use to get a better deal on apartment rent?"], ["hyde", "Research comparable rents in your area on Zillow or Apartments.com before negotiating. Highlight your strengths as a tenant: stable income, good credit, long tenure, or willingness to sign a longer lease. Negotiate during off-peak months (November-February) when demand is lower. Offer to prepay several months or handle minor maintenance in exchange for a reduction."]], "query": "how to negotiate rent prices"} -{"output": [["lex", "propagate succulents leaves cuttings"], ["lex", "succulent leaf propagation rooting"], ["lex", "grow succulents from leaf"], ["vec", "how do you propagate new succulent plants from individual leaf cuttings?"], ["vec", "what is the step-by-step process for rooting succulent leaves to grow new plants?"], ["hyde", "Gently twist a healthy leaf from the stem, ensuring a clean break with the base intact. Let it callous over for 2-3 days in indirect light. Place on top of well-draining cactus soil and mist every few days. Roots and a tiny rosette will appear in 2-4 weeks. Avoid direct sunlight until established."]], "query": "how to propagate succulents from leaves"} -{"output": [["lex", "NGO non-governmental organization role"], ["lex", "NGOs humanitarian aid development"], ["lex", "nonprofit organizations international advocacy"], ["vec", "what roles do non-governmental organizations (NGOs) play in humanitarian aid, development, and advocacy?"], ["vec", "how do NGOs influence government policy and deliver services in developing countries?"], ["hyde", "Non-governmental organizations (NGOs) operate independently from government to address social, environmental, and humanitarian issues. They deliver aid in crisis zones, advocate for policy changes, monitor human rights, and provide services like healthcare and education. Major NGOs include Médecins Sans Frontières, Amnesty International, and the Red Cross."]], "query": "what is the role of non-governmental organizations"} -{"output": [["lex", "Pentecost Christian Holy Spirit"], ["lex", "Pentecost Acts apostles church"], ["lex", "Pentecost feast day Christianity"], ["vec", "what is the meaning and significance of Pentecost in the Christian faith?"], ["vec", "what happened on the day of Pentecost according to the Book of Acts in the Bible?"], ["hyde", "Pentecost commemorates the descent of the Holy Spirit upon the apostles fifty days after Easter, as described in Acts 2. The apostles began speaking in tongues and Peter preached to a crowd, leading to about 3,000 conversions. It is often called the birthday of the Christian Church and is celebrated as a major feast day."]], "query": "what is pentecost in christian faith"} -{"output": [["lex", "pay off student loans faster"], ["lex", "student loan repayment strategies"], ["lex", "student loan refinance extra payments"], ["vec", "what are the most effective strategies for paying off student loans ahead of schedule?"], ["vec", "how can refinancing or making extra payments help you pay off student loans faster?"], ["hyde", "Make payments above the minimum and specify that extra goes toward the principal. Refinance at a lower interest rate if your credit has improved. Use the avalanche method to target the highest-rate loan first. Set up biweekly payments instead of monthly to make one extra payment per year. Allocate windfalls like tax refunds directly to loans."]], "query": "how to pay off student loans faster"} -{"output": [["lex", "gothic literature characteristics elements"], ["lex", "gothic fiction dark romantic horror"], ["lex", "gothic novel atmosphere supernatural"], ["vec", "what are the defining characteristics and common elements of gothic literature?"], ["vec", "how do gothic novels use setting, atmosphere, and the supernatural to create suspense and dread?"], ["hyde", "Gothic literature features dark, brooding settings like castles, ruins, and isolated mansions. Common elements include supernatural events, madness, secrets, and heightened emotion. The atmosphere is oppressive and foreboding. Key works include Horace Walpole's The Castle of Otranto, Mary Shelley's Frankenstein, and Bram Stoker's Dracula."]], "query": "what are the characteristics of gothic literature?"} -{"output": [["lex", "register political party requirements"], ["lex", "form new political party ballot access"], ["lex", "political party registration petition signatures"], ["vec", "what is the legal process for registering a new political party in the United States?"], ["vec", "what requirements must be met to officially form and register a political party for elections?"], ["hyde", "Requirements to register a political party vary by state. Generally, you must file organizational documents with the secretary of state, collect a minimum number of petition signatures (often 1-5% of registered voters), adopt a party platform and bylaws, and hold a founding convention. Some states also require fielding candidates in a certain number of races."]], "query": "how to register a political party"} -{"output": [["lex", "leather reclining lounge chair"], ["lex", "leather recliner chair buy"], ["lex", "reclining lounge chair living room"], ["vec", "what are the best leather reclining lounge chairs for comfort and durability?"], ["vec", "where can I buy a high-quality leather recliner chair for my living room?"], ["hyde", "The La-Z-Boy Kirkwood leather recliner features top-grain leather upholstery, a power reclining mechanism, and lumbar support. At $1,200, it's a mid-range option with a 10-year warranty. For premium choices, the Ekornes Stressless recliner offers ergonomic design with adjustable headrest and glide function starting at $2,500."]], "query": "leather reclining lounge chairs"} -{"output": [["lex", "write scientific research proposal"], ["lex", "research proposal template structure"], ["lex", "grant proposal methodology aims"], ["vec", "how do you write a compelling scientific research proposal with clear aims and methodology?"], ["vec", "what sections and structure should a scientific research proposal include?"], ["hyde", "A scientific research proposal typically includes: title, abstract, specific aims, background and significance, preliminary data, research design and methods, timeline, budget and justification, and references. The specific aims page is the most critical — state the problem, your hypothesis, and 2-3 measurable objectives clearly in one page."]], "query": "how to write a scientific research proposal"} -{"output": [["lex", "open savings account bank"], ["lex", "savings account requirements documents"], ["lex", "high yield savings account online"], ["vec", "what is the process for opening a savings account at a bank or online institution?"], ["vec", "what documents and minimum deposit do you need to open a savings account?"], ["hyde", "To open a savings account, choose a bank or credit union and compare interest rates (high-yield online accounts often offer 4-5% APY). You'll need a government-issued ID, Social Security number, and an initial deposit (often $25-$100). Apply online or in person. Link a checking account for easy transfers and set up automatic deposits."]], "query": "how to open a savings account"} -{"output": [["lex", "e-commerce business online retail"], ["lex", "e-commerce sales growth digital"], ["lex", "online shopping platform business model"], ["vec", "how has e-commerce transformed the way businesses sell products and reach customers?"], ["vec", "what role does e-commerce play in business strategy including direct-to-consumer and marketplace models?"], ["hyde", "E-commerce enables businesses to sell products globally without physical storefronts. Companies use platforms like Shopify, Amazon Marketplace, and WooCommerce to reach customers online. In 2024, global e-commerce sales exceeded $6 trillion. Direct-to-consumer (DTC) brands cut out middlemen, while marketplaces aggregate sellers for one-stop shopping."]], "query": "what is the role of e-commerce in modern business"} -{"output": [["lex", "tree climbing techniques equipment"], ["lex", "recreational tree climbing arborist"], ["lex", "tree climbing harness rope"], ["vec", "what techniques and equipment are used for recreational or professional tree climbing?"], ["vec", "how do arborists safely climb trees using ropes, harnesses, and climbing spurs?"], ["hyde", "Recreational tree climbing uses a doubled-rope technique (DRT) with a throw line to set the rope over a branch. Climbers wear a saddle harness and ascend using mechanical ascenders or friction hitches like the Blake's hitch. Arborists use single-rope technique (SRT) for efficiency and may use climbing spurs for removals only."]], "query": "tree climb"} -{"output": [["lex", "upgrade car headlights LED HID"], ["lex", "replace headlight bulbs brighter"], ["lex", "headlight upgrade installation"], ["vec", "how do you upgrade your car's headlights to brighter LED or HID bulbs?"], ["vec", "what are the steps for replacing stock halogen headlights with aftermarket LED headlights?"], ["hyde", "To upgrade from halogen to LED headlights, find your bulb size in the owner's manual (e.g., H11, 9005). Purchase a quality LED kit from brands like Hikari or Fahren. Remove the old bulb by twisting the retaining ring, insert the LED bulb, and connect the driver/ballast. Aim the headlights after installation to avoid blinding oncoming traffic."]], "query": "how to upgrade car headlights?"} -{"output": [["lex", "To Kill a Mockingbird themes"], ["lex", "To Kill a Mockingbird racial injustice innocence"], ["lex", "Harper Lee themes moral courage"], ["vec", "what are the major themes explored in Harper Lee's To Kill a Mockingbird?"], ["vec", "how does To Kill a Mockingbird address racial injustice, moral courage, and the loss of innocence?"], ["hyde", "The central themes of To Kill a Mockingbird include racial injustice in the American South, as shown through Tom Robinson's trial. Moral courage is embodied by Atticus Finch, who defends Robinson despite social pressure. The loss of innocence is traced through Scout's growing awareness of prejudice and cruelty in Maycomb, Alabama."]], "query": "what are the themes of to kill a mockingbird?"} -{"output": [["lex", "install car roof rack"], ["lex", "roof rack mounting crossbars"], ["lex", "car roof rack installation guide"], ["vec", "how do you install a roof rack on a car with or without factory roof rails?"], ["vec", "what are the steps for mounting crossbars and a roof rack system on a vehicle?"], ["hyde", "For cars with factory side rails, slide the crossbar feet onto the rails and tighten the clamps at your desired spacing. For bare roofs, use a fit kit with clips that hook into the door frame. Torque the mounting hardware to the manufacturer's specification (usually 6-8 Nm). Test by pushing firmly on the bars to confirm they don't shift."]], "query": "how to install a car roof rack?"} -{"output": [["lex", "deforestation environmental impact"], ["lex", "deforestation climate change biodiversity loss"], ["lex", "tropical rainforest destruction causes"], ["vec", "why is deforestation considered a serious environmental problem and what are its consequences?"], ["vec", "how does deforestation contribute to climate change, biodiversity loss, and soil erosion?"], ["hyde", "Deforestation removes trees that absorb CO2, releasing stored carbon and accelerating climate change. Tropical forests hold over 50% of Earth's species — clearing them drives mass extinction. Deforested land loses topsoil to erosion, reducing agricultural productivity. The Amazon alone lost 10,000 square kilometers of forest in a single year."]], "query": "why is deforestation a concern?"} -{"output": [["lex", "philosophy nature of reality metaphysics"], ["lex", "metaphysics ontology existence"], ["lex", "philosophical realism idealism"], ["vec", "how have philosophers historically explored and debated the nature of reality and existence?"], ["vec", "what are the main metaphysical positions on whether reality is fundamentally material, mental, or something else?"], ["hyde", "Metaphysics, the branch of philosophy concerned with the nature of reality, asks questions like: What exists? Is the physical world all there is? Plato argued that true reality consists of abstract Forms. Descartes proposed mind-body dualism. Materialists hold that only physical matter exists, while idealists like Berkeley argued that reality is fundamentally mental."]], "query": "how do philosophers explore the nature of reality"} -{"output": [["lex", "writing routine daily habit"], ["lex", "build writing practice discipline"], ["lex", "writing schedule productivity"], ["vec", "how do you establish a consistent daily writing routine and maintain discipline?"], ["vec", "what strategies do professional writers use to build and sustain a writing habit?"], ["hyde", "Set a specific time each day for writing — morning works best for many writers because willpower is highest. Start with a modest goal of 300-500 words and increase gradually. Write in the same place to create environmental cues. Track your word count daily. Don't edit while drafting — the first draft's only job is to exist."]], "query": "how to build a writing routine"} -{"output": [["lex", "public opinion immigration polls"], ["lex", "immigration attitudes survey sentiment"], ["lex", "immigration policy public views 2025 2026"], ["vec", "what do recent polls and surveys reveal about public sentiment on immigration policy?"], ["vec", "how do public attitudes toward immigration vary by country, political affiliation, and demographics?"], ["hyde", "A 2025 Gallup poll found that 28% of Americans wanted immigration increased, 36% wanted it decreased, and 33% wanted it kept at current levels. Views split sharply along party lines: 55% of Democrats favored more immigration versus 11% of Republicans. In Europe, surveys showed rising concern about integration alongside recognition of labor market needs."]], "query": "what are public sentiments on immigration"} -{"output": [["lex", "Buddhist meditation practice techniques"], ["lex", "Vipassana Zen meditation Buddhism"], ["lex", "mindfulness meditation Buddhist traditions"], ["vec", "what are the main forms of meditation practiced in Buddhism and how are they performed?"], ["vec", "how do Vipassana, Zen, and Tibetan Buddhist meditation techniques differ from each other?"], ["hyde", "Buddhist meditation includes two main types: samatha (calm abiding) and vipassana (insight). In Vipassana, practitioners observe bodily sensations and mental events with equanimity. Zen meditation (zazen) involves sitting with awareness of breath, often facing a wall. Tibetan Buddhism adds visualization practices and mantra recitation. All traditions emphasize mindful awareness."]], "query": "how do people practice meditation in buddhism"} -{"output": [["lex", "edit photos Adobe Lightroom"], ["lex", "Lightroom editing tutorial sliders"], ["lex", "Lightroom develop module adjustments"], ["vec", "how do you edit and enhance photos using Adobe Lightroom's develop module?"], ["vec", "what are the essential Lightroom editing steps for exposure, color, and tone adjustments?"], ["hyde", "In Lightroom's Develop module, start with the Basic panel: adjust Exposure for overall brightness, then Highlights and Shadows to recover detail. Set White Balance using the eyedropper or Temperature/Tint sliders. Increase Clarity for midtone contrast and Vibrance for subtle color boost. Use the HSL panel to fine-tune individual colors."]], "query": "how to edit in lightroom"} -{"output": [["lex", "philosophy of education learning theory"], ["lex", "educational philosophy Dewey Montessori"], ["lex", "epistemology education pedagogy"], ["vec", "how do educational philosophers like Dewey and Montessori theorize about the nature of learning?"], ["vec", "what are the major philosophical approaches to education and how do they shape teaching methods?"], ["hyde", "John Dewey's pragmatism views learning as experiential — students learn by doing and reflecting. Montessori emphasizes self-directed activity and hands-on learning in prepared environments. Constructivism holds that learners build knowledge actively rather than passively receiving it. Each philosophy leads to different classroom structures and teaching practices."]], "query": "how does the philosophy of education explore learning"} -{"output": [["lex", "family budget plan household"], ["lex", "family budget spreadsheet expenses"], ["lex", "household budgeting categories"], ["vec", "how do you create a family budget that accounts for all household income and expenses?"], ["vec", "what categories and tools should you use when building a family budget?"], ["hyde", "List all family income sources including salaries, freelance work, and benefits. Categorize expenses into fixed (mortgage, insurance, utilities), variable (groceries, gas, clothing), and discretionary (dining out, entertainment). Allocate funds using the envelope method or a budgeting app like Mint or YNAB. Review spending together monthly."]], "query": "how to make a family budget?"} -{"output": [["lex", "Ten Commandments significance Bible"], ["lex", "Ten Commandments Moses Judaism Christianity"], ["lex", "Decalogue moral law religious"], ["vec", "what is the religious and historical significance of the Ten Commandments in Judaism and Christianity?"], ["vec", "how have the Ten Commandments influenced Western law, ethics, and moral codes?"], ["hyde", "The Ten Commandments (Decalogue) were given by God to Moses on Mount Sinai, as recorded in Exodus 20 and Deuteronomy 5. They form the foundational moral code of Judaism and Christianity, covering duties to God (no other gods, no idols, keep the Sabbath) and duties to others (honor parents, do not murder, steal, or lie)."]], "query": "what is the significance of the ten commandments"} -{"output": [["lex", "creative non-fiction genre writing"], ["lex", "creative nonfiction memoir essay narrative"], ["lex", "literary nonfiction storytelling"], ["vec", "what is creative non-fiction and how does it differ from traditional journalism or academic writing?"], ["vec", "what techniques do creative non-fiction writers use to tell true stories in a literary way?"], ["hyde", "Creative non-fiction uses literary techniques — narrative arc, scene-setting, dialogue, and vivid description — to tell true stories. Subgenres include memoir, personal essay, literary journalism, and nature writing. Unlike standard reporting, the writer's voice and perspective are central. Examples include Truman Capote's In Cold Blood and Joan Didion's essays."]], "query": "what is creative non-fiction?"} -{"output": [["lex", "air filter replacement HVAC"], ["lex", "car engine air filter"], ["lex", "home air purifier HEPA filter"], ["vec", "how often should you replace an air filter in your car engine or home HVAC system?"], ["vec", "what types of air filters are available for home air purifiers and what do HEPA ratings mean?"], ["hyde", "Replace your car's engine air filter every 15,000-30,000 miles depending on driving conditions. Home HVAC filters should be changed every 1-3 months. HEPA filters capture 99.97% of particles 0.3 microns or larger. MERV ratings from 1-16 indicate filtration efficiency — MERV 13+ is recommended for allergy sufferers."]], "query": "air filter"} -{"output": [["lex", "periodic table elements chemistry"], ["lex", "periodic table groups periods atomic number"], ["lex", "Mendeleev periodic table organization"], ["vec", "what is the periodic table and how are chemical elements organized within it?"], ["vec", "how did Mendeleev create the periodic table and what patterns does it reveal about element properties?"], ["hyde", "The periodic table organizes all known chemical elements by increasing atomic number into rows (periods) and columns (groups). Elements in the same group share similar chemical properties because they have the same number of valence electrons. Dmitri Mendeleev published the first widely recognized periodic table in 1869, predicting undiscovered elements."]], "query": "what is the periodic table"} -{"output": [["lex", "green screen chroma key setup"], ["lex", "green screen video editing background"], ["lex", "green screen lighting technique"], ["vec", "how do you set up and use a green screen for video production and chroma key compositing?"], ["vec", "what lighting and camera settings are needed for clean green screen footage?"], ["hyde", "Set up an evenly lit green screen with no wrinkles or shadows. Place the subject at least 6 feet in front of the screen to avoid green spill. Use two softbox lights at 45-degree angles on the screen and separate lights for the subject. In post-production, apply chroma key in software like DaVinci Resolve or After Effects to replace the green background."]], "query": "how to use green screen"} -{"output": [["lex", "fashion trends 2023 2024 2025"], ["lex", "latest fashion trends clothing style"], ["lex", "2023 fashion runway trends"], ["vec", "what were the top fashion trends in 2023 and how have they evolved into 2024-2025?"], ["vec", "what clothing styles, colors, and silhouettes defined fashion trends in recent years?"], ["hyde", "Key fashion trends in 2023 included quiet luxury with understated neutral tones and premium fabrics, oversized blazers and tailored wide-leg trousers, sheer fabrics, ballet flats, and the revival of denim-on-denim. Barbiecore pink carried over from 2022, while earth tones and burgundy gained momentum heading into 2024."]], "query": "what are the latest fashion trends 2023?"} -{"output": [["lex", "field research methods data collection"], ["lex", "conduct field study observation interview"], ["lex", "ethnographic fieldwork techniques"], ["vec", "how do researchers plan and conduct field research including observation and interviews?"], ["vec", "what are the methods and ethical considerations involved in conducting ethnographic field research?"], ["hyde", "Field research involves collecting data in natural settings through observation, interviews, and surveys. Begin with a clear research question and ethical approval. Use participant observation to immerse yourself in the environment. Take detailed field notes immediately after each session. Triangulate data from multiple sources to strengthen validity."]], "query": "how to conduct field research"} -{"output": [["lex", "digital currency cryptocurrency Bitcoin"], ["lex", "digital currency CBDC blockchain"], ["lex", "cryptocurrency exchange trading"], ["vec", "what are digital currencies including cryptocurrencies and central bank digital currencies (CBDCs)?"], ["vec", "how do digital currencies like Bitcoin and Ethereum work using blockchain technology?"], ["hyde", "Digital currencies exist only in electronic form and include cryptocurrencies like Bitcoin and Ethereum, which use decentralized blockchain networks, and central bank digital currencies (CBDCs) issued by governments. Bitcoin uses proof-of-work consensus while Ethereum moved to proof-of-stake. Over 130 countries are exploring or piloting CBDCs as of 2025."]], "query": "digital currencies"} -{"output": [["lex", "tree growth rate species"], ["lex", "grow trees planting care"], ["lex", "tree growth stages seedling mature"], ["vec", "how fast do different tree species grow and what conditions promote healthy tree growth?"], ["vec", "what are the stages of tree growth from seedling to mature tree and how do you care for young trees?"], ["hyde", "Tree growth rates vary widely by species. Fast-growing trees like hybrid poplar and willow can add 3-5 feet per year, while oaks grow 1-2 feet annually. For healthy growth, plant in appropriate soil with adequate drainage, water deeply during the first two years, mulch around the base (not touching the trunk), and prune to establish strong structure."]], "query": "tree grow"} -{"output": [["lex", "sail set trim sailing"], ["lex", "setting sails rigging sailboat"], ["lex", "sail trim wind angle"], ["vec", "how do you properly set and trim sails on a sailboat for different wind conditions?"], ["vec", "what is the correct technique for setting a mainsail and jib when sailing upwind or downwind?"], ["hyde", "To set the mainsail, head into the wind and raise the halyard while feeding the luff into the mast track. Tension the outhaul and cunningham based on wind strength. When sailing upwind, trim the mainsheet until the telltales flow evenly. Ease the sheet when reaching or running. Adjust the jib sheet so the luff telltales break evenly."]], "query": "sail set"} -{"output": [["lex", "scientific method steps process"], ["lex", "apply scientific method experiment hypothesis"], ["lex", "scientific method observation data analysis"], ["vec", "what are the steps of the scientific method and how do you apply them to an experiment?"], ["vec", "how do scientists use the scientific method to test hypotheses and draw conclusions?"], ["hyde", "The scientific method follows these steps: (1) Observe a phenomenon, (2) Ask a question, (3) Form a testable hypothesis, (4) Design and conduct an experiment with controlled variables, (5) Collect and analyze data, (6) Draw conclusions — does the evidence support or refute the hypothesis? (7) Communicate results and invite replication."]], "query": "how to apply the scientific method"} -{"output": [["lex", "Holy Spirit Christianity role"], ["lex", "Holy Spirit Trinity Christian theology"], ["lex", "Holy Spirit gifts fruits Bible"], ["vec", "what role does the Holy Spirit play in Christian theology and the life of believers?"], ["vec", "how is the Holy Spirit understood within the doctrine of the Trinity in Christianity?"], ["hyde", "In Christian theology, the Holy Spirit is the third person of the Trinity — coequal with the Father and the Son. The Spirit convicts of sin, regenerates believers at conversion, indwells Christians as a guide and comforter, and empowers them with spiritual gifts (1 Corinthians 12). At Pentecost, the Spirit descended on the apostles, enabling them to preach."]], "query": "what is the role of the holy spirit in christianity?"} -{"output": [["lex", "code review pull request"], ["lex", "code review checklist guidelines"], ["lex", "peer code review feedback"], ["vec", "what are the best practices for conducting an effective code review on a pull request?"], ["vec", "what should reviewers look for during a code review including bugs, readability, and architecture?"], ["hyde", "During a code review, check for correctness, readability, and maintainability. Look for edge cases, error handling, and potential security issues. Verify that naming conventions are clear and tests cover the new code. Provide constructive feedback with specific suggestions rather than vague criticism. Approve only when the code is production-ready."]], "query": "code review"} -{"output": [["lex", "personal finance management"], ["lex", "manage money budgeting saving investing"], ["lex", "personal financial planning"], ["vec", "what are the key steps for managing your personal finances including budgeting, saving, and investing?"], ["vec", "how should you organize your personal finances to build wealth and avoid debt?"], ["hyde", "Start with a budget tracking all income and expenses. Build an emergency fund covering 3-6 months of expenses. Pay off high-interest debt aggressively. Contribute enough to your 401(k) to get the employer match, then fund a Roth IRA. Automate savings and investments. Review your financial plan quarterly and adjust as income or goals change."]], "query": "how to manage personal finances"} -{"output": [["lex", "read legislative documents bills statutes"], ["lex", "understand legislation legal language"], ["lex", "interpreting bills acts laws"], ["vec", "how do you read and interpret legislative documents such as bills, statutes, and regulations?"], ["vec", "what techniques help non-lawyers understand the language and structure of legislative texts?"], ["hyde", "Legislative documents follow a standard structure: the title, enacting clause, definitions section, substantive provisions, and effective date. Start with the definitions section — legal terms often have specific meanings different from everyday use. Read the \"findings\" or \"purpose\" section for context. Track cross-references to other statutes. Legislative summaries from CRS or CBO can provide plain-language explanations."]], "query": "how to understand legislative documents"} -{"output": [["lex", "participate public policy discussion civic"], ["lex", "public policy engagement town hall"], ["lex", "citizen participation policy advocacy"], ["vec", "how can citizens effectively participate in public policy discussions and influence government decisions?"], ["vec", "what are the ways individuals can engage in public policy debates at the local, state, and federal level?"], ["hyde", "Attend town hall meetings and public comment sessions held by local and state government bodies. Submit written comments during rulemaking periods — federal agencies post proposed rules on regulations.gov. Contact your elected representatives by phone or email. Join advocacy organizations that align with your policy priorities and participate in their campaigns."]], "query": "how to participate in public policy discussions"} -{"output": [["lex", "philosophy of religion theology"], ["lex", "philosophical arguments God existence"], ["lex", "religion philosophy relationship faith reason"], ["vec", "what role does philosophy play in examining and understanding religious beliefs and concepts?"], ["vec", "how do philosophers analyze religious claims about God, the soul, and the meaning of existence?"], ["hyde", "Philosophy of religion examines fundamental questions that religions address: Does God exist? What is the nature of the soul? How can evil exist if God is omnipotent? Philosophers evaluate arguments for God's existence (cosmological, teleological, ontological) and critique them. The field also explores the relationship between faith and reason, asking whether religious belief can be rationally justified."]], "query": "what is the role of philosophy in religion?"} -{"output": [["lex", "outdoor survival training wilderness"], ["lex", "survival skills shelter fire water"], ["lex", "wilderness survival course"], ["vec", "what does outdoor survival training involve and what skills does it teach?"], ["vec", "how do wilderness survival courses teach people to find shelter, water, fire, and food in the wild?"], ["hyde", "Outdoor survival training teaches skills needed to stay alive in wilderness emergencies. Core topics include building emergency shelters from natural materials, finding and purifying water, starting fire without matches using a ferro rod or bow drill, signaling for rescue, and basic navigation without GPS. Courses range from weekend workshops to multi-week immersive programs."]], "query": "what is outdoor survival training?"} -{"output": [["lex", "Jazz Age history 1920s"], ["lex", "Jazz Age Harlem Renaissance Roaring Twenties"], ["lex", "jazz music history Louis Armstrong"], ["vec", "what was the Jazz Age and how did jazz music shape American culture in the 1920s?"], ["vec", "how did the Jazz Age connect to the Harlem Renaissance and the social changes of the Roaring Twenties?"], ["hyde", "The Jazz Age, spanning roughly 1920-1929, was a cultural movement defined by the rise of jazz music, loosened social mores, and economic prosperity. Jazz originated in New Orleans and spread to Chicago and New York. The Harlem Renaissance saw Black artists, musicians, and writers flourish. Louis Armstrong, Duke Ellington, and Bessie Smith became icons. The era ended with the stock market crash of 1929."]], "query": "what is the history of the jazz age"} -{"output": [["lex", "analyze government budget fiscal"], ["lex", "government budget analysis revenue expenditure"], ["lex", "federal state budget breakdown"], ["vec", "how do you read and analyze a government budget to understand spending priorities and fiscal health?"], ["vec", "what tools and frameworks are used to evaluate government budget allocations and deficits?"], ["hyde", "To analyze a government budget, start with the summary tables showing total revenue, total expenditure, and the deficit or surplus. Compare allocations across categories: defense, healthcare, education, infrastructure. Track year-over-year changes to identify spending trends. Examine revenue sources (income tax, sales tax, borrowing) and assess whether projected growth assumptions are realistic."]], "query": "how to analyze government budgets"} -{"output": [["lex", "learn Python programming beginner"], ["lex", "Python tutorial course exercises"], ["lex", "Python programming fundamentals syntax"], ["vec", "what is the best way for a beginner to learn Python programming from scratch?"], ["vec", "what resources, courses, and projects should someone use to learn Python programming?"], ["hyde", "Start with Python's official tutorial at docs.python.org. Learn the basics: variables, data types, loops, conditionals, and functions. Practice on sites like LeetCode or HackerRank. Build small projects — a calculator, a to-do list, or a web scraper using requests and BeautifulSoup. Automate the Boring Stuff with Python is a popular free book for beginners."]], "query": "how to learn python programming?"} -{"output": [["lex", "Gospel of Wealth Andrew Carnegie"], ["lex", "Gospel of Wealth philanthropy gilded age"], ["vec", "what is the Gospel of Wealth written by Andrew Carnegie and what does it argue about the duty of the rich?"], ["vec", "how did Andrew Carnegie's Gospel of Wealth influence philanthropy and attitudes toward wealth in America?"], ["hyde", "The Gospel of Wealth is an 1889 essay by Andrew Carnegie arguing that the wealthy have a moral obligation to distribute their surplus wealth for the public good. Carnegie believed that rich individuals were better suited than government to direct resources toward education, libraries, and civic institutions. He practiced this philosophy by funding over 2,500 public libraries."]], "query": "what is the gospel of wealth"} -{"output": [["lex", "concept of God religions monotheism polytheism"], ["lex", "God Christianity Islam Hinduism Judaism"], ["lex", "religious interpretations divine nature"], ["vec", "how do different world religions like Christianity, Islam, Hinduism, and Buddhism understand the concept of God?"], ["vec", "what are the key differences between monotheistic, polytheistic, and non-theistic religious views of God?"], ["hyde", "Christianity, Islam, and Judaism are monotheistic — they worship one God, though Christianity distinguishes three persons in the Trinity. Hinduism includes both monotheistic and polytheistic traditions: Brahman is the ultimate reality, while deities like Vishnu and Shiva represent aspects of it. Buddhism is non-theistic, focusing on awakening rather than worship of a creator God."]], "query": "how do various religions interpret the concept of god?"} -{"output": [["lex", "satire literary device definition"], ["lex", "satire examples humor criticism"], ["lex", "satirical writing Swift Orwell"], ["vec", "what is satire as a literary form and how does it use humor to criticize people, institutions, or society?"], ["vec", "what are famous examples of satire in literature, television, and political commentary?"], ["hyde", "Satire uses irony, exaggeration, and ridicule to expose and criticize foolishness or corruption. Jonathan Swift's A Modest Proposal satirized British policy toward Ireland by suggesting the poor sell their children as food. George Orwell's Animal Farm satirized Soviet totalitarianism. Modern satire appears in shows like The Daily Show and publications like The Onion."]], "query": "what is satire"} -{"output": [["lex", "JSON serialization deserialization"], ["lex", "JSON serialize object string"], ["lex", "JSON stringify parse encoding"], ["vec", "how do you serialize objects to JSON and deserialize JSON strings back to objects in programming?"], ["vec", "what functions are used for JSON serialization in Python, JavaScript, and other languages?"], ["hyde", "JSON serialization converts an object into a JSON string for storage or transmission. In JavaScript, JSON.stringify(obj) serializes and JSON.parse(str) deserializes. In Python, json.dumps(obj) converts to a string and json.loads(str) parses back. Custom serialization for dates or complex types requires encoder/decoder overrides."]], "query": "json serial"} -{"output": [["lex", "fix car air conditioning AC repair"], ["lex", "car AC not blowing cold recharge"], ["lex", "automotive AC compressor refrigerant"], ["vec", "how do you diagnose and fix a car air conditioning system that is not blowing cold air?"], ["vec", "what are the common causes of car AC failure and how do you recharge the refrigerant?"], ["hyde", "If your car AC blows warm air, check the refrigerant level first — low refrigerant is the most common cause. Use a recharge kit with R-134a (or R-1234yf for newer cars) and a pressure gauge. If the compressor clutch doesn't engage, check the fuse and relay. A leak requires UV dye detection and repair before recharging. Cabin filter clogs can also reduce airflow."]], "query": "how to fix car air conditioning?"} -{"output": [["lex", "moral absolutism ethics definition"], ["lex", "moral absolutism versus relativism"], ["lex", "absolute moral principles deontology"], ["vec", "what is moral absolutism and how does it differ from moral relativism in ethical philosophy?"], ["vec", "what are the arguments for and against the view that some moral rules are universally true?"], ["hyde", "Moral absolutism holds that certain actions are intrinsically right or wrong regardless of context, culture, or consequences. For example, an absolutist would say lying is always wrong, even to protect someone. This view aligns with Kantian deontology and natural law theory. Critics argue it fails to account for moral dilemmas where absolute rules conflict."]], "query": "what is moral absolutism"} -{"output": [["lex", "world overview capitals quiz tutorial"], ["lex", "world overview capitals quiz guide"], ["lex", "world overview capitals quiz examples"], ["vec", "guide for world capitals quiz"], ["vec", "how to world capitals quiz"], ["hyde", "This comprehensive guide covers everything you need to know about world capitals quiz. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "world capitals quiz"} -{"output": [["lex", "trivia overview facts about space examples"], ["lex", "trivia facts about space best practices"], ["lex", "trivia overview facts about space guide"], ["vec", "understanding trivia facts about space"], ["vec", "guide for trivia facts about space"], ["hyde", "This comprehensive guide covers everything you need to know about trivia facts about space. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "trivia facts about space"} -{"output": [["lex", "did overview you know history examples"], ["lex", "did overview you know history guide"], ["lex", "did you know history best practices"], ["vec", "complete did you know history reference"], ["vec", "learn about did you know history"], ["hyde", "This comprehensive guide covers everything you need to know about did you know history. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "did you know history"} -{"output": [["lex", "random overview science facts tutorial"], ["lex", "random overview science facts guide"], ["lex", "random science facts best practices"], ["vec", "how to random science facts"], ["vec", "guide for random science facts"], ["hyde", "This comprehensive guide covers everything you need to know about random science facts. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "random science facts"} -{"output": [["lex", "famous inventions timeline best practices"], ["lex", "famous inventions timeline documentation"], ["lex", "famous overview inventions timeline tutorial"], ["vec", "how to famous inventions timeline"], ["vec", "complete famous inventions timeline reference"], ["hyde", "This comprehensive guide covers everything you need to know about famous inventions timeline. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "famous inventions timeline"} -{"output": [["lex", "world overview records list guide"], ["lex", "world overview records list tutorial"], ["lex", "world records list best practices"], ["vec", "how to world records list"], ["vec", "understanding world records list"], ["hyde", "This comprehensive guide covers everything you need to know about world records list. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "world records list"} -{"output": [["lex", "fun geography facts documentation"], ["lex", "fun overview geography facts guide"], ["lex", "fun overview geography facts examples"], ["vec", "guide for fun geography facts"], ["vec", "understanding fun geography facts"], ["hyde", "This comprehensive guide covers everything you need to know about fun geography facts. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "fun geography facts"} -{"output": [["lex", "historical trivia questions documentation"], ["lex", "historical overview trivia questions guide"], ["lex", "historical trivia questions best practices"], ["vec", "how to historical trivia questions"], ["vec", "guide for historical trivia questions"], ["hyde", "This comprehensive guide covers everything you need to know about historical trivia questions. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "historical trivia questions"} -{"output": [["lex", "animal trivia facts best practices"], ["lex", "animal overview trivia facts tutorial"], ["lex", "animal overview trivia facts guide"], ["vec", "complete animal trivia facts reference"], ["vec", "guide for animal trivia facts"], ["hyde", "This comprehensive guide covers everything you need to know about animal trivia facts. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "animal trivia facts"} -{"output": [["lex", "sports overview trivia records examples"], ["lex", "sports trivia records documentation"], ["lex", "sports overview trivia records guide"], ["vec", "learn about sports trivia records"], ["vec", "how to sports trivia records"], ["hyde", "This comprehensive guide covers everything you need to know about sports trivia records. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sports trivia records"} -{"output": [["lex", "largest overview countries by area guide"], ["lex", "largest countries by area documentation"], ["lex", "largest countries by area best practices"], ["vec", "understanding largest countries by area"], ["vec", "complete largest countries by area reference"], ["hyde", "This comprehensive guide covers everything you need to know about largest countries by area. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "largest countries by area"} -{"output": [["lex", "rivers that cross multiple countries documentation"], ["lex", "rivers overview that cross multiple countries tutorial"], ["lex", "rivers overview that cross multiple countries guide"], ["vec", "complete rivers that cross multiple countries reference"], ["vec", "understanding rivers that cross multiple countries"], ["hyde", "This comprehensive guide covers everything you need to know about rivers that cross multiple countries. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "rivers that cross multiple countries"} -{"output": [["lex", "highest mountain peaks documentation"], ["lex", "highest overview mountain peaks examples"], ["lex", "highest overview mountain peaks guide"], ["vec", "understanding highest mountain peaks"], ["vec", "guide for highest mountain peaks"], ["hyde", "This comprehensive guide covers everything you need to know about highest mountain peaks. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "highest mountain peaks"} -{"output": [["lex", "desert overview climate zones examples"], ["lex", "desert climate zones documentation"], ["lex", "desert overview climate zones tutorial"], ["vec", "guide for desert climate zones"], ["vec", "how to desert climate zones"], ["hyde", "This comprehensive guide covers everything you need to know about desert climate zones. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "desert climate zones"} -{"output": [["lex", "island overview nations list guide"], ["lex", "island nations list best practices"], ["lex", "island nations list documentation"], ["vec", "understanding island nations list"], ["vec", "how to island nations list"], ["hyde", "This comprehensive guide covers everything you need to know about island nations list. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "island nations list"} -{"output": [["lex", "capital cities europe best practices"], ["lex", "capital cities europe documentation"], ["lex", "capital overview cities europe tutorial"], ["vec", "guide for capital cities europe"], ["vec", "learn about capital cities europe"], ["hyde", "This comprehensive guide covers everything you need to know about capital cities europe. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "capital cities europe"} -{"output": [["lex", "population overview by continent guide"], ["lex", "population overview by continent examples"], ["lex", "population by continent best practices"], ["vec", "learn about population by continent"], ["vec", "understanding population by continent"], ["hyde", "This comprehensive guide covers everything you need to know about population by continent. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "population by continent"} -{"output": [["lex", "time overview zones map tutorial"], ["lex", "time overview zones map guide"], ["lex", "time zones map documentation"], ["vec", "how to time zones map"], ["vec", "complete time zones map reference"], ["hyde", "This comprehensive guide covers everything you need to know about time zones map. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "time zones map"} -{"output": [["lex", "latitude longitude coordinates best practices"], ["lex", "latitude longitude coordinates documentation"], ["lex", "latitude overview longitude coordinates tutorial"], ["vec", "complete latitude longitude coordinates reference"], ["vec", "how to latitude longitude coordinates"], ["hyde", "This comprehensive guide covers everything you need to know about latitude longitude coordinates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latitude longitude coordinates"} -{"output": [["lex", "borders overview between countries tutorial"], ["lex", "borders between countries documentation"], ["lex", "borders between countries best practices"], ["vec", "learn about borders between countries"], ["vec", "complete borders between countries reference"], ["hyde", "This comprehensive guide covers everything you need to know about borders between countries. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "borders between countries"} -{"output": [["lex", "ocean overview currents patterns tutorial"], ["lex", "ocean overview currents patterns examples"], ["lex", "ocean currents patterns documentation"], ["vec", "understanding ocean currents patterns"], ["vec", "how to ocean currents patterns"], ["hyde", "This comprehensive guide covers everything you need to know about ocean currents patterns. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "ocean currents patterns"} -{"output": [["lex", "tectonic overview plate boundaries examples"], ["lex", "tectonic plate boundaries documentation"], ["lex", "tectonic plate boundaries best practices"], ["vec", "complete tectonic plate boundaries reference"], ["vec", "learn about tectonic plate boundaries"], ["hyde", "This comprehensive guide covers everything you need to know about tectonic plate boundaries. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "tectonic plate boundaries"} -{"output": [["lex", "climate overview zones earth tutorial"], ["lex", "climate overview zones earth guide"], ["lex", "climate zones earth documentation"], ["vec", "learn about climate zones earth"], ["vec", "guide for climate zones earth"], ["hyde", "This comprehensive guide covers everything you need to know about climate zones earth. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate zones earth"} -{"output": [["lex", "stoicism overview daily practice examples"], ["lex", "stoicism daily practice best practices"], ["lex", "stoicism overview daily practice tutorial"], ["vec", "guide for stoicism daily practice"], ["vec", "learn about stoicism daily practice"], ["hyde", "This comprehensive guide covers everything you need to know about stoicism daily practice. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "stoicism daily practice"} -{"output": [["lex", "existentialism overview meaning life examples"], ["lex", "existentialism overview meaning life guide"], ["lex", "existentialism meaning life documentation"], ["vec", "learn about existentialism meaning life"], ["vec", "complete existentialism meaning life reference"], ["hyde", "This comprehensive guide covers everything you need to know about existentialism meaning life. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "existentialism meaning life"} -{"output": [["lex", "utilitarianism overview ethics explained tutorial"], ["lex", "utilitarianism overview ethics explained guide"], ["lex", "utilitarianism overview ethics explained examples"], ["vec", "guide for utilitarianism ethics explained"], ["vec", "complete utilitarianism ethics explained reference"], ["hyde", "This comprehensive guide covers everything you need to know about utilitarianism ethics explained. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "utilitarianism ethics explained"} -{"output": [["lex", "kant categorical imperative best practices"], ["lex", "kant overview categorical imperative guide"], ["lex", "kant overview categorical imperative tutorial"], ["vec", "complete kant categorical imperative reference"], ["vec", "how to kant categorical imperative"], ["hyde", "This comprehensive guide covers everything you need to know about kant categorical imperative. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "kant categorical imperative"} -{"output": [["lex", "free will determinism debate documentation"], ["lex", "free overview will determinism debate examples"], ["lex", "free overview will determinism debate tutorial"], ["vec", "complete free will determinism debate reference"], ["vec", "learn about free will determinism debate"], ["hyde", "This comprehensive guide covers everything you need to know about free will determinism debate. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "free will determinism debate"} -{"output": [["lex", "nietzsche overview will to power guide"], ["lex", "nietzsche will to power best practices"], ["lex", "nietzsche overview will to power examples"], ["vec", "complete nietzsche will to power reference"], ["vec", "learn about nietzsche will to power"], ["hyde", "This comprehensive guide covers everything you need to know about nietzsche will to power. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "nietzsche will to power"} -{"output": [["lex", "socrates overview method questioning guide"], ["lex", "socrates overview method questioning tutorial"], ["lex", "socrates overview method questioning examples"], ["vec", "understanding socrates method questioning"], ["vec", "complete socrates method questioning reference"], ["hyde", "This comprehensive guide covers everything you need to know about socrates method questioning. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "socrates method questioning"} -{"output": [["lex", "plato overview theory forms tutorial"], ["lex", "plato theory forms best practices"], ["lex", "plato overview theory forms guide"], ["vec", "how to plato theory forms"], ["vec", "guide for plato theory forms"], ["hyde", "This comprehensive guide covers everything you need to know about plato theory forms. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "plato theory forms"} -{"output": [["lex", "aristotle virtue ethics documentation"], ["lex", "aristotle virtue ethics best practices"], ["lex", "aristotle overview virtue ethics tutorial"], ["vec", "complete aristotle virtue ethics reference"], ["vec", "how to aristotle virtue ethics"], ["hyde", "This comprehensive guide covers everything you need to know about aristotle virtue ethics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "aristotle virtue ethics"} -{"output": [["lex", "descartes overview cogito ergo sum guide"], ["lex", "descartes overview cogito ergo sum examples"], ["lex", "descartes cogito ergo sum best practices"], ["vec", "complete descartes cogito ergo sum reference"], ["vec", "learn about descartes cogito ergo sum"], ["hyde", "This comprehensive guide covers everything you need to know about descartes cogito ergo sum. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "descartes cogito ergo sum"} -{"output": [["lex", "logic propositional calculus documentation"], ["lex", "logic overview propositional calculus tutorial"], ["lex", "logic overview propositional calculus guide"], ["vec", "understanding logic propositional calculus"], ["vec", "complete logic propositional calculus reference"], ["hyde", "This comprehensive guide covers everything you need to know about logic propositional calculus. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "logic propositional calculus"} -{"output": [["lex", "epistemology overview knowledge theory examples"], ["lex", "epistemology overview knowledge theory tutorial"], ["lex", "epistemology knowledge theory documentation"], ["vec", "learn about epistemology knowledge theory"], ["vec", "complete epistemology knowledge theory reference"], ["hyde", "This comprehensive guide covers everything you need to know about epistemology knowledge theory. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "epistemology knowledge theory"} -{"output": [["lex", "metaphysics overview existence reality tutorial"], ["lex", "metaphysics existence reality best practices"], ["lex", "metaphysics overview existence reality guide"], ["vec", "understanding metaphysics existence reality"], ["vec", "how to metaphysics existence reality"], ["hyde", "This comprehensive guide covers everything you need to know about metaphysics existence reality. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "metaphysics existence reality"} -{"output": [["lex", "ancient civilizations timeline documentation"], ["lex", "ancient overview civilizations timeline examples"], ["lex", "ancient civilizations timeline best practices"], ["vec", "complete ancient civilizations timeline reference"], ["vec", "understanding ancient civilizations timeline"], ["hyde", "This comprehensive guide covers everything you need to know about ancient civilizations timeline. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "ancient civilizations timeline"} -{"output": [["lex", "roman overview empire fall reasons guide"], ["lex", "roman empire fall reasons best practices"], ["lex", "roman empire fall reasons documentation"], ["vec", "guide for roman empire fall reasons"], ["vec", "how to roman empire fall reasons"], ["hyde", "This comprehensive guide covers everything you need to know about roman empire fall reasons. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "roman empire fall reasons"} -{"output": [["lex", "medieval period events documentation"], ["lex", "medieval period events best practices"], ["lex", "medieval overview period events tutorial"], ["vec", "learn about medieval period events"], ["vec", "how to medieval period events"], ["hyde", "This comprehensive guide covers everything you need to know about medieval period events. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "medieval period events"} -{"output": [["lex", "renaissance overview art movement examples"], ["lex", "renaissance overview art movement guide"], ["lex", "renaissance art movement documentation"], ["vec", "understanding renaissance art movement"], ["vec", "how to renaissance art movement"], ["hyde", "This comprehensive guide covers everything you need to know about renaissance art movement. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "renaissance art movement"} -{"output": [["lex", "industrial overview revolution inventions tutorial"], ["lex", "industrial revolution inventions best practices"], ["lex", "industrial overview revolution inventions examples"], ["vec", "how to industrial revolution inventions"], ["vec", "guide for industrial revolution inventions"], ["hyde", "This comprehensive guide covers everything you need to know about industrial revolution inventions. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "industrial revolution inventions"} -{"output": [["lex", "world overview war i causes tutorial"], ["lex", "world war i causes documentation"], ["lex", "world war i causes best practices"], ["vec", "learn about world war i causes"], ["vec", "how to world war i causes"], ["hyde", "This comprehensive guide covers everything you need to know about world war i causes. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "world war i causes"} -{"output": [["lex", "cold war key events best practices"], ["lex", "cold overview war key events tutorial"], ["lex", "cold overview war key events guide"], ["vec", "understanding cold war key events"], ["vec", "learn about cold war key events"], ["hyde", "This comprehensive guide covers everything you need to know about cold war key events. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "cold war key events"} -{"output": [["lex", "french overview revolution timeline tutorial"], ["lex", "french revolution timeline documentation"], ["lex", "french overview revolution timeline guide"], ["vec", "understanding french revolution timeline"], ["vec", "guide for french revolution timeline"], ["hyde", "This comprehensive guide covers everything you need to know about french revolution timeline. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "french revolution timeline"} -{"output": [["lex", "american civil war battles documentation"], ["lex", "american overview civil war battles tutorial"], ["lex", "american overview civil war battles guide"], ["vec", "learn about american civil war battles"], ["vec", "complete american civil war battles reference"], ["hyde", "This comprehensive guide covers everything you need to know about american civil war battles. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "american civil war battles"} -{"output": [["lex", "egyptian overview pharaohs dynasty guide"], ["lex", "egyptian overview pharaohs dynasty examples"], ["lex", "egyptian pharaohs dynasty documentation"], ["vec", "how to egyptian pharaohs dynasty"], ["vec", "understanding egyptian pharaohs dynasty"], ["hyde", "This comprehensive guide covers everything you need to know about egyptian pharaohs dynasty. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "egyptian pharaohs dynasty"} -{"output": [["lex", "bronze overview age collapse guide"], ["lex", "bronze overview age collapse tutorial"], ["lex", "bronze age collapse documentation"], ["vec", "guide for bronze age collapse"], ["vec", "understanding bronze age collapse"], ["hyde", "This comprehensive guide covers everything you need to know about bronze age collapse. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "bronze age collapse"} -{"output": [["lex", "byzantine overview empire history tutorial"], ["lex", "byzantine empire history best practices"], ["lex", "byzantine empire history documentation"], ["vec", "learn about byzantine empire history"], ["vec", "how to byzantine empire history"], ["hyde", "This comprehensive guide covers everything you need to know about byzantine empire history. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "byzantine empire history"} -{"output": [["lex", "vietnam overview war timeline examples"], ["lex", "vietnam war timeline best practices"], ["lex", "vietnam war timeline documentation"], ["vec", "understanding vietnam war timeline"], ["vec", "complete vietnam war timeline reference"], ["hyde", "This comprehensive guide covers everything you need to know about vietnam war timeline. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "vietnam war timeline"} -{"output": [["lex", "quantum overview mechanics basics guide"], ["lex", "quantum mechanics basics documentation"], ["lex", "quantum overview mechanics basics examples"], ["vec", "complete quantum mechanics basics reference"], ["vec", "learn about quantum mechanics basics"], ["hyde", "This comprehensive guide covers everything you need to know about quantum mechanics basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "quantum mechanics basics"} -{"output": [["lex", "theory of relativity explained documentation"], ["lex", "theory overview of relativity explained examples"], ["lex", "theory overview of relativity explained tutorial"], ["vec", "learn about theory of relativity explained"], ["vec", "guide for theory of relativity explained"], ["hyde", "This comprehensive guide covers everything you need to know about theory of relativity explained. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "theory of relativity explained"} -{"output": [["lex", "dna structure discovery best practices"], ["lex", "dna overview structure discovery tutorial"], ["lex", "dna overview structure discovery guide"], ["vec", "understanding dna structure discovery"], ["vec", "learn about dna structure discovery"], ["hyde", "This comprehensive guide covers everything you need to know about dna structure discovery. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "dna structure discovery"} -{"output": [["lex", "photosynthesis process steps documentation"], ["lex", "photosynthesis overview process steps guide"], ["lex", "photosynthesis overview process steps examples"], ["vec", "guide for photosynthesis process steps"], ["vec", "complete photosynthesis process steps reference"], ["hyde", "This comprehensive guide covers everything you need to know about photosynthesis process steps. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "photosynthesis process steps"} -{"output": [["lex", "black overview holes physics tutorial"], ["lex", "black overview holes physics examples"], ["lex", "black holes physics best practices"], ["vec", "understanding black holes physics"], ["vec", "complete black holes physics reference"], ["hyde", "This comprehensive guide covers everything you need to know about black holes physics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "black holes physics"} -{"output": [["lex", "plate overview tectonics theory examples"], ["lex", "plate overview tectonics theory guide"], ["lex", "plate tectonics theory best practices"], ["vec", "how to plate tectonics theory"], ["vec", "guide for plate tectonics theory"], ["hyde", "This comprehensive guide covers everything you need to know about plate tectonics theory. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "plate tectonics theory"} -{"output": [["lex", "evolution overview natural selection examples"], ["lex", "evolution natural selection best practices"], ["lex", "evolution natural selection documentation"], ["vec", "learn about evolution natural selection"], ["vec", "guide for evolution natural selection"], ["hyde", "This comprehensive guide covers everything you need to know about evolution natural selection. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "evolution natural selection"} -{"output": [["lex", "periodic overview table elements tutorial"], ["lex", "periodic overview table elements examples"], ["lex", "periodic table elements best practices"], ["vec", "understanding periodic table elements"], ["vec", "complete periodic table elements reference"], ["hyde", "This comprehensive guide covers everything you need to know about periodic table elements. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "periodic table elements"} -{"output": [["lex", "cell overview biology fundamentals tutorial"], ["lex", "cell overview biology fundamentals examples"], ["lex", "cell biology fundamentals best practices"], ["vec", "complete cell biology fundamentals reference"], ["vec", "how to cell biology fundamentals"], ["hyde", "This comprehensive guide covers everything you need to know about cell biology fundamentals. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "cell biology fundamentals"} -{"output": [["lex", "climate change evidence best practices"], ["lex", "climate overview change evidence examples"], ["lex", "climate change evidence documentation"], ["vec", "learn about climate change evidence"], ["vec", "complete climate change evidence reference"], ["hyde", "This comprehensive guide covers everything you need to know about climate change evidence. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate change evidence"} -{"output": [["lex", "impressionist overview painters list tutorial"], ["lex", "impressionist painters list best practices"], ["lex", "impressionist overview painters list guide"], ["vec", "understanding impressionist painters list"], ["vec", "complete impressionist painters list reference"], ["hyde", "This comprehensive guide covers everything you need to know about impressionist painters list. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "impressionist painters list"} -{"output": [["lex", "shakespeare overview plays summary guide"], ["lex", "shakespeare overview plays summary examples"], ["lex", "shakespeare overview plays summary tutorial"], ["vec", "how to shakespeare plays summary"], ["vec", "learn about shakespeare plays summary"], ["hyde", "This comprehensive guide covers everything you need to know about shakespeare plays summary. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "shakespeare plays summary"} -{"output": [["lex", "classical overview music composers examples"], ["lex", "classical music composers documentation"], ["lex", "classical music composers best practices"], ["vec", "how to classical music composers"], ["vec", "understanding classical music composers"], ["hyde", "This comprehensive guide covers everything you need to know about classical music composers. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "classical music composers"} -{"output": [["lex", "modern overview art movements tutorial"], ["lex", "modern overview art movements examples"], ["lex", "modern overview art movements guide"], ["vec", "how to modern art movements"], ["vec", "guide for modern art movements"], ["hyde", "This comprehensive guide covers everything you need to know about modern art movements. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "modern art movements"} -{"output": [["lex", "film overview noir characteristics examples"], ["lex", "film overview noir characteristics tutorial"], ["lex", "film noir characteristics documentation"], ["vec", "guide for film noir characteristics"], ["vec", "how to film noir characteristics"], ["hyde", "This comprehensive guide covers everything you need to know about film noir characteristics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "film noir characteristics"} -{"output": [["lex", "jazz history origins best practices"], ["lex", "jazz history origins documentation"], ["lex", "jazz overview history origins tutorial"], ["vec", "learn about jazz history origins"], ["vec", "understanding jazz history origins"], ["hyde", "This comprehensive guide covers everything you need to know about jazz history origins. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "jazz history origins"} -{"output": [["lex", "renaissance sculpture techniques documentation"], ["lex", "renaissance overview sculpture techniques examples"], ["lex", "renaissance sculpture techniques best practices"], ["vec", "how to renaissance sculpture techniques"], ["vec", "guide for renaissance sculpture techniques"], ["hyde", "This comprehensive guide covers everything you need to know about renaissance sculpture techniques. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "renaissance sculpture techniques"} -{"output": [["lex", "photography composition rules best practices"], ["lex", "photography composition rules documentation"], ["lex", "photography overview composition rules guide"], ["vec", "understanding photography composition rules"], ["vec", "complete photography composition rules reference"], ["hyde", "This comprehensive guide covers everything you need to know about photography composition rules. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "photography composition rules"} -{"output": [["lex", "poetry forms haiku documentation"], ["lex", "poetry overview forms haiku examples"], ["lex", "poetry overview forms haiku guide"], ["vec", "learn about poetry forms haiku"], ["vec", "how to poetry forms haiku"], ["hyde", "This comprehensive guide covers everything you need to know about poetry forms haiku. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "poetry forms haiku"} -{"output": [["lex", "baroque overview art characteristics tutorial"], ["lex", "baroque overview art characteristics guide"], ["lex", "baroque art characteristics best practices"], ["vec", "complete baroque art characteristics reference"], ["vec", "guide for baroque art characteristics"], ["hyde", "This comprehensive guide covers everything you need to know about baroque art characteristics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "baroque art characteristics"} -{"output": [["lex", "street overview art graffiti history guide"], ["lex", "street overview art graffiti history examples"], ["lex", "street art graffiti history documentation"], ["vec", "understanding street art graffiti history"], ["vec", "guide for street art graffiti history"], ["hyde", "This comprehensive guide covers everything you need to know about street art graffiti history. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "street art graffiti history"} -{"output": [["lex", "symptoms overview of vitamin deficiency examples"], ["lex", "symptoms of vitamin deficiency best practices"], ["lex", "symptoms overview of vitamin deficiency guide"], ["vec", "learn about symptoms of vitamin deficiency"], ["vec", "how to symptoms of vitamin deficiency"], ["hyde", "This comprehensive guide covers everything you need to know about symptoms of vitamin deficiency. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "symptoms of vitamin deficiency"} -{"output": [["lex", "how overview vaccines work immune system tutorial"], ["lex", "how overview vaccines work immune system examples"], ["lex", "how vaccines work immune system documentation"], ["vec", "guide for how vaccines work immune system"], ["vec", "how to how vaccines work immune system"], ["hyde", "This comprehensive guide covers everything you need to know about how vaccines work immune system. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "how vaccines work immune system"} -{"output": [["lex", "blood pressure normal range documentation"], ["lex", "blood overview pressure normal range examples"], ["lex", "blood pressure normal range best practices"], ["vec", "complete blood pressure normal range reference"], ["vec", "learn about blood pressure normal range"], ["hyde", "This comprehensive guide covers everything you need to know about blood pressure normal range. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "blood pressure normal range"} -{"output": [["lex", "sleep overview hygiene tips examples"], ["lex", "sleep hygiene tips best practices"], ["lex", "sleep overview hygiene tips guide"], ["vec", "learn about sleep hygiene tips"], ["vec", "guide for sleep hygiene tips"], ["hyde", "This comprehensive guide covers everything you need to know about sleep hygiene tips. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sleep hygiene tips"} -{"output": [["lex", "intermittent fasting benefits documentation"], ["lex", "intermittent overview fasting benefits guide"], ["lex", "intermittent fasting benefits best practices"], ["vec", "complete intermittent fasting benefits reference"], ["vec", "learn about intermittent fasting benefits"], ["hyde", "This comprehensive guide covers everything you need to know about intermittent fasting benefits. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "intermittent fasting benefits"} -{"output": [["lex", "anxiety overview coping strategies guide"], ["lex", "anxiety coping strategies best practices"], ["lex", "anxiety coping strategies documentation"], ["vec", "understanding anxiety coping strategies"], ["vec", "complete anxiety coping strategies reference"], ["hyde", "This comprehensive guide covers everything you need to know about anxiety coping strategies. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "anxiety coping strategies"} -{"output": [["lex", "stretching overview exercises back pain guide"], ["lex", "stretching exercises back pain best practices"], ["lex", "stretching overview exercises back pain tutorial"], ["vec", "how to stretching exercises back pain"], ["vec", "understanding stretching exercises back pain"], ["hyde", "This comprehensive guide covers everything you need to know about stretching exercises back pain. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "stretching exercises back pain"} -{"output": [["lex", "heart overview disease prevention guide"], ["lex", "heart overview disease prevention examples"], ["lex", "heart disease prevention best practices"], ["vec", "guide for heart disease prevention"], ["vec", "complete heart disease prevention reference"], ["hyde", "This comprehensive guide covers everything you need to know about heart disease prevention. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "heart disease prevention"} -{"output": [["lex", "diabetes type 2 management documentation"], ["lex", "diabetes type 2 management best practices"], ["lex", "diabetes overview type 2 management tutorial"], ["vec", "how to diabetes type 2 management"], ["vec", "guide for diabetes type 2 management"], ["hyde", "This comprehensive guide covers everything you need to know about diabetes type 2 management. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "diabetes type 2 management"} -{"output": [["lex", "meditation mental health documentation"], ["lex", "meditation overview mental health tutorial"], ["lex", "meditation overview mental health examples"], ["vec", "understanding meditation mental health"], ["vec", "learn about meditation mental health"], ["hyde", "This comprehensive guide covers everything you need to know about meditation mental health. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "meditation mental health"} -{"output": [["lex", "nutrition macros explained documentation"], ["lex", "nutrition macros explained best practices"], ["lex", "nutrition overview macros explained tutorial"], ["vec", "understanding nutrition macros explained"], ["vec", "guide for nutrition macros explained"], ["hyde", "This comprehensive guide covers everything you need to know about nutrition macros explained. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "nutrition macros explained"} -{"output": [["lex", "first aid basics best practices"], ["lex", "first overview aid basics tutorial"], ["lex", "first overview aid basics examples"], ["vec", "understanding first aid basics"], ["vec", "learn about first aid basics"], ["hyde", "This comprehensive guide covers everything you need to know about first aid basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "first aid basics"} -{"output": [["lex", "compound overview interest calculator examples"], ["lex", "compound overview interest calculator guide"], ["lex", "compound interest calculator best practices"], ["vec", "understanding compound interest calculator"], ["vec", "how to compound interest calculator"], ["hyde", "This comprehensive guide covers everything you need to know about compound interest calculator. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "compound interest calculator"} -{"output": [["lex", "stock overview market basics beginners guide"], ["lex", "stock market basics beginners documentation"], ["lex", "stock overview market basics beginners examples"], ["vec", "guide for stock market basics beginners"], ["vec", "learn about stock market basics beginners"], ["hyde", "This comprehensive guide covers everything you need to know about stock market basics beginners. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "stock market basics beginners"} -{"output": [["lex", "startup overview funding stages tutorial"], ["lex", "startup funding stages best practices"], ["lex", "startup funding stages documentation"], ["vec", "complete startup funding stages reference"], ["vec", "guide for startup funding stages"], ["hyde", "This comprehensive guide covers everything you need to know about startup funding stages. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "startup funding stages"} -{"output": [["lex", "tax deductions small business best practices"], ["lex", "tax deductions small business documentation"], ["lex", "tax overview deductions small business examples"], ["vec", "learn about tax deductions small business"], ["vec", "complete tax deductions small business reference"], ["hyde", "This comprehensive guide covers everything you need to know about tax deductions small business. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "tax deductions small business"} -{"output": [["lex", "budgeting overview methods 50 30 20 guide"], ["lex", "budgeting methods 50 30 20 best practices"], ["lex", "budgeting methods 50 30 20 documentation"], ["vec", "complete budgeting methods 50 30 20 reference"], ["vec", "how to budgeting methods 50 30 20"], ["hyde", "This comprehensive guide covers everything you need to know about budgeting methods 50 30 20. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "budgeting methods 50 30 20"} -{"output": [["lex", "cryptocurrency explained simply documentation"], ["lex", "cryptocurrency overview explained simply examples"], ["lex", "cryptocurrency overview explained simply guide"], ["vec", "how to cryptocurrency explained simply"], ["vec", "learn about cryptocurrency explained simply"], ["hyde", "This comprehensive guide covers everything you need to know about cryptocurrency explained simply. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "cryptocurrency explained simply"} -{"output": [["lex", "inflation effects on savings documentation"], ["lex", "inflation overview effects on savings tutorial"], ["lex", "inflation overview effects on savings guide"], ["vec", "guide for inflation effects on savings"], ["vec", "complete inflation effects on savings reference"], ["hyde", "This comprehensive guide covers everything you need to know about inflation effects on savings. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "inflation effects on savings"} -{"output": [["lex", "retirement overview planning strategies guide"], ["lex", "retirement planning strategies documentation"], ["lex", "retirement overview planning strategies examples"], ["vec", "understanding retirement planning strategies"], ["vec", "how to retirement planning strategies"], ["hyde", "This comprehensive guide covers everything you need to know about retirement planning strategies. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "retirement planning strategies"} -{"output": [["lex", "passive income ideas documentation"], ["lex", "passive overview income ideas guide"], ["lex", "passive overview income ideas tutorial"], ["vec", "how to passive income ideas"], ["vec", "guide for passive income ideas"], ["hyde", "This comprehensive guide covers everything you need to know about passive income ideas. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "passive income ideas"} -{"output": [["lex", "venture overview capital vs angel investors tutorial"], ["lex", "venture capital vs angel investors best practices"], ["lex", "venture overview capital vs angel investors guide"], ["vec", "learn about venture capital vs angel investors"], ["vec", "guide for venture capital vs angel investors"], ["hyde", "This comprehensive guide covers everything you need to know about venture capital vs angel investors. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "venture capital vs angel investors"} -{"output": [["lex", "balance overview sheet basics guide"], ["lex", "balance overview sheet basics tutorial"], ["lex", "balance overview sheet basics examples"], ["vec", "complete balance sheet basics reference"], ["vec", "how to balance sheet basics"], ["hyde", "This comprehensive guide covers everything you need to know about balance sheet basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "balance sheet basics"} -{"output": [["lex", "supply overview chain management tutorial"], ["lex", "supply overview chain management guide"], ["lex", "supply chain management best practices"], ["vec", "learn about supply chain management"], ["vec", "guide for supply chain management"], ["hyde", "This comprehensive guide covers everything you need to know about supply chain management. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "supply chain management"} -{"output": [["lex", "marathon overview training schedule guide"], ["lex", "marathon overview training schedule tutorial"], ["lex", "marathon training schedule best practices"], ["vec", "learn about marathon training schedule"], ["vec", "guide for marathon training schedule"], ["hyde", "This comprehensive guide covers everything you need to know about marathon training schedule. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "marathon training schedule"} -{"output": [["lex", "weightlifting overview proper form guide"], ["lex", "weightlifting proper form documentation"], ["lex", "weightlifting overview proper form examples"], ["vec", "guide for weightlifting proper form"], ["vec", "how to weightlifting proper form"], ["hyde", "This comprehensive guide covers everything you need to know about weightlifting proper form. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "weightlifting proper form"} -{"output": [["lex", "swimming overview stroke techniques tutorial"], ["lex", "swimming stroke techniques best practices"], ["lex", "swimming overview stroke techniques guide"], ["vec", "how to swimming stroke techniques"], ["vec", "complete swimming stroke techniques reference"], ["hyde", "This comprehensive guide covers everything you need to know about swimming stroke techniques. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "swimming stroke techniques"} -{"output": [["lex", "tennis serve mechanics documentation"], ["lex", "tennis overview serve mechanics tutorial"], ["lex", "tennis overview serve mechanics examples"], ["vec", "understanding tennis serve mechanics"], ["vec", "how to tennis serve mechanics"], ["hyde", "This comprehensive guide covers everything you need to know about tennis serve mechanics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "tennis serve mechanics"} -{"output": [["lex", "basketball dribbling drills documentation"], ["lex", "basketball overview dribbling drills tutorial"], ["lex", "basketball dribbling drills best practices"], ["vec", "understanding basketball dribbling drills"], ["vec", "complete basketball dribbling drills reference"], ["hyde", "This comprehensive guide covers everything you need to know about basketball dribbling drills. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "basketball dribbling drills"} -{"output": [["lex", "soccer formations tactics documentation"], ["lex", "soccer overview formations tactics tutorial"], ["lex", "soccer formations tactics best practices"], ["vec", "complete soccer formations tactics reference"], ["vec", "understanding soccer formations tactics"], ["hyde", "This comprehensive guide covers everything you need to know about soccer formations tactics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "soccer formations tactics"} -{"output": [["lex", "golf overview swing fundamentals examples"], ["lex", "golf overview swing fundamentals guide"], ["lex", "golf overview swing fundamentals tutorial"], ["vec", "how to golf swing fundamentals"], ["vec", "learn about golf swing fundamentals"], ["hyde", "This comprehensive guide covers everything you need to know about golf swing fundamentals. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "golf swing fundamentals"} -{"output": [["lex", "yoga overview poses beginners guide"], ["lex", "yoga overview poses beginners examples"], ["lex", "yoga poses beginners documentation"], ["vec", "learn about yoga poses beginners"], ["vec", "guide for yoga poses beginners"], ["hyde", "This comprehensive guide covers everything you need to know about yoga poses beginners. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "yoga poses beginners"} -{"output": [["lex", "running injury prevention best practices"], ["lex", "running overview injury prevention tutorial"], ["lex", "running overview injury prevention examples"], ["vec", "understanding running injury prevention"], ["vec", "guide for running injury prevention"], ["hyde", "This comprehensive guide covers everything you need to know about running injury prevention. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "running injury prevention"} -{"output": [["lex", "cycling overview gear ratios guide"], ["lex", "cycling overview gear ratios tutorial"], ["lex", "cycling gear ratios best practices"], ["vec", "complete cycling gear ratios reference"], ["vec", "guide for cycling gear ratios"], ["hyde", "This comprehensive guide covers everything you need to know about cycling gear ratios. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "cycling gear ratios"} -{"output": [["lex", "rock climbing grades documentation"], ["lex", "rock overview climbing grades tutorial"], ["lex", "rock overview climbing grades examples"], ["vec", "complete rock climbing grades reference"], ["vec", "how to rock climbing grades"], ["hyde", "This comprehensive guide covers everything you need to know about rock climbing grades. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "rock climbing grades"} -{"output": [["lex", "surfing overview wave types tutorial"], ["lex", "surfing overview wave types examples"], ["lex", "surfing wave types documentation"], ["vec", "guide for surfing wave types"], ["vec", "complete surfing wave types reference"], ["hyde", "This comprehensive guide covers everything you need to know about surfing wave types. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "surfing wave types"} -{"output": [["lex", "best overview time visit japan examples"], ["lex", "best time visit japan documentation"], ["lex", "best time visit japan best practices"], ["vec", "understanding best time visit japan"], ["vec", "guide for best time visit japan"], ["hyde", "This comprehensive guide covers everything you need to know about best time visit japan. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "best time visit japan"} -{"output": [["lex", "travel packing checklist documentation"], ["lex", "travel overview packing checklist tutorial"], ["lex", "travel overview packing checklist guide"], ["vec", "complete travel packing checklist reference"], ["vec", "guide for travel packing checklist"], ["hyde", "This comprehensive guide covers everything you need to know about travel packing checklist. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "travel packing checklist"} -{"output": [["lex", "budget backpacking europe documentation"], ["lex", "budget overview backpacking europe guide"], ["lex", "budget overview backpacking europe examples"], ["vec", "learn about budget backpacking europe"], ["vec", "how to budget backpacking europe"], ["hyde", "This comprehensive guide covers everything you need to know about budget backpacking europe. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "budget backpacking europe"} -{"output": [["lex", "visa requirements usa best practices"], ["lex", "visa overview requirements usa tutorial"], ["lex", "visa overview requirements usa examples"], ["vec", "guide for visa requirements usa"], ["vec", "learn about visa requirements usa"], ["hyde", "This comprehensive guide covers everything you need to know about visa requirements usa. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "visa requirements usa"} -{"output": [["lex", "jet overview lag remedies guide"], ["lex", "jet overview lag remedies examples"], ["lex", "jet lag remedies best practices"], ["vec", "understanding jet lag remedies"], ["vec", "guide for jet lag remedies"], ["hyde", "This comprehensive guide covers everything you need to know about jet lag remedies. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "jet lag remedies"} -{"output": [["lex", "road overview trip planning tips tutorial"], ["lex", "road overview trip planning tips examples"], ["lex", "road overview trip planning tips guide"], ["vec", "learn about road trip planning tips"], ["vec", "complete road trip planning tips reference"], ["hyde", "This comprehensive guide covers everything you need to know about road trip planning tips. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "road trip planning tips"} -{"output": [["lex", "solo overview travel safety tutorial"], ["lex", "solo travel safety best practices"], ["lex", "solo travel safety documentation"], ["vec", "guide for solo travel safety"], ["vec", "learn about solo travel safety"], ["hyde", "This comprehensive guide covers everything you need to know about solo travel safety. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "solo travel safety"} -{"output": [["lex", "airport overview security rules examples"], ["lex", "airport overview security rules guide"], ["lex", "airport overview security rules tutorial"], ["vec", "understanding airport security rules"], ["vec", "learn about airport security rules"], ["hyde", "This comprehensive guide covers everything you need to know about airport security rules. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "airport security rules"} -{"output": [["lex", "travel overview insurance coverage guide"], ["lex", "travel overview insurance coverage examples"], ["lex", "travel overview insurance coverage tutorial"], ["vec", "understanding travel insurance coverage"], ["vec", "how to travel insurance coverage"], ["hyde", "This comprehensive guide covers everything you need to know about travel insurance coverage. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "travel insurance coverage"} -{"output": [["lex", "language overview apps learning tutorial"], ["lex", "language overview apps learning examples"], ["lex", "language overview apps learning guide"], ["vec", "guide for language apps learning"], ["vec", "understanding language apps learning"], ["hyde", "This comprehensive guide covers everything you need to know about language apps learning. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "language apps learning"} -{"output": [["lex", "hostel overview vs hotel comparison examples"], ["lex", "hostel vs hotel comparison documentation"], ["lex", "hostel vs hotel comparison best practices"], ["vec", "understanding hostel vs hotel comparison"], ["vec", "learn about hostel vs hotel comparison"], ["hyde", "This comprehensive guide covers everything you need to know about hostel vs hotel comparison. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "hostel vs hotel comparison"} -{"output": [["lex", "travel overview photography tips examples"], ["lex", "travel overview photography tips tutorial"], ["lex", "travel photography tips documentation"], ["vec", "how to travel photography tips"], ["vec", "complete travel photography tips reference"], ["hyde", "This comprehensive guide covers everything you need to know about travel photography tips. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "travel photography tips"} -{"output": [["lex", "bread baking techniques best practices"], ["lex", "bread overview baking techniques guide"], ["lex", "bread overview baking techniques tutorial"], ["vec", "complete bread baking techniques reference"], ["vec", "guide for bread baking techniques"], ["hyde", "This comprehensive guide covers everything you need to know about bread baking techniques. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "bread baking techniques"} -{"output": [["lex", "knife overview skills basics guide"], ["lex", "knife overview skills basics examples"], ["lex", "knife skills basics best practices"], ["vec", "how to knife skills basics"], ["vec", "complete knife skills basics reference"], ["hyde", "This comprehensive guide covers everything you need to know about knife skills basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "knife skills basics"} -{"output": [["lex", "fermentation overview at home tutorial"], ["lex", "fermentation at home documentation"], ["lex", "fermentation overview at home examples"], ["vec", "complete fermentation at home reference"], ["vec", "guide for fermentation at home"], ["hyde", "This comprehensive guide covers everything you need to know about fermentation at home. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "fermentation at home"} -{"output": [["lex", "meal overview prep weekly guide"], ["lex", "meal overview prep weekly tutorial"], ["lex", "meal prep weekly documentation"], ["vec", "guide for meal prep weekly"], ["vec", "understanding meal prep weekly"], ["hyde", "This comprehensive guide covers everything you need to know about meal prep weekly. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "meal prep weekly"} -{"output": [["lex", "spice combinations guide documentation"], ["lex", "spice overview combinations guide tutorial"], ["lex", "spice overview combinations guide examples"], ["vec", "guide for spice combinations guide"], ["vec", "complete spice combinations guide reference"], ["hyde", "This comprehensive guide covers everything you need to know about spice combinations guide. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "spice combinations guide"} -{"output": [["lex", "pasta making fresh best practices"], ["lex", "pasta overview making fresh tutorial"], ["lex", "pasta overview making fresh guide"], ["vec", "guide for pasta making fresh"], ["vec", "complete pasta making fresh reference"], ["hyde", "This comprehensive guide covers everything you need to know about pasta making fresh. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "pasta making fresh"} -{"output": [["lex", "coffee overview brewing methods examples"], ["lex", "coffee overview brewing methods guide"], ["lex", "coffee brewing methods documentation"], ["vec", "complete coffee brewing methods reference"], ["vec", "learn about coffee brewing methods"], ["hyde", "This comprehensive guide covers everything you need to know about coffee brewing methods. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "coffee brewing methods"} -{"output": [["lex", "wine overview pairing basics tutorial"], ["lex", "wine overview pairing basics examples"], ["lex", "wine pairing basics best practices"], ["vec", "guide for wine pairing basics"], ["vec", "learn about wine pairing basics"], ["hyde", "This comprehensive guide covers everything you need to know about wine pairing basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "wine pairing basics"} -{"output": [["lex", "vegetarian overview protein sources guide"], ["lex", "vegetarian overview protein sources tutorial"], ["lex", "vegetarian overview protein sources examples"], ["vec", "how to vegetarian protein sources"], ["vec", "complete vegetarian protein sources reference"], ["hyde", "This comprehensive guide covers everything you need to know about vegetarian protein sources. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "vegetarian protein sources"} -{"output": [["lex", "food storage guidelines documentation"], ["lex", "food storage guidelines best practices"], ["lex", "food overview storage guidelines examples"], ["vec", "guide for food storage guidelines"], ["vec", "how to food storage guidelines"], ["hyde", "This comprehensive guide covers everything you need to know about food storage guidelines. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "food storage guidelines"} -{"output": [["lex", "sourdough overview starter maintenance examples"], ["lex", "sourdough overview starter maintenance tutorial"], ["lex", "sourdough overview starter maintenance guide"], ["vec", "how to sourdough starter maintenance"], ["vec", "learn about sourdough starter maintenance"], ["hyde", "This comprehensive guide covers everything you need to know about sourdough starter maintenance. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sourdough starter maintenance"} -{"output": [["lex", "grilling overview temperature chart guide"], ["lex", "grilling temperature chart documentation"], ["lex", "grilling overview temperature chart examples"], ["vec", "guide for grilling temperature chart"], ["vec", "understanding grilling temperature chart"], ["hyde", "This comprehensive guide covers everything you need to know about grilling temperature chart. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "grilling temperature chart"} -{"output": [["lex", "cognitive overview biases list guide"], ["lex", "cognitive overview biases list tutorial"], ["lex", "cognitive overview biases list examples"], ["vec", "complete cognitive biases list reference"], ["vec", "how to cognitive biases list"], ["hyde", "This comprehensive guide covers everything you need to know about cognitive biases list. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "cognitive biases list"} -{"output": [["lex", "attachment theory styles best practices"], ["lex", "attachment overview theory styles examples"], ["lex", "attachment theory styles documentation"], ["vec", "learn about attachment theory styles"], ["vec", "understanding attachment theory styles"], ["hyde", "This comprehensive guide covers everything you need to know about attachment theory styles. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "attachment theory styles"} -{"output": [["lex", "maslow hierarchy needs best practices"], ["lex", "maslow overview hierarchy needs tutorial"], ["lex", "maslow overview hierarchy needs examples"], ["vec", "understanding maslow hierarchy needs"], ["vec", "learn about maslow hierarchy needs"], ["hyde", "This comprehensive guide covers everything you need to know about maslow hierarchy needs. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "maslow hierarchy needs"} -{"output": [["lex", "growth overview mindset vs fixed tutorial"], ["lex", "growth overview mindset vs fixed guide"], ["lex", "growth mindset vs fixed documentation"], ["vec", "complete growth mindset vs fixed reference"], ["vec", "learn about growth mindset vs fixed"], ["hyde", "This comprehensive guide covers everything you need to know about growth mindset vs fixed. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "growth mindset vs fixed"} -{"output": [["lex", "emotional overview intelligence components guide"], ["lex", "emotional intelligence components best practices"], ["lex", "emotional overview intelligence components examples"], ["vec", "how to emotional intelligence components"], ["vec", "complete emotional intelligence components reference"], ["hyde", "This comprehensive guide covers everything you need to know about emotional intelligence components. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "emotional intelligence components"} -{"output": [["lex", "memory overview techniques mnemonics guide"], ["lex", "memory techniques mnemonics documentation"], ["lex", "memory techniques mnemonics best practices"], ["vec", "how to memory techniques mnemonics"], ["vec", "learn about memory techniques mnemonics"], ["hyde", "This comprehensive guide covers everything you need to know about memory techniques mnemonics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "memory techniques mnemonics"} -{"output": [["lex", "habit overview formation science examples"], ["lex", "habit overview formation science tutorial"], ["lex", "habit formation science documentation"], ["vec", "learn about habit formation science"], ["vec", "guide for habit formation science"], ["hyde", "This comprehensive guide covers everything you need to know about habit formation science. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "habit formation science"} -{"output": [["lex", "stress overview response fight flight guide"], ["lex", "stress overview response fight flight examples"], ["lex", "stress response fight flight documentation"], ["vec", "how to stress response fight flight"], ["vec", "understanding stress response fight flight"], ["hyde", "This comprehensive guide covers everything you need to know about stress response fight flight. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "stress response fight flight"} -{"output": [["lex", "personality types myers briggs documentation"], ["lex", "personality overview types myers briggs examples"], ["lex", "personality overview types myers briggs tutorial"], ["vec", "understanding personality types myers briggs"], ["vec", "how to personality types myers briggs"], ["hyde", "This comprehensive guide covers everything you need to know about personality types myers briggs. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "personality types myers briggs"} -{"output": [["lex", "motivation overview intrinsic extrinsic guide"], ["lex", "motivation overview intrinsic extrinsic examples"], ["lex", "motivation overview intrinsic extrinsic tutorial"], ["vec", "how to motivation intrinsic extrinsic"], ["vec", "guide for motivation intrinsic extrinsic"], ["hyde", "This comprehensive guide covers everything you need to know about motivation intrinsic extrinsic. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "motivation intrinsic extrinsic"} -{"output": [["lex", "decision overview making psychology tutorial"], ["lex", "decision making psychology best practices"], ["lex", "decision overview making psychology examples"], ["vec", "learn about decision making psychology"], ["vec", "how to decision making psychology"], ["hyde", "This comprehensive guide covers everything you need to know about decision making psychology. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "decision making psychology"} -{"output": [["lex", "procrastination overview causes solutions guide"], ["lex", "procrastination causes solutions documentation"], ["lex", "procrastination overview causes solutions examples"], ["vec", "complete procrastination causes solutions reference"], ["vec", "how to procrastination causes solutions"], ["hyde", "This comprehensive guide covers everything you need to know about procrastination causes solutions. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "procrastination causes solutions"} -{"output": [["lex", "renewable energy types documentation"], ["lex", "renewable overview energy types tutorial"], ["lex", "renewable energy types best practices"], ["vec", "complete renewable energy types reference"], ["vec", "learn about renewable energy types"], ["hyde", "This comprehensive guide covers everything you need to know about renewable energy types. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "renewable energy types"} -{"output": [["lex", "carbon footprint reduction documentation"], ["lex", "carbon footprint reduction best practices"], ["lex", "carbon overview footprint reduction tutorial"], ["vec", "guide for carbon footprint reduction"], ["vec", "learn about carbon footprint reduction"], ["hyde", "This comprehensive guide covers everything you need to know about carbon footprint reduction. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "carbon footprint reduction"} -{"output": [["lex", "composting overview basics home examples"], ["lex", "composting overview basics home guide"], ["lex", "composting overview basics home tutorial"], ["vec", "how to composting basics home"], ["vec", "complete composting basics home reference"], ["hyde", "This comprehensive guide covers everything you need to know about composting basics home. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "composting basics home"} -{"output": [["lex", "endangered species list best practices"], ["lex", "endangered overview species list examples"], ["lex", "endangered overview species list guide"], ["vec", "learn about endangered species list"], ["vec", "guide for endangered species list"], ["hyde", "This comprehensive guide covers everything you need to know about endangered species list. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "endangered species list"} -{"output": [["lex", "recycling symbols meaning documentation"], ["lex", "recycling overview symbols meaning examples"], ["lex", "recycling symbols meaning best practices"], ["vec", "complete recycling symbols meaning reference"], ["vec", "how to recycling symbols meaning"], ["hyde", "This comprehensive guide covers everything you need to know about recycling symbols meaning. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recycling symbols meaning"} -{"output": [["lex", "ocean overview plastic pollution examples"], ["lex", "ocean overview plastic pollution guide"], ["lex", "ocean plastic pollution documentation"], ["vec", "learn about ocean plastic pollution"], ["vec", "guide for ocean plastic pollution"], ["hyde", "This comprehensive guide covers everything you need to know about ocean plastic pollution. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "ocean plastic pollution"} -{"output": [["lex", "deforestation effects best practices"], ["lex", "deforestation overview effects tutorial"], ["lex", "deforestation overview effects guide"], ["vec", "understanding deforestation effects"], ["vec", "guide for deforestation effects"], ["hyde", "This comprehensive guide covers everything you need to know about deforestation effects. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "deforestation effects"} -{"output": [["lex", "sustainable living tips best practices"], ["lex", "sustainable living tips documentation"], ["lex", "sustainable overview living tips guide"], ["vec", "learn about sustainable living tips"], ["vec", "complete sustainable living tips reference"], ["hyde", "This comprehensive guide covers everything you need to know about sustainable living tips. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sustainable living tips"} -{"output": [["lex", "wildlife overview conservation efforts guide"], ["lex", "wildlife overview conservation efforts examples"], ["lex", "wildlife conservation efforts documentation"], ["vec", "how to wildlife conservation efforts"], ["vec", "complete wildlife conservation efforts reference"], ["hyde", "This comprehensive guide covers everything you need to know about wildlife conservation efforts. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "wildlife conservation efforts"} -{"output": [["lex", "solar overview panel installation examples"], ["lex", "solar overview panel installation guide"], ["lex", "solar panel installation documentation"], ["vec", "complete solar panel installation reference"], ["vec", "how to solar panel installation"], ["hyde", "This comprehensive guide covers everything you need to know about solar panel installation. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "solar panel installation"} -{"output": [["lex", "water overview conservation methods examples"], ["lex", "water overview conservation methods guide"], ["lex", "water conservation methods documentation"], ["vec", "guide for water conservation methods"], ["vec", "learn about water conservation methods"], ["hyde", "This comprehensive guide covers everything you need to know about water conservation methods. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "water conservation methods"} -{"output": [["lex", "biodiversity importance best practices"], ["lex", "biodiversity importance documentation"], ["lex", "biodiversity overview importance examples"], ["vec", "complete biodiversity importance reference"], ["vec", "understanding biodiversity importance"], ["hyde", "This comprehensive guide covers everything you need to know about biodiversity importance. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "biodiversity importance"} -{"output": [["lex", "calculus derivatives explained best practices"], ["lex", "calculus overview derivatives explained examples"], ["lex", "calculus derivatives explained documentation"], ["vec", "learn about calculus derivatives explained"], ["vec", "how to calculus derivatives explained"], ["hyde", "This comprehensive guide covers everything you need to know about calculus derivatives explained. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "calculus derivatives explained"} -{"output": [["lex", "probability overview basics statistics tutorial"], ["lex", "probability basics statistics documentation"], ["lex", "probability basics statistics best practices"], ["vec", "guide for probability basics statistics"], ["vec", "how to probability basics statistics"], ["hyde", "This comprehensive guide covers everything you need to know about probability basics statistics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "probability basics statistics"} -{"output": [["lex", "linear overview algebra matrices guide"], ["lex", "linear algebra matrices documentation"], ["lex", "linear overview algebra matrices tutorial"], ["vec", "how to linear algebra matrices"], ["vec", "complete linear algebra matrices reference"], ["hyde", "This comprehensive guide covers everything you need to know about linear algebra matrices. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "linear algebra matrices"} -{"output": [["lex", "geometry proofs theorems documentation"], ["lex", "geometry proofs theorems best practices"], ["lex", "geometry overview proofs theorems examples"], ["vec", "how to geometry proofs theorems"], ["vec", "complete geometry proofs theorems reference"], ["hyde", "This comprehensive guide covers everything you need to know about geometry proofs theorems. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "geometry proofs theorems"} -{"output": [["lex", "logarithms overview rules properties examples"], ["lex", "logarithms rules properties best practices"], ["lex", "logarithms rules properties documentation"], ["vec", "how to logarithms rules properties"], ["vec", "understanding logarithms rules properties"], ["hyde", "This comprehensive guide covers everything you need to know about logarithms rules properties. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "logarithms rules properties"} -{"output": [["lex", "trigonometry overview identities guide"], ["lex", "trigonometry identities documentation"], ["lex", "trigonometry identities best practices"], ["vec", "learn about trigonometry identities"], ["vec", "how to trigonometry identities"], ["hyde", "This comprehensive guide covers everything you need to know about trigonometry identities. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "trigonometry identities"} -{"output": [["lex", "set theory basics documentation"], ["lex", "set overview theory basics guide"], ["lex", "set overview theory basics tutorial"], ["vec", "understanding set theory basics"], ["vec", "complete set theory basics reference"], ["hyde", "This comprehensive guide covers everything you need to know about set theory basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "set theory basics"} -{"output": [["lex", "prime numbers properties best practices"], ["lex", "prime overview numbers properties guide"], ["lex", "prime numbers properties documentation"], ["vec", "complete prime numbers properties reference"], ["vec", "guide for prime numbers properties"], ["hyde", "This comprehensive guide covers everything you need to know about prime numbers properties. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "prime numbers properties"} -{"output": [["lex", "fractions overview decimals conversion guide"], ["lex", "fractions overview decimals conversion tutorial"], ["lex", "fractions decimals conversion best practices"], ["vec", "guide for fractions decimals conversion"], ["vec", "complete fractions decimals conversion reference"], ["hyde", "This comprehensive guide covers everything you need to know about fractions decimals conversion. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "fractions decimals conversion"} -{"output": [["lex", "algebra overview equations solving tutorial"], ["lex", "algebra overview equations solving guide"], ["lex", "algebra equations solving best practices"], ["vec", "understanding algebra equations solving"], ["vec", "learn about algebra equations solving"], ["hyde", "This comprehensive guide covers everything you need to know about algebra equations solving. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "algebra equations solving"} -{"output": [["lex", "graph overview theory fundamentals tutorial"], ["lex", "graph theory fundamentals documentation"], ["lex", "graph overview theory fundamentals examples"], ["vec", "complete graph theory fundamentals reference"], ["vec", "understanding graph theory fundamentals"], ["hyde", "This comprehensive guide covers everything you need to know about graph theory fundamentals. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "graph theory fundamentals"} -{"output": [["lex", "combinatorics permutations best practices"], ["lex", "combinatorics overview permutations tutorial"], ["lex", "combinatorics permutations documentation"], ["vec", "understanding combinatorics permutations"], ["vec", "how to combinatorics permutations"], ["hyde", "This comprehensive guide covers everything you need to know about combinatorics permutations. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "combinatorics permutations"} -{"output": [["lex", "spanish verb conjugation documentation"], ["lex", "spanish overview verb conjugation guide"], ["lex", "spanish overview verb conjugation examples"], ["vec", "how to spanish verb conjugation"], ["vec", "learn about spanish verb conjugation"], ["hyde", "This comprehensive guide covers everything you need to know about spanish verb conjugation. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "spanish verb conjugation"} -{"output": [["lex", "japanese hiragana katakana best practices"], ["lex", "japanese overview hiragana katakana guide"], ["lex", "japanese hiragana katakana documentation"], ["vec", "complete japanese hiragana katakana reference"], ["vec", "guide for japanese hiragana katakana"], ["hyde", "This comprehensive guide covers everything you need to know about japanese hiragana katakana. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "japanese hiragana katakana"} -{"output": [["lex", "french overview pronunciation rules guide"], ["lex", "french pronunciation rules documentation"], ["lex", "french overview pronunciation rules examples"], ["vec", "learn about french pronunciation rules"], ["vec", "how to french pronunciation rules"], ["hyde", "This comprehensive guide covers everything you need to know about french pronunciation rules. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "french pronunciation rules"} -{"output": [["lex", "german overview cases grammar examples"], ["lex", "german overview cases grammar guide"], ["lex", "german overview cases grammar tutorial"], ["vec", "understanding german cases grammar"], ["vec", "how to german cases grammar"], ["hyde", "This comprehensive guide covers everything you need to know about german cases grammar. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "german cases grammar"} -{"output": [["lex", "mandarin overview tones guide guide"], ["lex", "mandarin tones guide best practices"], ["lex", "mandarin overview tones guide examples"], ["vec", "guide for mandarin tones guide"], ["vec", "understanding mandarin tones guide"], ["hyde", "This comprehensive guide covers everything you need to know about mandarin tones guide. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "mandarin tones guide"} -{"output": [["lex", "latin phrases common documentation"], ["lex", "latin overview phrases common tutorial"], ["lex", "latin overview phrases common examples"], ["vec", "learn about latin phrases common"], ["vec", "guide for latin phrases common"], ["hyde", "This comprehensive guide covers everything you need to know about latin phrases common. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latin phrases common"} -{"output": [["lex", "arabic overview alphabet basics guide"], ["lex", "arabic overview alphabet basics examples"], ["lex", "arabic alphabet basics best practices"], ["vec", "complete arabic alphabet basics reference"], ["vec", "understanding arabic alphabet basics"], ["hyde", "This comprehensive guide covers everything you need to know about arabic alphabet basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "arabic alphabet basics"} -{"output": [["lex", "english overview idioms meanings guide"], ["lex", "english overview idioms meanings examples"], ["lex", "english idioms meanings documentation"], ["vec", "how to english idioms meanings"], ["vec", "understanding english idioms meanings"], ["hyde", "This comprehensive guide covers everything you need to know about english idioms meanings. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "english idioms meanings"} -{"output": [["lex", "sign language basics documentation"], ["lex", "sign language basics best practices"], ["lex", "sign overview language basics examples"], ["vec", "guide for sign language basics"], ["vec", "understanding sign language basics"], ["hyde", "This comprehensive guide covers everything you need to know about sign language basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sign language basics"} -{"output": [["lex", "etymology overview word origins tutorial"], ["lex", "etymology overview word origins examples"], ["lex", "etymology word origins documentation"], ["vec", "how to etymology word origins"], ["vec", "guide for etymology word origins"], ["hyde", "This comprehensive guide covers everything you need to know about etymology word origins. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "etymology word origins"} -{"output": [["lex", "grammar punctuation rules best practices"], ["lex", "grammar punctuation rules documentation"], ["lex", "grammar overview punctuation rules tutorial"], ["vec", "guide for grammar punctuation rules"], ["vec", "understanding grammar punctuation rules"], ["hyde", "This comprehensive guide covers everything you need to know about grammar punctuation rules. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "grammar punctuation rules"} -{"output": [["lex", "writing overview style guides guide"], ["lex", "writing overview style guides examples"], ["lex", "writing overview style guides tutorial"], ["vec", "complete writing style guides reference"], ["vec", "learn about writing style guides"], ["hyde", "This comprehensive guide covers everything you need to know about writing style guides. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "writing style guides"} -{"output": [["lex", "woodworking joints types documentation"], ["lex", "woodworking overview joints types guide"], ["lex", "woodworking overview joints types tutorial"], ["vec", "how to woodworking joints types"], ["vec", "learn about woodworking joints types"], ["hyde", "This comprehensive guide covers everything you need to know about woodworking joints types. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "woodworking joints types"} -{"output": [["lex", "knitting patterns beginners documentation"], ["lex", "knitting overview patterns beginners examples"], ["lex", "knitting overview patterns beginners tutorial"], ["vec", "guide for knitting patterns beginners"], ["vec", "learn about knitting patterns beginners"], ["hyde", "This comprehensive guide covers everything you need to know about knitting patterns beginners. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "knitting patterns beginners"} -{"output": [["lex", "home overview repair basics guide"], ["lex", "home overview repair basics tutorial"], ["lex", "home repair basics documentation"], ["vec", "how to home repair basics"], ["vec", "complete home repair basics reference"], ["hyde", "This comprehensive guide covers everything you need to know about home repair basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "home repair basics"} -{"output": [["lex", "sewing overview machine threading tutorial"], ["lex", "sewing overview machine threading examples"], ["lex", "sewing machine threading documentation"], ["vec", "complete sewing machine threading reference"], ["vec", "learn about sewing machine threading"], ["hyde", "This comprehensive guide covers everything you need to know about sewing machine threading. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "sewing machine threading"} -{"output": [["lex", "painting overview techniques acrylic guide"], ["lex", "painting overview techniques acrylic examples"], ["lex", "painting techniques acrylic best practices"], ["vec", "learn about painting techniques acrylic"], ["vec", "how to painting techniques acrylic"], ["hyde", "This comprehensive guide covers everything you need to know about painting techniques acrylic. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "painting techniques acrylic"} -{"output": [["lex", "pottery overview wheel basics guide"], ["lex", "pottery overview wheel basics tutorial"], ["lex", "pottery overview wheel basics examples"], ["vec", "learn about pottery wheel basics"], ["vec", "complete pottery wheel basics reference"], ["hyde", "This comprehensive guide covers everything you need to know about pottery wheel basics. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "pottery wheel basics"} -{"output": [["lex", "electronics overview soldering guide guide"], ["lex", "electronics overview soldering guide examples"], ["lex", "electronics soldering guide documentation"], ["vec", "learn about electronics soldering guide"], ["vec", "guide for electronics soldering guide"], ["hyde", "This comprehensive guide covers everything you need to know about electronics soldering guide. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "electronics soldering guide"} -{"output": [["lex", "gardening soil preparation best practices"], ["lex", "gardening overview soil preparation guide"], ["lex", "gardening soil preparation documentation"], ["vec", "learn about gardening soil preparation"], ["vec", "complete gardening soil preparation reference"], ["hyde", "This comprehensive guide covers everything you need to know about gardening soil preparation. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "gardening soil preparation"} -{"output": [["lex", "candle making supplies best practices"], ["lex", "candle making supplies documentation"], ["lex", "candle overview making supplies examples"], ["vec", "understanding candle making supplies"], ["vec", "guide for candle making supplies"], ["hyde", "This comprehensive guide covers everything you need to know about candle making supplies. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "candle making supplies"} -{"output": [["lex", "leather overview crafting tools tutorial"], ["lex", "leather overview crafting tools guide"], ["lex", "leather crafting tools documentation"], ["vec", "guide for leather crafting tools"], ["vec", "complete leather crafting tools reference"], ["hyde", "This comprehensive guide covers everything you need to know about leather crafting tools. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "leather crafting tools"} -{"output": [["lex", "origami overview folding instructions tutorial"], ["lex", "origami folding instructions best practices"], ["lex", "origami folding instructions documentation"], ["vec", "complete origami folding instructions reference"], ["vec", "understanding origami folding instructions"], ["hyde", "This comprehensive guide covers everything you need to know about origami folding instructions. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "origami folding instructions"} -{"output": [["lex", "furniture overview restoration tips guide"], ["lex", "furniture overview restoration tips tutorial"], ["lex", "furniture overview restoration tips examples"], ["vec", "understanding furniture restoration tips"], ["vec", "learn about furniture restoration tips"], ["hyde", "This comprehensive guide covers everything you need to know about furniture restoration tips. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "furniture restoration tips"} -{"output": [["lex", "recent overview GitHub changes 2026 tutorial"], ["lex", "recent overview GitHub changes 2026 examples"], ["lex", "recent overview GitHub changes 2026 guide"], ["vec", "complete recent GitHub changes 2026 reference"], ["vec", "understanding recent GitHub changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent GitHub changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent GitHub changes 2026"} -{"output": [["lex", "recent overview Kubernetes changes 2025 guide"], ["lex", "recent overview Kubernetes changes 2025 tutorial"], ["lex", "recent Kubernetes changes 2025 documentation"], ["vec", "learn about recent Kubernetes changes 2025"], ["vec", "understanding recent Kubernetes changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent Kubernetes changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Kubernetes changes 2025"} -{"output": [["lex", "climate overview tech recent news November tutorial"], ["lex", "climate tech recent news November documentation"], ["lex", "climate overview tech recent news November guide"], ["vec", "complete climate tech recent news November reference"], ["vec", "learn about climate tech recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech recent news November"} -{"output": [["lex", "React overview latest version release tutorial"], ["lex", "React overview latest version release examples"], ["lex", "React latest version release best practices"], ["vec", "how to React latest version release"], ["vec", "complete React latest version release reference"], ["hyde", "This comprehensive guide covers everything you need to know about React latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React latest version release"} -{"output": [["lex", "AI recent news October documentation"], ["lex", "AI overview recent news October tutorial"], ["lex", "AI overview recent news October examples"], ["vec", "how to AI recent news October"], ["vec", "complete AI recent news October reference"], ["hyde", "This comprehensive guide covers everything you need to know about AI recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI recent news October"} -{"output": [["lex", "recent overview Kubernetes changes 2026 examples"], ["lex", "recent overview Kubernetes changes 2026 guide"], ["lex", "recent Kubernetes changes 2026 documentation"], ["vec", "complete recent Kubernetes changes 2026 reference"], ["vec", "guide for recent Kubernetes changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent Kubernetes changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Kubernetes changes 2026"} -{"output": [["lex", "GitHub latest version release best practices"], ["lex", "GitHub overview latest version release tutorial"], ["lex", "GitHub overview latest version release guide"], ["vec", "guide for GitHub latest version release"], ["vec", "complete GitHub latest version release reference"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub latest version release"} -{"output": [["lex", "latest overview Python updates guide"], ["lex", "latest Python updates documentation"], ["lex", "latest Python updates best practices"], ["vec", "how to latest Python updates"], ["vec", "complete latest Python updates reference"], ["hyde", "This comprehensive guide covers everything you need to know about latest Python updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Python updates"} -{"output": [["lex", "Shopify overview recent news December guide"], ["lex", "Shopify overview recent news December tutorial"], ["lex", "Shopify overview recent news December examples"], ["vec", "guide for Shopify recent news December"], ["vec", "complete Shopify recent news December reference"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify recent news December"} -{"output": [["lex", "Vue overview recent news November examples"], ["lex", "Vue recent news November best practices"], ["lex", "Vue recent news November documentation"], ["vec", "how to Vue recent news November"], ["vec", "learn about Vue recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Vue recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue recent news November"} -{"output": [["lex", "Next.js overview changelog 2025 guide"], ["lex", "Next.js overview changelog 2025 examples"], ["lex", "Next.js changelog 2025 documentation"], ["vec", "learn about Next.js changelog 2025"], ["vec", "understanding Next.js changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js changelog 2025"} -{"output": [["lex", "Docker latest version release best practices"], ["lex", "Docker overview latest version release tutorial"], ["lex", "Docker latest version release documentation"], ["vec", "how to Docker latest version release"], ["vec", "understanding Docker latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Docker latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker latest version release"} -{"output": [["lex", "Kubernetes changelog 2025 best practices"], ["lex", "Kubernetes changelog 2025 documentation"], ["lex", "Kubernetes overview changelog 2025 examples"], ["vec", "how to Kubernetes changelog 2025"], ["vec", "learn about Kubernetes changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes changelog 2025"} -{"output": [["lex", "Docker overview new features 2025 guide"], ["lex", "Docker new features 2025 best practices"], ["lex", "Docker overview new features 2025 tutorial"], ["vec", "understanding Docker new features 2025"], ["vec", "learn about Docker new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Docker new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker new features 2025"} -{"output": [["lex", "what changed in Vue 2025 best practices"], ["lex", "what overview changed in Vue 2025 guide"], ["lex", "what changed in Vue 2025 documentation"], ["vec", "how to what changed in Vue 2025"], ["vec", "learn about what changed in Vue 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Vue 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Vue 2025"} -{"output": [["lex", "AI new features 2025 documentation"], ["lex", "AI new features 2025 best practices"], ["lex", "AI overview new features 2025 tutorial"], ["vec", "how to AI new features 2025"], ["vec", "learn about AI new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about AI new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI new features 2025"} -{"output": [["lex", "what overview changed in Vue 2026 tutorial"], ["lex", "what overview changed in Vue 2026 examples"], ["lex", "what overview changed in Vue 2026 guide"], ["vec", "learn about what changed in Vue 2026"], ["vec", "understanding what changed in Vue 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Vue 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Vue 2026"} -{"output": [["lex", "recent overview AI changes 2025 tutorial"], ["lex", "recent overview AI changes 2025 guide"], ["lex", "recent AI changes 2025 best practices"], ["vec", "understanding recent AI changes 2025"], ["vec", "complete recent AI changes 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about recent AI changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent AI changes 2025"} -{"output": [["lex", "Vue recent news October documentation"], ["lex", "Vue overview recent news October guide"], ["lex", "Vue overview recent news October tutorial"], ["vec", "guide for Vue recent news October"], ["vec", "learn about Vue recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about Vue recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue recent news October"} -{"output": [["lex", "what overview changed in Next.js 2026 examples"], ["lex", "what changed in Next.js 2026 documentation"], ["lex", "what changed in Next.js 2026 best practices"], ["vec", "complete what changed in Next.js 2026 reference"], ["vec", "how to what changed in Next.js 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Next.js 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Next.js 2026"} -{"output": [["lex", "Docker changelog 2026 best practices"], ["lex", "Docker changelog 2026 documentation"], ["lex", "Docker overview changelog 2026 examples"], ["vec", "understanding Docker changelog 2026"], ["vec", "complete Docker changelog 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Docker changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker changelog 2026"} -{"output": [["lex", "Python recent news November documentation"], ["lex", "Python overview recent news November tutorial"], ["lex", "Python recent news November best practices"], ["vec", "understanding Python recent news November"], ["vec", "how to Python recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Python recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python recent news November"} -{"output": [["lex", "recent Python changes 2026 best practices"], ["lex", "recent Python changes 2026 documentation"], ["lex", "recent overview Python changes 2026 guide"], ["vec", "complete recent Python changes 2026 reference"], ["vec", "guide for recent Python changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent Python changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Python changes 2026"} -{"output": [["lex", "climate tech changelog 2026 documentation"], ["lex", "climate overview tech changelog 2026 examples"], ["lex", "climate tech changelog 2026 best practices"], ["vec", "guide for climate tech changelog 2026"], ["vec", "learn about climate tech changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech changelog 2026"} -{"output": [["lex", "GitHub changelog 2026 documentation"], ["lex", "GitHub overview changelog 2026 examples"], ["lex", "GitHub overview changelog 2026 guide"], ["vec", "guide for GitHub changelog 2026"], ["vec", "complete GitHub changelog 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub changelog 2026"} -{"output": [["lex", "Shopify overview latest version release guide"], ["lex", "Shopify overview latest version release examples"], ["lex", "Shopify overview latest version release tutorial"], ["vec", "how to Shopify latest version release"], ["vec", "guide for Shopify latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify latest version release"} -{"output": [["lex", "recent Python changes 2025 best practices"], ["lex", "recent overview Python changes 2025 examples"], ["lex", "recent overview Python changes 2025 tutorial"], ["vec", "understanding recent Python changes 2025"], ["vec", "guide for recent Python changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent Python changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Python changes 2025"} -{"output": [["lex", "recent overview AWS changes 2025 guide"], ["lex", "recent AWS changes 2025 best practices"], ["lex", "recent overview AWS changes 2025 examples"], ["vec", "complete recent AWS changes 2025 reference"], ["vec", "guide for recent AWS changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent AWS changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent AWS changes 2025"} -{"output": [["lex", "climate tech recent news October documentation"], ["lex", "climate tech recent news October best practices"], ["lex", "climate overview tech recent news October guide"], ["vec", "guide for climate tech recent news October"], ["vec", "understanding climate tech recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech recent news October"} -{"output": [["lex", "Python overview changelog 2025 tutorial"], ["lex", "Python overview changelog 2025 examples"], ["lex", "Python changelog 2025 best practices"], ["vec", "how to Python changelog 2025"], ["vec", "complete Python changelog 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Python changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python changelog 2025"} -{"output": [["lex", "latest AI updates best practices"], ["lex", "latest overview AI updates guide"], ["lex", "latest overview AI updates tutorial"], ["vec", "understanding latest AI updates"], ["vec", "learn about latest AI updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest AI updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest AI updates"} -{"output": [["lex", "Vue overview recent news December examples"], ["lex", "Vue overview recent news December tutorial"], ["lex", "Vue recent news December best practices"], ["vec", "understanding Vue recent news December"], ["vec", "learn about Vue recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about Vue recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue recent news December"} -{"output": [["lex", "React recent news October documentation"], ["lex", "React recent news October best practices"], ["lex", "React overview recent news October examples"], ["vec", "how to React recent news October"], ["vec", "guide for React recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about React recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React recent news October"} -{"output": [["lex", "recent overview space exploration changes 2025 guide"], ["lex", "recent space exploration changes 2025 best practices"], ["lex", "recent overview space exploration changes 2025 examples"], ["vec", "guide for recent space exploration changes 2025"], ["vec", "understanding recent space exploration changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent space exploration changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent space exploration changes 2025"} -{"output": [["lex", "space overview exploration latest version release tutorial"], ["lex", "space overview exploration latest version release guide"], ["lex", "space exploration latest version release documentation"], ["vec", "understanding space exploration latest version release"], ["vec", "complete space exploration latest version release reference"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration latest version release"} -{"output": [["lex", "recent overview machine learning changes 2026 examples"], ["lex", "recent overview machine learning changes 2026 guide"], ["lex", "recent machine learning changes 2026 best practices"], ["vec", "understanding recent machine learning changes 2026"], ["vec", "how to recent machine learning changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent machine learning changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent machine learning changes 2026"} -{"output": [["lex", "machine learning recent news December documentation"], ["lex", "machine overview learning recent news December guide"], ["lex", "machine learning recent news December best practices"], ["vec", "understanding machine learning recent news December"], ["vec", "learn about machine learning recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning recent news December"} -{"output": [["lex", "latest overview GitHub updates guide"], ["lex", "latest GitHub updates documentation"], ["lex", "latest GitHub updates best practices"], ["vec", "understanding latest GitHub updates"], ["vec", "how to latest GitHub updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest GitHub updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest GitHub updates"} -{"output": [["lex", "Vue overview changelog 2026 examples"], ["lex", "Vue changelog 2026 documentation"], ["lex", "Vue changelog 2026 best practices"], ["vec", "learn about Vue changelog 2026"], ["vec", "how to Vue changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Vue changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue changelog 2026"} -{"output": [["lex", "recent Docker changes 2025 documentation"], ["lex", "recent Docker changes 2025 best practices"], ["lex", "recent overview Docker changes 2025 guide"], ["vec", "complete recent Docker changes 2025 reference"], ["vec", "how to recent Docker changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent Docker changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Docker changes 2025"} -{"output": [["lex", "what overview changed in GitHub 2026 tutorial"], ["lex", "what overview changed in GitHub 2026 guide"], ["lex", "what changed in GitHub 2026 documentation"], ["vec", "understanding what changed in GitHub 2026"], ["vec", "guide for what changed in GitHub 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in GitHub 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in GitHub 2026"} -{"output": [["lex", "Shopify overview recent news October guide"], ["lex", "Shopify recent news October documentation"], ["lex", "Shopify overview recent news October tutorial"], ["vec", "learn about Shopify recent news October"], ["vec", "complete Shopify recent news October reference"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify recent news October"} -{"output": [["lex", "recent overview GitHub changes 2025 guide"], ["lex", "recent GitHub changes 2025 best practices"], ["lex", "recent overview GitHub changes 2025 tutorial"], ["vec", "guide for recent GitHub changes 2025"], ["vec", "learn about recent GitHub changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent GitHub changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent GitHub changes 2025"} -{"output": [["lex", "Next.js overview changelog 2026 tutorial"], ["lex", "Next.js changelog 2026 documentation"], ["lex", "Next.js changelog 2026 best practices"], ["vec", "guide for Next.js changelog 2026"], ["vec", "complete Next.js changelog 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js changelog 2026"} -{"output": [["lex", "what overview changed in TypeScript 2026 examples"], ["lex", "what changed in TypeScript 2026 best practices"], ["lex", "what changed in TypeScript 2026 documentation"], ["vec", "complete what changed in TypeScript 2026 reference"], ["vec", "guide for what changed in TypeScript 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in TypeScript 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in TypeScript 2026"} -{"output": [["lex", "Python new features 2026 best practices"], ["lex", "Python overview new features 2026 examples"], ["lex", "Python overview new features 2026 guide"], ["vec", "guide for Python new features 2026"], ["vec", "complete Python new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Python new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python new features 2026"} -{"output": [["lex", "climate overview tech changelog 2025 tutorial"], ["lex", "climate tech changelog 2025 documentation"], ["lex", "climate overview tech changelog 2025 examples"], ["vec", "guide for climate tech changelog 2025"], ["vec", "how to climate tech changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech changelog 2025"} -{"output": [["lex", "GitHub recent news December best practices"], ["lex", "GitHub overview recent news December guide"], ["lex", "GitHub overview recent news December examples"], ["vec", "learn about GitHub recent news December"], ["vec", "how to GitHub recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub recent news December"} -{"output": [["lex", "Kubernetes new features 2026 documentation"], ["lex", "Kubernetes overview new features 2026 tutorial"], ["lex", "Kubernetes overview new features 2026 guide"], ["vec", "understanding Kubernetes new features 2026"], ["vec", "guide for Kubernetes new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes new features 2026"} -{"output": [["lex", "Kubernetes recent news October best practices"], ["lex", "Kubernetes overview recent news October guide"], ["lex", "Kubernetes recent news October documentation"], ["vec", "how to Kubernetes recent news October"], ["vec", "complete Kubernetes recent news October reference"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes recent news October"} -{"output": [["lex", "TypeScript recent news October best practices"], ["lex", "TypeScript overview recent news October guide"], ["lex", "TypeScript recent news October documentation"], ["vec", "understanding TypeScript recent news October"], ["vec", "complete TypeScript recent news October reference"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript recent news October"} -{"output": [["lex", "Docker recent news October documentation"], ["lex", "Docker overview recent news October examples"], ["lex", "Docker overview recent news October tutorial"], ["vec", "complete Docker recent news October reference"], ["vec", "learn about Docker recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about Docker recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker recent news October"} -{"output": [["lex", "space overview exploration changelog 2025 guide"], ["lex", "space overview exploration changelog 2025 tutorial"], ["lex", "space exploration changelog 2025 documentation"], ["vec", "complete space exploration changelog 2025 reference"], ["vec", "understanding space exploration changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration changelog 2025"} -{"output": [["lex", "Vue latest version release documentation"], ["lex", "Vue latest version release best practices"], ["lex", "Vue overview latest version release examples"], ["vec", "complete Vue latest version release reference"], ["vec", "learn about Vue latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Vue latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue latest version release"} -{"output": [["lex", "Next.js new features 2025 best practices"], ["lex", "Next.js overview new features 2025 guide"], ["lex", "Next.js overview new features 2025 tutorial"], ["vec", "learn about Next.js new features 2025"], ["vec", "complete Next.js new features 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js new features 2025"} -{"output": [["lex", "climate overview tech new features 2025 guide"], ["lex", "climate overview tech new features 2025 tutorial"], ["lex", "climate overview tech new features 2025 examples"], ["vec", "learn about climate tech new features 2025"], ["vec", "understanding climate tech new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech new features 2025"} -{"output": [["lex", "what overview changed in climate tech 2026 examples"], ["lex", "what changed in climate tech 2026 documentation"], ["lex", "what overview changed in climate tech 2026 tutorial"], ["vec", "how to what changed in climate tech 2026"], ["vec", "complete what changed in climate tech 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in climate tech 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in climate tech 2026"} -{"output": [["lex", "what changed in space exploration 2026 best practices"], ["lex", "what overview changed in space exploration 2026 tutorial"], ["lex", "what overview changed in space exploration 2026 examples"], ["vec", "how to what changed in space exploration 2026"], ["vec", "understanding what changed in space exploration 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in space exploration 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in space exploration 2026"} -{"output": [["lex", "Shopify overview new features 2025 guide"], ["lex", "Shopify new features 2025 documentation"], ["lex", "Shopify new features 2025 best practices"], ["vec", "understanding Shopify new features 2025"], ["vec", "complete Shopify new features 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify new features 2025"} -{"output": [["lex", "climate overview tech new features 2026 guide"], ["lex", "climate tech new features 2026 best practices"], ["lex", "climate overview tech new features 2026 tutorial"], ["vec", "understanding climate tech new features 2026"], ["vec", "how to climate tech new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech new features 2026"} -{"output": [["lex", "machine overview learning recent news October guide"], ["lex", "machine learning recent news October best practices"], ["lex", "machine overview learning recent news October tutorial"], ["vec", "complete machine learning recent news October reference"], ["vec", "learn about machine learning recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning recent news October"} -{"output": [["lex", "latest React updates documentation"], ["lex", "latest overview React updates examples"], ["lex", "latest React updates best practices"], ["vec", "learn about latest React updates"], ["vec", "understanding latest React updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest React updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest React updates"} -{"output": [["lex", "TypeScript latest version release best practices"], ["lex", "TypeScript overview latest version release examples"], ["lex", "TypeScript overview latest version release tutorial"], ["vec", "guide for TypeScript latest version release"], ["vec", "complete TypeScript latest version release reference"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript latest version release"} -{"output": [["lex", "Next.js latest version release best practices"], ["lex", "Next.js overview latest version release guide"], ["lex", "Next.js overview latest version release examples"], ["vec", "how to Next.js latest version release"], ["vec", "guide for Next.js latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js latest version release"} -{"output": [["lex", "what overview changed in Kubernetes 2026 tutorial"], ["lex", "what changed in Kubernetes 2026 best practices"], ["lex", "what overview changed in Kubernetes 2026 guide"], ["vec", "understanding what changed in Kubernetes 2026"], ["vec", "complete what changed in Kubernetes 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Kubernetes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Kubernetes 2026"} -{"output": [["lex", "recent React changes 2026 documentation"], ["lex", "recent React changes 2026 best practices"], ["lex", "recent overview React changes 2026 examples"], ["vec", "understanding recent React changes 2026"], ["vec", "learn about recent React changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent React changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent React changes 2026"} -{"output": [["lex", "recent climate tech changes 2025 best practices"], ["lex", "recent overview climate tech changes 2025 guide"], ["lex", "recent overview climate tech changes 2025 tutorial"], ["vec", "complete recent climate tech changes 2025 reference"], ["vec", "guide for recent climate tech changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent climate tech changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent climate tech changes 2025"} -{"output": [["lex", "what changed in Shopify 2026 best practices"], ["lex", "what changed in Shopify 2026 documentation"], ["lex", "what overview changed in Shopify 2026 guide"], ["vec", "complete what changed in Shopify 2026 reference"], ["vec", "learn about what changed in Shopify 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Shopify 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Shopify 2026"} -{"output": [["lex", "Kubernetes changelog 2026 documentation"], ["lex", "Kubernetes overview changelog 2026 examples"], ["lex", "Kubernetes overview changelog 2026 tutorial"], ["vec", "guide for Kubernetes changelog 2026"], ["vec", "understanding Kubernetes changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes changelog 2026"} -{"output": [["lex", "Shopify overview recent news November tutorial"], ["lex", "Shopify overview recent news November examples"], ["lex", "Shopify recent news November best practices"], ["vec", "learn about Shopify recent news November"], ["vec", "guide for Shopify recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify recent news November"} -{"output": [["lex", "GitHub overview recent news October tutorial"], ["lex", "GitHub recent news October best practices"], ["lex", "GitHub overview recent news October guide"], ["vec", "guide for GitHub recent news October"], ["vec", "learn about GitHub recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub recent news October"} -{"output": [["lex", "Kubernetes overview recent news December examples"], ["lex", "Kubernetes overview recent news December guide"], ["lex", "Kubernetes recent news December documentation"], ["vec", "how to Kubernetes recent news December"], ["vec", "complete Kubernetes recent news December reference"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes recent news December"} -{"output": [["lex", "what changed in Docker 2025 best practices"], ["lex", "what overview changed in Docker 2025 guide"], ["lex", "what overview changed in Docker 2025 examples"], ["vec", "understanding what changed in Docker 2025"], ["vec", "learn about what changed in Docker 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Docker 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Docker 2025"} -{"output": [["lex", "recent overview React changes 2025 guide"], ["lex", "recent React changes 2025 best practices"], ["lex", "recent overview React changes 2025 examples"], ["vec", "how to recent React changes 2025"], ["vec", "complete recent React changes 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about recent React changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent React changes 2025"} -{"output": [["lex", "what changed in Kubernetes 2025 best practices"], ["lex", "what overview changed in Kubernetes 2025 guide"], ["lex", "what overview changed in Kubernetes 2025 tutorial"], ["vec", "guide for what changed in Kubernetes 2025"], ["vec", "understanding what changed in Kubernetes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Kubernetes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Kubernetes 2025"} -{"output": [["lex", "recent overview TypeScript changes 2026 guide"], ["lex", "recent TypeScript changes 2026 documentation"], ["lex", "recent TypeScript changes 2026 best practices"], ["vec", "learn about recent TypeScript changes 2026"], ["vec", "understanding recent TypeScript changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent TypeScript changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent TypeScript changes 2026"} -{"output": [["lex", "Shopify overview changelog 2025 examples"], ["lex", "Shopify overview changelog 2025 guide"], ["lex", "Shopify changelog 2025 best practices"], ["vec", "learn about Shopify changelog 2025"], ["vec", "understanding Shopify changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify changelog 2025"} -{"output": [["lex", "latest overview Docker updates guide"], ["lex", "latest overview Docker updates examples"], ["lex", "latest overview Docker updates tutorial"], ["vec", "understanding latest Docker updates"], ["vec", "learn about latest Docker updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest Docker updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Docker updates"} -{"output": [["lex", "recent machine learning changes 2025 documentation"], ["lex", "recent overview machine learning changes 2025 tutorial"], ["lex", "recent overview machine learning changes 2025 examples"], ["vec", "complete recent machine learning changes 2025 reference"], ["vec", "understanding recent machine learning changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent machine learning changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent machine learning changes 2025"} -{"output": [["lex", "recent overview AI changes 2026 examples"], ["lex", "recent overview AI changes 2026 guide"], ["lex", "recent AI changes 2026 best practices"], ["vec", "how to recent AI changes 2026"], ["vec", "guide for recent AI changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent AI changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent AI changes 2026"} -{"output": [["lex", "recent overview Docker changes 2026 guide"], ["lex", "recent overview Docker changes 2026 examples"], ["lex", "recent Docker changes 2026 documentation"], ["vec", "guide for recent Docker changes 2026"], ["vec", "learn about recent Docker changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent Docker changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Docker changes 2026"} -{"output": [["lex", "what overview changed in AWS 2026 guide"], ["lex", "what changed in AWS 2026 documentation"], ["lex", "what overview changed in AWS 2026 tutorial"], ["vec", "how to what changed in AWS 2026"], ["vec", "understanding what changed in AWS 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in AWS 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in AWS 2026"} -{"output": [["lex", "what overview changed in Shopify 2025 guide"], ["lex", "what changed in Shopify 2025 documentation"], ["lex", "what overview changed in Shopify 2025 examples"], ["vec", "understanding what changed in Shopify 2025"], ["vec", "how to what changed in Shopify 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Shopify 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Shopify 2025"} -{"output": [["lex", "AI changelog 2026 documentation"], ["lex", "AI overview changelog 2026 examples"], ["lex", "AI changelog 2026 best practices"], ["vec", "learn about AI changelog 2026"], ["vec", "understanding AI changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about AI changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI changelog 2026"} -{"output": [["lex", "latest Kubernetes updates best practices"], ["lex", "latest Kubernetes updates documentation"], ["lex", "latest overview Kubernetes updates guide"], ["vec", "guide for latest Kubernetes updates"], ["vec", "learn about latest Kubernetes updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest Kubernetes updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Kubernetes updates"} -{"output": [["lex", "what overview changed in climate tech 2025 guide"], ["lex", "what changed in climate tech 2025 best practices"], ["lex", "what overview changed in climate tech 2025 examples"], ["vec", "learn about what changed in climate tech 2025"], ["vec", "understanding what changed in climate tech 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in climate tech 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in climate tech 2025"} -{"output": [["lex", "latest machine learning updates documentation"], ["lex", "latest machine learning updates best practices"], ["lex", "latest overview machine learning updates examples"], ["vec", "learn about latest machine learning updates"], ["vec", "understanding latest machine learning updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest machine learning updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest machine learning updates"} -{"output": [["lex", "what changed in Next.js 2025 best practices"], ["lex", "what changed in Next.js 2025 documentation"], ["lex", "what overview changed in Next.js 2025 guide"], ["vec", "understanding what changed in Next.js 2025"], ["vec", "learn about what changed in Next.js 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Next.js 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Next.js 2025"} -{"output": [["lex", "TypeScript changelog 2025 documentation"], ["lex", "TypeScript overview changelog 2025 examples"], ["lex", "TypeScript overview changelog 2025 guide"], ["vec", "understanding TypeScript changelog 2025"], ["vec", "guide for TypeScript changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript changelog 2025"} -{"output": [["lex", "recent overview AWS changes 2026 guide"], ["lex", "recent overview AWS changes 2026 tutorial"], ["lex", "recent overview AWS changes 2026 examples"], ["vec", "how to recent AWS changes 2026"], ["vec", "understanding recent AWS changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent AWS changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent AWS changes 2026"} -{"output": [["lex", "Vue changelog 2025 best practices"], ["lex", "Vue changelog 2025 documentation"], ["lex", "Vue overview changelog 2025 examples"], ["vec", "guide for Vue changelog 2025"], ["vec", "understanding Vue changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Vue changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue changelog 2025"} -{"output": [["lex", "TypeScript new features 2025 best practices"], ["lex", "TypeScript overview new features 2025 guide"], ["lex", "TypeScript overview new features 2025 tutorial"], ["vec", "complete TypeScript new features 2025 reference"], ["vec", "how to TypeScript new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript new features 2025"} -{"output": [["lex", "React recent news December best practices"], ["lex", "React overview recent news December tutorial"], ["lex", "React overview recent news December examples"], ["vec", "complete React recent news December reference"], ["vec", "guide for React recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about React recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React recent news December"} -{"output": [["lex", "AWS changelog 2026 best practices"], ["lex", "AWS changelog 2026 documentation"], ["lex", "AWS overview changelog 2026 guide"], ["vec", "guide for AWS changelog 2026"], ["vec", "learn about AWS changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about AWS changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS changelog 2026"} -{"output": [["lex", "AI recent news December documentation"], ["lex", "AI overview recent news December guide"], ["lex", "AI recent news December best practices"], ["vec", "complete AI recent news December reference"], ["vec", "how to AI recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about AI recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI recent news December"} -{"output": [["lex", "TypeScript recent news December documentation"], ["lex", "TypeScript recent news December best practices"], ["lex", "TypeScript overview recent news December examples"], ["vec", "understanding TypeScript recent news December"], ["vec", "how to TypeScript recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript recent news December"} -{"output": [["lex", "climate tech recent news December best practices"], ["lex", "climate overview tech recent news December guide"], ["lex", "climate tech recent news December documentation"], ["vec", "how to climate tech recent news December"], ["vec", "guide for climate tech recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech recent news December"} -{"output": [["lex", "Next.js overview recent news October guide"], ["lex", "Next.js recent news October documentation"], ["lex", "Next.js recent news October best practices"], ["vec", "complete Next.js recent news October reference"], ["vec", "guide for Next.js recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js recent news October"} -{"output": [["lex", "AI overview latest version release guide"], ["lex", "AI overview latest version release examples"], ["lex", "AI latest version release documentation"], ["vec", "understanding AI latest version release"], ["vec", "how to AI latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about AI latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI latest version release"} -{"output": [["lex", "latest Next.js updates documentation"], ["lex", "latest overview Next.js updates tutorial"], ["lex", "latest overview Next.js updates guide"], ["vec", "understanding latest Next.js updates"], ["vec", "learn about latest Next.js updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest Next.js updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Next.js updates"} -{"output": [["lex", "Vue overview new features 2026 examples"], ["lex", "Vue overview new features 2026 guide"], ["lex", "Vue new features 2026 documentation"], ["vec", "guide for Vue new features 2026"], ["vec", "understanding Vue new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Vue new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue new features 2026"} -{"output": [["lex", "space overview exploration new features 2026 tutorial"], ["lex", "space exploration new features 2026 best practices"], ["lex", "space overview exploration new features 2026 guide"], ["vec", "understanding space exploration new features 2026"], ["vec", "learn about space exploration new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration new features 2026"} -{"output": [["lex", "recent overview Shopify changes 2026 examples"], ["lex", "recent Shopify changes 2026 best practices"], ["lex", "recent overview Shopify changes 2026 tutorial"], ["vec", "how to recent Shopify changes 2026"], ["vec", "understanding recent Shopify changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent Shopify changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Shopify changes 2026"} -{"output": [["lex", "machine learning latest version release documentation"], ["lex", "machine overview learning latest version release tutorial"], ["lex", "machine overview learning latest version release examples"], ["vec", "complete machine learning latest version release reference"], ["vec", "understanding machine learning latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning latest version release"} -{"output": [["lex", "Docker overview new features 2026 tutorial"], ["lex", "Docker overview new features 2026 guide"], ["lex", "Docker new features 2026 best practices"], ["vec", "how to Docker new features 2026"], ["vec", "complete Docker new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Docker new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker new features 2026"} -{"output": [["lex", "Python overview recent news December guide"], ["lex", "Python recent news December best practices"], ["lex", "Python overview recent news December tutorial"], ["vec", "complete Python recent news December reference"], ["vec", "understanding Python recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about Python recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python recent news December"} -{"output": [["lex", "what changed in React 2026 documentation"], ["lex", "what overview changed in React 2026 examples"], ["lex", "what overview changed in React 2026 guide"], ["vec", "learn about what changed in React 2026"], ["vec", "understanding what changed in React 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in React 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in React 2026"} -{"output": [["lex", "Docker overview changelog 2025 examples"], ["lex", "Docker changelog 2025 best practices"], ["lex", "Docker overview changelog 2025 tutorial"], ["vec", "understanding Docker changelog 2025"], ["vec", "complete Docker changelog 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Docker changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker changelog 2025"} -{"output": [["lex", "what changed in Docker 2026 best practices"], ["lex", "what changed in Docker 2026 documentation"], ["lex", "what overview changed in Docker 2026 examples"], ["vec", "complete what changed in Docker 2026 reference"], ["vec", "understanding what changed in Docker 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Docker 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Docker 2026"} -{"output": [["lex", "recent Next.js changes 2026 best practices"], ["lex", "recent overview Next.js changes 2026 guide"], ["lex", "recent Next.js changes 2026 documentation"], ["vec", "understanding recent Next.js changes 2026"], ["vec", "learn about recent Next.js changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent Next.js changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Next.js changes 2026"} -{"output": [["lex", "latest overview climate tech updates examples"], ["lex", "latest overview climate tech updates tutorial"], ["lex", "latest climate tech updates best practices"], ["vec", "understanding latest climate tech updates"], ["vec", "complete latest climate tech updates reference"], ["hyde", "This comprehensive guide covers everything you need to know about latest climate tech updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest climate tech updates"} -{"output": [["lex", "machine learning changelog 2026 documentation"], ["lex", "machine overview learning changelog 2026 guide"], ["lex", "machine overview learning changelog 2026 examples"], ["vec", "guide for machine learning changelog 2026"], ["vec", "learn about machine learning changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning changelog 2026"} -{"output": [["lex", "what overview changed in AWS 2025 examples"], ["lex", "what overview changed in AWS 2025 guide"], ["lex", "what changed in AWS 2025 best practices"], ["vec", "complete what changed in AWS 2025 reference"], ["vec", "learn about what changed in AWS 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in AWS 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in AWS 2025"} -{"output": [["lex", "Kubernetes overview recent news November guide"], ["lex", "Kubernetes overview recent news November tutorial"], ["lex", "Kubernetes recent news November best practices"], ["vec", "how to Kubernetes recent news November"], ["vec", "guide for Kubernetes recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes recent news November"} -{"output": [["lex", "AI overview changelog 2025 examples"], ["lex", "AI changelog 2025 best practices"], ["lex", "AI overview changelog 2025 tutorial"], ["vec", "guide for AI changelog 2025"], ["vec", "learn about AI changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about AI changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI changelog 2025"} -{"output": [["lex", "recent Next.js changes 2025 documentation"], ["lex", "recent overview Next.js changes 2025 examples"], ["lex", "recent Next.js changes 2025 best practices"], ["vec", "how to recent Next.js changes 2025"], ["vec", "complete recent Next.js changes 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about recent Next.js changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Next.js changes 2025"} -{"output": [["lex", "Python overview recent news October examples"], ["lex", "Python recent news October documentation"], ["lex", "Python recent news October best practices"], ["vec", "complete Python recent news October reference"], ["vec", "guide for Python recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about Python recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python recent news October"} -{"output": [["lex", "recent overview Vue changes 2025 tutorial"], ["lex", "recent Vue changes 2025 best practices"], ["lex", "recent overview Vue changes 2025 guide"], ["vec", "guide for recent Vue changes 2025"], ["vec", "complete recent Vue changes 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about recent Vue changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Vue changes 2025"} -{"output": [["lex", "AI new features 2026 documentation"], ["lex", "AI overview new features 2026 guide"], ["lex", "AI overview new features 2026 tutorial"], ["vec", "how to AI new features 2026"], ["vec", "complete AI new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about AI new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI new features 2026"} -{"output": [["lex", "React new features 2026 documentation"], ["lex", "React overview new features 2026 tutorial"], ["lex", "React overview new features 2026 examples"], ["vec", "learn about React new features 2026"], ["vec", "complete React new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about React new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React new features 2026"} -{"output": [["lex", "Vue new features 2025 documentation"], ["lex", "Vue new features 2025 best practices"], ["lex", "Vue overview new features 2025 guide"], ["vec", "guide for Vue new features 2025"], ["vec", "understanding Vue new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about Vue new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vue new features 2025"} -{"output": [["lex", "climate overview tech latest version release examples"], ["lex", "climate overview tech latest version release tutorial"], ["lex", "climate tech latest version release best practices"], ["vec", "complete climate tech latest version release reference"], ["vec", "guide for climate tech latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about climate tech latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "climate tech latest version release"} -{"output": [["lex", "Python overview latest version release tutorial"], ["lex", "Python overview latest version release guide"], ["lex", "Python latest version release best practices"], ["vec", "understanding Python latest version release"], ["vec", "learn about Python latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Python latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python latest version release"} -{"output": [["lex", "AWS overview recent news December guide"], ["lex", "AWS overview recent news December examples"], ["lex", "AWS overview recent news December tutorial"], ["vec", "complete AWS recent news December reference"], ["vec", "how to AWS recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about AWS recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS recent news December"} -{"output": [["lex", "GitHub overview changelog 2025 tutorial"], ["lex", "GitHub overview changelog 2025 guide"], ["lex", "GitHub changelog 2025 documentation"], ["vec", "understanding GitHub changelog 2025"], ["vec", "complete GitHub changelog 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub changelog 2025"} -{"output": [["lex", "what overview changed in machine learning 2026 tutorial"], ["lex", "what overview changed in machine learning 2026 examples"], ["lex", "what overview changed in machine learning 2026 guide"], ["vec", "learn about what changed in machine learning 2026"], ["vec", "how to what changed in machine learning 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in machine learning 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in machine learning 2026"} -{"output": [["lex", "space exploration recent news October documentation"], ["lex", "space overview exploration recent news October guide"], ["lex", "space overview exploration recent news October examples"], ["vec", "learn about space exploration recent news October"], ["vec", "understanding space exploration recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration recent news October"} -{"output": [["lex", "React overview changelog 2026 tutorial"], ["lex", "React overview changelog 2026 examples"], ["lex", "React changelog 2026 documentation"], ["vec", "how to React changelog 2026"], ["vec", "understanding React changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about React changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React changelog 2026"} -{"output": [["lex", "React overview changelog 2025 tutorial"], ["lex", "React overview changelog 2025 guide"], ["lex", "React changelog 2025 best practices"], ["vec", "complete React changelog 2025 reference"], ["vec", "how to React changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about React changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React changelog 2025"} -{"output": [["lex", "machine overview learning recent news November tutorial"], ["lex", "machine overview learning recent news November guide"], ["lex", "machine overview learning recent news November examples"], ["vec", "how to machine learning recent news November"], ["vec", "understanding machine learning recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning recent news November"} -{"output": [["lex", "GitHub overview new features 2025 guide"], ["lex", "GitHub overview new features 2025 tutorial"], ["lex", "GitHub overview new features 2025 examples"], ["vec", "learn about GitHub new features 2025"], ["vec", "how to GitHub new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub new features 2025"} -{"output": [["lex", "machine overview learning new features 2025 tutorial"], ["lex", "machine learning new features 2025 documentation"], ["lex", "machine learning new features 2025 best practices"], ["vec", "how to machine learning new features 2025"], ["vec", "learn about machine learning new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning new features 2025"} -{"output": [["lex", "AI recent news November documentation"], ["lex", "AI overview recent news November guide"], ["lex", "AI overview recent news November examples"], ["vec", "learn about AI recent news November"], ["vec", "understanding AI recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about AI recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AI recent news November"} -{"output": [["lex", "Python overview new features 2025 tutorial"], ["lex", "Python new features 2025 documentation"], ["lex", "Python overview new features 2025 examples"], ["vec", "understanding Python new features 2025"], ["vec", "complete Python new features 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Python new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python new features 2025"} -{"output": [["lex", "latest Shopify updates best practices"], ["lex", "latest Shopify updates documentation"], ["lex", "latest overview Shopify updates guide"], ["vec", "complete latest Shopify updates reference"], ["vec", "guide for latest Shopify updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest Shopify updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Shopify updates"} -{"output": [["lex", "Kubernetes overview new features 2025 examples"], ["lex", "Kubernetes new features 2025 documentation"], ["lex", "Kubernetes new features 2025 best practices"], ["vec", "guide for Kubernetes new features 2025"], ["vec", "complete Kubernetes new features 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes new features 2025"} -{"output": [["lex", "what overview changed in AI 2026 guide"], ["lex", "what changed in AI 2026 documentation"], ["lex", "what overview changed in AI 2026 tutorial"], ["vec", "guide for what changed in AI 2026"], ["vec", "understanding what changed in AI 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in AI 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in AI 2026"} -{"output": [["lex", "machine learning new features 2026 best practices"], ["lex", "machine overview learning new features 2026 guide"], ["lex", "machine overview learning new features 2026 examples"], ["vec", "understanding machine learning new features 2026"], ["vec", "how to machine learning new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning new features 2026"} -{"output": [["lex", "recent overview Shopify changes 2025 examples"], ["lex", "recent overview Shopify changes 2025 tutorial"], ["lex", "recent Shopify changes 2025 best practices"], ["vec", "complete recent Shopify changes 2025 reference"], ["vec", "how to recent Shopify changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent Shopify changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Shopify changes 2025"} -{"output": [["lex", "what overview changed in machine learning 2025 guide"], ["lex", "what changed in machine learning 2025 best practices"], ["lex", "what changed in machine learning 2025 documentation"], ["vec", "learn about what changed in machine learning 2025"], ["vec", "complete what changed in machine learning 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in machine learning 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in machine learning 2025"} -{"output": [["lex", "Shopify new features 2026 best practices"], ["lex", "Shopify overview new features 2026 examples"], ["lex", "Shopify overview new features 2026 guide"], ["vec", "understanding Shopify new features 2026"], ["vec", "complete Shopify new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify new features 2026"} -{"output": [["lex", "Docker overview recent news November examples"], ["lex", "Docker recent news November best practices"], ["lex", "Docker overview recent news November tutorial"], ["vec", "understanding Docker recent news November"], ["vec", "guide for Docker recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Docker recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker recent news November"} -{"output": [["lex", "latest Vue updates documentation"], ["lex", "latest overview Vue updates tutorial"], ["lex", "latest Vue updates best practices"], ["vec", "understanding latest Vue updates"], ["vec", "learn about latest Vue updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest Vue updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest Vue updates"} -{"output": [["lex", "Next.js overview new features 2026 examples"], ["lex", "Next.js overview new features 2026 guide"], ["lex", "Next.js new features 2026 best practices"], ["vec", "learn about Next.js new features 2026"], ["vec", "how to Next.js new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js new features 2026"} -{"output": [["lex", "GitHub overview new features 2026 examples"], ["lex", "GitHub overview new features 2026 tutorial"], ["lex", "GitHub new features 2026 documentation"], ["vec", "how to GitHub new features 2026"], ["vec", "understanding GitHub new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub new features 2026"} -{"output": [["lex", "AWS new features 2025 best practices"], ["lex", "AWS overview new features 2025 guide"], ["lex", "AWS overview new features 2025 tutorial"], ["vec", "how to AWS new features 2025"], ["vec", "understanding AWS new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about AWS new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS new features 2025"} -{"output": [["lex", "what overview changed in Python 2026 tutorial"], ["lex", "what changed in Python 2026 best practices"], ["lex", "what overview changed in Python 2026 guide"], ["vec", "guide for what changed in Python 2026"], ["vec", "learn about what changed in Python 2026"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Python 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Python 2026"} -{"output": [["lex", "what changed in TypeScript 2025 best practices"], ["lex", "what overview changed in TypeScript 2025 tutorial"], ["lex", "what changed in TypeScript 2025 documentation"], ["vec", "complete what changed in TypeScript 2025 reference"], ["vec", "understanding what changed in TypeScript 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in TypeScript 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in TypeScript 2025"} -{"output": [["lex", "recent space exploration changes 2026 best practices"], ["lex", "recent space exploration changes 2026 documentation"], ["lex", "recent overview space exploration changes 2026 tutorial"], ["vec", "understanding recent space exploration changes 2026"], ["vec", "learn about recent space exploration changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent space exploration changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent space exploration changes 2026"} -{"output": [["lex", "AWS new features 2026 documentation"], ["lex", "AWS overview new features 2026 tutorial"], ["lex", "AWS overview new features 2026 examples"], ["vec", "complete AWS new features 2026 reference"], ["vec", "understanding AWS new features 2026"], ["hyde", "This comprehensive guide covers everything you need to know about AWS new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS new features 2026"} -{"output": [["lex", "recent overview TypeScript changes 2025 examples"], ["lex", "recent TypeScript changes 2025 documentation"], ["lex", "recent overview TypeScript changes 2025 guide"], ["vec", "learn about recent TypeScript changes 2025"], ["vec", "guide for recent TypeScript changes 2025"], ["hyde", "This comprehensive guide covers everything you need to know about recent TypeScript changes 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent TypeScript changes 2025"} -{"output": [["lex", "latest overview TypeScript updates examples"], ["lex", "latest overview TypeScript updates guide"], ["lex", "latest TypeScript updates best practices"], ["vec", "complete latest TypeScript updates reference"], ["vec", "learn about latest TypeScript updates"], ["hyde", "This comprehensive guide covers everything you need to know about latest TypeScript updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest TypeScript updates"} -{"output": [["lex", "what changed in React 2025 documentation"], ["lex", "what overview changed in React 2025 tutorial"], ["lex", "what changed in React 2025 best practices"], ["vec", "learn about what changed in React 2025"], ["vec", "understanding what changed in React 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in React 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in React 2025"} -{"output": [["lex", "AWS overview changelog 2025 examples"], ["lex", "AWS overview changelog 2025 tutorial"], ["lex", "AWS changelog 2025 documentation"], ["vec", "how to AWS changelog 2025"], ["vec", "complete AWS changelog 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about AWS changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS changelog 2025"} -{"output": [["lex", "space exploration changelog 2026 documentation"], ["lex", "space exploration changelog 2026 best practices"], ["lex", "space overview exploration changelog 2026 guide"], ["vec", "learn about space exploration changelog 2026"], ["vec", "how to space exploration changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration changelog 2026"} -{"output": [["lex", "React new features 2025 best practices"], ["lex", "React overview new features 2025 guide"], ["lex", "React overview new features 2025 tutorial"], ["vec", "complete React new features 2025 reference"], ["vec", "how to React new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about React new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React new features 2025"} -{"output": [["lex", "AWS overview latest version release guide"], ["lex", "AWS latest version release documentation"], ["lex", "AWS latest version release best practices"], ["vec", "complete AWS latest version release reference"], ["vec", "understanding AWS latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about AWS latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS latest version release"} -{"output": [["lex", "latest space exploration updates documentation"], ["lex", "latest overview space exploration updates guide"], ["lex", "latest overview space exploration updates examples"], ["vec", "understanding latest space exploration updates"], ["vec", "complete latest space exploration updates reference"], ["hyde", "This comprehensive guide covers everything you need to know about latest space exploration updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest space exploration updates"} -{"output": [["lex", "Kubernetes latest version release best practices"], ["lex", "Kubernetes latest version release documentation"], ["lex", "Kubernetes overview latest version release guide"], ["vec", "understanding Kubernetes latest version release"], ["vec", "how to Kubernetes latest version release"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes latest version release. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes latest version release"} -{"output": [["lex", "React recent news November best practices"], ["lex", "React overview recent news November examples"], ["lex", "React overview recent news November guide"], ["vec", "guide for React recent news November"], ["vec", "how to React recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about React recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React recent news November"} -{"output": [["lex", "TypeScript recent news November documentation"], ["lex", "TypeScript overview recent news November examples"], ["lex", "TypeScript overview recent news November guide"], ["vec", "guide for TypeScript recent news November"], ["vec", "understanding TypeScript recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript recent news November"} -{"output": [["lex", "what overview changed in AI 2025 guide"], ["lex", "what overview changed in AI 2025 examples"], ["lex", "what overview changed in AI 2025 tutorial"], ["vec", "how to what changed in AI 2025"], ["vec", "understanding what changed in AI 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in AI 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in AI 2025"} -{"output": [["lex", "Docker overview recent news December guide"], ["lex", "Docker recent news December documentation"], ["lex", "Docker overview recent news December tutorial"], ["vec", "guide for Docker recent news December"], ["vec", "understanding Docker recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about Docker recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker recent news December"} -{"output": [["lex", "TypeScript overview changelog 2026 guide"], ["lex", "TypeScript overview changelog 2026 tutorial"], ["lex", "TypeScript overview changelog 2026 examples"], ["vec", "understanding TypeScript changelog 2026"], ["vec", "how to TypeScript changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript changelog 2026"} -{"output": [["lex", "space overview exploration new features 2025 examples"], ["lex", "space exploration new features 2025 documentation"], ["lex", "space overview exploration new features 2025 tutorial"], ["vec", "how to space exploration new features 2025"], ["vec", "understanding space exploration new features 2025"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration new features 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration new features 2025"} -{"output": [["lex", "space overview exploration recent news December examples"], ["lex", "space overview exploration recent news December guide"], ["lex", "space overview exploration recent news December tutorial"], ["vec", "guide for space exploration recent news December"], ["vec", "learn about space exploration recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration recent news December"} -{"output": [["lex", "Shopify overview changelog 2026 tutorial"], ["lex", "Shopify overview changelog 2026 examples"], ["lex", "Shopify changelog 2026 documentation"], ["vec", "understanding Shopify changelog 2026"], ["vec", "complete Shopify changelog 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about Shopify changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Shopify changelog 2026"} -{"output": [["lex", "AWS recent news November documentation"], ["lex", "AWS overview recent news November guide"], ["lex", "AWS overview recent news November examples"], ["vec", "understanding AWS recent news November"], ["vec", "complete AWS recent news November reference"], ["hyde", "This comprehensive guide covers everything you need to know about AWS recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS recent news November"} -{"output": [["lex", "AWS overview recent news October tutorial"], ["lex", "AWS overview recent news October examples"], ["lex", "AWS recent news October documentation"], ["vec", "learn about AWS recent news October"], ["vec", "guide for AWS recent news October"], ["hyde", "This comprehensive guide covers everything you need to know about AWS recent news October. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS recent news October"} -{"output": [["lex", "Next.js overview recent news December guide"], ["lex", "Next.js recent news December documentation"], ["lex", "Next.js recent news December best practices"], ["vec", "guide for Next.js recent news December"], ["vec", "how to Next.js recent news December"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js recent news December. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js recent news December"} -{"output": [["lex", "space overview exploration recent news November guide"], ["lex", "space overview exploration recent news November examples"], ["lex", "space overview exploration recent news November tutorial"], ["vec", "guide for space exploration recent news November"], ["vec", "learn about space exploration recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about space exploration recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "space exploration recent news November"} -{"output": [["lex", "what overview changed in Python 2025 guide"], ["lex", "what overview changed in Python 2025 tutorial"], ["lex", "what changed in Python 2025 documentation"], ["vec", "learn about what changed in Python 2025"], ["vec", "guide for what changed in Python 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in Python 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in Python 2025"} -{"output": [["lex", "GitHub recent news November documentation"], ["lex", "GitHub overview recent news November tutorial"], ["lex", "GitHub overview recent news November examples"], ["vec", "complete GitHub recent news November reference"], ["vec", "learn about GitHub recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub recent news November"} -{"output": [["lex", "machine overview learning changelog 2025 examples"], ["lex", "machine overview learning changelog 2025 guide"], ["lex", "machine learning changelog 2025 best practices"], ["vec", "how to machine learning changelog 2025"], ["vec", "learn about machine learning changelog 2025"], ["hyde", "This comprehensive guide covers everything you need to know about machine learning changelog 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "machine learning changelog 2025"} -{"output": [["lex", "Next.js overview recent news November guide"], ["lex", "Next.js overview recent news November tutorial"], ["lex", "Next.js overview recent news November examples"], ["vec", "complete Next.js recent news November reference"], ["vec", "learn about Next.js recent news November"], ["hyde", "This comprehensive guide covers everything you need to know about Next.js recent news November. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Next.js recent news November"} -{"output": [["lex", "latest AWS updates best practices"], ["lex", "latest AWS updates documentation"], ["lex", "latest overview AWS updates examples"], ["vec", "guide for latest AWS updates"], ["vec", "complete latest AWS updates reference"], ["hyde", "This comprehensive guide covers everything you need to know about latest AWS updates. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "latest AWS updates"} -{"output": [["lex", "recent overview Vue changes 2026 examples"], ["lex", "recent overview Vue changes 2026 guide"], ["lex", "recent Vue changes 2026 best practices"], ["vec", "how to recent Vue changes 2026"], ["vec", "complete recent Vue changes 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about recent Vue changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent Vue changes 2026"} -{"output": [["lex", "what changed in space exploration 2025 documentation"], ["lex", "what overview changed in space exploration 2025 examples"], ["lex", "what changed in space exploration 2025 best practices"], ["vec", "understanding what changed in space exploration 2025"], ["vec", "learn about what changed in space exploration 2025"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in space exploration 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in space exploration 2025"} -{"output": [["lex", "TypeScript new features 2026 best practices"], ["lex", "TypeScript overview new features 2026 tutorial"], ["lex", "TypeScript overview new features 2026 guide"], ["vec", "learn about TypeScript new features 2026"], ["vec", "complete TypeScript new features 2026 reference"], ["hyde", "This comprehensive guide covers everything you need to know about TypeScript new features 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "TypeScript new features 2026"} -{"output": [["lex", "what overview changed in GitHub 2025 guide"], ["lex", "what changed in GitHub 2025 documentation"], ["lex", "what changed in GitHub 2025 best practices"], ["vec", "learn about what changed in GitHub 2025"], ["vec", "complete what changed in GitHub 2025 reference"], ["hyde", "This comprehensive guide covers everything you need to know about what changed in GitHub 2025. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "what changed in GitHub 2025"} -{"output": [["lex", "recent climate tech changes 2026 best practices"], ["lex", "recent overview climate tech changes 2026 guide"], ["lex", "recent overview climate tech changes 2026 tutorial"], ["vec", "how to recent climate tech changes 2026"], ["vec", "learn about recent climate tech changes 2026"], ["hyde", "This comprehensive guide covers everything you need to know about recent climate tech changes 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "recent climate tech changes 2026"} -{"output": [["lex", "Python changelog 2026 documentation"], ["lex", "Python overview changelog 2026 guide"], ["lex", "Python changelog 2026 best practices"], ["vec", "how to Python changelog 2026"], ["vec", "understanding Python changelog 2026"], ["hyde", "This comprehensive guide covers everything you need to know about Python changelog 2026. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Python changelog 2026"} -{"output": [["lex", "who overview is TDS motorsports tutorial"], ["lex", "who overview is TDS motorsports guide"], ["lex", "who is TDS motorsports documentation"], ["vec", "learn about who is TDS motorsports"], ["vec", "guide for who is TDS motorsports"], ["hyde", "This comprehensive guide covers everything you need to know about who is TDS motorsports. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "who is TDS motorsports"} -{"output": [["lex", "React overview hooks tutorial examples"], ["lex", "React hooks tutorial documentation"], ["lex", "React overview hooks tutorial tutorial"], ["vec", "understanding React hooks tutorial"], ["vec", "how to React hooks tutorial"], ["hyde", "This comprehensive guide covers everything you need to know about React hooks tutorial. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "React hooks tutorial"} -{"output": [["lex", "Docker overview container networking tutorial"], ["lex", "Docker overview container networking examples"], ["lex", "Docker container networking best practices"], ["vec", "complete Docker container networking reference"], ["vec", "understanding Docker container networking"], ["hyde", "This comprehensive guide covers everything you need to know about Docker container networking. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Docker container networking"} -{"output": [["lex", "Kubernetes pod deployment best practices"], ["lex", "Kubernetes pod deployment documentation"], ["lex", "Kubernetes overview pod deployment examples"], ["vec", "how to Kubernetes pod deployment"], ["vec", "complete Kubernetes pod deployment reference"], ["hyde", "This comprehensive guide covers everything you need to know about Kubernetes pod deployment. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Kubernetes pod deployment"} -{"output": [["lex", "AWS Lambda functions setup documentation"], ["lex", "AWS overview Lambda functions setup examples"], ["lex", "AWS overview Lambda functions setup tutorial"], ["vec", "learn about AWS Lambda functions setup"], ["vec", "how to AWS Lambda functions setup"], ["hyde", "This comprehensive guide covers everything you need to know about AWS Lambda functions setup. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "AWS Lambda functions setup"} -{"output": [["lex", "Stripe overview payment integration examples"], ["lex", "Stripe overview payment integration tutorial"], ["lex", "Stripe payment integration documentation"], ["vec", "learn about Stripe payment integration"], ["vec", "understanding Stripe payment integration"], ["hyde", "This comprehensive guide covers everything you need to know about Stripe payment integration. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Stripe payment integration"} -{"output": [["lex", "GitHub overview Actions workflow guide"], ["lex", "GitHub overview Actions workflow examples"], ["lex", "GitHub Actions workflow documentation"], ["vec", "understanding GitHub Actions workflow"], ["vec", "guide for GitHub Actions workflow"], ["hyde", "This comprehensive guide covers everything you need to know about GitHub Actions workflow. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "GitHub Actions workflow"} -{"output": [["lex", "Vercel overview deployment guide examples"], ["lex", "Vercel deployment guide documentation"], ["lex", "Vercel overview deployment guide tutorial"], ["vec", "learn about Vercel deployment guide"], ["vec", "understanding Vercel deployment guide"], ["hyde", "This comprehensive guide covers everything you need to know about Vercel deployment guide. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Vercel deployment guide"} -{"output": [["lex", "Supabase auth configuration documentation"], ["lex", "Supabase overview auth configuration tutorial"], ["lex", "Supabase auth configuration best practices"], ["vec", "understanding Supabase auth configuration"], ["vec", "learn about Supabase auth configuration"], ["hyde", "This comprehensive guide covers everything you need to know about Supabase auth configuration. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Supabase auth configuration"} -{"output": [["lex", "Twilio overview SMS API guide"], ["lex", "Twilio overview SMS API examples"], ["lex", "Twilio SMS API documentation"], ["vec", "how to Twilio SMS API"], ["vec", "complete Twilio SMS API reference"], ["hyde", "This comprehensive guide covers everything you need to know about Twilio SMS API. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Twilio SMS API"} -{"output": [["lex", "Datadog overview monitoring setup guide"], ["lex", "Datadog monitoring setup best practices"], ["lex", "Datadog overview monitoring setup examples"], ["vec", "complete Datadog monitoring setup reference"], ["vec", "understanding Datadog monitoring setup"], ["hyde", "This comprehensive guide covers everything you need to know about Datadog monitoring setup. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Datadog monitoring setup"} -{"output": [["lex", "Sentry error tracking best practices"], ["lex", "Sentry overview error tracking guide"], ["lex", "Sentry error tracking documentation"], ["vec", "understanding Sentry error tracking"], ["vec", "learn about Sentry error tracking"], ["hyde", "This comprehensive guide covers everything you need to know about Sentry error tracking. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Sentry error tracking"} -{"output": [["lex", "Terraform overview AWS provider tutorial"], ["lex", "Terraform overview AWS provider guide"], ["lex", "Terraform AWS provider best practices"], ["vec", "how to Terraform AWS provider"], ["vec", "understanding Terraform AWS provider"], ["hyde", "This comprehensive guide covers everything you need to know about Terraform AWS provider. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Terraform AWS provider"} -{"output": [["lex", "Ansible playbook examples best practices"], ["lex", "Ansible overview playbook examples examples"], ["lex", "Ansible overview playbook examples tutorial"], ["vec", "understanding Ansible playbook examples"], ["vec", "how to Ansible playbook examples"], ["hyde", "This comprehensive guide covers everything you need to know about Ansible playbook examples. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike."]], "category": "diverse_addon", "query": "Ansible playbook examples"} -{"output": [["lex", "ssh key auth setup"], ["lex", "ssh public private key pair"], ["lex", "passwordless ssh login"], ["vec", "how to set up ssh key-based authentication instead of passwords"], ["vec", "step-by-step guide to generating and configuring ssh keys for secure server access"], ["hyde", "Generate an SSH key pair with ssh-keygen -t ed25519. Copy the public key to ~/.ssh/authorized_keys on the remote server using ssh-copy-id. Ensure permissions are 700 for .ssh and 600 for authorized_keys."]], "query": "ssh key authentication"} -{"output": [["lex", "python venv virtualenv"], ["lex", "pip virtual environment setup"], ["lex", "python isolated dependencies"], ["vec", "how to create and activate a python virtual environment for project isolation"], ["vec", "what is the difference between venv, virtualenv, and conda for managing python dependencies"], ["hyde", "Create a virtual environment with python -m venv myenv, then activate it with source myenv/bin/activate on Unix or myenv\\Scripts\\activate on Windows. Install packages with pip and they stay isolated from your system Python."]], "query": "Python virtual environments"} -{"output": [["lex", "git merge conflict resolve"], ["lex", "git conflict markers HEAD"], ["lex", "resolving merge conflicts"], ["vec", "how to resolve merge conflicts in git when two branches modify the same lines"], ["vec", "what do the conflict markers mean and how do you manually edit conflicted files"], ["hyde", "Git marks conflicts with <<<<<<< HEAD, =======, and >>>>>>> branch-name. Edit the file to keep the code you want, remove the markers, then git add the file and commit. Use git mergetool for a visual diff interface."]], "query": "git merge conflicts"} -{"output": [["lex", "tcp udp protocol difference"], ["lex", "tcp reliable udp fast"], ["lex", "connection-oriented vs connectionless"], ["vec", "what are the key differences between TCP and UDP network protocols"], ["vec", "when should you use TCP versus UDP for application networking"], ["hyde", "TCP provides reliable, ordered delivery with acknowledgments and retransmission. UDP is faster but unreliable—packets may arrive out of order or not at all. Use TCP for web, email, file transfer. Use UDP for video streaming, gaming, DNS where speed matters more than reliability."]], "query": "TCP vs UDP"} -{"output": [["lex", "docker compose volume mount"], ["lex", "docker persistent storage volumes"], ["lex", "compose yaml volumes section"], ["vec", "how to configure persistent volumes in docker compose for data that survives container restarts"], ["vec", "what is the difference between bind mounts and named volumes in docker compose"], ["hyde", "In docker-compose.yml, define volumes under the top-level volumes key and reference them in services. Named volumes persist data in Docker's storage. Bind mounts map host directories directly: volumes: - ./data:/app/data for development, - myvolume:/app/data for production."]], "query": "Docker compose volumes"} -{"output": [["lex", "regex lookahead assertion"], ["lex", "regex lookbehind positive negative"], ["lex", "zero-width assertions regex"], ["vec", "how do lookahead and lookbehind assertions work in regular expressions"], ["vec", "what is the syntax for positive and negative lookahead and lookbehind in regex"], ["hyde", "Lookahead (?=pattern) matches a position followed by pattern without consuming it. Negative lookahead (?!pattern) matches where pattern doesn't follow. Lookbehind (?<=pattern) matches a position preceded by pattern. Example: \\d+(?= dollars) matches numbers followed by 'dollars'."]], "query": "regex lookahead lookbehind"} -{"output": [["lex", "kubernetes secrets k8s"], ["lex", "k8s secret yaml base64"], ["lex", "kubectl create secret"], ["vec", "how to create and use secrets in kubernetes for sensitive configuration data"], ["vec", "what are best practices for managing secrets in kubernetes clusters"], ["hyde", "Create secrets with kubectl create secret generic mysecret --from-literal=password=abc123. Reference in pods via env valueFrom secretKeyRef or volume mounts. Secrets are base64 encoded, not encrypted—use sealed-secrets or external secret managers like Vault for production."]], "query": "Kubernetes secrets management"} -{"output": [["lex", "cors error fix browser"], ["lex", "access-control-allow-origin header"], ["lex", "cors preflight request"], ["vec", "how to fix CORS errors when making API requests from a web browser"], ["vec", "what causes cross-origin resource sharing errors and how do you configure the server to allow them"], ["hyde", "CORS errors occur when a browser blocks requests to a different origin. Fix by adding Access-Control-Allow-Origin headers on the server. For Express: app.use(cors()). For preflight requests, handle OPTIONS and return Access-Control-Allow-Methods and Access-Control-Allow-Headers."]], "query": "CORS errors fix"} -{"output": [["lex", "postgresql index explain analyze"], ["lex", "postgres btree index performance"], ["lex", "create index postgresql"], ["vec", "how to use EXPLAIN ANALYZE to understand query performance and index usage in postgresql"], ["vec", "what types of indexes does postgresql support and when should you use each"], ["hyde", "Run EXPLAIN ANALYZE SELECT... to see the query plan and actual execution time. Look for Seq Scan on large tables—add an index with CREATE INDEX idx_name ON table(column). B-tree indexes work for equality and range queries, GIN for full-text search and arrays, GiST for geometric data."]], "query": "PostgreSQL indexes explain"} -{"output": [["lex", "jwt refresh token flow"], ["lex", "access token refresh token"], ["lex", "jwt token expiration renewal"], ["vec", "how does the jwt refresh token flow work for maintaining user sessions"], ["vec", "what is the difference between access tokens and refresh tokens in jwt authentication"], ["hyde", "Access tokens are short-lived (15 min) and sent with each request. Refresh tokens are long-lived (days/weeks) and stored securely. When the access token expires, send the refresh token to /auth/refresh to get a new access token without re-authenticating."]], "query": "JWT token refresh"} -{"output": [["lex", "react overview useeffect cleanup function"], ["lex", "useeffect return cleanup"], ["lex", "react unmount cleanup"], ["vec", "how to properly clean up side effects in react useeffect to prevent memory leaks"], ["vec", "when does the useeffect cleanup function run and what should you clean up"], ["hyde", "Return a cleanup function from useEffect to run before the component unmounts or before the effect re-runs. Use it to cancel subscriptions, clear timers, and abort fetch requests. Example: useEffect(() => { const id = setInterval(fn, 1000); return () => clearInterval(id); }, []);"]], "query": "React useEffect cleanup"} -{"output": [["lex", "nginx overview reverse proxy config"], ["lex", "nginx proxy_pass upstream"], ["lex", "nginx load balancer setup"], ["vec", "how to configure nginx as a reverse proxy to forward requests to backend servers"], ["vec", "what nginx directives do you need for a basic reverse proxy configuration"], ["hyde", "In nginx.conf, use proxy_pass inside a location block: location /api { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }. Add upstream blocks for load balancing across multiple backend servers."]], "query": "nginx reverse proxy"} -{"output": [["lex", "systemd service unit file"], ["lex", "systemctl enable start service"], ["lex", "systemd service configuration"], ["vec", "how to create a systemd service file to run an application as a linux daemon"], ["vec", "what are the essential sections and directives in a systemd unit file"], ["hyde", "Create /etc/systemd/system/myapp.service with [Unit] Description, [Service] ExecStart=/path/to/app, Restart=always, User=appuser, and [Install] WantedBy=multi-user.target. Run systemctl daemon-reload, then systemctl enable --now myapp."]], "query": "systemd service file"} -{"output": [["lex", "websocket http difference"], ["lex", "websocket persistent connection"], ["lex", "http polling vs websocket"], ["vec", "what are the differences between websockets and http for real-time communication"], ["vec", "when should you use websockets instead of http long polling or server-sent events"], ["hyde", "HTTP is request-response: client asks, server answers, connection closes. WebSocket upgrades HTTP to a persistent bidirectional connection. Use WebSocket for chat, live updates, gaming. Use SSE for server-to-client only streaming. HTTP polling wastes bandwidth with repeated requests."]], "query": "websocket vs http"} -{"output": [["lex", "sql injection prevent parameterized"], ["lex", "prepared statements sql injection"], ["lex", "sql injection sanitize input"], ["vec", "how to prevent sql injection attacks in web applications"], ["vec", "why are parameterized queries and prepared statements important for database security"], ["hyde", "Never concatenate user input into SQL strings. Use parameterized queries: cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,)). ORMs like SQLAlchemy handle this automatically. Validate and sanitize input, but parameterization is the primary defense."]], "query": "SQL injection prevention"} -{"output": [["lex", "typescript generics type parameter"], ["lex", "typescript generic function interface"], ["lex", "ts generics constraints extends"], ["vec", "how to use generics in typescript to write reusable type-safe functions and classes"], ["vec", "what is the syntax for generic type parameters and constraints in typescript"], ["hyde", "Generics let you write flexible, reusable code while maintaining type safety. Declare with angle brackets: function identity(arg: T): T { return arg; }. Add constraints with extends: function getLength(item: T): number { return item.length; }."]], "query": "TypeScript generics"} -{"output": [["lex", "oauth2 authorization code flow"], ["lex", "oauth authorization code grant"], ["lex", "oauth2 pkce code verifier"], ["vec", "how does the oauth 2.0 authorization code flow work for secure third-party authentication"], ["vec", "what are the steps in the oauth authorization code grant and why is pkce recommended"], ["hyde", "User clicks login, redirected to auth server with client_id and redirect_uri. User authenticates, gets authorization code. App exchanges code for tokens at token endpoint. PKCE adds code_verifier/code_challenge to prevent interception attacks—required for public clients."]], "query": "OAuth 2.0 authorization code flow"} -{"output": [["lex", "redis cache strategy pattern"], ["lex", "redis cache aside through"], ["lex", "redis ttl expiration caching"], ["vec", "what are the common caching strategies when using redis for application performance"], ["vec", "how do you implement cache-aside, write-through, and write-behind patterns with redis"], ["hyde", "Cache-aside: app checks Redis first, fetches from DB on miss, writes to cache. Write-through: writes go to cache and DB together. Write-behind: writes to cache, async sync to DB. Set TTL with EXPIRE to prevent stale data. Use SETEX for atomic set-with-expiry."]], "query": "Redis caching strategies"} -{"output": [["lex", "graphql rest api comparison"], ["lex", "graphql query flexibility"], ["lex", "rest vs graphql tradeoffs"], ["vec", "what are the main differences between graphql and rest api design approaches"], ["vec", "when should you choose graphql over rest for your api architecture"], ["hyde", "REST uses fixed endpoints returning predefined data shapes. GraphQL uses one endpoint where clients specify exactly what fields they need, reducing over-fetching. REST is simpler, better cached. GraphQL excels for mobile apps, complex data requirements, and avoiding multiple round trips."]], "query": "GraphQL vs REST"} -{"output": [["lex", "linux chmod file permissions"], ["lex", "unix rwx permission bits"], ["lex", "chmod 755 644 meaning"], ["vec", "how do linux file permissions work and how do you change them with chmod"], ["vec", "what do the rwx permission bits mean for owner, group, and others"], ["hyde", "Permissions are rwx for read, write, execute. Three groups: owner, group, others. chmod 755 means rwxr-xr-x (owner full, others read+execute). chmod 644 means rw-r--r-- (owner read+write, others read only). Use chmod +x to add execute permission."]], "query": "linux file permissions chmod"} -{"output": [["lex", "async await try catch"], ["lex", "javascript promise error handling"], ["lex", "async function exception handling"], ["vec", "how to properly handle errors in javascript async await functions"], ["vec", "what happens when an async function throws and how do you catch those errors"], ["hyde", "Wrap await calls in try-catch blocks: try { const data = await fetchData(); } catch (err) { console.error(err); }. Unhandled rejections in async functions become unhandled promise rejections. For multiple awaits, catch individually or use Promise.allSettled to handle partial failures."]], "query": "async await error handling"} -{"output": [["lex", "elasticsearch overview query dsl"], ["lex", "elasticsearch bool must should"], ["lex", "es full text search query"], ["vec", "how to write search queries using elasticsearch query dsl syntax"], ["vec", "what are the common query types in elasticsearch like match, term, and bool queries"], ["hyde", "Elasticsearch Query DSL uses JSON. Match query for full-text: {match: {title: 'search'}}. Term for exact: {term: {status: 'published'}}. Bool combines queries: {bool: {must: [...], should: [...], filter: [...], must_not: [...]}}. Filter context skips scoring for faster filtering."]], "query": "Elasticsearch query DSL"} -{"output": [["lex", "terraform state file backend"], ["lex", "terraform remote state s3"], ["lex", "tfstate locking management"], ["vec", "how to manage terraform state files and what are the best practices for team collaboration"], ["vec", "why should you use remote state backends in terraform and how do you configure them"], ["hyde", "Store state remotely in S3, GCS, or Terraform Cloud—never commit tfstate to git. Configure backend in terraform { backend \"s3\" { bucket = \"my-state\", key = \"prod.tfstate\", region = \"us-east-1\", dynamodb_table = \"tf-locks\" } }. DynamoDB provides state locking to prevent concurrent modifications."]], "query": "terraform state management"} -{"output": [["lex", "monorepo polyrepo comparison"], ["lex", "monorepo benefits drawbacks"], ["lex", "single repo multiple repos"], ["vec", "what are the tradeoffs between using a monorepo versus multiple repositories"], ["vec", "when does a monorepo make sense and what tools help manage large monorepos"], ["hyde", "Monorepos keep all code in one repository—easier atomic changes across packages, shared tooling, consistent versioning. Polyrepos give teams autonomy, simpler CI, clearer ownership. Use monorepos for tightly coupled code. Tools: Nx, Turborepo, Lerna, Bazel for build orchestration."]], "query": "monorepo vs polyrepo"} -{"output": [["lex", "prometheus overview alerting rules config"], ["lex", "prometheus alertmanager rules"], ["lex", "promql alert expressions"], ["vec", "how to write prometheus alerting rules to notify on metric thresholds"], ["vec", "what is the syntax for prometheus alert rules and how do they integrate with alertmanager"], ["hyde", "Define rules in YAML: groups: - name: example rules: - alert: HighErrorRate expr: rate(http_errors_total[5m]) > 0.1 for: 5m labels: severity: critical annotations: summary: High error rate. Prometheus evaluates rules periodically and sends firing alerts to Alertmanager for routing and deduplication."]], "query": "prometheus alerting rules"} -{"output": [["lex", "css flexbox center align"], ["lex", "flexbox justify-content align-items"], ["lex", "css center div flexbox"], ["vec", "how to center elements horizontally and vertically using css flexbox"], ["vec", "what flexbox properties do you use to center content in a container"], ["hyde", "On the container, set display: flex; justify-content: center; align-items: center;. justify-content handles the main axis (horizontal by default), align-items handles the cross axis. Add height: 100vh to center within the viewport. For a single item, margin: auto also works inside flex containers."]], "query": "CSS flexbox centering"} -{"output": [["lex", "database connection pool"], ["lex", "connection pooling performance"], ["lex", "db pool size configuration"], ["vec", "what is database connection pooling and why does it improve application performance"], ["vec", "how do you configure connection pool size for optimal database throughput"], ["hyde", "Opening database connections is expensive. Connection pools maintain reusable connections. Set pool size based on: pool_size = (core_count * 2) + effective_spindle_count. Too small starves the app, too large overwhelms the database. Popular libraries: HikariCP for Java, pgbouncer for PostgreSQL."]], "query": "database connection pooling"} -{"output": [["lex", "kafka consumer group offset"], ["lex", "kafka partition consumer rebalance"], ["lex", "kafka consumer group id"], ["vec", "how do kafka consumer groups work for parallel message processing"], ["vec", "what happens during consumer group rebalancing and how are partitions assigned"], ["hyde", "Consumers with the same group.id share partitions—each partition is consumed by only one consumer in the group. Adding consumers triggers rebalancing. If consumers > partitions, some idle. Offsets track progress per partition. Use enable.auto.commit=false for exactly-once semantics with manual commits."]], "query": "kafka consumer groups"} -{"output": [["lex", "vim search replace substitute"], ["lex", "vim sed command :%s"], ["lex", "vim find replace regex"], ["vec", "how to search and replace text in vim using the substitute command"], ["vec", "what is the syntax for vim search and replace with regular expressions and flags"], ["hyde", "Use :%s/old/new/g to replace all occurrences in the file. % means all lines, g means global (all matches per line). Add c for confirmation: :%s/old/new/gc. Use \\< and \\> for word boundaries. & in replacement refers to the matched text. Use :s for current line only."]], "query": "vim search replace"} -{"output": [["lex", "http status codes list"], ["lex", "http 200 400 500 codes"], ["lex", "rest api status codes"], ["vec", "what do the common http status codes mean and when should you use each"], ["vec", "how do you choose the right http status code for api responses"], ["hyde", "200 OK success, 201 Created for POST, 204 No Content for DELETE. 400 Bad Request for invalid input, 401 Unauthorized for auth required, 403 Forbidden for insufficient permissions, 404 Not Found. 500 Internal Server Error for unexpected failures, 503 Service Unavailable for temporary issues."]], "query": "http status codes meaning"} -{"output": [["lex", "binary overview search algorithm"], ["lex", "binary search sorted array"], ["lex", "binary search time complexity"], ["vec", "how does the binary search algorithm work and what is its time complexity"], ["vec", "how do you implement binary search to find an element in a sorted array"], ["hyde", "Binary search halves the search space each iteration. Compare target with middle element: if smaller, search left half; if larger, search right. O(log n) time complexity. Requires sorted input. Watch for integer overflow in mid calculation: use low + (high - low) / 2 instead of (low + high) / 2."]], "query": "binary search algorithm"} -{"output": [["lex", "git overview rebase interactive squash"], ["lex", "git rebase -i edit commits"], ["lex", "git squash commits rebase"], ["vec", "how to use git interactive rebase to edit, squash, and reorder commits"], ["vec", "what are the commands available in git rebase interactive mode"], ["hyde", "Run git rebase -i HEAD~5 to edit the last 5 commits. In the editor, change 'pick' to: squash (s) to combine with previous, reword (r) to edit message, edit (e) to amend, drop (d) to remove. Save and follow prompts. Never rebase commits already pushed to shared branches."]], "query": "git rebase interactive"} -{"output": [["lex", "docker environment variables"], ["lex", "docker env file compose"], ["lex", "docker run -e env vars"], ["vec", "how to pass environment variables to docker containers"], ["vec", "what are the different ways to set environment variables in docker and docker compose"], ["hyde", "Use -e flag: docker run -e DB_HOST=localhost myapp. In docker-compose.yml: environment: - DB_HOST=localhost or env_file: - .env. For secrets, prefer docker secrets or mount files. Variables in Dockerfile with ENV persist in the image; runtime -e overrides them."]], "query": "environment variables docker"} -{"output": [["lex", "rate limiting algorithm api"], ["lex", "token bucket leaky bucket"], ["lex", "rate limit sliding window"], ["vec", "what algorithms are used for api rate limiting and how do they differ"], ["vec", "how do token bucket and sliding window rate limiting algorithms work"], ["hyde", "Token bucket: bucket fills at fixed rate, requests consume tokens, rejected when empty—allows bursts. Leaky bucket: requests queue, processed at fixed rate—smooths traffic. Sliding window: count requests in rolling time window. Fixed window has boundary issues; sliding window log is precise but memory-heavy."]], "query": "rate limiting algorithms"} -{"output": [["lex", "blue overview green deployment strategy"], ["lex", "zero downtime deployment"], ["lex", "blue green kubernetes rollout"], ["vec", "what is blue green deployment and how does it enable zero downtime releases"], ["vec", "how do you implement blue green deployments in kubernetes or cloud environments"], ["hyde", "Blue-green runs two identical environments. Blue is live, green has the new version. Test green thoroughly, then switch the load balancer. Instant rollback by switching back to blue. In Kubernetes, use two deployments with a service selector update, or Argo Rollouts for automated blue-green."]], "query": "blue green deployment"} -{"output": [["lex", "memory leak debug profiler"], ["lex", "memory leak detection tools"], ["lex", "heap dump memory analysis"], ["vec", "how to find and fix memory leaks in applications"], ["vec", "what tools and techniques help identify memory leaks in different programming languages"], ["hyde", "Use heap profilers: Chrome DevTools for JavaScript, VisualVM or MAT for Java, Valgrind for C/C++, tracemalloc for Python. Take heap snapshots before and after operations, compare retained objects. Common causes: forgotten event listeners, closures holding references, unbounded caches, circular references."]], "query": "memory leak debugging"} -{"output": [["lex", "stripe webhook signature verify"], ["lex", "stripe webhook endpoint secret"], ["lex", "stripe event verification"], ["vec", "how to verify stripe webhook signatures to ensure events are authentic"], ["vec", "what is the correct way to handle and validate incoming stripe webhook events"], ["hyde", "Stripe signs webhooks with your endpoint secret. Verify using stripe.webhooks.constructEvent(body, sig, endpointSecret). Use the raw request body, not parsed JSON. Return 200 quickly, process async. Handle event types like checkout.session.completed. Store endpoint secret securely, rotate if compromised."]], "query": "Stripe webhook verification"} -{"output": [["lex", "react context redux comparison"], ["lex", "useContext vs redux state"], ["lex", "react state management choice"], ["vec", "when should you use react context versus redux for state management"], ["vec", "what are the tradeoffs between react context api and redux for global state"], ["hyde", "Context is built-in, simple for low-frequency updates like themes and auth. Redux adds boilerplate but provides devtools, middleware, time-travel debugging, predictable updates. Context re-renders all consumers on any change; Redux allows granular subscriptions. Use Context for simple cases, Redux for complex state logic."]], "query": "React context vs Redux"} -{"output": [["lex", "dns records types a cname mx"], ["lex", "dns configuration records"], ["lex", "domain name system records"], ["vec", "what are the different types of dns records and what does each one do"], ["vec", "how do you configure dns records for a domain including a, cname, mx, and txt records"], ["hyde", "A record maps domain to IPv4 address. AAAA for IPv6. CNAME aliases one domain to another (can't be on root domain). MX for mail servers with priority. TXT for verification and SPF/DKIM. NS delegates to nameservers. TTL controls caching duration. Changes propagate based on previous TTL."]], "query": "DNS records explained"} -{"output": [["lex", "tmux session window pane"], ["lex", "tmux attach detach session"], ["lex", "tmux commands shortcuts"], ["vec", "how to create and manage tmux sessions for persistent terminal workflows"], ["vec", "what are the essential tmux commands for session, window, and pane management"], ["hyde", "Start session: tmux new -s name. Detach: Ctrl-b d. Reattach: tmux attach -t name. New window: Ctrl-b c. Split pane: Ctrl-b % (vertical), Ctrl-b \" (horizontal). Navigate panes: Ctrl-b arrow. List sessions: tmux ls. Kill session: tmux kill-session -t name. Sessions persist after disconnect."]], "query": "tmux session management"} -{"output": [["lex", "utf-8 unicode encoding"], ["lex", "utf8 character encoding bytes"], ["lex", "unicode utf-8 ascii difference"], ["vec", "how does utf-8 encoding work and why is it the standard for text"], ["vec", "what is the relationship between unicode and utf-8 and how are characters encoded as bytes"], ["hyde", "UTF-8 encodes Unicode code points as 1-4 bytes. ASCII characters (0-127) use 1 byte, compatible with ASCII. Higher code points use more bytes with leading bits indicating length. UTF-8 is self-synchronizing and space-efficient for Latin text. Always specify encoding explicitly when reading/writing files."]], "query": "utf-8 encoding explained"} -{"output": [["lex", "microservices overview communication patterns"], ["lex", "sync async microservice calls"], ["lex", "event driven microservices"], ["vec", "what are the common communication patterns between microservices"], ["vec", "when should microservices use synchronous rest calls versus asynchronous messaging"], ["hyde", "Sync (REST/gRPC): simple, immediate response, but creates coupling and cascade failures. Async (message queues, events): decoupled, resilient, eventual consistency. Use sync for queries needing immediate response. Use async for commands, notifications, cross-service workflows. Event sourcing and CQRS for complex domains."]], "query": "microservices communication patterns"} -{"output": [["lex", "bash script best practices"], ["lex", "shell script error handling"], ["lex", "bash scripting guidelines"], ["vec", "what are the best practices for writing reliable and maintainable shell scripts"], ["vec", "how do you handle errors and edge cases properly in bash scripts"], ["hyde", "Start with #!/usr/bin/env bash and set -euo pipefail. Use shellcheck for linting. Quote variables: \"$var\". Use [[ ]] for tests. Handle errors with trap. Use functions for reusability. Avoid parsing ls output—use globs. Prefer printf over echo. Use local variables in functions. Add -- before filenames from user input."]], "query": "shell script best practices"} -{"output": [["lex", "load balancer health check"], ["lex", "health check endpoint liveness"], ["lex", "lb health probe configuration"], ["vec", "how do load balancer health checks work and why are they important"], ["vec", "what should a health check endpoint return and how do you configure health check intervals"], ["hyde", "Load balancers probe backend instances to route traffic only to healthy ones. Health endpoint should check critical dependencies (database, cache) and return 200 if healthy, 503 if not. Configure interval (10-30s), timeout (5s), and threshold (2-3 failures). Include /health and /ready endpoints for Kubernetes liveness and readiness."]], "query": "load balancer health checks"} -{"output": [["lex", "ssl tls certificate renewal"], ["lex", "lets encrypt certbot renew"], ["lex", "https certificate expiration"], ["vec", "how to renew ssl tls certificates before they expire"], ["vec", "what is the process for automated certificate renewal with lets encrypt and certbot"], ["hyde", "Let's Encrypt certificates expire in 90 days. Certbot auto-renews via cron or systemd timer: certbot renew runs twice daily, renews within 30 days of expiry. Test with --dry-run. For other CAs, set calendar reminders. Check expiration: openssl s_client -connect domain:443 | openssl x509 -noout -dates."]], "query": "certificate ssl tls renewal"} -{"output": [["lex", "python decorator function"], ["lex", "python @ decorator syntax"], ["lex", "python wrapper decorator"], ["vec", "how do python decorators work and what is the syntax for creating them"], ["vec", "what are common use cases for decorators in python like logging, caching, and authentication"], ["hyde", "Decorators wrap functions to extend behavior. @decorator before def is syntactic sugar for func = decorator(func). A decorator is a function taking a function and returning a new function. Use functools.wraps to preserve metadata. Common uses: @lru_cache for memoization, @login_required for auth, timing/logging wrappers."]], "query": "python decorators explained"} -{"output": [["lex", "cap theorem distributed database"], ["lex", "consistency availability partition tolerance"], ["lex", "cap theorem tradeoffs"], ["vec", "what is the cap theorem and how does it apply to distributed database design"], ["vec", "how do different databases choose between consistency and availability during network partitions"], ["hyde", "CAP theorem: distributed systems can guarantee only 2 of 3—Consistency (all nodes see same data), Availability (requests get responses), Partition tolerance (survives network splits). During partitions, choose CP (reject requests for consistency, like MongoDB) or AP (serve potentially stale data, like Cassandra). PACELC extends CAP for normal operation tradeoffs."]], "query": "cap theorem database"} -{"output": [["lex", "garbage collection gc tuning"], ["lex", "jvm gc heap memory"], ["lex", "gc pause time optimization"], ["vec", "how to tune garbage collection for better application performance"], ["vec", "what gc algorithms are available and how do you choose gc settings for low latency"], ["hyde", "For JVM, G1GC is default, good balance of throughput and pause times. ZGC and Shenandoah offer sub-millisecond pauses for low-latency needs. Tune heap size: -Xms and -Xmx same to avoid resizing. Monitor with gc logs: -Xlog:gc*. Reduce allocation rate by reusing objects and avoiding unnecessary autoboxing."]], "query": "garbage collection tuning"} -{"output": [["lex", "feature flags toggles"], ["lex", "feature flag implementation"], ["lex", "gradual rollout feature flags"], ["vec", "how to implement feature flags for gradual rollouts and a/b testing"], ["vec", "what are the best practices for managing feature flags in production"], ["hyde", "Feature flags decouple deployment from release. Simple: if (featureEnabled('new-checkout')) { ... }. Store flags in config, database, or services like LaunchDarkly. Use for gradual rollout (1% -> 10% -> 100%), A/B tests, kill switches. Clean up old flags to prevent technical debt. Log flag evaluations for debugging."]], "query": "feature flags implementation"} -{"output": [["lex", "kafka partitions topics"], ["lex", "kafka partition key ordering"], ["lex", "kafka partition count scaling"], ["vec", "how do kafka partitions work and how do they affect scalability and message ordering"], ["vec", "how do you choose the right number of partitions for a kafka topic"], ["hyde", "Partitions enable parallelism—each partition is consumed by one consumer in a group. Messages with same key go to same partition, preserving order per key. More partitions = more throughput but more overhead. Start with partitions = max(expected throughput / partition throughput, consumer count). Can't reduce partitions, only increase."]], "query": "apache kafka partitions"} -{"output": [["lex", "cron overview job syntax schedule"], ["lex", "crontab expression format"], ["lex", "cron schedule examples"], ["vec", "how to write cron expressions to schedule jobs at specific times"], ["vec", "what does each field in a crontab entry mean and what are common scheduling patterns"], ["hyde", "Cron format: minute hour day-of-month month day-of-week command. */5 * * * * runs every 5 minutes. 0 2 * * * runs daily at 2 AM. 0 0 * * 0 runs weekly on Sunday. Use crontab -e to edit. Tools like crontab.guru help build expressions. Consider timezone—cron uses system time."]], "query": "cron job syntax"} -{"output": [["lex", "gpg key sign verify"], ["lex", "gpg signature git commits"], ["lex", "pgp key signing encryption"], ["vec", "how to use gpg keys for signing and verifying files and git commits"], ["vec", "what is the process for creating gpg keys and configuring git to sign commits"], ["hyde", "Generate key: gpg --full-generate-key. List keys: gpg --list-keys. Sign file: gpg --sign file.txt. Verify: gpg --verify file.txt.gpg. For git: git config --global user.signingkey KEYID, git config --global commit.gpgsign true. Export public key for GitHub: gpg --armor --export KEYID."]], "query": "GPG key signing"} -{"output": [["lex", "api versioning strategy"], ["lex", "rest api version url header"], ["lex", "api backward compatibility"], ["vec", "what are the different strategies for versioning rest apis"], ["vec", "how do you maintain backward compatibility when evolving an api"], ["hyde", "URL versioning (/v1/users) is explicit, easy to route. Header versioning (Accept: application/vnd.api+json;version=1) keeps URLs clean. Query param (?version=1) is simple but pollutes URLs. Prefer additive changes—new fields don't break clients. Deprecate gracefully with sunset headers and migration guides."]], "query": "api versioning strategies"} -{"output": [["lex", "mutex semaphore difference"], ["lex", "mutex lock synchronization"], ["lex", "semaphore counting binary"], ["vec", "what is the difference between a mutex and a semaphore in concurrent programming"], ["vec", "when should you use a mutex versus a semaphore for thread synchronization"], ["hyde", "Mutex is a binary lock owned by one thread—used for mutual exclusion protecting shared resources. Semaphore is a counter allowing N concurrent accesses—used for limiting concurrency (connection pools, rate limiting). Mutex has ownership (same thread must unlock), semaphore doesn't. Use mutex for critical sections, semaphore for resource counting."]], "query": "mutex vs semaphore"} -{"output": [["lex", "json overview schema validation"], ["lex", "jsonschema validator python"], ["lex", "json schema types required"], ["vec", "how to use json schema to validate the structure of json data"], ["vec", "what are the common json schema keywords for defining types, required fields, and constraints"], ["hyde", "JSON Schema defines expected structure. Key properties: type (string, number, object, array), properties for object fields, required array for mandatory fields, items for array elements. Validators: ajv (JS), jsonschema (Python). Use for API request validation, config file validation, documentation generation."]], "query": "json schema validation"} -{"output": [["lex", "ci overview cd pipeline stages"], ["lex", "continuous integration deployment"], ["lex", "build test deploy pipeline"], ["vec", "what are the typical stages in a ci cd pipeline"], ["vec", "how do you design a continuous integration and deployment pipeline for reliable releases"], ["hyde", "Typical stages: 1) Source—trigger on commit, 2) Build—compile, bundle, create artifacts, 3) Test—unit, integration, e2e tests, 4) Security scan—SAST, dependency audit, 5) Deploy to staging, 6) Acceptance tests, 7) Deploy to production. Use parallelization for speed. Gate deployments on test pass. Implement rollback mechanisms."]], "query": "CI CD pipeline stages"} -{"output": [["lex", "event overview sourcing pattern"], ["lex", "event store append only log"], ["lex", "cqrs event sourcing"], ["vec", "what is event sourcing and how does it differ from traditional crud data storage"], ["vec", "how do you implement event sourcing and what are its benefits and challenges"], ["hyde", "Event sourcing stores state changes as immutable events rather than current state. Account balance is sum of all Deposit and Withdrawal events. Benefits: full audit trail, time travel, replay for debugging. Challenges: eventual consistency, event schema evolution, increased complexity. Often paired with CQRS—separate read models built from event stream."]], "query": "event sourcing pattern"} -{"output": [["lex", "ipv4 ipv6 difference"], ["lex", "ipv6 address format"], ["lex", "ipv4 exhaustion ipv6 transition"], ["vec", "what are the key differences between ipv4 and ipv6 addressing"], ["vec", "why is ipv6 necessary and how does the transition from ipv4 work"], ["hyde", "IPv4 uses 32-bit addresses (4 billion), exhausted in 2011. IPv6 uses 128-bit addresses (340 undecillion), formatted as eight hex groups: 2001:0db8::1. IPv6 eliminates NAT need, has built-in IPsec. Transition via dual-stack (both protocols) or tunneling. Check IPv6 support: curl -6 ipv6.google.com."]], "query": "IPv4 vs IPv6"} -{"output": [["lex", "dependency injection di pattern"], ["lex", "di inversion of control ioc"], ["lex", "dependency injection testing"], ["vec", "what is dependency injection and why does it improve code maintainability"], ["vec", "how does dependency injection make unit testing easier"], ["hyde", "Dependency injection provides dependencies from outside rather than creating them internally. Class receives DatabaseService via constructor instead of instantiating it. Benefits: loose coupling, easy testing with mocks, flexible configuration. Instead of new EmailService(), inject interface IEmailService—swap implementations without changing consumer code."]], "query": "dependency injection benefits"} -{"output": [["lex", "s3 bucket policy permissions"], ["lex", "aws s3 iam policy json"], ["lex", "s3 bucket access control"], ["vec", "how to write an s3 bucket policy to control access permissions"], ["vec", "what is the difference between s3 bucket policies and iam policies for access control"], ["hyde", "S3 bucket policies are resource-based JSON policies attached to buckets. Grant public read: {\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::bucket/*\"}]}. IAM policies attach to users/roles. Use bucket policies for cross-account access, IAM for user-specific permissions. Block public access settings override policies."]], "query": "S3 bucket policy"} -{"output": [["lex", "idempotency overview api design"], ["lex", "idempotent request key"], ["lex", "api retry safety idempotency"], ["vec", "what is idempotency in api design and why is it important for reliability"], ["vec", "how do you implement idempotent endpoints to handle duplicate requests safely"], ["hyde", "Idempotent operations produce the same result regardless of how many times called. GET, PUT, DELETE are naturally idempotent. POST needs idempotency keys: client sends unique key, server stores result, returns cached result on retry. Store keys with TTL (24h). Critical for payment APIs—prevents double charges on network retry."]], "query": "idempotency api design"} -{"output": [["lex", "awk overview command examples"], ["lex", "awk print column field"], ["lex", "awk text processing"], ["vec", "how to use awk for text processing and extracting columns from files"], ["vec", "what are common awk patterns and commands for parsing structured text"], ["hyde", "awk processes text line by line, splitting into fields. Print second column: awk '{print $2}' file. Custom delimiter: awk -F',' '{print $1}'. Pattern match: awk '/error/ {print}'. Sum column: awk '{sum+=$3} END {print sum}'. Variables: awk -v threshold=100 '$3 > threshold'. Built-in vars: NF (fields), NR (line number)."]], "query": "awk command examples"} -{"output": [["lex", "database sharding horizontal"], ["lex", "shard key partition strategy"], ["lex", "database horizontal scaling"], ["vec", "what is database sharding and what strategies exist for partitioning data"], ["vec", "how do you choose a shard key and what are the tradeoffs of different sharding approaches"], ["hyde", "Sharding distributes data across multiple databases. Strategies: range-based (user IDs 1-1M on shard 1), hash-based (consistent hashing), directory-based (lookup table). Choose shard key with high cardinality, even distribution, query locality. Avoid hot spots—don't shard by timestamp. Cross-shard queries are expensive. Consider sharding only after vertical scaling exhausted."]], "query": "database sharding strategies"} -{"output": [["lex", "jq overview json parsing command"], ["lex", "jq filter select query"], ["lex", "jq command line json"], ["vec", "how to use jq to parse and transform json data from the command line"], ["vec", "what are the common jq filters for extracting and manipulating json fields"], ["hyde", "jq is a command-line JSON processor. Extract field: jq '.name' file.json. Array element: jq '.[0]'. Nested: jq '.users[].email'. Filter: jq '.items[] | select(.price > 100)'. Transform: jq '{name: .title, count: .items | length}'. Raw output: jq -r. Pipe curl output: curl api | jq '.data'."]], "query": "jq json parsing"} -{"output": [["lex", "compile time runtime error difference"], ["lex", "static dynamic type checking"], ["lex", "compilation errors vs exceptions"], ["vec", "what is the difference between compile time and runtime errors in programming"], ["vec", "why are compile time errors generally preferable to runtime errors for code reliability"], ["hyde", "Compile time errors occur during compilation before code runs—syntax errors, type mismatches in statically typed languages. Runtime errors occur during execution—null pointer, division by zero, file not found. Compile time errors are caught early, cheaper to fix. Static typing and linters catch more at compile time. TypeScript catches errors that JavaScript defers to runtime."]], "query": "compile time vs runtime errors"} -{"output": [["lex", "cdn content delivery network"], ["lex", "cdn caching edge servers"], ["lex", "cloudflare cdn setup"], ["vec", "how does a content delivery network cdn improve website performance"], ["vec", "what content should you serve through a cdn and how do you configure cache headers"], ["hyde", "CDN caches content at edge servers geographically close to users, reducing latency. Serve static assets (images, CSS, JS) through CDN. Set Cache-Control headers: max-age=31536000 for versioned assets, shorter for dynamic content. Configure origin pulls, purge cache on deploys. Popular CDNs: Cloudflare, CloudFront, Fastly, Akamai."]], "query": "content delivery network cdn"} -{"output": [["lex", "circuit overview breaker pattern"], ["lex", "circuit breaker resilience"], ["lex", "hystrix resilience4j circuit"], ["vec", "what is the circuit breaker pattern and how does it improve system resilience"], ["vec", "how do you implement circuit breakers to prevent cascade failures in distributed systems"], ["hyde", "Circuit breaker prevents repeated calls to failing services. States: Closed (normal), Open (failing, reject calls immediately), Half-Open (test recovery). After N failures, opens circuit. After timeout, allows test request. If succeeds, closes. Prevents cascade failures, provides fallbacks. Libraries: resilience4j (Java), polly (.NET), opossum (Node.js)."]], "query": "circuit breaker pattern"} -{"output": [["lex", "mac address ip address difference"], ["lex", "mac address layer 2 hardware"], ["lex", "ip vs mac network address"], ["vec", "what is the difference between a mac address and an ip address in networking"], ["vec", "how do mac addresses and ip addresses work together for network communication"], ["hyde", "MAC address is hardware identifier burned into NIC, 48 bits (AA:BB:CC:DD:EE:FF), used in Layer 2 (local network). IP address is logical, assigned by network, used in Layer 3 (routing). ARP maps IP to MAC on local network. IP gets packets between networks, MAC delivers within a network segment. MAC is permanent, IP changes with network."]], "query": "mac address vs ip address"} -{"output": [["lex", "unit test integration test difference"], ["lex", "testing pyramid unit integration e2e"], ["lex", "unit test isolation mocking"], ["vec", "what is the difference between unit tests and integration tests"], ["vec", "how should you balance unit tests and integration tests in the testing pyramid"], ["hyde", "Unit tests verify single functions or classes in isolation using mocks for dependencies. Fast, many of them. Integration tests verify components working together with real dependencies. Slower, fewer of them. Testing pyramid: many unit tests at base, fewer integration tests in middle, few e2e tests at top. Unit tests catch logic bugs, integration tests catch interface mismatches."]], "query": "unit test vs integration test"} -{"output": [["lex", "base64 overview encoding decoding"], ["lex", "base64 encode decode string"], ["lex", "base64 binary to text"], ["vec", "what is base64 encoding and when should you use it"], ["vec", "how do you encode and decode base64 strings in different programming languages"], ["hyde", "Base64 encodes binary data as ASCII text using 64 characters (A-Z, a-z, 0-9, +, /). Increases size by ~33%. Use for embedding binary in JSON/XML, data URLs, email attachments. Not encryption—easily decoded. In shell: echo -n 'text' | base64. Decode: echo 'dGV4dA==' | base64 -d. In JS: btoa('text'), atob('dGV4dA==')."]], "query": "base64 encoding decoding"} -{"output": [["lex", "tail overview recursion optimization"], ["lex", "tail call optimization tco"], ["lex", "recursive function stack overflow"], ["vec", "what is tail recursion and how does tail call optimization prevent stack overflow"], ["vec", "how do you convert a recursive function to tail recursive form"], ["hyde", "Tail recursion: recursive call is the last operation, no work after it returns. TCO reuses stack frame instead of adding new one—prevents stack overflow. Convert by passing accumulated result as parameter: factorial(n, acc=1) { return n <= 1 ? acc : factorial(n-1, n*acc); }. Not all languages implement TCO—JavaScript in strict mode, Scheme yes, Python no."]], "query": "tail recursion optimization"} -{"output": [["lex", "nginx overview location block config"], ["lex", "nginx location regex prefix"], ["lex", "nginx location matching order"], ["vec", "how do nginx location blocks work and in what order are they matched"], ["vec", "what is the syntax for nginx location directives including prefix and regex matching"], ["hyde", "Location matching order: 1) Exact match (= /path), 2) Preferential prefix (^~ /path), 3) Regex in config order (~* case-insensitive, ~ case-sensitive), 4) Longest prefix match. Example: location /api { proxy_pass http://backend; }. Regex: location ~ \\.php$ { fastcgi_pass; }. Use = for exact matches to skip regex evaluation."]], "query": "nginx location block"} -{"output": [["lex", "oop overview encapsulation abstraction"], ["lex", "object oriented principles"], ["lex", "encapsulation data hiding"], ["vec", "what are encapsulation and abstraction in object oriented programming"], ["vec", "how do encapsulation and abstraction differ and why are they important for software design"], ["hyde", "Encapsulation bundles data and methods, restricting direct access via private fields and public getters/setters. Protects internal state, enables validation. Abstraction hides implementation complexity, exposing only essential interface. Car has accelerate() method—you don't need to know engine internals. Encapsulation is how you hide, abstraction is what you hide."]], "query": "oop encapsulation abstraction"} -{"output": [["lex", "webhook vs polling api"], ["lex", "push vs pull api pattern"], ["lex", "webhook callback http"], ["vec", "what are the differences between webhooks and api polling for receiving updates"], ["vec", "when should you use webhooks instead of polling an api for changes"], ["hyde", "Polling: client repeatedly asks server for updates. Simple but wastes bandwidth if nothing changed, may miss events between polls. Webhooks: server pushes updates to client endpoint when events occur. Real-time, efficient, but requires public endpoint and handling failures. Use webhooks when available (Stripe, GitHub), fall back to polling for systems without webhook support."]], "query": "webhook vs api polling"} -{"output": [["lex", "database overview transaction isolation levels"], ["lex", "read committed serializable"], ["lex", "sql isolation dirty read phantom"], ["vec", "what are the different database transaction isolation levels and their tradeoffs"], ["vec", "how do isolation levels prevent anomalies like dirty reads and phantom reads"], ["hyde", "Isolation levels from weakest to strongest: Read Uncommitted (dirty reads possible), Read Committed (sees only committed data, default in PostgreSQL), Repeatable Read (no non-repeatable reads), Serializable (no phantom reads, full isolation). Higher isolation = more locking = lower concurrency. Choose based on consistency needs vs performance."]], "query": "database transaction isolation levels"} -{"output": [["lex", "hash overview table collision resolution"], ["lex", "hash map chaining open addressing"], ["lex", "hash collision handling"], ["vec", "how do hash tables handle collisions when multiple keys hash to the same bucket"], ["vec", "what are the differences between chaining and open addressing for collision resolution"], ["hyde", "Chaining: each bucket holds a linked list of entries with same hash. Simple, handles high load well. Open addressing: on collision, probe for next empty slot. Linear probing (check next slot), quadratic probing, double hashing. Better cache locality but degrades at high load factors. Most implementations use chaining (Java HashMap) or open addressing with good probing (Python dict)."]], "query": "hash table collision resolution"} -{"output": [["lex", "yaml json config comparison"], ["lex", "yaml vs json syntax"], ["lex", "configuration file format"], ["vec", "what are the differences between yaml and json for configuration files"], ["vec", "when should you choose yaml over json for application configuration"], ["hyde", "JSON: strict syntax, no comments, explicit quotes, universal parsing. YAML: superset of JSON, allows comments, cleaner for humans, indentation-based. Use JSON for data interchange, APIs, when strict parsing needed. Use YAML for configs (Docker Compose, Kubernetes, CI/CD) where human editing is common. YAML gotchas: Norway problem (NO parsed as false), inconsistent indentation."]], "query": "yaml vs json config"} -{"output": [["lex", "kubernetes overview ingress controller"], ["lex", "k8s ingress nginx traefik"], ["lex", "ingress rules path host"], ["vec", "what is a kubernetes ingress controller and how does it route external traffic to services"], ["vec", "how do you configure ingress rules for path-based and host-based routing in kubernetes"], ["hyde", "Ingress controller implements Ingress resources, routing external HTTP/HTTPS to services. Popular controllers: nginx-ingress, Traefik, HAProxy. Ingress resource defines rules: host (foo.com), paths (/api -> api-service, / -> frontend). Annotations configure TLS, rate limiting, auth. Install controller first, then create Ingress resources."]], "query": "Kubernetes ingress controller"} -{"output": [["lex", "docker overview layer caching build"], ["lex", "dockerfile cache optimization"], ["lex", "docker build cache layers"], ["vec", "how does docker layer caching work and how do you optimize dockerfiles for faster builds"], ["vec", "what dockerfile practices maximize cache hits when building docker images"], ["hyde", "Docker caches each instruction as a layer. Cache invalidates when instruction or context changes, invalidating all subsequent layers. Optimization: order from least to most frequently changing. Copy package.json and install deps before copying source code. Use .dockerignore. Multi-stage builds discard intermediate layers. COPY --from for selective extraction."]], "query": "docker layer caching"} -{"output": [["lex", "ssh overview tunnel port forwarding"], ["lex", "ssh local remote forward"], ["lex", "ssh -L -R tunnel"], ["vec", "how to set up ssh tunnels for local and remote port forwarding"], ["vec", "what is the difference between ssh local port forwarding and remote port forwarding"], ["hyde", "Local forwarding (-L): access remote service through local port. ssh -L 8080:localhost:3000 server—localhost:8080 reaches server's port 3000. Remote forwarding (-R): expose local service through remote port. ssh -R 8080:localhost:3000 server—server:8080 reaches your port 3000. Use for accessing databases behind firewalls, exposing dev servers temporarily."]], "query": "ssh tunnel port forwarding"} -{"output": [["lex", "rest overview api pagination"], ["lex", "api pagination offset cursor"], ["lex", "paginated response next page"], ["vec", "what are the different approaches to implementing pagination in rest apis"], ["vec", "how do offset-based and cursor-based pagination compare for api design"], ["hyde", "Offset pagination: ?page=2&limit=20 or ?offset=20&limit=20. Simple but slow for deep pages, inconsistent with real-time inserts. Cursor pagination: ?cursor=abc123&limit=20, cursor encodes position. Consistent, efficient, better for infinite scroll. Return next_cursor in response. Use Link headers or response body for pagination URLs."]], "query": "rest api pagination"} -{"output": [["lex", "solid principles oop"], ["lex", "single responsibility open closed"], ["lex", "solid design principles"], ["vec", "what are the solid principles in object oriented design"], ["vec", "how do the solid principles improve code maintainability and flexibility"], ["hyde", "SOLID: Single Responsibility (one reason to change), Open/Closed (open for extension, closed for modification), Liskov Substitution (subtypes substitutable for base types), Interface Segregation (many specific interfaces over one general), Dependency Inversion (depend on abstractions not concretions). Following SOLID produces loosely coupled, testable, maintainable code."]], "query": "solid principles explained"} -{"output": [["lex", "protobuf json comparison"], ["lex", "protocol buffers serialization"], ["lex", "grpc protobuf format"], ["vec", "what are the differences between protocol buffers and json for data serialization"], ["vec", "when should you use protobuf instead of json for api communication"], ["hyde", "JSON: human-readable, self-describing, universal support, larger payload. Protobuf: binary format, 3-10x smaller, faster serialization, requires schema (.proto files), strong typing. Use JSON for public APIs, debugging, human interaction. Use Protobuf for internal microservices, high-throughput systems, gRPC. Schema evolution with field numbers enables backward compatibility."]], "query": "protobuf vs json"} -{"output": [["lex", "linux overview namespaces containers"], ["lex", "container isolation namespace cgroup"], ["lex", "docker linux namespaces"], ["vec", "how do linux namespaces enable container isolation"], ["vec", "what kernel features do docker and containers use for process isolation"], ["hyde", "Containers use Linux namespaces for isolation: PID (process tree), NET (network stack), MNT (filesystem mounts), UTS (hostname), IPC (inter-process communication), USER (user IDs). Cgroups limit resource usage (CPU, memory). Together they isolate processes without full VM overhead. Containers share host kernel but see isolated views of system resources."]], "query": "linux namespaces containers"} -{"output": [["lex", "graphql overview subscriptions websocket"], ["lex", "graphql realtime subscriptions"], ["lex", "graphql subscription server"], ["vec", "how do graphql subscriptions work for real-time data updates"], ["vec", "what is the underlying protocol for graphql subscriptions and how do you implement them"], ["hyde", "GraphQL subscriptions enable real-time updates via persistent connections. Client subscribes: subscription { messageAdded { text } }. Server pushes when events occur. Typically uses WebSocket with graphql-ws protocol. Server maintains subscription registry, publishes events through PubSub. Apollo Server and Relay support subscriptions natively."]], "query": "GraphQL subscriptions websocket"} -{"output": [["lex", "stateless stateful service"], ["lex", "stateless api design"], ["lex", "session state storage"], ["vec", "what is the difference between stateless and stateful services in application architecture"], ["vec", "why are stateless services easier to scale and how do you handle state when needed"], ["hyde", "Stateless services don't store client state between requests—any instance can handle any request. Scale by adding instances, no session affinity needed. Stateful services maintain client state, requiring sticky sessions or shared storage. Make services stateless by storing session in JWT tokens, Redis, or databases. Stateless is preferred for horizontal scaling and resilience."]], "query": "stateless vs stateful services"} -{"output": [["lex", "git bisect bug finding"], ["lex", "git bisect good bad"], ["lex", "binary search git commit"], ["vec", "how to use git bisect to find the commit that introduced a bug"], ["vec", "what is the git bisect workflow for binary search debugging through commit history"], ["hyde", "git bisect does binary search through commits to find where bug was introduced. Start: git bisect start, git bisect bad (current has bug), git bisect good v1.0 (known good commit). Git checks out middle commit—test and mark git bisect good or git bisect bad. Repeat until found. Automate with git bisect run ./test.sh. End with git bisect reset."]], "query": "git bisect debugging"} -{"output": [["lex", "dns overview propagation time"], ["lex", "dns ttl propagation delay"], ["lex", "dns changes not working"], ["vec", "why do dns changes take time to propagate and how can you speed it up"], ["vec", "what is dns propagation and how does ttl affect how quickly changes are visible"], ["hyde", "DNS propagation is time for changes to spread through cached resolvers worldwide. TTL (Time To Live) controls cache duration. High TTL (86400s) means up to 24h wait. Before changes, lower TTL to 300s, wait for old TTL, make change, then restore TTL. Use dig @8.8.8.8 domain.com to check Google's view. Full propagation can take 24-48h for high-TTL records."]], "query": "dns propagation time"} -{"output": [["lex", "roman empire fall causes"], ["lex", "decline of rome 476 AD"], ["lex", "western roman empire collapse"], ["vec", "what were the main causes of the fall of the western roman empire"], ["vec", "how did economic, military, and political factors contribute to rome's collapse"], ["hyde", "The Western Roman Empire fell in 476 AD when Odoacer deposed Romulus Augustulus. Contributing factors included economic troubles, military overextension, political instability with rapid emperor turnover, pressure from Germanic tribes, and the division of the empire. The Eastern Roman Empire (Byzantine) survived until 1453."]], "query": "fall of the Roman Empire"} -{"output": [["lex", "world war 1 causes"], ["lex", "ww1 assassination archduke franz ferdinand"], ["lex", "causes great war 1914"], ["vec", "what were the main causes and triggers of world war one"], ["vec", "how did the assassination of archduke franz ferdinand lead to a global war"], ["hyde", "WWI was caused by MAIN: Militarism, Alliances, Imperialism, Nationalism. The assassination of Archduke Franz Ferdinand on June 28, 1914 in Sarajevo triggered a chain reaction through alliance systems. Austria-Hungary declared war on Serbia, pulling in Russia, Germany, France, and Britain within weeks."]], "query": "causes of World War I"} -{"output": [["lex", "egyptian pyramids how built"], ["lex", "pyramid construction ancient egypt"], ["lex", "great pyramid giza building"], ["vec", "how were the ancient egyptian pyramids constructed without modern technology"], ["vec", "what techniques and labor did ancient egyptians use to build the pyramids at giza"], ["hyde", "The pyramids were built using ramps, levers, and organized labor forces of tens of thousands of workers. Limestone blocks weighing 2.5 tons average were quarried nearby and transported on sledges. Workers were not slaves but paid laborers housed in nearby villages. The Great Pyramid took approximately 20 years to complete around 2560 BC."]], "query": "ancient Egypt pyramids construction"} -{"output": [["lex", "french overview revolution timeline events"], ["lex", "french revolution 1789 bastille"], ["lex", "reign of terror robespierre"], ["vec", "what were the major events of the french revolution in chronological order"], ["vec", "how did the french revolution progress from the storming of the bastille to napoleon"], ["hyde", "1789: Estates-General convenes, Bastille stormed July 14. 1791: Constitutional monarchy established. 1792: Republic declared, king executed. 1793-94: Reign of Terror under Robespierre, 17,000 guillotined. 1794: Thermidorian Reaction ends Terror. 1799: Napoleon's coup establishes Consulate."]], "query": "French Revolution timeline"} -{"output": [["lex", "ottoman overview empire history"], ["lex", "ottoman sultanate 1299 1922"], ["lex", "turkish ottoman empire rise fall"], ["vec", "what was the history of the ottoman empire from its founding to its dissolution"], ["vec", "how did the ottoman empire rise to become a major world power and eventually decline"], ["hyde", "Founded by Osman I around 1299, the Ottoman Empire conquered Constantinople in 1453, ending the Byzantine Empire. At its peak under Suleiman the Magnificent (1520-1566), it controlled Southeast Europe, Western Asia, and North Africa. Gradual decline through the 18th-19th centuries culminated in dissolution after WWI in 1922."]], "query": "Ottoman Empire history"} -{"output": [["lex", "american overview civil war battles"], ["lex", "civil war gettysburg antietam"], ["lex", "union confederate battles 1861"], ["vec", "what were the major battles of the american civil war"], ["vec", "which battles were turning points in the civil war between union and confederate forces"], ["hyde", "Major battles: Fort Sumter (1861, war begins), Bull Run (Confederate victory), Antietam (1862, bloodiest single day, led to Emancipation Proclamation), Gettysburg (1863, Union turning point), Vicksburg (Union controls Mississippi), Sherman's March (1864), Appomattox (1865, Lee surrenders). Total casualties exceeded 600,000."]], "query": "American Civil War battles"} -{"output": [["lex", "ming overview dynasty china history"], ["lex", "ming dynasty 1368 1644"], ["lex", "chinese ming emperors"], ["vec", "what were the major achievements and characteristics of the ming dynasty in china"], ["vec", "how did the ming dynasty rise to power and what led to its eventual fall"], ["hyde", "The Ming Dynasty (1368-1644) was founded by Zhu Yuanzhang after overthrowing Mongol Yuan rule. Notable achievements: construction of the Forbidden City, voyages of Zheng He, restoration of the Great Wall, and flourishing arts and porcelain. Fell to the Manchu Qing after peasant rebellions weakened central authority."]], "query": "Ming Dynasty China"} -{"output": [["lex", "viking overview age exploration"], ["lex", "vikings norse exploration america"], ["lex", "viking raids settlements"], ["vec", "where did the vikings explore and settle during the viking age"], ["vec", "what routes did norse explorers take and what lands did they discover"], ["hyde", "The Viking Age (793-1066 AD) saw Norse expansion across Europe and beyond. Vikings raided British Isles and France, settled Iceland (874), Greenland (985), and reached North America (Vinland, c.1000) under Leif Erikson. They also traveled east through Russia to Constantinople and served as Varangian Guard."]], "query": "Viking Age exploration"} -{"output": [["lex", "industrial overview revolution inventions"], ["lex", "industrial revolution steam engine"], ["lex", "18th century industrial innovations"], ["vec", "what were the key inventions that drove the industrial revolution"], ["vec", "how did the steam engine and textile machinery transform manufacturing in the 18th century"], ["hyde", "Key inventions: Spinning Jenny (1764), Water Frame (1769), Steam Engine improved by James Watt (1769), Power Loom (1785), Cotton Gin (1793), Steam Locomotive (1804). These enabled factory production, mass manufacturing, and transformed society from agricultural to industrial. Britain led the revolution starting around 1760."]], "query": "Industrial Revolution inventions"} -{"output": [["lex", "byzantine overview empire constantinople"], ["lex", "eastern roman empire byzantium"], ["lex", "fall of constantinople 1453"], ["vec", "what was the byzantine empire and how long did it last after rome fell"], ["vec", "how did constantinople serve as the capital of the byzantine empire until 1453"], ["hyde", "The Byzantine Empire was the continuation of the Eastern Roman Empire, lasting from 330 AD (Constantinople founded) to 1453. At its peak under Justinian I, it reconquered much of the western Mediterranean. Constantinople was the largest and wealthiest European city for centuries until falling to Ottoman Turks under Mehmed II on May 29, 1453."]], "query": "Byzantine Empire Constantinople"} -{"output": [["lex", "aztec overview empire civilization"], ["lex", "aztec tenochtitlan mexico"], ["lex", "aztec history mesoamerica"], ["vec", "what was the aztec empire and how did their civilization develop in mesoamerica"], ["vec", "how did the aztecs build tenochtitlan and what led to the fall of their empire"], ["hyde", "The Aztec Empire (1428-1521) dominated central Mexico from their capital Tenochtitlan, built on an island in Lake Texcoco (modern Mexico City). Population reached 200,000+. Known for pyramids, human sacrifice, chinampas (floating gardens), and tribute system. Conquered by Hernán Cortés in 1521 with help from rival indigenous groups and smallpox."]], "query": "Aztec Empire civilization"} -{"output": [["lex", "renaissance overview italy florence"], ["lex", "italian renaissance medici"], ["lex", "florence renaissance art"], ["vec", "why did the renaissance begin in italy particularly in florence"], ["vec", "how did the medici family and florence become the center of the italian renaissance"], ["hyde", "The Renaissance began in Florence around 1400 due to wealth from banking and trade, political stability, and classical heritage. The Medici family, especially Lorenzo the Magnificent, patronized artists like Leonardo, Michelangelo, and Botticelli. Florence's guilds, humanism from rediscovered Greek texts, and competition among city-states drove cultural innovation."]], "query": "Renaissance Italy Florence"} -{"output": [["lex", "cold overview war berlin wall"], ["lex", "berlin wall 1961 1989"], ["lex", "east west germany division"], ["vec", "what was the significance of the berlin wall during the cold war"], ["vec", "why was the berlin wall built and what led to its fall in 1989"], ["hyde", "The Berlin Wall was built overnight on August 13, 1961 by East Germany to stop emigration to the West—3.5 million had fled since 1945. It divided Berlin for 28 years, symbolizing the Iron Curtain. Fell November 9, 1989 after Hungary opened its border and East German protests grew. Germany reunified October 3, 1990."]], "query": "Cold War Berlin Wall"} -{"output": [["lex", "mongol overview empire genghis khan"], ["lex", "mongol conquests 13th century"], ["lex", "genghis khan mongol history"], ["vec", "how did genghis khan build the mongol empire into the largest contiguous land empire"], ["vec", "what territories did the mongol empire conquer and how did they administer such vast lands"], ["hyde", "Genghis Khan united Mongol tribes by 1206 and conquered from Korea to Poland by his death in 1227. The empire peaked under his grandsons, spanning 24 million km²—largest contiguous empire ever. Success came from cavalry tactics, meritocracy, religious tolerance, and the Yam relay system. Divided into khanates after 1260."]], "query": "Mongol Empire Genghis Khan"} -{"output": [["lex", "ancient overview greece democracy athens"], ["lex", "athenian democracy 5th century bc"], ["lex", "greek democracy origins"], ["vec", "how did democracy develop in ancient athens and how did it function"], ["vec", "what were the key institutions and practices of athenian democracy"], ["hyde", "Athenian democracy emerged under Cleisthenes (508 BC) and peaked under Pericles (461-429 BC). Citizens (adult male non-slaves) voted directly in the Assembly (Ekklesia) on laws and policy. The Council of 500, chosen by lot, set the agenda. Jury courts had hundreds of jurors. About 30,000 of 300,000 residents were citizens."]], "query": "ancient Greece democracy Athens"} -{"output": [["lex", "protestant reformation luther"], ["lex", "martin luther 95 theses"], ["lex", "reformation 1517 catholic church"], ["vec", "what started the protestant reformation and what were its main ideas"], ["vec", "how did martin luther's 95 theses challenge the catholic church and spread across europe"], ["hyde", "Martin Luther posted his 95 Theses on October 31, 1517 in Wittenberg, criticizing indulgences and papal authority. Key ideas: salvation by faith alone, scripture as sole authority, priesthood of all believers. The printing press spread his ideas rapidly. Luther was excommunicated in 1521. The Reformation split Western Christianity and sparked religious wars across Europe."]], "query": "Protestant Reformation Martin Luther"} -{"output": [["lex", "silk road trade route"], ["lex", "silk road ancient trade china"], ["lex", "silk road history commerce"], ["vec", "what was the silk road and how did it connect east and west"], ["vec", "what goods and ideas were exchanged along the ancient silk road trade routes"], ["hyde", "The Silk Road was a network of trade routes connecting China to the Mediterranean from around 130 BC to 1450s AD. Goods traded: silk, spices, porcelain from East; gold, glass, horses from West. Also spread Buddhism, Islam, technologies like paper and gunpowder, and unfortunately, the Black Death. Named by German geographer Ferdinand von Richthofen in 1877."]], "query": "Silk Road trade routes"} -{"output": [["lex", "napoleonic overview wars europe"], ["lex", "napoleon bonaparte campaigns"], ["lex", "napoleonic era 1803 1815"], ["vec", "what were the major campaigns and outcomes of the napoleonic wars"], ["vec", "how did napoleon's military conquests reshape europe and lead to his downfall"], ["hyde", "The Napoleonic Wars (1803-1815) saw France under Napoleon dominate continental Europe through brilliant campaigns at Austerlitz, Jena, and Wagram. His empire stretched from Spain to Poland. The failed 1812 Russian invasion (600,000 troops, 100,000 returned) began his decline. Exiled to Elba 1814, returned for Hundred Days, finally defeated at Waterloo June 18, 1815."]], "query": "Napoleonic Wars Europe"} -{"output": [["lex", "ancient overview mesopotamia civilizations"], ["lex", "mesopotamia sumer babylon"], ["lex", "cradle of civilization tigris euphrates"], ["vec", "what civilizations arose in ancient mesopotamia and what were their achievements"], ["vec", "why is mesopotamia called the cradle of civilization and what did sumerians invent"], ["hyde", "Mesopotamia (modern Iraq) between Tigris and Euphrates rivers hosted the world's first civilizations. Sumerians (4500-1900 BC) invented writing (cuneiform), the wheel, sailboat, and plow. Akkadian Empire under Sargon was first empire. Babylon produced Hammurabi's Code. Assyrians and Persians followed. Agriculture surplus enabled cities, specialization, and complex society."]], "query": "ancient Mesopotamia civilizations"} -{"output": [["lex", "meiji overview restoration japan"], ["lex", "meiji era modernization 1868"], ["lex", "japan meiji emperor reform"], ["vec", "what was the meiji restoration and how did it transform japan"], ["vec", "how did japan modernize so rapidly during the meiji period from 1868 to 1912"], ["hyde", "The Meiji Restoration (1868) ended 250 years of Tokugawa shogunate rule, restoring imperial power under Emperor Meiji. Japan rapidly industrialized and westernized: abolished feudalism, created national army, built railways, established constitution (1889). Slogan: 'Rich country, strong army.' Japan defeated China (1895) and Russia (1905), becoming a world power within 50 years."]], "query": "Meiji Restoration Japan"} -{"output": [["lex", "black overview death plague europe"], ["lex", "bubonic plague 1347 medieval"], ["lex", "black death medieval europe"], ["vec", "what was the black death and how did it impact medieval europe"], ["vec", "how did the bubonic plague spread across europe and what were its consequences"], ["hyde", "The Black Death (1347-1351) killed 75-200 million people, 30-60% of Europe's population. Caused by Yersinia pestis bacteria spread by fleas on rats, it arrived via Genoese ships from Crimea. Symptoms: buboes, fever, death within days. Consequences: labor shortages raised wages, weakened feudalism, sparked religious movements and persecution of Jews."]], "query": "Black Death plague Europe"} -{"output": [["lex", "spanish overview conquest americas"], ["lex", "conquistadors cortez pizarro"], ["lex", "spanish colonization new world"], ["vec", "how did spanish conquistadors conquer the aztec and inca empires"], ["vec", "what factors enabled spain to colonize the americas so rapidly in the 16th century"], ["hyde", "Hernán Cortés conquered the Aztec Empire (1519-1521) with 500 soldiers, allying with Tlaxcalans and exploiting Montezuma's hesitation. Francisco Pizarro conquered the Inca Empire (1532-1533) capturing Atahualpa during civil war. Spanish advantages: steel weapons, horses, gunpowder, and crucially, Old World diseases like smallpox that killed 90% of indigenous populations."]], "query": "Spanish Conquest Americas"} -{"output": [["lex", "world war 2 d-day normandy"], ["lex", "d-day june 6 1944 invasion"], ["lex", "operation overlord ww2"], ["vec", "what happened on d-day and why was the normandy invasion a turning point in world war two"], ["vec", "how was the d-day invasion of normandy planned and executed by allied forces"], ["hyde", "D-Day, June 6, 1944, was the largest amphibious invasion in history. Operation Overlord landed 156,000 Allied troops on five Normandy beaches (Utah, Omaha, Gold, Juno, Sword). Despite 10,000+ casualties, it established a Western Front, leading to Paris liberation (August 1944) and Germany's surrender (May 1945). Supreme Commander: Dwight D. Eisenhower."]], "query": "World War II D-Day"} -{"output": [["lex", "han overview dynasty china achievements"], ["lex", "han dynasty 206 bc history"], ["lex", "ancient china han empire"], ["vec", "what were the major achievements and contributions of the han dynasty in china"], ["vec", "why is the han dynasty considered a golden age in chinese history"], ["hyde", "The Han Dynasty (206 BC - 220 AD) is considered China's golden age. Achievements: Silk Road trade established, paper invented (105 AD), civil service exams introduced, Confucianism became state ideology. Population reached 60 million. So influential that ethnic Chinese still call themselves 'Han people.' Collapsed due to court intrigue, eunuch power, and Yellow Turban Rebellion."]], "query": "Han Dynasty China achievements"} diff --git a/finetune/data/qmd_expansion_v3_structured.jsonl b/finetune/data/qmd_expansion_v3_structured.jsonl new file mode 100644 index 00000000..fadb062e --- /dev/null +++ b/finetune/data/qmd_expansion_v3_structured.jsonl @@ -0,0 +1,1498 @@ +{"query": "how tourism affects local cultures", "output": [["hyde", "Tourism often leads to cultural commodification, where traditional dances, crafts, and rituals are adapted to meet tourist expectations. In Bali, temple ceremonies have been shortened and repackaged as entertainment, diluting their spiritual significance for locals."], ["lex", "tourism impact local culture"], ["lex", "cultural effects mass tourism communities"], ["lex", "tourist influence indigenous traditions"], ["vec", "what are the positive and negative effects of tourism on local cultural traditions and communities"], ["vec", "how does mass tourism change the customs, language, and daily life of host communities"]]} +{"query": "how to ferment foods at home", "output": [["hyde", "To ferment vegetables at home, submerge them in a 2-3% salt brine in a mason jar. Keep at room temperature (65-75°F) for 3-7 days, burping the jar daily to release CO2. Taste after day 3 and refrigerate once the tanginess is to your liking."], ["lex", "home fermentation vegetables guide"], ["lex", "lacto fermentation salt brine method"], ["lex", "homemade sauerkraut kimchi ferment"], ["vec", "what is the step-by-step process for fermenting vegetables at home using salt brine"], ["vec", "how do you safely ferment foods like sauerkraut and kimchi in your kitchen"]]} +{"query": "how to mix modern and vintage decor", "output": [["hyde", "Pair a vintage wooden dresser with a sleek modern mirror. Use neutral wall colors as a backdrop and let one statement antique piece anchor each room. Mix textures—a velvet mid-century sofa with clean-lined metal side tables creates visual contrast without clashing."], ["lex", "modern vintage decor mix interior design"], ["lex", "combining antique furniture contemporary style"], ["vec", "how do you blend vintage furniture and antique pieces with modern interior design elements"], ["vec", "what are effective ways to combine mid-century or antique decor with contemporary minimalist style"]]} +{"query": "how to perform a scientific experiment", "output": [["hyde", "Step 1: Define your research question. Step 2: Formulate a testable hypothesis. Step 3: Identify independent, dependent, and controlled variables. Step 4: Design your procedure with a control group. Step 5: Collect and record data systematically. Step 6: Analyze results and draw conclusions."], ["lex", "scientific experiment steps procedure"], ["lex", "scientific method hypothesis variables control"], ["lex", "lab experiment design methodology"], ["vec", "what are the steps to design and carry out a controlled scientific experiment"], ["vec", "how do you formulate a hypothesis, set up controls, and collect data in a scientific experiment"]]} +{"query": "web mail", "output": [["hyde", "Webmail allows you to access your email through a web browser without installing a desktop client. Popular services include Gmail (mail.google.com), Outlook.com, Yahoo Mail, and ProtonMail. Log in with your credentials to read, compose, and manage messages from any device."], ["lex", "webmail client email browser"], ["lex", "web-based email service provider"], ["lex", "online email login inbox access"], ["vec", "how to access and use web-based email services like Gmail, Outlook, or Yahoo Mail through a browser"], ["vec", "what are the most popular webmail providers and how do their features compare"]]} +{"query": "what does the quran cover", "output": [["hyde", "The Quran covers topics including monotheism (tawhid), the Day of Judgment, stories of prophets from Adam to Muhammad, ethical conduct, family law, dietary rules, charity (zakat), prayer, and the relationship between God and humanity. It contains 114 surahs organized roughly by length."], ["lex", "quran topics contents themes"], ["lex", "quran teachings subjects covered"], ["vec", "what are the main topics and themes discussed in the Quran"], ["vec", "what subjects does the Quran address including theology, law, morality, and prophetic stories"]]} +{"query": "web config", "output": [["hyde", "The web.config file is an XML configuration file used by IIS and ASP.NET. It controls settings such as authentication, authorization, custom errors, connection strings, and HTTP handlers. Place it in the root of your application directory. Example: "], ["lex", "web.config file IIS ASP.NET"], ["lex", "web server configuration settings"], ["lex", "web.config XML settings authentication"], ["vec", "how to configure a web.config file for IIS and ASP.NET applications"], ["vec", "what settings and sections are available in a web.config file for web server configuration"]]} +{"query": "how to choose farm equipment", "output": [["hyde", "Match tractor horsepower to your acreage: 25-45 HP for under 50 acres, 45-85 HP for 50-200 acres, and 100+ HP for large operations. Consider PTO power for running implements like mowers and tillers. Evaluate whether two-wheel or four-wheel drive suits your terrain. Used equipment can save 40-60% over new."], ["lex", "farm equipment selection tractor implements"], ["lex", "agricultural machinery buying guide"], ["lex", "choosing tractor size horsepower acreage"], ["vec", "what factors should you consider when selecting farm equipment like tractors and implements for your land"], ["vec", "how do you match the right agricultural machinery to your farm size, crop type, and budget"]]} +{"query": "how do thought experiments aid philosophical reasoning", "output": [["hyde", "Thought experiments isolate specific variables in complex problems by constructing hypothetical scenarios. Judith Jarvis Thomson's violinist argument tests bodily autonomy intuitions, while the trolley problem probes deontological vs. consequentialist reasoning. They help philosophers identify hidden assumptions and clarify conceptual boundaries."], ["lex", "thought experiments philosophy reasoning"], ["lex", "philosophical thought experiment trolley problem examples"], ["vec", "how do philosophers use thought experiments like the trolley problem to test moral and logical intuitions"], ["vec", "what role do hypothetical scenarios play in advancing philosophical arguments and theories"]]} +{"query": "what is the significance of logic in philosophy", "output": [["hyde", "Logic provides the structural framework for all philosophical reasoning. Aristotle's syllogistic logic established rules for valid deduction. Modern formal logic, including propositional and predicate calculus, allows philosophers to precisely evaluate argument validity, identify fallacies, and construct rigorous proofs."], ["lex", "logic philosophy significance role"], ["lex", "formal logic philosophical argument validity"], ["vec", "why is logic considered foundational to philosophical inquiry and argumentation"], ["vec", "how does formal and informal logic help philosophers evaluate the validity of arguments"]]} +{"query": "how to train for a 5k run", "output": [["hyde", "An 8-week 5K training plan for beginners: Weeks 1-2, alternate 1 min running and 2 min walking for 20 minutes, 3 days per week. Weeks 3-4, run 3 min, walk 1 min. Weeks 5-6, run 5 min, walk 1 min. Weeks 7-8, run continuously for 25-30 minutes. Include rest days between runs."], ["lex", "5k run training plan beginner"], ["lex", "couch to 5k running program schedule"], ["vec", "what is a good beginner training plan to prepare for running a 5k race"], ["vec", "how many weeks does it take to train for a 5k and what should each week look like"]]} +{"query": "how to engage with political dialogues", "output": [["hyde", "Start by listening actively and asking clarifying questions rather than immediately countering. Use \"I\" statements instead of accusations. Acknowledge shared values before addressing disagreements. Avoid strawmanning—restate the other person's position accurately before responding. Focus on specific policies rather than party labels."], ["lex", "political dialogue conversation civil discourse"], ["lex", "discussing politics constructively disagreement"], ["vec", "how can you have productive political conversations with people who hold different views"], ["vec", "what techniques help maintain respectful and constructive political dialogue across ideological divides"]]} +{"query": "what is competitive analysis", "output": [["hyde", "Competitive analysis is the process of identifying competitors and evaluating their strategies, strengths, and weaknesses relative to your own. Key frameworks include Porter's Five Forces, SWOT analysis, and competitor profiling. Analyze pricing, product features, market share, marketing channels, and customer reviews."], ["lex", "competitive analysis business strategy"], ["lex", "competitor analysis market research framework"], ["vec", "what is competitive analysis in business and how do companies use it to inform strategy"], ["vec", "what frameworks and methods are used to conduct a competitive analysis of rival companies"]]} +{"query": "how does the united nations operate", "output": [["hyde", "The UN operates through six principal organs: the General Assembly (all 193 members, one vote each), the Security Council (15 members, 5 permanent with veto power), the Secretariat, the International Court of Justice, ECOSOC, and the Trusteeship Council. Resolutions require majority votes; Security Council decisions need 9 of 15 votes with no P5 veto."], ["lex", "united nations structure operations governance"], ["lex", "UN general assembly security council agencies"], ["vec", "how is the United Nations structured and what are the roles of its main bodies like the General Assembly and Security Council"], ["vec", "how does the UN make decisions, enforce resolutions, and coordinate international action"]]} +{"query": "what are the crusades?", "output": [["hyde", "The Crusades were a series of religious wars between 1096 and 1291, initiated by the Latin Church to recapture the Holy Land from Muslim rule. The First Crusade (1096-1099) captured Jerusalem. Subsequent crusades had mixed results, and the last Crusader stronghold at Acre fell in 1291."], ["lex", "crusades medieval holy wars Jerusalem"], ["lex", "crusades history 1096 Christian Muslim"], ["vec", "what were the Crusades and why did European Christians launch military campaigns to the Holy Land"], ["vec", "what were the major Crusades, their outcomes, and their lasting impact on Europe and the Middle East"]]} +{"query": "what is a literary theme?", "output": [["hyde", "A literary theme is the underlying message or central idea explored in a work of fiction. Unlike the subject (what the story is about), the theme is what the story says about that subject. For example, a novel's subject might be war, while its theme could be \"war dehumanizes both victors and victims.\""], ["lex", "literary theme definition examples"], ["lex", "theme in literature central idea meaning"], ["vec", "what is a literary theme and how does it differ from the subject or plot of a story"], ["vec", "how do authors develop and convey themes throughout a work of literature"]]} +{"query": "what is the ethical significance of consent", "output": [["hyde", "Consent is ethically significant because it respects individual autonomy—the right of persons to make decisions about their own bodies and lives. In medical ethics, informed consent requires that patients understand the risks, benefits, and alternatives before agreeing to treatment. Without valid consent, actions become coercive regardless of their intent."], ["lex", "consent ethics moral significance"], ["lex", "informed consent autonomy medical ethics"], ["vec", "why is consent considered ethically important in medical, legal, and interpersonal contexts"], ["vec", "how does the concept of informed consent protect individual autonomy and human dignity"]]} +{"query": "paint mix", "output": [["hyde", "Start with the three primary colors: red, blue, and yellow. Mix red and blue for purple, blue and yellow for green, red and yellow for orange. Add white to lighten (tint) and black to darken (shade). Mix small amounts gradually—it takes less dark paint to shift a light color than the reverse."], ["lex", "paint color mixing guide ratios"], ["lex", "acrylic oil paint mixing technique"], ["lex", "paint color chart combinations blending"], ["vec", "how do you mix paint colors to achieve specific shades and hues"], ["vec", "what are the basic color mixing ratios and techniques for acrylic and oil paints"]]} +{"query": "how to conserve energy in the office?", "output": [["hyde", "Switch to LED lighting and install occupancy sensors in conference rooms and restrooms. Set computers to sleep mode after 10 minutes of inactivity. Use smart power strips to eliminate phantom loads. Set thermostats to 68°F in winter and 76°F in summer. These measures typically reduce office energy use by 20-30%."], ["lex", "office energy conservation tips"], ["lex", "reduce electricity workplace energy saving"], ["vec", "what are practical ways to reduce energy consumption in an office or workplace"], ["vec", "how can offices save electricity through lighting, HVAC, and equipment management"]]} +{"query": "how to test soil ph?", "output": [["hyde", "Insert a soil pH meter probe 4-6 inches into moist soil for a quick reading. For more accuracy, use a chemical test kit: mix one part soil with one part distilled water, let settle, then add the indicator solution. Compare the color to the chart. Most garden plants prefer pH 6.0-7.0."], ["lex", "soil pH test kit method"], ["lex", "test soil acidity alkalinity garden"], ["vec", "how do you test the pH level of garden soil using a home test kit or meter"], ["vec", "what methods are available for measuring soil pH and interpreting the results for gardening"]]} +{"query": "navigating sustainable building certifications", "output": [["hyde", "LEED (Leadership in Energy and Environmental Design) awards points across categories: energy, water, materials, indoor quality, and site selection. Projects need 40-49 points for Certified, 50-59 for Silver, 60-79 for Gold, and 80+ for Platinum. BREEAM is more common in Europe and uses a percentage-based scoring system."], ["lex", "sustainable building certification LEED BREEAM"], ["lex", "green building standards certification process"], ["vec", "what are the main sustainable building certifications like LEED, BREEAM, and WELL, and how do you achieve them"], ["vec", "how do you navigate the requirements and application process for green building certifications"]]} +{"query": "what is the role of religious leaders?", "output": [["hyde", "Religious leaders serve as spiritual guides, interpreters of sacred texts, and community organizers. A parish priest administers sacraments, leads worship, and provides pastoral care. An imam leads prayers, delivers Friday sermons (khutbah), and offers religious guidance. Rabbis teach Torah, arbitrate Jewish law, and counsel congregants."], ["lex", "religious leaders role function community"], ["lex", "clergy priests imams rabbis duties responsibilities"], ["vec", "what roles do religious leaders like priests, imams, and rabbis play in their communities"], ["vec", "how do religious leaders guide spiritual practice, provide counsel, and serve their congregations"]]} +{"query": "how to maintain a balanced diet", "output": [["hyde", "A balanced diet includes roughly 45-65% carbohydrates, 20-35% fats, and 10-35% protein. Fill half your plate with fruits and vegetables, a quarter with whole grains, and a quarter with lean protein. Aim for 25-30g of fiber daily. Limit added sugars to under 25g and sodium to under 2300mg per day."], ["lex", "balanced diet nutrition food groups"], ["lex", "healthy eating meal plan macronutrients"], ["vec", "how do you maintain a balanced diet with the right proportions of proteins, carbohydrates, fats, and vitamins"], ["vec", "what does a daily balanced meal plan look like for an average adult"]]} +{"query": "what is moral philosophy", "output": [["hyde", "Moral philosophy, or ethics, is the branch of philosophy concerned with questions of right and wrong conduct. It includes three main branches: metaethics (the nature of moral judgments), normative ethics (frameworks like utilitarianism, deontology, and virtue ethics), and applied ethics (specific issues like abortion or euthanasia)."], ["lex", "moral philosophy ethics definition branches"], ["lex", "ethics normative metaethics applied"], ["vec", "what is moral philosophy and what are its main branches including normative ethics and metaethics"], ["vec", "how does moral philosophy address questions of right and wrong, virtue, and duty"]]} +{"query": "how to use a light meter", "output": [["hyde", "Point an incident light meter at the camera from the subject's position with the dome facing the lens. It reads the light falling on the subject, giving accurate exposure regardless of subject brightness. For reflected metering, point the meter at the subject from the camera position. Set the ISO first, then read the recommended aperture and shutter speed."], ["lex", "light meter photography exposure reading"], ["lex", "incident reflected light meter settings"], ["vec", "how do you use a handheld light meter to measure exposure for photography"], ["vec", "what is the difference between incident and reflected light metering and when should you use each"]]} +{"query": "what is the significance of creative writing?", "output": [["hyde", "Creative writing allows individuals to explore complex emotions, construct meaning, and communicate experiences that resist straightforward exposition. Through fiction, poetry, and memoir, writers develop empathy by inhabiting other perspectives. Studies show that reading literary fiction improves theory of mind and emotional intelligence."], ["lex", "creative writing significance purpose value"], ["lex", "creative writing literary expression storytelling"], ["vec", "why is creative writing significant as a form of artistic expression and communication"], ["vec", "how does creative writing contribute to culture, self-expression, and empathy"]]} +{"query": "what are the key principles of confucianism?", "output": [["hyde", "The key principles of Confucianism include Ren (benevolence/humaneness), Li (ritual propriety), Xiao (filial piety), Yi (righteousness), and Zhi (wisdom). The Five Relationships define social bonds: ruler-subject, parent-child, husband-wife, elder-younger sibling, and friend-friend. Each relationship carries reciprocal obligations."], ["lex", "confucianism key principles ren li xiao"], ["lex", "confucian philosophy five relationships virtues"], ["vec", "what are the core principles and virtues of Confucianism such as ren, li, and filial piety"], ["vec", "how do the five key relationships in Confucianism structure social and moral order"]]} +{"query": "what is agile project management", "output": [["hyde", "Agile project management is an iterative approach that delivers work in short cycles called sprints (typically 1-4 weeks). Teams hold daily standups, plan sprint backlogs, and conduct retrospectives. Key frameworks include Scrum (with defined roles: Product Owner, Scrum Master, Team) and Kanban (continuous flow with WIP limits)."], ["lex", "agile project management scrum kanban"], ["lex", "agile methodology sprints iterative development"], ["vec", "what is agile project management and how does it differ from traditional waterfall approaches"], ["vec", "how do agile frameworks like Scrum and Kanban organize work into sprints and iterations"]]} +{"query": "what is the significance of the harlem renaissance", "output": [["hyde", "The Harlem Renaissance (1920s-1930s) was a cultural explosion centered in Harlem, New York, that transformed African American literature, music, and art. Langston Hughes, Zora Neale Hurston, and Claude McKay produced groundbreaking literary works. Jazz and blues flourished at the Cotton Club. The movement asserted Black identity and challenged racial stereotypes."], ["lex", "Harlem Renaissance significance African American culture"], ["lex", "Harlem Renaissance 1920s literature art music"], ["vec", "what was the Harlem Renaissance and why was it significant for African American culture and arts"], ["vec", "which writers, artists, and musicians defined the Harlem Renaissance and what impact did they have"]]} +{"query": "what triggered world war i", "output": [["hyde", "The assassination of Archduke Franz Ferdinand of Austria-Hungary on June 28, 1914, in Sarajevo triggered WWI. Austria-Hungary issued an ultimatum to Serbia. The alliance system pulled in Russia (allied with Serbia), Germany (allied with Austria-Hungary), France (allied with Russia), and Britain (allied with France and Belgium)."], ["lex", "World War I causes triggers assassination"], ["lex", "WWI outbreak 1914 Franz Ferdinand alliances"], ["vec", "what events and conditions triggered the start of World War I in 1914"], ["vec", "how did the assassination of Archduke Franz Ferdinand lead to a full-scale world war through the alliance system"]]} +{"query": "how to improve drawing skills?", "output": [["hyde", "Practice gesture drawing daily: set a timer for 30-60 seconds and sketch the overall pose of a figure or object without lifting your pencil. Draw from life, not just photos. Study basic forms—spheres, cylinders, boxes—and learn to see complex objects as combinations of these shapes. Fill a sketchbook page every day."], ["lex", "improve drawing skills practice techniques"], ["lex", "learn to draw exercises sketching"], ["vec", "what exercises and practice routines help improve drawing and sketching skills for beginners"], ["vec", "how can you develop better hand-eye coordination and observational skills for drawing"]]} +{"query": "what is international relations", "output": [["hyde", "International relations (IR) is a subfield of political science that studies interactions between states, international organizations, and non-state actors. Major theoretical frameworks include realism (states pursue power in an anarchic system), liberalism (institutions and cooperation reduce conflict), and constructivism (social norms shape state behavior)."], ["lex", "international relations definition political science"], ["lex", "IR theory realism liberalism diplomacy"], ["vec", "what is the field of international relations and what theories explain how states interact"], ["vec", "how does international relations study diplomacy, conflict, trade, and cooperation between nations"]]} +{"query": "what is the human genome project", "output": [["hyde", "The Human Genome Project (1990-2003) was an international research effort to sequence all 3.2 billion base pairs of human DNA and identify approximately 20,500 genes. Completed in April 2003, it cost $2.7 billion and has enabled advances in personalized medicine, genetic testing, and understanding of hereditary diseases."], ["lex", "Human Genome Project HGP DNA sequencing"], ["lex", "human genome mapping genes 2003 completed"], ["vec", "what was the Human Genome Project and what did it accomplish in mapping human DNA"], ["vec", "how has the Human Genome Project influenced genetics, medicine, and our understanding of human biology"]]} +{"query": "how to assess a neighborhood safety", "output": [["hyde", "Check crime maps on sites like CrimeMapping.com or SpotCrime using the ZIP code. Walk the neighborhood at different times of day and night. Look for signs of community investment: maintained properties, street lighting, and active businesses. Talk to residents and visit the local police precinct for crime statistics."], ["lex", "neighborhood safety assessment crime check"], ["lex", "evaluate neighborhood crime rate walkability"], ["vec", "how do you assess whether a neighborhood is safe before moving there"], ["vec", "what factors and data sources help evaluate neighborhood safety including crime statistics and local conditions"]]} +{"query": "what are the characteristics of a just society", "output": [["hyde", "John Rawls argued a just society is one where principles are chosen behind a \"veil of ignorance\"—not knowing your own position. His two principles: (1) equal basic liberties for all, and (2) social and economic inequalities are arranged to benefit the least advantaged (difference principle) with fair equality of opportunity."], ["lex", "just society characteristics principles fairness"], ["lex", "social justice equality Rawls distributive justice"], ["vec", "what are the defining characteristics of a just society according to political philosophy"], ["vec", "how do philosophers like John Rawls define justice and the principles of a fair society"]]} +{"query": "what is the significance of the narrative arc?", "output": [["hyde", "The narrative arc structures a story's progression from exposition through rising action to climax, then falling action and resolution. Gustav Freytag formalized this as a five-act pyramid. A strong arc creates tension, develops characters through conflict, and delivers emotional payoff, keeping readers engaged from beginning to end."], ["lex", "narrative arc significance story structure"], ["lex", "narrative arc exposition climax resolution"], ["vec", "what is a narrative arc and why is it significant in storytelling and fiction writing"], ["vec", "how do the stages of a narrative arc—exposition, rising action, climax, falling action, resolution—shape a story"]]} +{"query": "what is bioethics", "output": [["hyde", "Bioethics is an interdisciplinary field that examines ethical issues arising from advances in biology and medicine. Core principles include autonomy (patient choice), beneficence (do good), non-maleficence (do no harm), and justice (fair distribution). It addresses topics such as end-of-life care, genetic editing (CRISPR), stem cell research, and clinical trial ethics."], ["lex", "bioethics definition medical ethics biology"], ["lex", "bioethics issues euthanasia cloning genetic engineering"], ["vec", "what is bioethics and what moral questions does it address in medicine and biological science"], ["vec", "how does bioethics evaluate issues like genetic engineering, euthanasia, and organ transplantation"]]} +{"query": "what is the significance of reincarnation in hinduism", "output": [["hyde", "In Hinduism, reincarnation (samsara) is the cycle of death and rebirth of the atman (soul). Karma—the accumulated results of actions—determines the conditions of each rebirth. The ultimate goal is moksha: liberation from the cycle of samsara, achieved through jnana (knowledge), bhakti (devotion), or karma yoga (selfless action)."], ["lex", "reincarnation hinduism samsara karma"], ["lex", "Hindu rebirth cycle moksha atman"], ["vec", "what role does reincarnation play in Hindu belief and how is it connected to karma and moksha"], ["vec", "how does the concept of samsara and the cycle of rebirth shape Hindu spiritual practice"]]} +{"query": "learn code", "output": [["hyde", "Start with Python or JavaScript—both have gentle learning curves and wide applications. Free resources include freeCodeCamp.org, Codecademy, and CS50 on edX. Begin with variables, loops, and functions, then build small projects. Practice daily on coding challenges at sites like LeetCode or Codewars."], ["lex", "learn programming coding beginner"], ["lex", "learn to code online courses tutorials"], ["lex", "programming language beginner Python JavaScript"], ["vec", "how can a beginner start learning to code and which programming language should they learn first"], ["vec", "what are the best free resources and online courses for learning programming from scratch"]]} +{"query": "what is the significance of the enlightenment?", "output": [["hyde", "The Enlightenment (c. 1685-1815) emphasized reason, individual liberty, and scientific inquiry over tradition and religious authority. Thinkers like John Locke (natural rights), Voltaire (freedom of speech), and Kant (\"dare to know\") laid the intellectual foundations for democratic revolutions, constitutional government, and the separation of church and state."], ["lex", "Enlightenment significance 18th century philosophy"], ["lex", "Age of Enlightenment reason science liberty"], ["vec", "what was the Enlightenment and why is it considered a turning point in Western intellectual history"], ["vec", "how did Enlightenment thinkers like Voltaire, Locke, and Kant influence modern democracy and science"]]} +{"query": "google docs", "output": [["hyde", "Google Docs is a free cloud-based word processor at docs.google.com. It supports real-time collaboration—multiple users can edit simultaneously with changes tracked by color. Share documents via link or email with view, comment, or edit permissions. It auto-saves to Google Drive and supports export to .docx, .pdf, and other formats."], ["lex", "Google Docs word processor cloud"], ["lex", "Google Docs collaboration editing sharing"], ["lex", "Google Docs templates formatting features"], ["vec", "how do you use Google Docs to create, edit, and collaborate on documents online"], ["vec", "what features does Google Docs offer for real-time collaboration, formatting, and sharing"]]} +{"query": "how to perform statistical analysis in research", "output": [["hyde", "Choose your statistical test based on your data type and research question. Use t-tests for comparing two group means, ANOVA for three or more groups, chi-square for categorical data, and regression for predicting outcomes. Check assumptions: normality (Shapiro-Wilk test), homogeneity of variance (Levene's test), and independence of observations."], ["lex", "statistical analysis research methods"], ["lex", "statistical tests t-test ANOVA regression research"], ["vec", "how do researchers choose and perform appropriate statistical analyses for their data"], ["vec", "what are the common statistical methods used in academic research and when should each be applied"]]} +{"query": "what is the role of physics in engineering", "output": [["hyde", "Physics underpins all engineering disciplines. Mechanical engineers apply Newton's laws and thermodynamics to design engines and machines. Electrical engineers use Maxwell's equations and semiconductor physics to build circuits. Civil engineers rely on statics and material strength calculations to design buildings and bridges that withstand loads."], ["lex", "physics role engineering applications"], ["lex", "physics principles mechanical electrical civil engineering"], ["vec", "how do physics principles apply to engineering disciplines like mechanical, electrical, and civil engineering"], ["vec", "what fundamental physics concepts are essential for engineers to understand and apply"]]} +{"query": "how to read a topographic map?", "output": [["hyde", "Contour lines connect points of equal elevation. Lines close together indicate steep terrain; lines far apart indicate gentle slopes. The contour interval (stated in the legend) is the elevation difference between adjacent lines. Every fifth line is an index contour, drawn thicker with the elevation labeled. Brown lines show terrain, blue shows water."], ["lex", "topographic map reading contour lines"], ["lex", "topo map elevation contour interval legend"], ["vec", "how do you read contour lines and elevation data on a topographic map"], ["vec", "what do the symbols, contour lines, and colors on a USGS topographic map represent"]]} +{"query": "how to choose car speakers?", "output": [["hyde", "Check your car's speaker sizes (common: 6.5\", 6x9\", 5.25\") using a fitment guide. Coaxial speakers are all-in-one replacements—easy to install with tweeter built in. Component speakers separate the woofer, tweeter, and crossover for better sound staging but require more installation work. Look for sensitivity (85+ dB) and RMS power handling matching your head unit or amp."], ["lex", "car speakers choosing size type"], ["lex", "car audio speakers coaxial component upgrade"], ["vec", "how do you choose aftermarket car speakers that fit your vehicle and sound preferences"], ["vec", "what is the difference between coaxial and component car speakers and which should you buy"]]} +{"query": "where to buy organic seeds?", "output": [["hyde", "Trusted organic seed suppliers include Johnny's Selected Seeds, High Mowing Organic Seeds, Seed Savers Exchange, and Baker Creek Heirloom Seeds. Look for USDA Certified Organic labels and non-GMO verification. Order in January-February for spring planting. Many offer sampler packs for beginners."], ["lex", "buy organic seeds online garden"], ["lex", "organic seed suppliers heirloom non-GMO"], ["vec", "where can you buy certified organic and heirloom seeds for a home garden"], ["vec", "which online seed companies sell high-quality organic and non-GMO vegetable and flower seeds"]]} +{"query": "challenges of digital transformation", "output": [["hyde", "Common digital transformation challenges include resistance to change from employees, integrating legacy systems with new platforms, data silos across departments, cybersecurity risks during migration, and shortage of skilled talent. McKinsey reports that 70% of digital transformation initiatives fail, often due to organizational culture rather than technology."], ["lex", "digital transformation challenges obstacles"], ["lex", "enterprise digital transformation barriers legacy systems"], ["vec", "what are the main challenges organizations face when undergoing digital transformation"], ["vec", "how do legacy systems, culture resistance, and skill gaps hinder digital transformation efforts"]]} +{"query": "what makes a good thriller novel?", "output": [["hyde", "A great thriller has a high-stakes central conflict, a ticking clock, and a protagonist under escalating pressure. Pacing is crucial—short chapters and cliffhanger endings drive momentum. Plant red herrings and misdirection, then deliver a twist that recontextualizes earlier clues. The antagonist should be intelligent and formidable, making the hero's victory feel earned."], ["lex", "thriller novel elements writing techniques"], ["lex", "good thriller pacing suspense plot twists"], ["vec", "what elements make a thriller novel compelling including pacing, suspense, and plot structure"], ["vec", "how do successful thriller writers build tension and keep readers turning pages"]]} +{"query": "what is the composition of the earth's atmosphere", "output": [["hyde", "Earth's atmosphere is composed of 78.09% nitrogen (N₂), 20.95% oxygen (O₂), 0.93% argon (Ar), and 0.04% carbon dioxide (CO₂). Trace gases include neon, helium, methane, krypton, and water vapor (0-4% depending on humidity). The atmosphere extends roughly 480 km above the surface and is divided into five layers: troposphere, stratosphere, mesosphere, thermosphere, and exosphere."], ["lex", "earth atmosphere composition gases percentages"], ["lex", "atmospheric gases nitrogen oxygen argon CO2"], ["vec", "what gases make up the Earth's atmosphere and in what proportions"], ["vec", "what is the chemical composition of Earth's atmosphere including trace gases"]]} +{"query": "how to file a petition to government", "output": [["hyde", "To file a petition, clearly state your request and supporting reasons. Collect signatures from eligible constituents—most jurisdictions require a minimum number based on population. File the petition with the appropriate government office (city clerk, state legislature, or Congress). Online platforms like Change.org can amplify support but may not satisfy legal petition requirements."], ["lex", "file petition government civic action"], ["lex", "government petition create submit signatures"], ["vec", "how do you create and file a formal petition to a government body or elected representative"], ["vec", "what is the process for submitting a petition to local, state, or federal government"]]} +{"query": "how to grow rhododendrons?", "output": [["hyde", "Rhododendrons require acidic soil (pH 4.5-6.0), partial shade, and consistent moisture. Plant in well-drained soil amended with peat moss or composted pine bark. Mulch with 2-3 inches of pine needles. Water deeply once a week—they have shallow root systems sensitive to drought. Avoid planting too deep; keep the root ball crown at soil level."], ["lex", "grow rhododendrons planting care soil"], ["lex", "rhododendron acidic soil shade watering"], ["vec", "how do you plant and care for rhododendrons including soil, light, and watering requirements"], ["vec", "what soil pH and growing conditions do rhododendrons need to thrive"]]} +{"query": "what is the ethics of surveillance", "output": [["hyde", "Mass surveillance raises fundamental questions about the balance between security and privacy. Critics argue programs like the NSA's PRISM violate Fourth Amendment protections against unreasonable search. Proponents claim surveillance prevents terrorism. The chilling effect—self-censorship by citizens who know they're watched—threatens free expression and democratic participation."], ["lex", "surveillance ethics privacy government"], ["lex", "mass surveillance civil liberties Fourth Amendment"], ["vec", "what are the ethical issues surrounding government and corporate surveillance of citizens"], ["vec", "how do privacy rights conflict with security justifications for mass surveillance programs"]]} +{"query": "regex match", "output": [["hyde", "A regex (regular expression) matches text patterns. Common syntax: `.` matches any character, `*` means zero or more, `+` means one or more, `?` means optional. `[a-z]` matches lowercase letters. `\\d` matches digits. Capture groups use parentheses: `(\\d{3})-(\\d{4})` matches and captures phone number parts. Use `^` for start and `$` for end of line."], ["lex", "regex match pattern regular expression"], ["lex", "regex syntax matching groups capture"], ["lex", "regular expression examples tutorial"], ["vec", "how do you write and use regular expressions to match patterns in text"], ["vec", "what is the syntax for regex pattern matching including groups, quantifiers, and character classes"]]} +{"query": "what is the ethics of research", "output": [["hyde", "Research ethics are governed by the Belmont Report's three principles: respect for persons (informed consent), beneficence (minimize harm, maximize benefit), and justice (fair selection of subjects). Institutional Review Boards (IRBs) review all human subjects research. Key requirements include voluntary participation, confidentiality, right to withdraw, and risk-benefit assessment."], ["lex", "research ethics principles IRB"], ["lex", "ethical research human subjects informed consent"], ["vec", "what ethical principles govern scientific and academic research involving human subjects"], ["vec", "how do institutional review boards ensure ethical standards in research studies"]]} +{"query": "how to set intentions for the day?", "output": [["hyde", "Each morning, sit quietly for 2-3 minutes and ask yourself: \"How do I want to feel today?\" and \"What matters most today?\" Write one to three intentions in a journal—e.g., \"I will be present in conversations\" or \"I will approach challenges with curiosity.\" Intentions focus on how you show up, not on tasks to complete. Review them at midday and evening."], ["lex", "set daily intentions morning routine"], ["lex", "intention setting mindfulness journaling"], ["vec", "how do you set meaningful daily intentions as part of a morning routine"], ["vec", "what is the practice of setting intentions and how does it differ from goal-setting"]]} +{"query": "what is the role of sacred music in worship?", "output": [["hyde", "Sacred music serves multiple functions in worship: it creates a contemplative atmosphere, unifies the congregation through shared singing, reinforces theological themes through lyrics, and marks liturgical transitions. Gregorian chant in Catholic Mass, bhajans in Hindu puja, and the Islamic adhan each use distinct musical forms to invoke the sacred and facilitate prayer."], ["lex", "sacred music worship role function"], ["lex", "religious hymns chants liturgical music"], ["vec", "what role does sacred music play in religious worship services across different faiths"], ["vec", "how do hymns, chants, and liturgical music enhance the experience of communal worship"]]} +{"query": "what are the features of ancient roman society?", "output": [["hyde", "Roman society was divided into patricians (aristocratic families), plebeians (common citizens), freedmen, and slaves. Citizens had legal rights including voting and property ownership. The Senate held political power, though plebeians gained representation through tribunes. Roman law (Twelve Tables, 450 BC) codified legal principles still influential today. The paterfamilias held authority over extended households."], ["lex", "ancient Roman society features structure"], ["lex", "Roman social classes patricians plebeians republic"], ["vec", "what were the defining features of ancient Roman society including social classes, government, and daily life"], ["vec", "how was ancient Roman society structured in terms of class hierarchy, citizenship, and law"]]} +{"query": "what is the role of family in society", "output": [["hyde", "The family is society's primary unit of socialization, teaching children language, norms, and values. Functionalist sociologists identify four key roles: socialization of children, economic cooperation, emotional support, and regulation of sexual behavior. Families also transmit cultural identity, religious traditions, and social status across generations."], ["lex", "family role society function socialization"], ["lex", "family structure social institution support"], ["vec", "what roles does the family unit play in society including socialization, support, and cultural transmission"], ["vec", "how do families function as the primary social institution for raising children and maintaining social order"]]} +{"query": "what is quantitative easing explained", "output": [["hyde", "Quantitative easing (QE) is an unconventional monetary policy where a central bank buys government bonds and other securities to inject money into the economy. When the Fed buys bonds, it increases bank reserves, lowers long-term interest rates, and encourages lending. The Fed used QE after 2008 and during COVID-19, expanding its balance sheet to over $8 trillion."], ["lex", "quantitative easing QE monetary policy"], ["lex", "quantitative easing central bank bond buying"], ["vec", "what is quantitative easing and how do central banks use it to stimulate the economy"], ["vec", "how does the Federal Reserve's quantitative easing program work and what are its effects on inflation and interest rates"]]} +{"query": "what is guerrilla marketing", "output": [["hyde", "Guerrilla marketing uses unconventional, low-cost tactics to create memorable brand experiences in unexpected places. Examples include flash mobs, street art installations, viral stunts, and ambient advertising placed in surprising locations. Jay Conrad Levinson coined the term in 1984. Success depends on creativity, surprise, and shareability rather than large advertising budgets."], ["lex", "guerrilla marketing unconventional low-cost"], ["lex", "guerrilla marketing examples campaigns street"], ["vec", "what is guerrilla marketing and how do businesses use unconventional tactics to promote products"], ["vec", "what are examples of successful guerrilla marketing campaigns and what makes them effective"]]} +{"query": "what is the study of geology", "output": [["hyde", "Geology is the scientific study of the Earth's structure, composition, and processes. Geologists examine rocks, minerals, fossils, and landforms to understand Earth's 4.5-billion-year history. Major branches include mineralogy (minerals), petrology (rocks), stratigraphy (rock layers), paleontology (fossils), and tectonics (plate movement and earthquakes)."], ["lex", "geology study earth science rocks minerals"], ["lex", "geology branches mineralogy tectonics stratigraphy"], ["vec", "what is geology and what do geologists study about the Earth's structure, materials, and history"], ["vec", "what are the main branches of geology including mineralogy, petrology, and plate tectonics"]]} +{"query": "how to photograph artwork?", "output": [["hyde", "Use two identical lights at 45-degree angles to the artwork to eliminate glare and ensure even illumination. Mount the camera on a tripod, centered and parallel to the surface. Shoot in RAW at ISO 100, f/8 for sharpness. Include a color checker card in one frame for accurate white balance. Use a remote shutter to avoid camera shake."], ["lex", "photograph artwork lighting camera setup"], ["lex", "art photography reproduction color accuracy"], ["vec", "how do you photograph paintings and artwork with accurate color and minimal glare"], ["vec", "what camera settings, lighting, and techniques produce high-quality photographs of artwork"]]} +{"query": "what are smart home technologies", "output": [["hyde", "Smart home technologies connect devices via Wi-Fi, Zigbee, Z-Wave, or Matter protocol to a central hub or voice assistant. Common categories include smart lighting (Philips Hue), thermostats (Nest, Ecobee), security cameras (Ring, Arlo), locks (August, Yale), and speakers (Amazon Echo, Google Nest). Automations trigger actions based on time, location, or sensor data."], ["lex", "smart home technologies devices IoT"], ["lex", "smart home automation hub Alexa Google Home"], ["vec", "what smart home technologies are available for automating lighting, security, climate, and entertainment"], ["vec", "how do smart home devices and IoT platforms like Alexa, Google Home, and HomeKit work together"]]} +{"query": "how sports influence youth development", "output": [["hyde", "Research shows youth sports participation improves physical fitness, teaches teamwork and leadership, and builds self-esteem. A 2019 study in the Journal of Sport and Health Science found that adolescents who play organized sports report lower rates of depression and anxiety. However, excessive pressure and early specialization can lead to burnout and injury."], ["lex", "sports youth development influence benefits"], ["lex", "youth athletics child development teamwork discipline"], ["vec", "how does participation in sports influence the physical, social, and emotional development of young people"], ["vec", "what benefits do organized sports provide for youth including teamwork, discipline, and mental health"]]} +{"query": "how to build self-confidence", "output": [["hyde", "Start by setting small, achievable goals and completing them—each success builds evidence of competence. Practice self-compassion: replace harsh self-criticism with the tone you'd use with a friend. Keep a \"wins\" journal and review it weekly. Gradually expand your comfort zone by doing one slightly uncomfortable thing each day. Confidence grows from accumulated experience, not positive thinking alone."], ["lex", "build self-confidence techniques self-esteem"], ["lex", "improve confidence self-worth mindset"], ["vec", "what are practical strategies for building self-confidence and overcoming self-doubt"], ["vec", "how can someone develop greater self-confidence through daily habits and mindset shifts"]]} +{"query": "how to plan a family field trip?", "output": [["hyde", "Choose an age-appropriate destination: museums, nature centers, farms, or historical sites. Check hours, admission costs, and accessibility online. Pack snacks, water, sunscreen, and a first-aid kit. Plan for shorter attention spans—schedule breaks every 60-90 minutes. Involve kids in planning by letting them choose one activity. Bring a scavenger hunt list to keep them engaged."], ["lex", "family field trip planning kids activities"], ["lex", "family outing day trip educational fun"], ["vec", "how do you plan an enjoyable and educational family field trip with children"], ["vec", "what are tips for organizing a family day trip including choosing destinations, packing, and budgeting"]]} +{"query": "what is a scientific model", "output": [["hyde", "A scientific model is a simplified representation of a system or phenomenon used to explain observations and make predictions. Models can be physical (a globe representing Earth), mathematical (equations describing gravity), or computational (climate simulations). All models are approximations—George Box wrote, \"All models are wrong, but some are useful.\""], ["lex", "scientific model definition types examples"], ["lex", "scientific models simulation representation theory"], ["vec", "what is a scientific model and how do scientists use models to explain and predict natural phenomena"], ["vec", "what are the different types of scientific models including physical, mathematical, and computational models"]]} +{"query": "io file", "output": [["hyde", "File I/O involves opening a file, reading or writing data, and closing it. In Python: `with open('file.txt', 'r') as f: data = f.read()` for reading, and `with open('file.txt', 'w') as f: f.write('hello')` for writing. The `with` statement ensures the file is properly closed. Use 'a' mode to append, 'rb'/'wb' for binary files."], ["lex", "file I/O input output operations"], ["lex", "file read write programming IO"], ["lex", "file handling open close stream"], ["vec", "how do you perform file input and output operations in programming languages"], ["vec", "what are the common methods for reading from and writing to files in Python, Java, or C"]]} +{"query": "what are creative portrait ideas?", "output": [["hyde", "Try shooting through prisms or crystal balls for rainbow light effects. Use fairy lights wrapped around the subject for warm bokeh. Photograph through rain-covered glass for a moody feel. Use dramatic side lighting with one bare bulb for chiaroscuro portraits. Shoot reflections in puddles, mirrors, or sunglasses. Double exposure combining portraits with textures or nature works well in-camera or in post."], ["lex", "creative portrait photography ideas techniques"], ["lex", "portrait photo ideas poses lighting creative"], ["vec", "what are unique and creative portrait photography ideas for interesting and artistic results"], ["vec", "how can you use lighting, props, angles, and locations for creative portrait photography"]]} +{"query": "fix hair", "output": [["hyde", "For damaged hair, use a deep conditioning mask with keratin or argan oil once a week. Trim split ends every 6-8 weeks. Reduce heat styling—if you must, use a heat protectant spray at 300°F max. For a quick bad hair day fix, try dry shampoo at the roots, a slicked-back bun, or braids. Sleep on a silk pillowcase to reduce friction and breakage."], ["lex", "fix hair repair damaged broken"], ["lex", "hair repair treatment dry frizzy damaged"], ["lex", "hairstyle fix bad hair day"], ["vec", "how do you fix and repair damaged, dry, or frizzy hair"], ["vec", "what are quick fixes for a bad hair day and long-term solutions for hair damage"]]} +{"query": "build up", "output": [["hyde", "To build up strength, follow progressive overload: gradually increase weight, reps, or sets each week. A beginner program like Starting Strength adds 5 lbs to compound lifts every session. Eat adequate protein (0.7-1g per pound bodyweight). Rest 48 hours between training the same muscle group. Consistency over 8-12 weeks produces measurable strength gains."], ["lex", "build up strength fitness training"], ["lex", "build up muscle mass exercise"], ["lex", "buildup gradual increase accumulation"], ["vec", "how do you progressively build up strength and muscle through a structured training program"], ["vec", "what does it mean to build up endurance, skills, or resources gradually over time"]]} +{"query": "how to participate in a protest", "output": [["hyde", "Know your rights: the First Amendment protects peaceful assembly on public property. Bring water, snacks, a phone charger, and ID. Write an emergency contact number on your arm. Stay with a buddy and agree on a meeting point. Wear comfortable shoes and weather-appropriate clothing. If tear gas is used, move upwind. Document police interactions by filming at a safe distance."], ["lex", "participate protest rally demonstration rights"], ["lex", "protest safety tips First Amendment rights"], ["vec", "how do you safely and effectively participate in a protest or public demonstration"], ["vec", "what should you know about your legal rights and safety precautions when attending a protest"]]} +{"query": "what is the principle of utility?", "output": [["hyde", "The principle of utility, formulated by Jeremy Bentham, states that the morally right action is the one that produces the greatest happiness for the greatest number. Bentham's felicific calculus measured pleasure by intensity, duration, certainty, and extent. John Stuart Mill refined this, distinguishing higher (intellectual) pleasures from lower (bodily) pleasures."], ["lex", "principle of utility utilitarianism Bentham Mill"], ["lex", "utility principle greatest happiness greatest number"], ["vec", "what is the principle of utility in utilitarian ethics as defined by Bentham and Mill"], ["vec", "how does the utilitarian principle of utility evaluate actions based on their consequences for overall happiness"]]} +{"query": "how to create a brand logo", "output": [["hyde", "Start by researching the brand's values, target audience, and competitors. Sketch 20-30 rough concepts on paper before going digital. A strong logo works in black and white, at small sizes (favicon), and large formats (billboard). Limit to 2-3 colors and one typeface. Test on business cards, websites, and merchandise. Tools: Adobe Illustrator, Figma, or Affinity Designer for vector-based design."], ["lex", "brand logo design create process"], ["lex", "logo design principles typography color branding"], ["vec", "how do you design an effective brand logo from concept to final design"], ["vec", "what principles of logo design ensure a brand mark is memorable, scalable, and versatile"]]} +{"query": "how to check tire pressure?", "output": [["hyde", "Check tire pressure when tires are cold (before driving or 3+ hours after). Remove the valve cap, press a tire gauge firmly onto the valve stem, and read the PSI. Compare to the recommended pressure on the driver's door jamb sticker (not the tire sidewall—that's the maximum). Add air at a gas station if low. Check all four tires plus the spare monthly."], ["lex", "check tire pressure gauge PSI"], ["lex", "tire pressure TPMS correct level car"], ["vec", "how do you check and adjust tire pressure using a tire gauge"], ["vec", "what is the correct tire pressure for a car and how often should it be checked"]]} +{"query": "how to cook quinoa", "output": [["hyde", "Rinse 1 cup quinoa in a fine mesh strainer to remove bitter saponins. Combine with 2 cups water and a pinch of salt in a saucepan. Bring to a boil, reduce to low, cover, and simmer for 15 minutes. Remove from heat and let steam with the lid on for 5 minutes. Fluff with a fork. Yields about 3 cups cooked quinoa."], ["lex", "cook quinoa recipe instructions stovetop"], ["lex", "quinoa cooking ratio water time"], ["vec", "what is the correct method for cooking quinoa on the stovetop with the right water ratio"], ["vec", "how do you cook fluffy quinoa and what is the water to quinoa ratio"]]} +{"query": "how to prevent identity theft", "output": [["hyde", "Freeze your credit at all three bureaus (Equifax, Experian, TransUnion)—it's free and prevents unauthorized accounts. Use unique passwords with a password manager. Enable two-factor authentication on all financial accounts. Shred documents with personal information. Monitor bank statements weekly and check your credit report annually at AnnualCreditReport.com."], ["lex", "prevent identity theft protection tips"], ["lex", "identity theft prevention credit freeze monitor"], ["vec", "what steps can you take to protect yourself from identity theft and fraud"], ["vec", "how do credit freezes, strong passwords, and monitoring help prevent identity theft"]]} +{"query": "how to start a blog", "output": [["hyde", "Choose a platform: WordPress.org for full control (needs hosting), or Substack/Ghost for simplicity. Pick a niche you can write about consistently. Register a domain name ($10-15/year). Write 5-10 posts before launching so visitors find content immediately. Optimize for SEO with clear titles and headers. Share on social media and engage with other bloggers in your niche."], ["lex", "start blog setup hosting platform"], ["lex", "blogging beginners WordPress Substack setup"], ["vec", "how do you start a blog from scratch including choosing a platform, domain, and writing your first posts"], ["vec", "what are the steps to launch a successful blog and attract readers"]]} +{"query": "documentary photography", "output": [["hyde", "Documentary photography aims to chronicle real events, conditions, or people over time to create a truthful narrative. Unlike photojournalism's focus on breaking news, documentary work unfolds over weeks, months, or years. Key practitioners include Dorothea Lange (Great Depression), Sebastião Salgado (workers, migration), and James Nachtwey (conflict). Shoot with available light, build trust with subjects, and caption extensively."], ["lex", "documentary photography style techniques"], ["lex", "documentary photojournalism storytelling long-term"], ["vec", "what is documentary photography and how does it differ from photojournalism and street photography"], ["vec", "what techniques and approaches do documentary photographers use to tell stories through images"]]} +{"query": "what causes tides", "output": [["hyde", "Tides are primarily caused by the gravitational pull of the Moon on Earth's oceans. The side of Earth facing the Moon experiences a direct gravitational pull creating a tidal bulge (high tide). A second bulge forms on the opposite side due to inertial forces. The Sun's gravity also contributes—spring tides (highest) occur during full and new moons when Sun and Moon align."], ["lex", "tides causes moon gravitational pull"], ["lex", "tidal forces moon sun earth gravity"], ["vec", "what causes ocean tides and how do the gravitational forces of the moon and sun create them"], ["vec", "how does the moon's gravitational pull create high and low tides on Earth"]]} +{"query": "what is the history of christianity?", "output": [["hyde", "Christianity originated in 1st-century Judea with the teachings of Jesus of Nazareth. After his crucifixion (c. 30 AD), apostles like Paul spread the faith across the Roman Empire. Constantine legalized it in 313 AD (Edict of Milan). The Great Schism (1054) split Eastern Orthodox and Roman Catholic churches. The Protestant Reformation began in 1517 with Martin Luther."], ["lex", "history Christianity origins spread timeline"], ["lex", "Christianity history Jesus apostles church development"], ["vec", "what is the history of Christianity from its origins with Jesus to the modern era"], ["vec", "how did Christianity spread from a small Jewish sect to a global religion over two millennia"]]} +{"query": "what is the industrial revolution", "output": [["hyde", "The Industrial Revolution began in Britain around 1760-1840, transforming agrarian economies into industrial ones. Key innovations included the steam engine (James Watt), spinning jenny (textile production), and iron smelting with coke. Factories replaced cottage industries. Urbanization accelerated as workers moved to cities. It brought economic growth but also child labor, pollution, and harsh working conditions."], ["lex", "Industrial Revolution history manufacturing 18th century"], ["lex", "Industrial Revolution steam engine factories Britain"], ["vec", "what was the Industrial Revolution and how did it transform manufacturing, society, and the economy"], ["vec", "when and where did the Industrial Revolution begin and what were its major innovations and consequences"]]} +{"query": "what is sustainable forestry?", "output": [["hyde", "Sustainable forestry manages forests to meet current timber needs without compromising future generations' resources. Practices include selective logging (harvesting individual trees rather than clearcutting), replanting harvested areas, maintaining buffer zones near waterways, and preserving biodiversity corridors. The Forest Stewardship Council (FSC) certifies sustainably managed forests."], ["lex", "sustainable forestry management practices"], ["lex", "sustainable logging forest stewardship FSC"], ["vec", "what is sustainable forestry and how does it balance timber harvesting with forest ecosystem health"], ["vec", "what practices and certifications like FSC ensure forests are managed sustainably"]]} +{"query": "what is character arc?", "output": [["hyde", "A character arc is the transformation a character undergoes from the beginning to the end of a story. In a positive arc, the character overcomes a flaw or false belief (e.g., Scrooge in A Christmas Carol). In a negative arc, they descend (Walter White in Breaking Bad). In a flat arc, the character's beliefs remain constant but they change the world around them."], ["lex", "character arc definition types fiction"], ["lex", "character arc development flat dynamic transformation"], ["vec", "what is a character arc in fiction and how do characters change throughout a story"], ["vec", "what are the different types of character arcs including positive, negative, and flat arcs"]]} +{"query": "how to address ethical dilemmas in research", "output": [["hyde", "When facing an ethical dilemma in research, consult your IRB or ethics committee immediately. Common dilemmas include conflicts between maximizing data quality and minimizing participant burden, handling incidental findings, and balancing confidentiality with mandatory reporting obligations. Document your reasoning and decisions. The Belmont Report provides foundational guidance: respect for persons, beneficence, and justice."], ["lex", "ethical dilemmas research handling IRB"], ["lex", "research ethics conflict resolution informed consent"], ["vec", "how should researchers identify and address ethical dilemmas that arise during scientific studies"], ["vec", "what frameworks and procedures help resolve ethical conflicts in academic and clinical research"]]} +{"query": "how to manage stress effectively", "output": [["hyde", "Effective stress management combines multiple approaches. Exercise 30 minutes daily—even walking reduces cortisol. Practice diaphragmatic breathing: inhale 4 counts, hold 4, exhale 6. Limit caffeine after noon. Maintain consistent sleep and wake times. Cognitive reframing: identify catastrophic thoughts and replace them with realistic assessments. Social connection is protective—schedule regular time with supportive people."], ["lex", "manage stress effectively coping techniques"], ["lex", "stress management relaxation anxiety reduction"], ["vec", "what are evidence-based techniques for managing stress and reducing anxiety in daily life"], ["vec", "how can you manage chronic stress through exercise, mindfulness, and lifestyle changes"]]} +{"query": "how does the philosophy of science address scientific change", "output": [["hyde", "Thomas Kuhn argued science progresses through paradigm shifts: periods of \"normal science\" within an accepted framework are punctuated by revolutionary crises when anomalies accumulate. Karl Popper proposed that science advances through falsification—theories must be testable and those that survive rigorous attempts at refutation are provisionally accepted. Lakatos offered a middle ground with his research programme methodology."], ["lex", "philosophy of science scientific change paradigm shift"], ["lex", "Kuhn paradigm revolution Popper falsification Lakatos"], ["vec", "how do philosophers of science like Kuhn, Popper, and Lakatos explain scientific revolutions and theory change"], ["vec", "what does the philosophy of science say about how scientific knowledge evolves and paradigms shift"]]} +{"query": "what are the rituals of judaism", "output": [["hyde", "Key Jewish rituals include Shabbat (weekly rest from Friday sunset to Saturday night with candle lighting, kiddush, and challah), the Passover seder (retelling the Exodus), Yom Kippur fasting, circumcision (brit milah) on the 8th day, bar/bat mitzvah at 13/12, and daily prayer (Shacharit, Mincha, Ma'ariv). Keeping kosher governs dietary laws separating meat and dairy."], ["lex", "Judaism rituals practices observances"], ["lex", "Jewish rituals Shabbat Passover bar mitzvah kosher"], ["vec", "what are the major rituals and religious observances in Judaism"], ["vec", "how do Jewish rituals like Shabbat, Passover, and bar/bat mitzvah mark life and calendar events"]]} +{"query": "how do scientists communicate their findings", "output": [["hyde", "Scientists communicate findings through peer-reviewed journal articles (the gold standard), conference presentations (talks and posters), and preprint servers like arXiv and bioRxiv for rapid dissemination. The publication process involves writing a manuscript, submitting to a journal, peer review by 2-3 experts, revision, and acceptance. Increasingly, scientists also use social media and press releases to reach the public."], ["lex", "scientists communicate findings publications"], ["lex", "scientific communication peer review journal conference"], ["vec", "how do scientists share and publish their research findings with the scientific community and public"], ["vec", "what are the channels scientists use to communicate results including journals, conferences, and preprints"]]} +{"query": "mock test", "output": [["hyde", "Mock tests simulate real exam conditions—same time limits, question types, and format. Take full-length practice tests under timed conditions every 1-2 weeks during preparation. Review every wrong answer to identify weak areas. Free mock tests are available on Khan Academy (SAT), ETS (GRE), and official certification body websites. Score trends across mock tests predict actual performance."], ["lex", "mock test practice exam preparation"], ["lex", "mock exam sample questions test prep"], ["lex", "practice test online free exam"], ["vec", "how do you use mock tests and practice exams to prepare for standardized tests and certifications"], ["vec", "where can you find free mock tests and practice exams for tests like SAT, GRE, or professional certifications"]]} +{"query": "what is the purpose of foreshadowing?", "output": [["hyde", "Foreshadowing plants clues or hints about future events in a narrative, building suspense and making plot developments feel earned rather than arbitrary. Chekhov's gun principle—if a gun appears in Act 1, it must fire by Act 3—is a classic example. Effective foreshadowing is subtle enough to miss on first reading but obvious in retrospect, rewarding rereading."], ["lex", "foreshadowing purpose literary device fiction"], ["lex", "foreshadowing examples narrative technique"], ["vec", "what is the purpose of foreshadowing in literature and how do authors use it to build suspense"], ["vec", "how does foreshadowing create anticipation and cohesion in a story's plot"]]} +{"query": "what is trail running?", "output": [["hyde", "Trail running is running on unpaved surfaces—dirt paths, mountain trails, forest tracks, and rocky terrain. Unlike road running, it requires navigating elevation changes, uneven footing, and obstacles. Use trail shoes with aggressive lugs for grip and rock plates for protection. Shorten your stride on technical terrain. Popular distances range from 5K to ultramarathons (50+ miles)."], ["lex", "trail running off-road terrain"], ["lex", "trail running shoes gear technique"], ["vec", "what is trail running and how does it differ from road running"], ["vec", "what gear, technique, and training do you need for trail running on off-road terrain"]]} +{"query": "what was the impact of the cold war?", "output": [["hyde", "The Cold War (1947-1991) divided the world into Western (NATO) and Eastern (Warsaw Pact) blocs. Its impacts include the nuclear arms race (peaking at 70,000+ warheads), proxy wars in Korea, Vietnam, and Afghanistan, the Space Race, decolonization movements influenced by superpower competition, and the eventual collapse of the Soviet Union in 1991 leading to U.S. unipolarity."], ["lex", "Cold War impact consequences effects"], ["lex", "Cold War legacy geopolitics nuclear arms race"], ["vec", "what were the major political, social, and economic impacts of the Cold War on the world"], ["vec", "how did the Cold War shape international relations, the nuclear arms race, and proxy conflicts"]]} +{"query": "street photography ethics", "output": [["hyde", "In most countries, photographing people in public spaces is legally permitted since there is no expectation of privacy. However, ethical street photographers follow principles: avoid exploiting vulnerable people, don't photograph children without parental awareness, respect requests to delete images, and consider whether the image dignifies or demeans the subject. Some photographers adopt a \"golden rule\" approach."], ["lex", "street photography ethics legal rights"], ["lex", "street photography consent privacy public space"], ["vec", "what are the ethical considerations and legal rights involved in street photography"], ["vec", "is it ethical to photograph strangers in public and what are the legal rules around street photography"]]} +{"query": "vitosha mountain", "output": [["hyde", "Vitosha is a mountain massif on the outskirts of Sofia, Bulgaria, reaching 2,290m at Cherni Vrah (Black Peak). Vitosha Nature Park offers hiking trails, ski runs at Aleko, and the Boyana Waterfall. The golden bridges stone river is a popular landmark. Access from Sofia takes 30 minutes by car or bus. The mountain is a popular day trip for Sofia residents year-round."], ["lex", "Vitosha mountain Sofia Bulgaria"], ["lex", "Vitosha hiking trails Cherni Vrah peak"], ["vec", "what are the hiking trails and attractions on Vitosha mountain near Sofia, Bulgaria"], ["vec", "what is Vitosha mountain and what outdoor activities are available in Vitosha Nature Park"]]} +{"query": "what is an anthology?", "output": [["hyde", "An anthology is a curated collection of literary works—short stories, poems, essays, or excerpts—by various authors, assembled around a common theme, genre, or time period. Editors select and arrange pieces to create a coherent reading experience. Examples include The Norton Anthology of English Literature and Best American Short Stories, published annually."], ["lex", "anthology definition literary collection"], ["lex", "anthology book short stories poems collected works"], ["vec", "what is an anthology and how are literary anthologies compiled and organized"], ["vec", "what types of works are typically collected in an anthology such as short stories, poems, or essays"]]} +{"query": "what is the significance of the yom kippur?", "output": [["hyde", "Yom Kippur (Day of Atonement) is the holiest day in Judaism, falling on the 10th of Tishrei. Observers fast for 25 hours from sunset to sunset, abstaining from food, water, leather shoes, and bathing. The day is spent in synagogue prayer, including the Kol Nidre service and the Neilah closing prayer. It is a day of repentance (teshuvah) for sins against God, concluding the ten Days of Awe."], ["lex", "Yom Kippur significance Jewish holy day"], ["lex", "Yom Kippur Day of Atonement fasting prayer"], ["vec", "what is Yom Kippur and why is it the most significant holy day in Judaism"], ["vec", "how do Jewish people observe Yom Kippur through fasting, prayer, and repentance"]]} +{"query": "what is clean camping?", "output": [["hyde", "Clean camping follows Leave No Trace principles: plan ahead, travel on durable surfaces, dispose of waste properly, leave what you find, minimize campfire impact, respect wildlife, and be considerate of others. Pack out all trash including food scraps. Use biodegradable soap 200 feet from water sources. Dig catholes 6-8 inches deep for human waste. Leave campsites cleaner than you found them."], ["lex", "clean camping Leave No Trace principles"], ["lex", "clean camping eco-friendly minimal impact"], ["vec", "what is clean camping and how do you minimize your environmental impact while camping outdoors"], ["vec", "what are the Leave No Trace principles and how do they apply to clean camping practices"]]} +{"query": "how to evaluate scientific claims critically", "output": [["hyde", "Check the source: is it published in a peer-reviewed journal? Look for sample size, control groups, and statistical significance (p < 0.05). Distinguish correlation from causation. Check if results have been replicated by independent researchers. Evaluate conflicts of interest and funding sources. Be skeptical of single studies—look for systematic reviews and meta-analyses that synthesize multiple studies."], ["lex", "evaluate scientific claims critical thinking"], ["lex", "scientific literacy evidence evaluation peer review"], ["vec", "how do you critically evaluate scientific claims and distinguish credible research from misinformation"], ["vec", "what criteria should you use to assess whether a scientific study's conclusions are reliable"]]} +{"query": "what is the significance of song in worship?", "output": [["hyde", "Singing in worship engages the whole person—body, mind, and emotions—in ways that spoken word alone cannot. Neuroscience shows group singing synchronizes heart rates and releases oxytocin, fostering communal bonding. In Christian worship, hymns reinforce theology through memorable lyrics. The Psalms themselves are songs, and Paul urged believers to address one another \"in psalms, hymns, and spiritual songs\" (Ephesians 5:19)."], ["lex", "song worship significance religious singing"], ["lex", "worship music congregational singing hymns praise"], ["vec", "what role does congregational singing and worship music play in religious services"], ["vec", "why is song considered a significant form of spiritual expression and communal worship across faiths"]]} +{"query": "what is the significance of algae in ecosystems", "output": [["hyde", "Algae produce approximately 50% of the world's oxygen through photosynthesis and form the base of aquatic food chains. Phytoplankton, a type of microalgae, supports marine ecosystems by providing energy to zooplankton, fish, and larger organisms."], ["lex", "algae ecosystem role food chain"], ["lex", "algae oxygen production aquatic ecosystems"], ["lex", "algae photosynthesis carbon cycle"], ["vec", "what role do algae play in aquatic and marine ecosystems"], ["vec", "how do algae contribute to oxygen production and food webs"]]} +{"query": "how to train for a marathon", "output": [["hyde", "A typical 16-week marathon training plan starts with a base of 15-20 miles per week, gradually increasing the long run by 1-2 miles each week. Include easy runs, tempo runs at marathon pace, and one rest day. Taper volume 2-3 weeks before race day."], ["lex", "marathon training plan schedule"], ["lex", "long distance running program beginner"], ["lex", "marathon race preparation mileage"], ["vec", "what is a good training plan for running a first marathon"], ["vec", "how to build weekly mileage for marathon race preparation"]]} +{"query": "how to handle a child's tantrum in public?", "output": [["hyde", "When your child has a tantrum in public, stay calm and speak in a low, steady voice. Get down to their eye level, acknowledge their feelings, and offer simple choices. If needed, move to a quieter spot and wait for the intensity to pass before addressing the behavior."], ["lex", "child tantrum public calm techniques"], ["lex", "toddler meltdown coping strategies"], ["vec", "what are effective ways to calm a toddler having a tantrum in a public place"], ["vec", "how should parents respond when their child has a meltdown in a store or restaurant"]]} +{"query": "how to invest in index funds", "output": [["hyde", "To invest in index funds, open a brokerage account with a provider like Vanguard, Fidelity, or Schwab. Choose a broad market index fund such as VTSAX or an S&P 500 ETF like VOO. Set up automatic contributions and reinvest dividends for compound growth."], ["lex", "index fund investing brokerage account"], ["lex", "S&P 500 index fund buy shares"], ["lex", "passive investing index ETF"], ["vec", "how to open a brokerage account and buy index funds for long-term investing"], ["vec", "what are the steps to start investing in S&P 500 or total market index funds"]]} +{"query": "what is data science", "output": [["hyde", "Data science is an interdisciplinary field that uses statistical methods, machine learning algorithms, and programming to extract insights from structured and unstructured data. Practitioners typically work with Python or R, use tools like pandas and scikit-learn, and apply techniques such as regression, classification, and clustering."], ["lex", "data science statistics machine learning"], ["lex", "data science analysis programming Python R"], ["vec", "what does data science involve and what skills are needed to work in the field"], ["vec", "how does data science combine statistics, programming, and domain knowledge"]]} +{"query": "how to improve concentration skills?", "output": [["hyde", "To improve concentration, try the Pomodoro technique: work for 25 minutes, then take a 5-minute break. Eliminate distractions by silencing notifications and using website blockers. Regular exercise, adequate sleep, and mindfulness meditation have all been shown to increase sustained attention."], ["lex", "improve focus concentration techniques"], ["lex", "attention span exercises deep work"], ["vec", "what are practical techniques to improve focus and concentration during work or study"], ["vec", "how can I train my brain to maintain attention for longer periods"]]} +{"query": "how to participate in earth hour?", "output": [["hyde", "Earth Hour takes place on the last Saturday of March each year. To participate, turn off all non-essential lights for one hour starting at 8:30 PM local time. You can also share your participation on social media using #EarthHour and organize community events."], ["lex", "Earth Hour participation lights off event"], ["lex", "Earth Hour date 2026 how to join"], ["vec", "how do I participate in the annual Earth Hour lights-off event"], ["vec", "what can individuals and businesses do during Earth Hour to show support"]]} +{"query": "what are nanotechnologies", "output": [["hyde", "Nanotechnology involves manipulating matter at the nanoscale, typically between 1 and 100 nanometers. Applications include targeted drug delivery using nanoparticles, carbon nanotube transistors in electronics, and nanocoatings that repel water and resist corrosion."], ["lex", "nanotechnology nanomaterials nanoscale engineering"], ["lex", "nanotech applications medicine electronics"], ["vec", "what is nanotechnology and how are nanoscale materials used in different industries"], ["vec", "what are the main applications of nanotechnology in medicine and electronics"]]} +{"query": "how to create a color palette for painting?", "output": [["hyde", "Start with a limited palette of 4-6 colors: a warm and cool version of each primary (e.g., cadmium yellow, lemon yellow, ultramarine blue, cerulean blue, alizarin crimson, cadmium red). Mix swatches to map out your range. Use complementary colors for contrast and analogous colors for harmony."], ["lex", "color palette painting color theory"], ["lex", "mixing paint colors warm cool complementary"], ["vec", "how do artists create a cohesive color palette for a painting using color theory"], ["vec", "what techniques help choose harmonious paint colors for an artwork"]]} +{"query": "how to make homemade pasta", "output": [["hyde", "Combine 2 cups of 00 flour with 3 large eggs on a clean surface. Knead the dough for 8-10 minutes until smooth and elastic. Wrap in plastic and rest for 30 minutes. Roll out thin with a rolling pin or pasta machine, then cut into desired shapes like fettuccine or tagliatelle."], ["lex", "homemade pasta recipe dough eggs flour"], ["lex", "fresh pasta making rolling cutting"], ["vec", "what is the recipe and technique for making fresh pasta dough from scratch"], ["vec", "how to roll and cut homemade pasta without a pasta machine"]]} +{"query": "how to reduce stress", "output": [["hyde", "Regular physical activity releases endorphins that naturally reduce stress. Practice deep breathing: inhale for 4 counts, hold for 4, exhale for 6. Other effective strategies include progressive muscle relaxation, journaling, limiting caffeine, and maintaining a consistent sleep schedule of 7-9 hours."], ["lex", "stress reduction techniques relaxation"], ["lex", "manage stress exercise meditation breathing"], ["vec", "what are effective daily habits for reducing stress and improving mental health"], ["vec", "how can breathing exercises and physical activity help lower stress levels"]]} +{"query": "how to develop a research hypothesis", "output": [["hyde", "A research hypothesis is a specific, testable prediction about the relationship between variables. Start by identifying your research question, then review existing literature. Formulate the hypothesis as an if-then or directional statement, clearly defining the independent and dependent variables."], ["lex", "research hypothesis formulation testable"], ["lex", "hypothesis writing independent dependent variable"], ["vec", "how do you write a clear and testable research hypothesis for a study"], ["vec", "what are the steps to develop a hypothesis from a research question"]]} +{"query": "what is social contract theory", "output": [["hyde", "Social contract theory proposes that individuals consent, either explicitly or tacitly, to surrender some freedoms to a governing authority in exchange for social order. Hobbes argued for an absolute sovereign, Locke emphasized natural rights and limited government, and Rousseau stressed the general will of the people."], ["lex", "social contract theory Hobbes Locke Rousseau"], ["lex", "social contract political philosophy government legitimacy"], ["vec", "what is social contract theory and how did Hobbes, Locke, and Rousseau differ in their views"], ["vec", "how does social contract theory explain the legitimacy of government authority"]]} +{"query": "code share", "output": [["hyde", "CodeShare.io is a free online editor for sharing code in real time. Paste or type your code, share the generated URL, and others can view or edit simultaneously. For permanent sharing, GitHub Gists let you create public or secret snippets with syntax highlighting and version history."], ["lex", "code sharing platform snippet pastebin"], ["lex", "codeshare live collaborative editor"], ["lex", "share code online GitHub Gist"], ["vec", "what are the best platforms for sharing code snippets with others online"], ["vec", "how to share code collaboratively in real time with another developer"]]} +{"query": "what is the significance of the american revolution", "output": [["hyde", "The American Revolution (1775-1783) established the United States as an independent nation and introduced a constitutional republic based on Enlightenment principles. The Declaration of Independence asserted natural rights, and the resulting Constitution created a framework of representative government that influenced the French Revolution and Latin American independence movements."], ["lex", "American Revolution significance independence 1776"], ["lex", "American Revolution impact democracy constitutional government"], ["vec", "why was the American Revolution historically significant for democracy and self-governance"], ["vec", "how did the American Revolution influence other independence movements worldwide"]]} +{"query": "how to understand political ideologies", "output": [["hyde", "Political ideologies are organized systems of beliefs about governance and society. The left-right spectrum places socialism and progressivism on the left, emphasizing equality and collective action, while conservatism and libertarianism sit on the right, prioritizing individual freedom and tradition. Each ideology has distinct views on the role of government, economics, and social policy."], ["lex", "political ideologies left right spectrum"], ["lex", "liberalism conservatism socialism political theory"], ["vec", "how can someone learn about different political ideologies and where they fall on the spectrum"], ["vec", "what are the main differences between liberalism, conservatism, socialism, and libertarianism"]]} +{"query": "how to build confidence in social situations?", "output": [["hyde", "Start small: make eye contact and greet one new person at each event. Prepare a few open-ended questions in advance. Focus on listening rather than performing. After each interaction, note what went well. Gradual exposure reduces anxiety over time—the more you practice, the more natural conversations become."], ["lex", "social confidence building shyness overcome"], ["lex", "social anxiety tips conversation skills"], ["vec", "what are practical steps to feel more confident when talking to people at social events"], ["vec", "how can someone overcome social anxiety and build self-confidence in group settings"]]} +{"query": "what to pack for a day hike", "output": [["hyde", "Day hike essentials: 2 liters of water, trail snacks (nuts, bars, fruit), map or GPS device, sun protection (hat, sunscreen, sunglasses), first aid kit, rain layer, extra warm layer, headlamp, and a fully charged phone. Wear moisture-wicking layers and broken-in hiking boots."], ["lex", "day hike packing list gear essentials"], ["lex", "hiking backpack water food first aid"], ["vec", "what should I bring in my backpack for a day hike in the mountains"], ["vec", "what are the essential items to pack for a full-day hiking trip"]]} +{"query": "what is digital collage art?", "output": [["hyde", "Digital collage art combines photographs, illustrations, textures, and graphic elements assembled in software like Photoshop, Procreate, or Canva. Artists layer, mask, blend, and transform images to create surreal or thematic compositions. Unlike physical collage, digital tools allow non-destructive editing and infinite experimentation with scale and color."], ["lex", "digital collage art Photoshop mixed media"], ["lex", "digital collage techniques layers composition"], ["vec", "what is digital collage art and how is it created using software"], ["vec", "what tools and techniques do artists use to make digital collages"]]} +{"query": "how to fix a car radiator leak?", "output": [["hyde", "For a small radiator leak, a stop-leak product like Bar's Leaks can provide a temporary fix. Add it to the coolant reservoir and run the engine. For permanent repair, locate the leak by pressurizing the cooling system, then either solder the radiator, replace the damaged hose, or install a new radiator if the damage is severe."], ["lex", "car radiator leak repair fix sealant"], ["lex", "radiator hose replacement coolant leak"], ["vec", "how to diagnose and fix a leaking car radiator or radiator hose"], ["vec", "can radiator stop-leak sealant permanently fix a small coolant leak"]]} +{"query": "where to buy saffron", "output": [["hyde", "Buy saffron from reputable spice retailers like Penzeys, Burlap & Barrel, or specialty grocery stores. Look for grade 1 (Sargol or Negin) Iranian or Spanish saffron. Expect to pay $8-15 per gram. Avoid suspiciously cheap saffron—it may be dyed safflower or corn silk."], ["lex", "buy saffron threads online spice shop"], ["lex", "saffron purchase quality grade price"], ["vec", "where is the best place to buy high-quality saffron threads online or in stores"], ["vec", "how to find genuine saffron and avoid counterfeit or adulterated products"]]} +{"query": "what is mahayana buddhism", "output": [["hyde", "Mahayana Buddhism, the \"Great Vehicle,\" emerged around the 1st century CE and emphasizes the bodhisattva ideal—the aspiration to attain enlightenment for the benefit of all sentient beings, not just oneself. Key texts include the Heart Sutra and Lotus Sutra. Major traditions include Zen, Pure Land, and Tibetan Buddhism."], ["lex", "Mahayana Buddhism bodhisattva teachings"], ["lex", "Mahayana vs Theravada Buddhism sutras"], ["vec", "what are the core beliefs and practices of Mahayana Buddhism"], ["vec", "how does Mahayana Buddhism differ from Theravada Buddhism"]]} +{"query": "what is utilitarianism in ethics", "output": [["hyde", "Utilitarianism is a consequentialist ethical theory holding that the morally right action is the one that produces the greatest happiness for the greatest number. Jeremy Bentham proposed a quantitative \"felicific calculus,\" while John Stuart Mill distinguished between higher and lower pleasures, arguing quality of happiness matters as much as quantity."], ["lex", "utilitarianism ethics greatest happiness principle"], ["lex", "utilitarianism Bentham Mill consequentialism"], ["vec", "what is utilitarianism and how does it determine right and wrong actions"], ["vec", "how did Jeremy Bentham and John Stuart Mill develop utilitarian ethics"]]} +{"query": "what is climate change?", "output": [["hyde", "Climate change refers to long-term shifts in global temperatures and weather patterns. Since the Industrial Revolution, burning fossil fuels has released carbon dioxide and methane, trapping heat in the atmosphere. This has caused average global temperatures to rise by about 1.1°C, leading to melting ice caps, rising sea levels, and more extreme weather events."], ["lex", "climate change global warming greenhouse gases"], ["lex", "climate change causes effects CO2 emissions"], ["vec", "what causes climate change and what are its effects on the planet"], ["vec", "how do greenhouse gas emissions from human activity drive global warming"]]} +{"query": "what is the difference between positive and negative rights", "output": [["hyde", "Negative rights require others to refrain from interfering—examples include freedom of speech, the right to privacy, and freedom from torture. Positive rights require others to provide something—examples include the right to education, healthcare, or a minimum standard of living. The distinction is central to debates between libertarians and welfare-state advocates."], ["lex", "positive rights negative rights difference"], ["lex", "positive negative rights examples entitlements liberties"], ["vec", "what is the distinction between positive and negative rights in political philosophy"], ["vec", "can you explain positive rights versus negative rights with examples"]]} +{"query": "what causes migraines", "output": [["hyde", "Migraines involve abnormal brain activity affecting nerve signals, chemicals, and blood vessels. Cortical spreading depression—a wave of electrical activity across the cortex—triggers the trigeminal nerve, releasing inflammatory peptides. Common triggers include stress, hormonal changes, certain foods (aged cheese, alcohol), sleep disruption, and bright lights."], ["lex", "migraine causes triggers brain"], ["lex", "migraine headache serotonin vascular nerve"], ["vec", "what are the biological causes and common triggers of migraine headaches"], ["vec", "why do some people get migraines and what happens in the brain during one"]]} +{"query": "how to talk to kids about bullying?", "output": [["hyde", "Start the conversation calmly by asking open-ended questions: \"Has anyone at school been mean to you or someone else?\" Listen without overreacting. Teach your child to say \"Stop, I don't like that\" firmly, walk away, and tell a trusted adult. Role-play scenarios so they can practice responses."], ["lex", "talk children bullying conversation advice"], ["lex", "kids bullying prevention parent discussion"], ["vec", "how should parents talk to their children about bullying at school"], ["vec", "what are age-appropriate ways to discuss bullying with kids and help them respond"]]} +{"query": "when to replace windshield wipers?", "output": [["hyde", "Replace windshield wipers every 6-12 months or when you notice streaking, skipping, squeaking, or smearing. Inspect the rubber edge for cracks, tears, or stiffness. If wipers leave unwiped areas or chatter across the glass, it's time for new blades. Extreme heat and cold accelerate deterioration."], ["lex", "replace windshield wipers signs worn"], ["lex", "wiper blade replacement frequency lifespan"], ["vec", "how often should windshield wipers be replaced and what are signs they need changing"], ["vec", "what are the signs that windshield wiper blades are worn out and need replacement"]]} +{"query": "how to aerate lawn manually?", "output": [["hyde", "To aerate manually, push a garden fork or manual core aerator into the soil every 4-6 inches, rocking it slightly to loosen the earth. Work in rows across the lawn. The best time to aerate is early fall for cool-season grasses or late spring for warm-season grasses. Water the lawn the day before to soften the soil."], ["lex", "aerate lawn manually core aeration fork"], ["lex", "lawn aeration by hand spike tool"], ["vec", "how to aerate a lawn by hand without a machine using a garden fork or manual aerator"], ["vec", "what is the best technique for manually aerating compacted soil in a yard"]]} +{"query": "how to improve business communication", "output": [["hyde", "Effective business communication starts with clarity: state the purpose in the first sentence, use short paragraphs, and include a clear call to action. In meetings, summarize key points and assign action items. Avoid jargon when possible. Active listening—paraphrasing what others say—builds rapport and reduces misunderstandings."], ["lex", "business communication skills effective workplace"], ["lex", "professional email writing clear messaging"], ["vec", "how can employees improve their written and verbal communication skills at work"], ["vec", "what techniques make business emails and presentations clearer and more effective"]]} +{"query": "how to manage anxiety naturally", "output": [["hyde", "Natural anxiety management includes regular aerobic exercise (30 minutes, 5 days a week), diaphragmatic breathing, progressive muscle relaxation, and limiting caffeine and alcohol. Cognitive behavioral techniques like thought journaling help identify and challenge anxious thinking patterns. Herbal supplements such as chamomile and ashwagandha show some evidence of benefit."], ["lex", "manage anxiety natural remedies without medication"], ["lex", "anxiety relief breathing exercise meditation"], ["vec", "what are natural ways to manage anxiety without medication"], ["vec", "how can exercise, breathing techniques, and lifestyle changes reduce anxiety symptoms"]]} +{"query": "how to draft a lease agreement", "output": [["hyde", "A residential lease agreement should include: names of landlord and tenant, property address, lease term (start/end dates), monthly rent amount and due date, security deposit amount and return conditions, maintenance responsibilities, pet policy, late fee terms, and termination/renewal clauses. Both parties should sign and retain copies."], ["lex", "lease agreement draft template rental"], ["lex", "residential lease contract terms clauses"], ["vec", "what should be included when drafting a residential lease agreement"], ["vec", "how to write a legally sound rental lease agreement between landlord and tenant"]]} +{"query": "what is burnout?", "output": [["hyde", "Burnout is a state of chronic physical and emotional exhaustion caused by prolonged stress, typically work-related. The WHO classifies it by three dimensions: energy depletion, increased mental distance or cynicism toward one's job, and reduced professional efficacy. Symptoms include fatigue, insomnia, irritability, and difficulty concentrating."], ["lex", "burnout syndrome workplace exhaustion"], ["lex", "burnout symptoms causes recovery"], ["vec", "what is burnout and what are its symptoms, causes, and effects on health"], ["vec", "how does chronic work stress lead to burnout and what does it feel like"]]} +{"query": "how to let go of negative thoughts?", "output": [["hyde", "To let go of negative thoughts, practice cognitive defusion: observe the thought without engaging it, label it (\"I'm having the thought that...\"), and let it pass like a cloud. Mindfulness meditation trains this skill. Write recurring worries in a journal, then close it—this externalizes them. Challenge distortions by asking: \"Is this thought based on facts or assumptions?\""], ["lex", "let go negative thoughts techniques"], ["lex", "negative thinking patterns CBT mindfulness"], ["vec", "how to stop dwelling on negative thoughts and break rumination cycles"], ["vec", "what mindfulness or cognitive techniques help release negative thinking"]]} +{"query": "how to brew the perfect cup of tea", "output": [["hyde", "Water temperature and steep time vary by tea type. Black tea: 200-212°F for 3-5 minutes. Green tea: 160-180°F for 2-3 minutes. White tea: 160-185°F for 4-5 minutes. Oolong: 185-205°F for 3-5 minutes. Use 1 teaspoon of loose leaf per 8 oz cup. Pre-warm the teapot with hot water for consistent extraction."], ["lex", "brew tea temperature steep time"], ["lex", "tea brewing method loose leaf"], ["vec", "what are the correct water temperatures and steeping times for different types of tea"], ["vec", "how to brew loose leaf tea properly for the best flavor"]]} +{"query": "what is anarchism", "output": [["hyde", "Anarchism is a political philosophy that rejects involuntary, coercive hierarchy—particularly the state—and advocates for voluntary, cooperative social organization. Major branches include anarcho-communism (Kropotkin), which envisions communal ownership, anarcho-syndicalism, which organizes through labor unions, and individualist anarchism, which emphasizes personal autonomy."], ["lex", "anarchism political philosophy anti-state"], ["lex", "anarchism theory Kropotkin Bakunin mutual aid"], ["vec", "what is anarchism as a political philosophy and what do anarchists believe"], ["vec", "how do different branches of anarchism envision a society without government"]]} +{"query": "how to stay motivated daily?", "output": [["hyde", "Set one clear priority each morning rather than a long to-do list. Break large goals into small daily tasks. Track streaks—visual progress reinforces consistency. Pair difficult tasks with rewards. On low-motivation days, commit to just 5 minutes; starting is the hardest part, and momentum usually follows."], ["lex", "daily motivation habits discipline routine"], ["lex", "stay motivated goals productivity tips"], ["vec", "what are practical strategies to stay motivated and productive every day"], ["vec", "how to maintain motivation when working toward long-term goals"]]} +{"query": "list sort", "output": [["hyde", "In Python, sort a list in-place with list.sort() or return a new sorted list with sorted(). Use key= for custom sorting: sorted(items, key=lambda x: x.name). In Java, use Collections.sort() or List.sort(). Common algorithms include quicksort (O(n log n) average), mergesort (stable, O(n log n)), and timsort (Python/Java default)."], ["lex", "sort list programming algorithm"], ["lex", "list sort Python Java ascending descending"], ["lex", "array sorting methods comparison"], ["vec", "how to sort a list or array in different programming languages"], ["vec", "what sorting algorithms are used for lists and how do they compare in performance"]]} +{"query": "what was the renaissance period", "output": [["hyde", "The Renaissance (14th-17th century) was a cultural movement that began in Florence, Italy, marking the transition from the medieval period to modernity. It saw a revival of classical Greek and Roman art and philosophy. Key figures include Leonardo da Vinci, Michelangelo, and Galileo. The invention of the printing press accelerated the spread of new ideas across Europe."], ["lex", "Renaissance period 14th-17th century Europe"], ["lex", "Renaissance art culture Florence rebirth"], ["vec", "what was the Renaissance period and why was it significant in European history"], ["vec", "how did the Renaissance transform art, science, and culture in Europe"]]} +{"query": "what is a smart thermostat?", "output": [["hyde", "A smart thermostat connects to WiFi and can be controlled via a smartphone app. Models like the Nest Learning Thermostat and Ecobee use sensors and machine learning to build a schedule based on your habits. They adjust heating and cooling automatically, reducing energy use by 10-15% on average compared to standard programmable thermostats."], ["lex", "smart thermostat WiFi programmable Nest Ecobee"], ["lex", "smart thermostat energy savings features"], ["vec", "what is a smart thermostat and how does it save energy compared to a regular thermostat"], ["vec", "how do smart thermostats like Nest and Ecobee learn and control home temperature"]]} +{"query": "what is the great barrier reef", "output": [["hyde", "The Great Barrier Reef, off the coast of Queensland, Australia, is the world's largest coral reef system, stretching over 2,300 kilometers. It comprises nearly 3,000 individual reef systems and supports over 1,500 fish species, 400 coral species, and 30 species of whales and dolphins. Coral bleaching from rising ocean temperatures is its greatest threat."], ["lex", "Great Barrier Reef Australia coral ecosystem"], ["lex", "Great Barrier Reef marine biodiversity coral bleaching"], ["vec", "what is the Great Barrier Reef and why is it important for marine biodiversity"], ["vec", "where is the Great Barrier Reef located and what threats does it face"]]} +{"query": "what is the significance of the sacred heart?", "output": [["hyde", "The Sacred Heart is a devotional image in Catholicism representing Jesus Christ's divine love for humanity. Popularized by St. Margaret Mary Alacoque's 17th-century visions, it depicts Christ's heart surrounded by a crown of thorns, flames, and a cross. The feast of the Sacred Heart is celebrated 19 days after Pentecost."], ["lex", "Sacred Heart Jesus Catholic devotion"], ["lex", "Sacred Heart significance symbolism Christianity"], ["vec", "what does the Sacred Heart of Jesus symbolize in Catholic tradition"], ["vec", "what is the history and religious significance of devotion to the Sacred Heart"]]} +{"query": "what is survival camping?", "output": [["hyde", "Survival camping means spending time outdoors with minimal or no modern gear, relying on wilderness skills. Core skills include building a debris shelter, starting fire with a ferro rod or bow drill, purifying water by boiling or filtering, navigating with a map and compass, and foraging or trapping for food."], ["lex", "survival camping wilderness skills bushcraft"], ["lex", "survival camping gear shelter fire water"], ["vec", "what is survival camping and what skills do you need to camp with minimal gear"], ["vec", "how to prepare for a survival camping trip in the wilderness"]]} +{"query": "how to fix wifi connection dropping", "output": [["hyde", "If your WiFi keeps dropping, try these steps: 1) Restart your router and modem by unplugging for 30 seconds. 2) Move closer to the router or remove obstructions. 3) Change the WiFi channel in router settings to reduce interference. 4) Update router firmware. 5) Check for driver updates on your device. 6) Disable power-saving mode for your wireless adapter."], ["lex", "WiFi dropping connection fix troubleshoot"], ["lex", "WiFi disconnecting frequently router reset"], ["vec", "how to troubleshoot a WiFi connection that keeps dropping or disconnecting"], ["vec", "why does my WiFi keep cutting out and how do I fix it"]]} +{"query": "what are the key elements of horror writing?", "output": [["hyde", "Effective horror writing relies on atmosphere, pacing, and the unknown. Build dread through setting—dark, isolated, claustrophobic spaces. Use sensory details to ground the reader. Withhold information: what the reader imagines is scarier than what you show. Escalate tension gradually, then release it with a shock. Relatable characters make the stakes feel real."], ["lex", "horror writing elements techniques atmosphere"], ["lex", "horror fiction suspense tension dread"], ["vec", "what literary elements and techniques make horror writing effective"], ["vec", "how do horror authors create suspense, tension, and fear in their stories"]]} +{"query": "what is the importance of free press", "output": [["hyde", "A free press serves as a watchdog on government and powerful institutions, exposing corruption, fraud, and abuse. The First Amendment protects press freedom in the United States. Without it, citizens lack access to independent information needed to make informed decisions. Countries with restricted press freedoms consistently rank lower on democracy indices."], ["lex", "free press importance democracy journalism"], ["lex", "freedom of press First Amendment accountability"], ["vec", "why is a free press important for democracy and holding governments accountable"], ["vec", "what role does press freedom play in protecting civil liberties and public information"]]} +{"query": "what are the best national parks?", "output": [["hyde", "Top US national parks include Yellowstone (geysers, wildlife), Yosemite (granite cliffs, waterfalls), Grand Canyon (layered red rock), Zion (slot canyons, river hikes), Glacier (pristine alpine lakes), and Acadia (Atlantic coastline). Visit during shoulder season (May or September) for fewer crowds and pleasant weather."], ["lex", "best national parks USA visit"], ["lex", "top national parks Yellowstone Yosemite Zion"], ["vec", "what are the most popular and scenic national parks to visit in the United States"], ["vec", "which national parks offer the best hiking, scenery, and wildlife experiences"]]} +{"query": "what is deconstruction", "output": [["hyde", "Deconstruction, associated with Jacques Derrida, is a method of critical analysis that examines how meaning in texts is constructed through binary oppositions (speech/writing, presence/absence). Derrida argued that meaning is never fixed; it is always deferred through a chain of signifiers. Deconstruction reveals the internal contradictions and assumptions hidden within texts."], ["lex", "deconstruction Derrida literary theory philosophy"], ["lex", "deconstruction meaning binary oppositions text"], ["vec", "what is deconstruction in philosophy and literary theory as developed by Jacques Derrida"], ["vec", "how does deconstructionist analysis challenge fixed meaning in texts"]]} +{"query": "how to repair a leaky faucet", "output": [["hyde", "Turn off the water supply valves under the sink. Remove the faucet handle by unscrewing the decorative cap and handle screw. Pull out the stem or cartridge. For compression faucets, replace the rubber washer and O-ring. For cartridge faucets, replace the entire cartridge. Reassemble, turn the water back on, and test for leaks."], ["lex", "leaky faucet repair fix dripping"], ["lex", "faucet washer O-ring cartridge replacement"], ["vec", "how to fix a dripping faucet by replacing the washer or cartridge"], ["vec", "what are the step-by-step instructions for repairing a leaky kitchen or bathroom faucet"]]} +{"query": "what is the significance of the ganges river in hinduism?", "output": [["hyde", "The Ganges (Ganga) is Hinduism's holiest river, personified as the goddess Ganga. Hindus believe bathing in the Ganges washes away sins and that immersing ashes of the dead in the river frees the soul from the cycle of rebirth. The cities of Varanasi and Haridwar along the Ganges host major pilgrimage sites and cremation ghats."], ["lex", "Ganges River Hinduism sacred significance"], ["lex", "Ganga river Hindu rituals purification"], ["vec", "why is the Ganges River considered sacred in Hinduism"], ["vec", "what religious rituals and beliefs are associated with the Ganges in Hindu tradition"]]} +{"query": "best places to buy bonsai trees", "output": [["hyde", "Reputable bonsai retailers include Bonsai Boy of New York, Brussel's Bonsai, and Eastern Leaf (online). Local bonsai nurseries and Japanese garden shops often carry better-quality specimens. For beginners, start with hardy species like Chinese elm, ficus, or juniper. Expect to pay $30-80 for a quality starter tree."], ["lex", "buy bonsai trees online nursery shop"], ["lex", "bonsai tree purchase quality species"], ["vec", "where are the best places to buy bonsai trees online or at local nurseries"], ["vec", "which online retailers and nurseries sell high-quality bonsai trees for beginners"]]} +{"query": "what are the principles of physics", "output": [["hyde", "The fundamental principles of physics include Newton's three laws of motion, the law of universal gravitation, the laws of thermodynamics (energy conservation, entropy), Maxwell's equations for electromagnetism, Einstein's special and general relativity, and quantum mechanics. These describe how matter, energy, space, and time interact at all scales."], ["lex", "physics principles fundamental laws"], ["lex", "Newton's laws thermodynamics relativity quantum"], ["vec", "what are the fundamental principles and laws of physics"], ["vec", "how do Newton's laws, thermodynamics, and quantum mechanics form the foundations of physics"]]} +{"query": "how to optimize website for seo", "output": [["hyde", "On-page SEO: use target keywords in title tags, H1 headings, and meta descriptions. Write unique, high-quality content over 1,000 words. Optimize images with alt text and compression. Technical SEO: ensure fast page load times (under 3 seconds), mobile responsiveness, HTTPS, clean URL structure, and an XML sitemap submitted to Google Search Console."], ["lex", "SEO optimization website search engine ranking"], ["lex", "on-page SEO meta tags keywords content"], ["vec", "what are the key steps to optimize a website for search engine rankings"], ["vec", "how to improve on-page and technical SEO for better Google search results"]]} +{"query": "what are the sacred texts of buddhism", "output": [["hyde", "The primary Buddhist scripture is the Tripitaka (Pali Canon), composed of three \"baskets\": the Vinaya Pitaka (monastic rules), Sutta Pitaka (discourses of the Buddha), and Abhidhamma Pitaka (philosophical analysis). Mahayana Buddhism adds texts like the Heart Sutra, Diamond Sutra, and Lotus Sutra, emphasizing the bodhisattva path."], ["lex", "Buddhist sacred texts scriptures Tripitaka"], ["lex", "Buddhism sutras Pali Canon Mahayana texts"], ["vec", "what are the main sacred texts and scriptures of Buddhism"], ["vec", "how do the Pali Canon and Mahayana sutras differ as Buddhist scriptures"]]} +{"query": "how to participate in public hearings", "output": [["hyde", "To participate in a public hearing, check your local government website for upcoming meetings and agendas. Sign up to speak in advance if required. Prepare a concise statement (usually 2-3 minutes). State your name and address for the record. Focus on facts and personal impact. You can also submit written comments before the deadline."], ["lex", "public hearing participation attend testify"], ["lex", "public hearing comment speak local government"], ["vec", "how can citizens participate and give testimony at public hearings"], ["vec", "what are the steps to attend and speak at a local government public hearing"]]} +{"query": "what is a hypothesis", "output": [["hyde", "A hypothesis is a testable prediction about the relationship between two or more variables. In the scientific method, it follows observation and research: based on existing knowledge, you propose an explanation that can be tested through experimentation. A hypothesis must be falsifiable—there must be a possible outcome that would prove it wrong."], ["lex", "hypothesis definition scientific research"], ["lex", "hypothesis testable prediction experiment"], ["vec", "what is a hypothesis in the scientific method and how is one formed"], ["vec", "what makes a good scientific hypothesis and how is it different from a theory"]]} +{"query": "what is extreme sports photography?", "output": [["hyde", "Extreme sports photography captures athletes performing in high-risk activities like surfing, snowboarding, rock climbing, and base jumping. Photographers use fast shutter speeds (1/1000s or faster), continuous autofocus, and burst mode. Key gear includes weather-sealed DSLRs or mirrorless cameras, telephoto lenses (70-200mm), and GoPro-style action cameras for POV shots."], ["lex", "extreme sports photography action camera"], ["lex", "adventure sports photography techniques shutter speed"], ["vec", "what is extreme sports photography and what equipment and techniques does it require"], ["vec", "how do photographers capture high-speed action shots in extreme sports"]]} +{"query": "how to live sustainably?", "output": [["hyde", "Sustainable living starts with reducing consumption: buy less, choose durable goods, and repair before replacing. Eat more plant-based meals, which have a lower carbon footprint. Use public transit, bike, or walk. Reduce waste through composting and recycling. Switch to renewable energy and use LED lighting. Carry reusable bags, bottles, and containers."], ["lex", "sustainable living tips eco-friendly lifestyle"], ["lex", "reduce waste carbon footprint daily habits"], ["vec", "what are practical everyday habits for living a more sustainable and eco-friendly life"], ["vec", "how can individuals reduce their carbon footprint and waste in daily living"]]} +{"query": "what is epistemological relativism", "output": [["hyde", "Epistemological relativism holds that knowledge and truth are not absolute but are relative to the social, cultural, or historical context in which they are produced. Different communities may have equally valid but incompatible knowledge systems. Critics argue this leads to self-refutation: the claim that all knowledge is relative is itself presented as an absolute truth."], ["lex", "epistemological relativism knowledge truth"], ["lex", "epistemological relativism philosophy objectivity"], ["vec", "what is epistemological relativism and how does it challenge objective truth claims"], ["vec", "how does epistemological relativism argue that knowledge is relative to perspective or culture"]]} +{"query": "what is mixed media art?", "output": [["hyde", "Mixed media art combines two or more artistic media in a single work—for example, acrylic paint with collaged paper, fabric, ink, and found objects. Techniques include layering, texturing with gels and paste, image transfers, and assemblage. The combination of materials creates visual depth and tactile richness that single-medium works cannot achieve."], ["lex", "mixed media art techniques materials"], ["lex", "mixed media collage painting assemblage"], ["vec", "what is mixed media art and what materials and techniques are commonly used"], ["vec", "how do artists combine different media like paint, paper, and found objects in mixed media artwork"]]} +{"query": "how to work at microsoft?", "output": [["hyde", "Apply through Microsoft's careers portal at careers.microsoft.com. Most technical roles require a CS degree or equivalent experience. The interview process typically includes a phone screen, online coding assessment, and an on-site loop of 4-5 interviews covering algorithms, system design, and behavioral questions. Prepare with LeetCode and system design practice."], ["lex", "Microsoft jobs hiring apply career"], ["lex", "Microsoft interview process software engineer"], ["vec", "how to apply for a job at Microsoft and what is the interview process like"], ["vec", "what qualifications and steps are needed to get hired at Microsoft"]]} +{"query": "what are the characteristics of haiku?", "output": [["hyde", "Haiku is a Japanese poetic form traditionally consisting of three lines with a 5-7-5 syllable pattern (or 17 morae in Japanese). Haiku typically captures a moment in nature and includes a kigo (seasonal word) and a kireji (cutting word) that creates a pause or shift. The poem juxtaposes two images to evoke emotion through suggestion rather than direct statement."], ["lex", "haiku characteristics syllable structure"], ["lex", "haiku poetry 5-7-5 Japanese nature"], ["vec", "what are the defining characteristics and rules of haiku poetry"], ["vec", "how is a traditional Japanese haiku structured and what themes does it explore"]]} +{"query": "what is plato's theory of forms", "output": [["hyde", "Plato's theory of Forms posits that the physical world is a shadow of a higher, non-material reality consisting of perfect, eternal Forms (Ideas). A beautiful object participates in the Form of Beauty; a just action reflects the Form of Justice. True knowledge comes from understanding these abstract Forms through reason, not through sensory experience of the changeable physical world."], ["lex", "Plato theory of Forms Ideas philosophy"], ["lex", "Platonic Forms abstract reality idealism"], ["vec", "what is Plato's theory of Forms and how does it explain reality"], ["vec", "how did Plato distinguish between the world of Forms and the physical world"]]} +{"query": "what is the law of attraction?", "output": [["hyde", "The law of attraction is the belief that positive or negative thoughts bring positive or negative experiences into a person's life. Proponents, popularized by the book \"The Secret,\" claim that visualizing desired outcomes and maintaining a positive mindset attracts those outcomes. Scientists generally consider it pseudoscience, though positive thinking can influence motivation and goal-directed behavior."], ["lex", "law of attraction manifestation positive thinking"], ["lex", "law of attraction belief visualization"], ["vec", "what is the law of attraction and how is it supposed to work"], ["vec", "does the law of attraction have any scientific basis or evidence"]]} +{"query": "what is literary parody?", "output": [["hyde", "Literary parody imitates the style, conventions, or content of a specific work or genre for comedic or critical effect. It exaggerates distinctive features to expose flaws or absurdities. Examples include Don Quixote (parodying chivalric romances), Northanger Abbey (Gothic novels), and The Hitchhiker's Guide to the Galaxy (science fiction tropes)."], ["lex", "literary parody satire imitation genre"], ["lex", "parody literature examples humor exaggeration"], ["vec", "what is literary parody and how does it use imitation for comedic or critical effect"], ["vec", "what are famous examples of parody in literature"]]} +{"query": "how to invest in cryptocurrency safely?", "output": [["hyde", "To invest in crypto safely: use reputable exchanges like Coinbase or Kraken with two-factor authentication. Never invest more than you can afford to lose. Transfer holdings to a hardware wallet (Ledger, Trezor) for long-term storage. Diversify across Bitcoin and Ethereum rather than speculative altcoins. Beware of phishing scams and never share your seed phrase."], ["lex", "cryptocurrency investing safely beginner"], ["lex", "crypto investment security wallet exchange"], ["vec", "how can beginners invest in cryptocurrency safely and minimize risk of loss"], ["vec", "what security measures should you take when buying and storing cryptocurrency"]]} +{"query": "what is a protagonist?", "output": [["hyde", "The protagonist is the central character of a narrative, the one whose goals and conflicts drive the plot. The story is told from their perspective or follows their journey. Protagonists are not always heroes—they can be antiheroes or morally ambiguous characters. The antagonist opposes the protagonist, creating the central conflict of the story."], ["lex", "protagonist definition literature main character"], ["lex", "protagonist role story narrative hero"], ["vec", "what is a protagonist in literature and what role do they play in a story"], ["vec", "how does the protagonist differ from the antagonist in narrative fiction"]]} +{"query": "how to prepare for a promotion review?", "output": [["hyde", "Before your promotion review, compile a list of key accomplishments with measurable results (revenue generated, projects delivered, efficiency improvements). Gather positive feedback from colleagues and clients. Align your achievements with the next-level job description. Prepare specific examples demonstrating leadership, initiative, and impact. Practice articulating your case concisely."], ["lex", "promotion review preparation performance"], ["lex", "job promotion meeting self-assessment achievements"], ["vec", "how should an employee prepare for a promotion review meeting with their manager"], ["vec", "what documentation and evidence should you gather before a promotion discussion"]]} +{"query": "how to reduce personal water usage?", "output": [["hyde", "Install low-flow showerheads (2 GPM or less) and faucet aerators. Fix leaky faucets—a drip wastes up to 3,000 gallons per year. Take shorter showers (5 minutes saves 12 gallons). Run dishwashers and washing machines only with full loads. Water gardens in the early morning to reduce evaporation. Collect rainwater for outdoor use."], ["lex", "reduce water usage conservation tips home"], ["lex", "save water household low-flow fixtures"], ["vec", "what are practical ways to reduce water consumption at home"], ["vec", "how can individuals conserve water in their daily routines and household"]]} +{"query": "sustainable technology", "output": [["hyde", "Sustainable technologies aim to reduce environmental impact while meeting human needs. Examples include solar panels and wind turbines for clean energy, electric vehicles, energy-efficient building materials, carbon capture systems, biodegradable plastics, precision agriculture that reduces water and pesticide use, and smart grids that optimize energy distribution."], ["lex", "sustainable technology green tech renewable energy"], ["lex", "sustainable technology clean energy innovation"], ["vec", "what are examples of sustainable technologies that reduce environmental impact"], ["vec", "how is technology being used to promote sustainability and fight climate change"]]} +{"query": "how do i vote in person", "output": [["hyde", "To vote in person, check your registration status and find your polling location at vote.org or your state's election website. Bring a valid photo ID if required by your state. On Election Day, go to your assigned polling place, check in with a poll worker, receive your ballot, mark your choices, and submit your ballot through the scanner or ballot box."], ["lex", "vote in person polling place Election Day"], ["lex", "in-person voting process ID requirements"], ["vec", "what are the steps to vote in person at a polling place on Election Day"], ["vec", "what do I need to bring and expect when voting in person for the first time"]]} +{"query": "what is aquaponics?", "output": [["hyde", "Aquaponics is a food production system that combines aquaculture (raising fish) with hydroponics (growing plants in water). Fish waste provides natural fertilizer for the plants, and the plants filter the water for the fish, creating a symbiotic cycle. Common setups use tilapia or goldfish with leafy greens, herbs, and tomatoes."], ["lex", "aquaponics fish plants symbiotic system"], ["lex", "aquaponics setup grow food fish tank"], ["vec", "what is aquaponics and how does it combine fish farming with plant growing"], ["vec", "how does an aquaponics system work and what can you grow with it"]]} +{"query": "what is the significance of the hajj in islam?", "output": [["hyde", "The Hajj is the fifth pillar of Islam, requiring every able-bodied Muslim who can afford it to make the pilgrimage to Mecca at least once in their lifetime. Performed during Dhul Hijjah, the rituals include circling the Kaaba seven times (tawaf), walking between Safa and Marwah, standing at Arafat, and the symbolic stoning of the devil at Mina."], ["lex", "Hajj Islam pilgrimage Mecca significance"], ["lex", "Hajj pillar Islam Kaaba rituals"], ["vec", "why is the Hajj pilgrimage to Mecca significant in Islam"], ["vec", "what are the rituals and spiritual meaning of the Hajj for Muslims"]]} +{"query": "what is a hypothesis testing", "output": [["hyde", "Hypothesis testing is a statistical method for making decisions using data. You state a null hypothesis (H0, no effect) and an alternative hypothesis (H1, effect exists). Collect data and calculate a test statistic. If the p-value is below the significance level (typically 0.05), reject H0. Common tests include t-test, chi-square, and ANOVA."], ["lex", "hypothesis testing statistics null alternative"], ["lex", "hypothesis test p-value significance level"], ["vec", "what is hypothesis testing in statistics and how does it work"], ["vec", "how do you perform a hypothesis test using null and alternative hypotheses"]]} +{"query": "how to publish a scientific article", "output": [["hyde", "To publish a scientific article: 1) Write the manuscript following IMRAD format (Introduction, Methods, Results, Discussion). 2) Choose a target journal matching your topic and impact level. 3) Format per the journal's author guidelines. 4) Submit through the journal's online portal. 5) Respond to peer reviewer comments during revision. The process typically takes 3-12 months."], ["lex", "publish scientific article journal peer review"], ["lex", "scientific paper submission academic journal"], ["vec", "what are the steps to publish a research article in a peer-reviewed scientific journal"], ["vec", "how does the peer review and journal submission process work for scientific papers"]]} +{"query": "what are common themes in poetry?", "output": [["hyde", "Common poetry themes include love and desire, mortality and the passage of time, nature and the seasons, loss and grief, identity and self-discovery, war and conflict, beauty, spirituality, and social justice. These universal themes recur across periods—from Sappho's love lyrics to Keats's meditations on mortality to contemporary poets exploring identity."], ["lex", "poetry themes common literary motifs"], ["lex", "poetry themes love death nature identity"], ["vec", "what are the most common themes explored in poetry across different periods"], ["vec", "how do poets use recurring themes like love, death, and nature in their work"]]} +{"query": "how to write a resume", "output": [["hyde", "A strong resume includes: contact information, a brief professional summary (2-3 sentences), work experience in reverse chronological order with bullet-point achievements, education, and relevant skills. Use action verbs (\"led,\" \"built,\" \"increased\") and quantify results (\"increased sales by 25%\"). Keep it to one page for under 10 years of experience. Tailor it to each job posting."], ["lex", "write resume format template job"], ["lex", "resume writing tips work experience skills"], ["vec", "how to write an effective resume that stands out to employers and recruiters"], ["vec", "what should be included in a resume and how should it be formatted"]]} +{"query": "what are key performance indicators", "output": [["hyde", "Key Performance Indicators (KPIs) are measurable values that demonstrate how effectively a company is achieving its objectives. Examples include revenue growth rate, customer acquisition cost, employee retention rate, and net promoter score. Effective KPIs are specific, measurable, achievable, relevant, and time-bound (SMART). They should align directly with strategic goals."], ["lex", "key performance indicators KPIs metrics"], ["lex", "KPI examples business performance measurement"], ["vec", "what are key performance indicators and how are they used to measure business success"], ["vec", "how do companies choose and track the right KPIs for their goals"]]} +{"query": "how to find art inspiration online?", "output": [["hyde", "Top platforms for art inspiration include Pinterest (curated mood boards), Behance and Dribbble (professional portfolios), ArtStation (digital and concept art), DeviantArt (community art), and Instagram art hashtags. Museums also offer virtual collections: Google Arts & Culture, the Met's Open Access, and the Rijksmuseum's digital archive."], ["lex", "art inspiration online websites platforms"], ["lex", "art inspiration Pinterest Behance DeviantArt"], ["vec", "where can artists find creative inspiration and references online"], ["vec", "what websites and platforms are best for discovering art inspiration"]]} +{"query": "what is the significance of logic in ethics?", "output": [["hyde", "Logic provides the structural framework for ethical reasoning. Valid arguments require that conclusions follow necessarily from premises. In ethics, logic helps identify fallacies, test the consistency of moral principles, and evaluate whether ethical claims are well-supported. For example, the logical form of universalizability in Kant's categorical imperative tests moral maxims for contradiction."], ["lex", "logic ethics moral reasoning philosophy"], ["lex", "logical arguments ethical theory validity"], ["vec", "what role does logic play in ethical reasoning and moral philosophy"], ["vec", "how do philosophers use logical arguments to evaluate ethical claims"]]} +{"query": "how to engage in sustainable urban living?", "output": [["hyde", "Sustainable urban living includes using public transit, biking, or walking instead of driving. Choose an energy-efficient apartment, reduce food waste through composting and meal planning, shop at local farmers markets, and support community gardens. Use shared resources like tool libraries and car-sharing services to reduce individual consumption."], ["lex", "sustainable urban living city eco-friendly"], ["lex", "urban sustainability public transit green housing"], ["vec", "what are practical ways to live sustainably in a city environment"], ["vec", "how can urban residents reduce their environmental footprint in daily life"]]} +{"query": "what is the concept of shalom in judaism?", "output": [["hyde", "Shalom in Judaism means far more than the absence of conflict. Derived from the Hebrew root meaning \"wholeness\" or \"completeness,\" shalom encompasses peace, harmony, welfare, and flourishing. It describes right relationships between people, with God, and with creation. The pursuit of shalom (rodef shalom) is a central ethical obligation in Jewish life."], ["lex", "shalom Judaism peace concept meaning"], ["lex", "shalom Hebrew wholeness completeness Jewish"], ["vec", "what does the concept of shalom mean in Judaism beyond just peace"], ["vec", "how is shalom understood as wholeness and completeness in Jewish theology"]]} +{"query": "how do structuralism and functionalism differ", "output": [["hyde", "Structuralism, founded by Wilhelm Wundt, sought to break down mental processes into their basic elements through introspection—analyzing the structure of consciousness. Functionalism, led by William James, focused instead on the purpose of mental processes—how the mind helps organisms adapt to their environment. Structuralism asked \"what is consciousness?\" while functionalism asked \"what is consciousness for?\""], ["lex", "structuralism functionalism differences psychology"], ["lex", "structuralism Wundt functionalism James psychology"], ["vec", "what are the differences between structuralism and functionalism in psychology"], ["vec", "how did Wundt's structuralism differ from William James's functionalism"]]} +{"query": "duolingo courses", "output": [["hyde", "Duolingo offers courses in over 40 languages, including Spanish, French, German, Japanese, Korean, Mandarin, Italian, Portuguese, and Hindi. Each course uses gamified lessons with speaking, listening, reading, and writing exercises. Popular courses include Spanish for English speakers (the most enrolled) and English for Spanish speakers."], ["lex", "Duolingo language courses available"], ["lex", "Duolingo app languages learn"], ["vec", "what language courses are available on Duolingo and which are the most popular"], ["vec", "how effective is Duolingo for learning a new language and what languages does it offer"]]} +{"query": "how to hang artwork without nails", "output": [["hyde", "Command Strips by 3M hold up to 16 lbs and leave no wall damage—press firmly for 30 seconds and wait 1 hour before hanging. Other nail-free options include adhesive hooks, velcro strips, magnetic frames, and picture hanging wire with adhesive anchors. For heavier pieces, use monkey hooks which require only a tiny hole, no hammer needed."], ["lex", "hang artwork without nails wall"], ["lex", "picture hanging command strips adhesive hooks"], ["vec", "how to hang pictures and artwork on walls without using nails or drilling holes"], ["vec", "what are the best no-damage methods for hanging frames on walls"]]} +{"query": "how augmented reality is applied in different fields", "output": [["hyde", "Augmented reality overlays digital content onto the real world and is applied across many fields. In healthcare, surgeons use AR to visualize anatomy during procedures. In education, AR apps bring textbook content to life in 3D. Retailers like IKEA use AR to let customers preview furniture in their homes. In manufacturing, AR guides workers through assembly with step-by-step overlays."], ["lex", "augmented reality applications fields industry"], ["lex", "AR technology healthcare education retail"], ["vec", "how is augmented reality being used in healthcare, education, and retail industries"], ["vec", "what are real-world applications of augmented reality across different fields"]]} +{"query": "what are the best soil types for roses", "output": [["hyde", "Roses thrive in well-draining loamy soil with a pH between 6.0 and 6.5. Amend heavy clay soil with compost and coarse sand to improve drainage. Mix in aged manure or rose-specific fertilizer before planting. Ensure soil holds moisture without becoming waterlogged. Mulch with 2-3 inches of organic material to retain moisture and regulate temperature."], ["lex", "best soil roses growing type"], ["lex", "rose garden soil pH loam drainage"], ["vec", "what type of soil do roses grow best in and how should it be prepared"], ["vec", "what soil pH and composition are ideal for growing healthy rose bushes"]]} +{"query": "how to encourage siblings to get along?", "output": [["hyde", "Give each child one-on-one time to reduce competition for attention. Avoid comparing siblings or labeling them (\"the smart one\"). Teach conflict resolution: help them express feelings with \"I\" statements and find compromises. Praise cooperation when you see it. Set clear family rules about physical aggression and name-calling."], ["lex", "siblings get along fighting conflict resolution"], ["lex", "sibling rivalry reduce cooperation strategies"], ["vec", "how can parents encourage their children to get along and reduce sibling rivalry"], ["vec", "what strategies help siblings resolve conflicts and build positive relationships"]]} +{"query": "what is the great wall of china?", "output": [["hyde", "The Great Wall of China is a series of fortifications built over centuries to protect Chinese states and empires from northern invasions. The most well-known sections were built during the Ming Dynasty (1368-1644). The total length, including all branches and sections across dynasties, is approximately 21,196 kilometers (13,171 miles)."], ["lex", "Great Wall China history construction"], ["lex", "Great Wall China length dynasty defense"], ["vec", "what is the Great Wall of China and why was it built"], ["vec", "how long is the Great Wall of China and which dynasties built it"]]} +{"query": "how to attend a political rally", "output": [["hyde", "Find rallies through candidate websites, social media, or event platforms like Eventbrite. Register if required (RSVP is often free). Arrive early as venues fill up. Bring water, sunscreen if outdoors, a charged phone, and valid ID. Wear comfortable shoes. Be aware of your surroundings and know the exit locations. Follow posted rules about signs and bags."], ["lex", "attend political rally event tips"], ["lex", "political rally preparation safety what to bring"], ["vec", "how to find and attend a political rally or campaign event in your area"], ["vec", "what should you know before attending your first political rally"]]} +{"query": "what is the function of a narrative arc?", "output": [["hyde", "A narrative arc is the structure that shapes a story's progression. It typically follows five stages: exposition (introduces characters and setting), rising action (builds conflict and tension), climax (the turning point), falling action (consequences unfold), and resolution (conflict is resolved). The arc gives readers a satisfying sense of progression and closure."], ["lex", "narrative arc function story structure"], ["lex", "narrative arc exposition climax resolution plot"], ["vec", "what is a narrative arc and how does it structure a story from beginning to end"], ["vec", "what are the parts of a narrative arc and why is it important in storytelling"]]} +{"query": "arg parse", "output": [["hyde", "Use argparse to handle CLI arguments: parser = argparse.ArgumentParser(); parser.add_argument(\"file\"); args = parser.parse_args(). Supports positional args, optional flags, subcommands, and type validation."], ["lex", "argparse Python command line arguments"], ["lex", "argument parser CLI Python module"], ["vec", "how to use Python argparse module to parse command line arguments"], ["vec", "how to define positional and optional arguments with argparse"]]} +{"query": "how to draw realistic portraits?", "output": [["hyde", "Start with a lightly sketched oval. Divide the face: eyes sit at the midpoint, the nose halfway between eyes and chin, and the mouth one-third below the nose. Use a grid or Loomis method for proportions. Build tonal values gradually—light layers first, then darker shadows. Blend with a tortillon for smooth skin textures. Pay close attention to the light source direction."], ["lex", "draw realistic portrait pencil technique"], ["lex", "portrait drawing face proportions shading"], ["vec", "how to draw a realistic human portrait with accurate proportions and shading"], ["vec", "what techniques do artists use to draw lifelike faces with pencil"]]} +{"query": "what is the impact of religion on culture?", "output": [["hyde", "Religion has profoundly shaped cultures worldwide—influencing art (Gothic cathedrals, Islamic calligraphy, Hindu temple sculpture), moral codes, legal systems (Sharia, Canon law), dietary practices, marriage customs, holidays, and music. Religious narratives provide shared identity and meaning. The Protestant work ethic, for example, influenced Western capitalism according to Max Weber."], ["lex", "religion impact culture society influence"], ["lex", "religion culture art morality traditions"], ["vec", "how has religion shaped culture, art, and social norms throughout history"], ["vec", "what influence does religion have on cultural values, laws, and traditions"]]} +{"query": "what is the ethics of war", "output": [["hyde", "Just war theory establishes criteria for morally permissible warfare. Jus ad bellum (right to go to war) requires just cause, legitimate authority, right intention, last resort, proportionality, and reasonable chance of success. Jus in bello (right conduct in war) requires distinction between combatants and civilians and proportional use of force."], ["lex", "ethics of war just war theory morality"], ["lex", "just war ethics military conflict jus ad bellum"], ["vec", "what is just war theory and the ethical principles governing warfare"], ["vec", "how do philosophers evaluate whether a war is morally justified"]]} +{"query": "how to analyze scientific data statistically", "output": [["hyde", "Choose your statistical test based on data type and research question. For comparing two group means, use an independent t-test (parametric) or Mann-Whitney U (non-parametric). For three or more groups, use one-way ANOVA. For correlations, use Pearson's r (continuous) or Spearman's rho (ordinal). Report effect sizes and confidence intervals alongside p-values."], ["lex", "statistical analysis scientific data methods"], ["lex", "statistical tests data analysis research t-test ANOVA"], ["vec", "how to choose and apply the right statistical tests for analyzing scientific research data"], ["vec", "what are the steps for performing statistical analysis on experimental data"]]} +{"query": "how to analyze experimental data", "output": [["hyde", "Start by cleaning the data: remove outliers using predefined criteria and check for missing values. Calculate descriptive statistics (mean, median, standard deviation). Visualize distributions with histograms or box plots. Apply appropriate statistical tests to evaluate hypotheses. Interpret results in context of your research question and note limitations."], ["lex", "analyze experimental data methods results"], ["lex", "experimental data analysis visualization interpretation"], ["vec", "what are the steps to properly analyze and interpret experimental research data"], ["vec", "how to organize, visualize, and draw conclusions from experimental results"]]} +{"query": "climate action", "output": [["hyde", "Climate action encompasses policies and initiatives to reduce greenhouse gas emissions and adapt to climate change. Key strategies include transitioning to renewable energy, electrifying transportation, improving energy efficiency in buildings, protecting forests, and implementing carbon pricing. The Paris Agreement aims to limit warming to 1.5°C above pre-industrial levels."], ["lex", "climate action policy emissions reduction"], ["lex", "climate action carbon neutral renewable energy 2026"], ["vec", "what actions are governments and individuals taking to combat climate change"], ["vec", "what are the most effective climate action strategies for reducing greenhouse gas emissions"]]} +{"query": "what are the main teachings of shinto?", "output": [["hyde", "Shinto, Japan's indigenous religion, centers on the worship of kami—spirits inhabiting natural features, ancestors, and sacred places. Core teachings emphasize purity (physical and spiritual cleanliness), harmony with nature, respect for ancestors, and community ritual. There is no single scripture; practice focuses on shrine worship, seasonal festivals (matsuri), and purification rites (harae)."], ["lex", "Shinto teachings beliefs practices Japan"], ["lex", "Shinto kami nature purity rituals"], ["vec", "what are the core beliefs and teachings of the Shinto religion in Japan"], ["vec", "how does Shinto view nature, purity, and the spiritual world"]]} +{"query": "chronic pain management clinics", "output": [["hyde", "Chronic pain management clinics use a multidisciplinary approach combining medication management, physical therapy, cognitive behavioral therapy, nerve blocks, and interventional procedures like epidural steroid injections. Teams typically include pain medicine physicians, physical therapists, and psychologists. Ask your primary care doctor for a referral or search the American Academy of Pain Medicine directory."], ["lex", "chronic pain management clinic treatment"], ["lex", "pain clinic multidisciplinary therapy near me"], ["vec", "what services do chronic pain management clinics offer and how do they treat patients"], ["vec", "how to find a reputable chronic pain management clinic for long-term treatment"]]} +{"query": "what is a business consultant", "output": [["hyde", "A business consultant is a professional who advises organizations on strategy, operations, and management. They analyze business problems, identify inefficiencies, and recommend solutions to improve performance and profitability."], ["lex", "business consultant role responsibilities"], ["lex", "management consulting services"], ["lex", "business advisory consultant"], ["vec", "what does a business consultant do and what services do they provide"], ["vec", "what qualifications and skills are needed to become a business consultant"]]} +{"query": "what are the characteristics of classic literature?", "output": [["hyde", "Classic literature is defined by its enduring relevance, universal themes, and artistic merit. These works explore the human condition through complex characters, moral dilemmas, and language that transcends the era in which they were written."], ["lex", "classic literature characteristics traits"], ["lex", "literary classics defining features"], ["vec", "what qualities make a work of fiction considered classic literature"], ["vec", "what distinguishes classic literature from other genres or time periods"]]} +{"query": "what is blockchain technology", "output": [["hyde", "Blockchain is a distributed ledger technology where transactions are recorded in blocks linked by cryptographic hashes. Each block contains a timestamp and transaction data, forming an immutable chain validated by a network of nodes through consensus mechanisms."], ["lex", "blockchain technology distributed ledger"], ["lex", "blockchain decentralized cryptographic"], ["lex", "blockchain consensus mechanism"], ["vec", "how does blockchain technology work as a distributed ledger system"], ["vec", "what are the technical components that make up a blockchain"]]} +{"query": "where to buy luxury bedding sets", "output": [["hyde", "Shop our collection of luxury bedding sets crafted from 100% Egyptian cotton and Italian-woven sateen. Thread counts from 400 to 1000. Free shipping on orders over $200. Available in king, queen, and California king sizes."], ["lex", "luxury bedding sets buy online"], ["lex", "high-end sheets duvet comforter"], ["lex", "premium Egyptian cotton bedding"], ["vec", "where can I purchase high-quality luxury bedding sets online or in stores"], ["vec", "which brands sell the best luxury sheets and duvet covers"]]} +{"query": "how to retire early", "output": [["hyde", "To retire early, aim to save 50-70% of your income and invest in low-cost index funds. At a 4% safe withdrawal rate, you need roughly 25x your annual expenses. A person spending $40,000/year needs about $1 million to retire."], ["lex", "early retirement financial planning"], ["lex", "FIRE financial independence retire early"], ["lex", "early retirement savings rate"], ["vec", "how much money do you need to save to retire before age 50"], ["vec", "what financial strategies allow people to retire early through the FIRE movement"]]} +{"query": "how climate change affects farming", "output": [["hyde", "Rising temperatures and shifting precipitation patterns reduce crop yields by 2-6% per decade. Droughts, heat stress, and unpredictable frost dates disrupt planting schedules, while increased CO2 levels alter nutrient content in staple crops like wheat and rice."], ["lex", "climate change agriculture crop yields"], ["lex", "global warming farming drought impact"], ["lex", "climate change food production"], ["vec", "how does rising global temperature affect crop yields and food production"], ["vec", "what effects does climate change have on soil quality and growing seasons for farmers"]]} +{"query": "how to assess car tire damage?", "output": [["hyde", "Check tire tread depth using the penny test—insert a penny with Lincoln's head facing down. If you can see the top of his head, the tread is below 2/32\" and the tire needs replacing. Also inspect sidewalls for bulges, cracks, or cuts."], ["lex", "car tire damage inspection signs"], ["lex", "tire wear tread depth sidewall"], ["lex", "tire replacement damage indicators"], ["vec", "how do you inspect car tires for damage and know when they need replacement"], ["vec", "what are the signs of dangerous tire wear or sidewall damage on a vehicle"]]} +{"query": "kindle library", "output": [["hyde", "Your Kindle Library stores all purchased and borrowed ebooks. Access it by tapping 'Library' on the home screen. Filter by 'Downloaded' or 'All' to see books stored on the device or in the cloud. Use collections to organize titles by genre or topic."], ["lex", "kindle library ebook collection"], ["lex", "Amazon Kindle digital library management"], ["lex", "kindle book organization archive"], ["vec", "how to manage and organize your ebook library on a Kindle device"], ["vec", "how to borrow library books on Kindle through Libby or OverDrive"]]} +{"query": "how to plant wildflowers in clay soil?", "output": [["hyde", "To plant wildflowers in clay soil, amend the top 2-3 inches with coarse sand and compost to improve drainage. Choose clay-tolerant species like black-eyed Susan, coneflower, and bee balm. Sow seeds in fall or early spring, pressing them into the surface without burying deeply."], ["lex", "wildflower planting clay soil"], ["lex", "wildflower seeds heavy clay ground"], ["vec", "what is the best method for growing wildflowers in heavy clay soil"], ["vec", "which wildflower species thrive in clay soil conditions"]]} +{"query": "how to photograph the milky way", "output": [["hyde", "Set your camera to manual mode with an aperture of f/2.8 or wider, ISO 3200-6400, and a shutter speed of 15-25 seconds using the 500 rule. Use a sturdy tripod and a wide-angle lens. Shoot during a new moon away from light pollution."], ["lex", "milky way astrophotography camera settings"], ["lex", "night sky photography milky way"], ["lex", "milky way photo long exposure"], ["vec", "what camera settings and equipment do you need to photograph the milky way"], ["vec", "how to find the best location and time for milky way photography"]]} +{"query": "what are ocean currents", "output": [["hyde", "Ocean currents are continuous, directed movements of seawater driven by wind, temperature, salinity, and the Earth's rotation. Surface currents are driven primarily by wind patterns, while deep-water thermohaline circulation is driven by differences in water density."], ["lex", "ocean currents thermohaline circulation"], ["lex", "ocean surface currents deep water"], ["lex", "ocean current patterns global"], ["vec", "what causes ocean currents and how do they circulate water around the globe"], ["vec", "what is the difference between surface ocean currents and deep water thermohaline circulation"]]} +{"query": "what is the concept of moral absolutism?", "output": [["hyde", "Moral absolutism holds that certain actions are inherently right or wrong regardless of context, culture, or consequence. Under this view, ethical rules are universal and unchanging—lying is always wrong, for example, even if it could prevent harm."], ["lex", "moral absolutism ethical theory"], ["lex", "moral absolutism objective right wrong"], ["vec", "what does moral absolutism mean as an ethical philosophy"], ["vec", "how does moral absolutism differ from moral relativism in determining right and wrong"]]} +{"query": "how to set up a smart home?", "output": [["hyde", "Start with a smart speaker like Amazon Echo or Google Nest as your central hub. Connect smart bulbs (Philips Hue, LIFX) and a smart thermostat (Nest, Ecobee) over WiFi or Zigbee. Use the companion app to create automations like turning off lights at bedtime."], ["lex", "smart home setup devices hub"], ["lex", "home automation WiFi Zigbee Z-Wave"], ["lex", "smart home starter guide speakers lights"], ["vec", "what devices and hubs do you need to set up a smart home automation system"], ["vec", "how to connect smart lights thermostats and speakers in a home network"]]} +{"query": "what is cycling commute?", "output": [["hyde", "Cycling commute refers to using a bicycle as your primary transportation to and from work. Bike commuters typically ride 3-15 miles each way, saving on fuel costs while getting daily exercise. Many cities now have protected bike lanes and bike-share programs."], ["lex", "cycling commute bike to work"], ["lex", "bicycle commuting urban transportation"], ["vec", "what does it mean to commute by bicycle and what are the benefits"], ["vec", "how do people use cycling as their daily commute to work in cities"]]} +{"query": "how to approach ethical decision-making", "output": [["hyde", "A structured approach to ethical decision-making involves: (1) identify the ethical issue, (2) gather relevant facts, (3) consider stakeholders affected, (4) evaluate options using ethical frameworks like utilitarianism or deontology, and (5) make and justify your decision."], ["lex", "ethical decision-making framework steps"], ["lex", "ethical reasoning moral dilemma process"], ["vec", "what frameworks or steps help with making ethical decisions in difficult situations"], ["vec", "how do you systematically evaluate moral choices when facing an ethical dilemma"]]} +{"query": "how to find a reliable realtor", "output": [["hyde", "Check that the realtor is licensed in your state and has no disciplinary actions. Read online reviews, ask for references from recent clients, and verify their transaction history. A good agent should know the local market and communicate promptly."], ["lex", "find reliable realtor real estate agent"], ["lex", "choosing trustworthy real estate agent"], ["vec", "how do you find and vet a trustworthy real estate agent for buying or selling a home"], ["vec", "what qualities and credentials should you look for in a reliable realtor"]]} +{"query": "how to lease a car?", "output": [["hyde", "To lease a car, negotiate the capitalized cost (sale price), money factor (interest rate), and residual value. Monthly payments are based on the difference between the cap cost and residual, divided by the lease term, plus a finance charge. Typical leases run 24-36 months."], ["lex", "car lease process terms payments"], ["lex", "vehicle leasing agreement negotiation"], ["vec", "what are the steps to lease a car and what terms should you negotiate"], ["vec", "how do car lease payments work and what fees are involved"]]} +{"query": "how do different cultures commemorate death?", "output": [["hyde", "In Mexico, Día de los Muertos celebrates deceased loved ones with altars, marigolds, and sugar skulls. Hindu cremation ceremonies release the soul for reincarnation. In Ghana, elaborate fantasy coffins reflect the deceased's life. Japanese Obon festivals welcome ancestral spirits home."], ["lex", "death rituals funeral customs cultures"], ["lex", "cultural death commemoration ceremonies"], ["vec", "what are the different ways cultures around the world honor and commemorate the dead"], ["vec", "how do funeral rituals and mourning traditions vary across religions and cultures"]]} +{"query": "how to change a tire", "output": [["hyde", "Loosen the lug nuts slightly before jacking. Place the jack under the vehicle frame near the flat tire and raise until the tire clears the ground. Remove lug nuts, pull off the flat, mount the spare, and hand-tighten the nuts in a star pattern. Lower the car and torque to 80-100 ft-lbs."], ["lex", "change flat tire steps jack"], ["lex", "car tire replacement spare"], ["vec", "what are the step-by-step instructions for changing a flat tire on the side of the road"], ["vec", "how to safely jack up a car and replace a flat tire with the spare"]]} +{"query": "how to develop a positive mindset?", "output": [["hyde", "Developing a positive mindset starts with awareness of negative self-talk. Replace \"I can't\" with \"I'm learning to.\" Practice daily gratitude by writing three things you're thankful for. Surround yourself with supportive people and limit exposure to negativity."], ["lex", "positive mindset development habits"], ["lex", "positive thinking mental attitude techniques"], ["vec", "what daily habits and techniques help develop and maintain a positive mindset"], ["vec", "how can you train your brain to think more positively and overcome negative thought patterns"]]} +{"query": "what is bioinformatics", "output": [["hyde", "Bioinformatics is an interdisciplinary field that combines biology, computer science, and statistics to analyze biological data. It involves developing algorithms and software to process DNA sequences, protein structures, and gene expression data from high-throughput experiments."], ["lex", "bioinformatics computational biology genomics"], ["lex", "bioinformatics DNA sequence analysis"], ["vec", "what is the field of bioinformatics and how does it apply computational methods to biological data"], ["vec", "how is bioinformatics used to analyze DNA sequences and genomic data"]]} +{"query": "how to prepare for a triathlon", "output": [["hyde", "A 12-week sprint triathlon plan builds endurance across all three disciplines. Week 1: swim 2x (20 min), bike 2x (30 min), run 3x (20 min). Gradually increase volume by 10% per week. Include one brick workout (bike-to-run) weekly to simulate race-day transitions."], ["lex", "triathlon training plan preparation"], ["lex", "swim bike run triathlon training"], ["vec", "what training plan should a beginner follow to prepare for their first triathlon"], ["vec", "how to balance swimming cycling and running workouts when training for a triathlon"]]} +{"query": "how to paint a car?", "output": [["hyde", "Sand the existing paint with 400-grit wet sandpaper until smooth. Apply 2-3 coats of automotive primer, sanding between coats with 600-grit. Spray the base color in thin, even passes, allowing 15 minutes flash time between coats. Finish with 2-3 coats of clearcoat."], ["lex", "car paint job spray booth steps"], ["lex", "automotive painting primer clearcoat"], ["vec", "what is the step-by-step process for painting a car at home or in a garage"], ["vec", "what preparation and materials are needed to repaint a car yourself"]]} +{"query": "lab test", "output": [["hyde", "Common lab tests include CBC (complete blood count), CMP (comprehensive metabolic panel), lipid panel, and thyroid function tests. A CBC measures white blood cells, red blood cells, hemoglobin, and platelets. Results outside the reference range may indicate infection, anemia, or other conditions."], ["lex", "lab test blood work results"], ["lex", "laboratory diagnostic testing medical"], ["lex", "lab test ordered interpretation"], ["vec", "what types of medical lab tests are commonly ordered and what do the results mean"], ["vec", "how to understand blood test results from a laboratory"]]} +{"query": "where to buy iphone 14", "output": [["hyde", "Buy iPhone 14 starting at $599 from Apple.com, or save with carrier deals from Verizon, AT&T, and T-Mobile. Trade in your old device for up to $400 off. Also available at Best Buy, Walmart, and Amazon with financing options."], ["lex", "buy iPhone 14 price deals"], ["lex", "iPhone 14 purchase Apple store carrier"], ["vec", "where can you buy an iPhone 14 at the best price online or in retail stores"], ["vec", "which stores and carriers currently sell the iPhone 14 and offer trade-in deals"]]} +{"query": "what is the categorical imperative", "output": [["hyde", "The categorical imperative, formulated by Immanuel Kant, states: \"Act only according to that maxim by which you can at the same time will that it should become a universal law.\" It requires that moral rules apply unconditionally to all rational beings, regardless of personal desires."], ["lex", "categorical imperative Kant ethics"], ["lex", "Kantian categorical imperative universal law"], ["vec", "what is Kant's categorical imperative and how does it function as a moral principle"], ["vec", "how does the categorical imperative test whether an action is morally permissible"]]} +{"query": "latest research on renewable agriculture", "output": [["hyde", "A 2025 study in Nature Food found that cover cropping and no-till practices increased soil organic carbon by 8-12% over five years. Researchers also demonstrated that integrating livestock grazing with crop rotation improved soil microbial diversity by 23%."], ["lex", "renewable agriculture research 2025 2026"], ["lex", "regenerative sustainable farming research"], ["lex", "renewable agriculture soil carbon sequestration"], ["vec", "what are the latest scientific findings on regenerative and renewable agriculture techniques"], ["vec", "what recent research has been published on sustainable farming and soil health in 2025 or 2026"]]} +{"query": "cloud deploy", "output": [["hyde", "Deploy to the cloud using `gcloud deploy` or configure a CI/CD pipeline with GitHub Actions. Define your infrastructure with Terraform or CloudFormation, build container images, push to a registry, and roll out to Kubernetes or serverless environments."], ["lex", "cloud deployment pipeline CI/CD"], ["lex", "cloud deploy AWS Azure GCP"], ["lex", "cloud infrastructure deployment automation"], ["vec", "how to deploy applications to cloud platforms like AWS, Azure, or Google Cloud"], ["vec", "what tools and pipelines are used for automated cloud deployment"]]} +{"query": "what is the significance of day of the dead", "output": [["hyde", "Día de los Muertos, celebrated November 1-2, is a Mexican tradition honoring deceased loved ones. Families build ofrendas (altars) decorated with marigolds, photos, and the departed's favorite foods. It blends pre-Columbian Aztec beliefs with Catholic All Saints' and All Souls' Days."], ["lex", "Day of the Dead Día de los Muertos significance"], ["lex", "Day of the Dead Mexican tradition meaning"], ["vec", "what is the cultural and spiritual significance of Day of the Dead in Mexican tradition"], ["vec", "why is Día de los Muertos celebrated and what does it mean to families in Mexico"]]} +{"query": "what is stonehenge", "output": [["hyde", "Stonehenge is a prehistoric stone circle on Salisbury Plain in Wiltshire, England, built in stages from roughly 3000 to 2000 BCE. The massive sarsen stones, some weighing 25 tons, were transported from Marlborough Downs 25 miles north. Its alignment with the summer solstice sunrise suggests astronomical or ceremonial function."], ["lex", "Stonehenge prehistoric monument England"], ["lex", "Stonehenge purpose construction history"], ["vec", "what is Stonehenge and why was it built on Salisbury Plain in England"], ["vec", "what do archaeologists know about the history and purpose of Stonehenge"]]} +{"query": "bug fix", "output": [["hyde", "To fix a bug, first reproduce it reliably and identify the exact conditions that trigger it. Use a debugger or add logging to narrow down the faulty code path. Write a regression test that captures the bug, then modify the code until the test passes."], ["lex", "bug fix debugging software"], ["lex", "bug fix code patch issue"], ["lex", "software bug troubleshooting resolution"], ["vec", "how to identify and fix bugs in software code effectively"], ["vec", "what is the process for debugging and resolving code issues"]]} +{"query": "how to wax a car?", "output": [["hyde", "Wash and dry the car thoroughly before waxing. Apply a thin layer of carnauba or synthetic wax with a foam applicator pad using circular motions. Work one panel at a time, let it haze for 5-10 minutes, then buff off with a clean microfiber towel."], ["lex", "car wax application steps"], ["lex", "wax car paint protection polish"], ["vec", "what is the proper technique for waxing a car to protect the paint finish"], ["vec", "how often should you wax a car and what products work best"]]} +{"query": "what is the veil of ignorance", "output": [["hyde", "The veil of ignorance is a thought experiment by John Rawls in A Theory of Justice (1971). It asks people to choose principles of justice from an \"original position\" where they don't know their own race, gender, wealth, or abilities. Rawls argues this produces fair, impartial rules."], ["lex", "veil of ignorance Rawls justice"], ["lex", "John Rawls original position veil of ignorance"], ["vec", "what is John Rawls' veil of ignorance thought experiment in political philosophy"], ["vec", "how does the veil of ignorance help determine principles of justice in a fair society"]]} +{"query": "what are the challenges of multiculturalism", "output": [["hyde", "Multicultural societies face challenges including language barriers, cultural misunderstandings, and tensions between assimilation and cultural preservation. Debates arise over shared national identity, religious accommodation in public institutions, and equitable representation of minority groups."], ["lex", "multiculturalism challenges social integration"], ["lex", "multicultural society tensions cultural diversity"], ["vec", "what social and political challenges arise in multicultural societies"], ["vec", "how do multicultural nations deal with cultural conflict and integration difficulties"]]} +{"query": "what are smart cities?", "output": [["hyde", "Smart cities integrate IoT sensors, data analytics, and connected infrastructure to improve urban services. Examples include adaptive traffic signals that reduce congestion by 25%, smart grids that optimize energy distribution, and sensors that monitor air quality and water systems in real time."], ["lex", "smart city technology IoT urban"], ["lex", "smart cities infrastructure data sensors"], ["vec", "what defines a smart city and what technologies do they use"], ["vec", "how do smart cities use IoT sensors and data analytics to improve urban infrastructure"]]} +{"query": "how to optimize supply chain", "output": [["hyde", "Optimize your supply chain by implementing demand forecasting with machine learning, reducing safety stock through just-in-time inventory, and diversifying suppliers to mitigate risk. Use real-time tracking and warehouse management systems to cut lead times by 15-30%."], ["lex", "supply chain optimization logistics"], ["lex", "supply chain efficiency inventory management"], ["vec", "what strategies and tools can companies use to optimize their supply chain operations"], ["vec", "how do businesses reduce supply chain costs while improving delivery speed and reliability"]]} +{"query": "what is an elevator pitch", "output": [["hyde", "An elevator pitch is a concise, 30-60 second summary of who you are and what you offer. Structure it as: hook (attention-grabbing opening), problem you solve, your solution, and a call to action. Practice until it sounds conversational, not rehearsed."], ["lex", "elevator pitch short business presentation"], ["lex", "elevator pitch 30-second summary"], ["vec", "what is an elevator pitch and how do you structure an effective one"], ["vec", "how do you deliver a compelling 30-second pitch for a business idea or job opportunity"]]} +{"query": "how to rotate car tires?", "output": [["hyde", "Rotate tires every 5,000-7,500 miles. For front-wheel drive, move fronts straight to the rear and cross the rears to the front. For rear-wheel drive, move rears straight forward and cross the fronts to the rear. All-wheel drive uses the rearward cross pattern."], ["lex", "car tire rotation pattern schedule"], ["lex", "tire rotation front rear cross"], ["vec", "how often should you rotate car tires and what pattern should you follow"], ["vec", "what is the correct tire rotation procedure for front-wheel and all-wheel drive vehicles"]]} +{"query": "how to participate in a pow wow", "output": [["hyde", "When attending a pow wow, stand during grand entry and honor songs. Don't touch dancers' regalia without permission. Ask before photographing. Bring a lawn chair, as seating is limited. Some dances are intertribal and open to all—the emcee will announce when visitors may join the circle."], ["lex", "pow wow Native American attend participate"], ["lex", "pow wow etiquette attendance protocol"], ["vec", "how can non-Native people respectfully attend and participate in a pow wow"], ["vec", "what are the etiquette rules and customs visitors should follow at a pow wow"]]} +{"query": "car rust", "output": [["hyde", "Car rust forms when bare metal is exposed to moisture and salt. Treat surface rust by sanding to bare metal, applying rust converter, priming, and repainting. For structural rust, cut out the damaged section and weld in a patch panel. Prevent rust with regular washing and undercoating."], ["lex", "car rust prevention treatment"], ["lex", "automotive rust repair body panel"], ["lex", "car rust removal undercarriage"], ["vec", "how to prevent and treat rust on a car body and undercarriage"], ["vec", "what causes rust on cars and how can you repair rusted panels"]]} +{"query": "what is moral obligation", "output": [["hyde", "A moral obligation is a duty to act in accordance with ethical principles, regardless of legal requirements. For example, one may feel morally obligated to help a stranger in danger. Philosophers debate whether moral obligations stem from reason (Kant), consequences (Mill), or social contracts."], ["lex", "moral obligation ethical duty"], ["lex", "moral obligation philosophy definition"], ["vec", "what does moral obligation mean in ethics and where do moral duties come from"], ["vec", "how do philosophers define and justify moral obligations people have toward others"]]} +{"query": "what is the purpose of a thesis statement?", "output": [["hyde", "A thesis statement presents the central argument of an essay in one or two sentences, typically at the end of the introduction. It tells the reader what the paper will argue and provides a roadmap for the evidence and analysis that follow. A strong thesis is specific, debatable, and supportable."], ["lex", "thesis statement purpose essay writing"], ["lex", "thesis statement argument academic paper"], ["vec", "what role does a thesis statement play in an essay or academic paper"], ["vec", "why is a strong thesis statement important and how should it be written"]]} +{"query": "how to attend a diplomatic event", "output": [["hyde", "At diplomatic events, follow the dress code specified on the invitation (black tie, business formal). Arrive punctually, greet the host first, and address ambassadors as \"Your Excellency.\" Exchange business cards with both hands. Avoid discussing controversial political topics unless invited to do so."], ["lex", "diplomatic event attendance protocol etiquette"], ["lex", "diplomatic reception dress code invitation"], ["vec", "what are the etiquette rules and dress codes for attending a diplomatic event or reception"], ["vec", "how do you get invited to and properly conduct yourself at a diplomatic function"]]} +{"query": "what is renewable energy", "output": [["hyde", "Renewable energy comes from naturally replenishing sources: solar, wind, hydroelectric, geothermal, and biomass. Solar panels convert sunlight into electricity using photovoltaic cells. Wind turbines capture kinetic energy from moving air. These sources produce little or no greenhouse gas emissions during operation."], ["lex", "renewable energy sources solar wind"], ["lex", "renewable energy types clean power"], ["vec", "what are the main types of renewable energy and how do they generate electricity"], ["vec", "how do renewable energy sources like solar and wind power differ from fossil fuels"]]} +{"query": "what is machine learning", "output": [["hyde", "Machine learning is a subset of artificial intelligence where algorithms learn patterns from training data rather than following explicit rules. Given labeled examples, a supervised learning model adjusts its parameters to minimize prediction error. Common algorithms include linear regression, decision trees, and neural networks."], ["lex", "machine learning algorithms training data"], ["lex", "machine learning AI neural networks"], ["vec", "what is machine learning and how do algorithms learn from data to make predictions"], ["vec", "how does machine learning differ from traditional programming and rule-based systems"]]} +{"query": "what is the role of the protagonist?", "output": [["hyde", "The protagonist is the central character whose goals and conflicts drive the narrative. They face obstacles, make choices, and undergo transformation through the story arc. Readers experience the plot primarily through the protagonist's perspective, creating emotional investment in their journey."], ["lex", "protagonist role literary fiction"], ["lex", "protagonist main character story function"], ["vec", "what role does the protagonist play in driving the plot of a novel or story"], ["vec", "how does the protagonist function as the central character in literary fiction"]]} +{"query": "api test", "output": [["hyde", "Test API endpoints using Postman or write automated tests with a framework like Jest or pytest. Send requests to each endpoint and assert status codes, response bodies, and headers. Example: `expect(response.status).toBe(200)` and validate the JSON schema of the response."], ["lex", "API testing automated endpoint"], ["lex", "REST API test Postman integration"], ["lex", "API endpoint validation testing"], ["vec", "how to write automated tests for REST API endpoints"], ["vec", "what tools and methods are used for API testing and validation"]]} +{"query": "how to improve civic engagement", "output": [["hyde", "Improve civic engagement by attending city council meetings, volunteering for local organizations, and contacting elected officials about issues you care about. Register to vote and participate in every election, including local and midterm races. Join neighborhood associations and community boards."], ["lex", "civic engagement participation community"], ["lex", "civic engagement voting local government"], ["vec", "what are effective ways to increase civic engagement and community participation"], ["vec", "how can citizens get more involved in local government and community decision-making"]]} +{"query": "sustainable agriculture", "output": [["hyde", "Sustainable agriculture maintains productivity while protecting natural resources. Key practices include crop rotation, cover cropping, integrated pest management, reduced tillage, and efficient water use. These methods improve soil health, reduce erosion, and lower dependence on synthetic fertilizers and pesticides."], ["lex", "sustainable agriculture farming methods"], ["lex", "sustainable agriculture soil health crop rotation"], ["lex", "sustainable agriculture environmental impact"], ["vec", "what farming practices make agriculture sustainable and environmentally friendly"], ["vec", "how does sustainable agriculture balance food production with environmental conservation"]]} +{"query": "how to fix car door lock?", "output": [["hyde", "If the car door lock won't engage, check the fuse first. Test the lock with the key and remote separately. If the remote works but the button doesn't, the switch is faulty. If neither works, the lock actuator has likely failed. Remove the door panel, disconnect the actuator, and replace it."], ["lex", "car door lock repair fix stuck"], ["lex", "car door lock actuator replacement"], ["vec", "how to diagnose and fix a car door lock that is stuck or not working"], ["vec", "how to replace a broken car door lock actuator or mechanism"]]} +{"query": "drug test", "output": [["hyde", "The standard 5-panel drug test screens for marijuana (THC), cocaine, opiates, amphetamines, and PCP. Urine tests detect most substances for 1-7 days, except marijuana which can be detected for up to 30 days in heavy users. Hair follicle tests cover approximately 90 days."], ["lex", "drug test urine screening types"], ["lex", "drug test employment panel detection"], ["lex", "drug testing workplace results"], ["vec", "what types of drug tests are used for employment and what substances do they detect"], ["vec", "how long do drugs stay detectable in urine blood and hair drug tests"]]} +{"query": "how to participate in lobbying efforts", "output": [["hyde", "Citizens can lobby by contacting representatives via phone, email, or scheduled meetings. Prepare a one-page brief on your issue with specific policy asks. Join advocacy organizations that coordinate lobbying days at state capitols. Grassroots lobbying involves petitions, public comment periods, and organized letter-writing campaigns."], ["lex", "lobbying participation advocacy government"], ["lex", "citizen lobbying elected officials"], ["vec", "how can ordinary citizens participate in lobbying and advocacy to influence legislation"], ["vec", "what steps are involved in organizing a lobbying effort for a political cause"]]} +{"query": "how do you find inspiration for photography?", "output": [["hyde", "Find photography inspiration by studying the work of photographers you admire on platforms like Flickr, 500px, and Instagram. Try a 365-day photo challenge. Walk familiar routes at different times of day. Limit yourself to one lens or shoot only in black and white to force creative thinking."], ["lex", "photography inspiration ideas creative"], ["lex", "photography creative motivation techniques"], ["vec", "where do photographers find creative inspiration for new projects and subjects"], ["vec", "what techniques help overcome creative block and find fresh ideas for photography"]]} +{"query": "how to install car led lights?", "output": [["hyde", "To install LED headlights, open the hood and locate the headlight housing. Twist the bulb holder counterclockwise to remove the old halogen bulb. Insert the LED bulb, secure the heat sink or fan module, and connect the driver if included. Test both low and high beams before reassembling."], ["lex", "car LED lights installation wiring"], ["lex", "LED headlight bulb install car"], ["vec", "how to install aftermarket LED lights on a car including wiring and connections"], ["vec", "step-by-step guide for replacing car headlights or interior lights with LEDs"]]} +{"query": "how to critically analyze research papers", "output": [["hyde", "When analyzing a research paper, evaluate: (1) Is the research question clearly stated? (2) Is the methodology appropriate and reproducible? (3) Is the sample size adequate? (4) Do the results support the conclusions? (5) Are limitations acknowledged? Check for conflicts of interest and citation of relevant prior work."], ["lex", "research paper critical analysis evaluation"], ["lex", "academic paper critique methodology"], ["vec", "how do you critically evaluate the methodology and conclusions of a research paper"], ["vec", "what framework should you use to analyze the strengths and weaknesses of an academic study"]]} +{"query": "what is mindfulness meditation", "output": [["hyde", "Mindfulness meditation involves focusing attention on the present moment without judgment. Sit comfortably, close your eyes, and observe your breath. When thoughts arise, acknowledge them without engaging and gently return focus to breathing. Start with 5-10 minutes daily and gradually increase duration."], ["lex", "mindfulness meditation practice technique"], ["lex", "mindfulness meditation awareness breathing"], ["vec", "what is mindfulness meditation and how do you practice it"], ["vec", "what are the mental and physical health benefits of regular mindfulness meditation"]]} +{"query": "what is the digital divide", "output": [["hyde", "The digital divide refers to the gap between those who have access to computers and the internet and those who do not. Roughly 2.7 billion people worldwide remain offline. Factors include income, geography, age, and education. Rural areas and developing countries are disproportionately affected."], ["lex", "digital divide internet access inequality"], ["lex", "digital divide technology gap socioeconomic"], ["vec", "what is the digital divide and how does it affect people without internet access"], ["vec", "what factors contribute to the technology gap between different socioeconomic groups"]]} +{"query": "what is nihilism", "output": [["hyde", "Nihilism is the philosophical view that life lacks objective meaning, purpose, or intrinsic value. Existential nihilism holds that no action is inherently meaningful. Friedrich Nietzsche warned that the \"death of God\" would lead to nihilism but urged individuals to create their own values through the will to power."], ["lex", "nihilism philosophy meaning Nietzsche"], ["lex", "nihilism existential moral meaning"], ["vec", "what is nihilism as a philosophical position and what does it claim about meaning and values"], ["vec", "how did Nietzsche and other philosophers develop and respond to nihilism"]]} +{"query": "how to improve self-discipline?", "output": [["hyde", "Build self-discipline by starting with small commitments and increasing gradually. Make your bed every morning. Use the two-minute rule: if a task takes less than two minutes, do it now. Remove temptations from your environment and track your streaks to maintain momentum."], ["lex", "self-discipline improvement habits willpower"], ["lex", "self-discipline strategies consistency"], ["vec", "what daily habits and strategies help build stronger self-discipline"], ["vec", "how can you train yourself to stay disciplined and follow through on goals"]]} +{"query": "what are the core practices of the bahá'í faith?", "output": [["hyde", "Core Bahá'í practices include daily obligatory prayer (one of three prayers chosen by the individual), fasting during the Nineteen-Day Fast in March, participation in Nineteen-Day Feasts, and the recitation of \"Alláh-u-Abhá\" 95 times daily. Bahá'ís also observe the prohibition on backbiting and alcohol."], ["lex", "Bahá'í faith core practices worship"], ["lex", "Bahá'í religion prayer fasting principles"], ["vec", "what are the main spiritual practices and rituals observed in the Bahá'í faith"], ["vec", "what daily practices and religious obligations do Bahá'ís follow"]]} +{"query": "what is highlining?", "output": [["hyde", "Highlining is the practice of walking a slackline anchored at significant height, often between cliffs, buildings, or over canyons. Unlike standard slacklining, highliners wear a climbing harness tethered to the line with a leash. Lines are rigged with redundant anchors using static rope or webbing."], ["lex", "highlining slackline extreme height"], ["lex", "highlining equipment safety rigging"], ["vec", "what is highlining and how does it differ from regular slacklining"], ["vec", "what equipment and safety precautions are required for highlining at extreme heights"]]} +{"query": "how to travel to bali", "output": [["hyde", "Fly into Ngurah Rai International Airport (DPS) in southern Bali. Many countries receive a 30-day visa on arrival for $500,000 IDR (~$35). Book a private driver for around $40-50/day to explore the island. Popular areas include Ubud for culture, Seminyak for dining, and Uluwatu for surfing."], ["lex", "travel Bali Indonesia flights visa"], ["lex", "Bali trip planning itinerary transportation"], ["vec", "how to plan a trip to Bali including flights, visas, and transportation"], ["vec", "what do you need to know before traveling to Bali Indonesia for the first time"]]} +{"query": "what caused the fall of the roman empire", "output": [["hyde", "The fall of the Western Roman Empire in 476 AD resulted from multiple factors: military overextension, barbarian invasions (Visigoths, Vandals, Ostrogoths), economic decline from debasement of currency, political instability with rapid emperor turnover, and the shift of power to Constantinople."], ["lex", "fall Roman Empire causes decline"], ["lex", "Roman Empire collapse reasons factors"], ["vec", "what were the main political military and economic causes of the fall of the Roman Empire"], ["vec", "why did the Western Roman Empire collapse in 476 AD"]]} +{"query": "what is philosophy of mind", "output": [["hyde", "Philosophy of mind examines the nature of mental states, consciousness, and their relationship to the physical brain. Central questions include the mind-body problem: how do subjective experiences (qualia) arise from neural processes? Key positions include dualism, physicalism, functionalism, and property dualism."], ["lex", "philosophy of mind consciousness problem"], ["lex", "philosophy of mind mental states dualism"], ["vec", "what does the philosophy of mind study about consciousness and mental states"], ["vec", "what are the main theories in philosophy of mind such as dualism and physicalism"]]} +{"query": "how to build a personal brand", "output": [["hyde", "Build your personal brand by defining your niche and unique value proposition. Create consistent profiles across LinkedIn, Twitter, and a personal website. Publish content regularly—blog posts, videos, or podcasts—that demonstrates your expertise. Engage authentically with your audience and network at industry events."], ["lex", "personal brand building online presence"], ["lex", "personal branding strategy social media"], ["vec", "how do you build a strong personal brand for career growth or entrepreneurship"], ["vec", "what steps should you take to develop a recognizable personal brand online"]]} +{"query": "what is the significance of dialogue in philosophy?", "output": [["hyde", "Dialogue has been central to philosophy since Plato's Socratic dialogues, where truth emerges through questioning and exchange rather than dogmatic assertion. The dialectical method exposes contradictions in arguments, refines ideas through challenge and response, and models philosophy as collaborative inquiry."], ["lex", "dialogue philosophy Socratic method"], ["lex", "philosophical dialogue significance discourse"], ["vec", "why is dialogue important as a method of philosophical inquiry and reasoning"], ["vec", "how did Socratic dialogue shape Western philosophical tradition"]]} +{"query": "what does it mean to write a biography?", "output": [["hyde", "Writing a biography means researching and narrating the story of a real person's life. Biographers conduct interviews, examine letters and documents, and verify facts through multiple sources. The narrative typically follows chronological structure while weaving in themes that defined the subject's character and impact."], ["lex", "biography writing nonfiction life story"], ["lex", "biography research subject narrative"], ["vec", "what is involved in writing a biography of someone's life"], ["vec", "how do biographers research and structure a narrative about a person's life"]]} +{"query": "how to develop a writing habit?", "output": [["hyde", "Set a specific time and place to write every day, even if only for 15-20 minutes. Track your word count or time spent writing. Don't edit while drafting—just get words on the page. Use writing prompts if you're stuck. Many successful authors, including Stephen King, recommend writing at least 1,000 words daily."], ["lex", "writing habit daily routine discipline"], ["lex", "writing habit consistency productivity"], ["vec", "how do you build and maintain a consistent daily writing habit"], ["vec", "what strategies help writers overcome procrastination and write regularly"]]} +{"query": "what is green technology", "output": [["hyde", "Green technology encompasses innovations that reduce environmental impact, including solar panels, electric vehicles, energy-efficient buildings, biodegradable materials, and water purification systems. These technologies aim to conserve resources, reduce waste, and lower carbon emissions across manufacturing, energy, and transportation sectors."], ["lex", "green technology clean environmental"], ["lex", "green technology sustainable energy efficiency"], ["vec", "what is green technology and what industries does it apply to"], ["vec", "how does green technology help reduce environmental impact and promote sustainability"]]} +{"query": "how to connect car bluetooth?", "output": [["hyde", "To connect via Bluetooth, enable Bluetooth on your phone and car infotainment system. On the car stereo, go to Settings > Bluetooth > Add Device. Select your car's name on your phone's Bluetooth list. Confirm the pairing code on both devices. The phone should automatically reconnect on future drives."], ["lex", "car Bluetooth pairing phone connect"], ["lex", "car Bluetooth setup audio streaming"], ["vec", "how to pair a smartphone to a car's Bluetooth system for calls and music"], ["vec", "step-by-step instructions for connecting a phone to car Bluetooth for the first time"]]} +{"query": "what are the building blocks of life", "output": [["hyde", "The building blocks of life are four types of organic molecules: proteins (made from amino acids), nucleic acids (DNA and RNA from nucleotides), carbohydrates (sugars and polysaccharides), and lipids (fats and phospholipids). These molecules self-assemble into cells, the basic unit of all living organisms."], ["lex", "building blocks of life molecules biochemistry"], ["lex", "amino acids nucleic acids proteins cells"], ["vec", "what are the fundamental molecular building blocks that make up all living organisms"], ["vec", "how do amino acids, nucleic acids, and lipids form the basis of life on Earth"]]} +{"query": "what is the role of a cinematographer?", "output": [["hyde", "The cinematographer, or director of photography (DP), is responsible for the visual look of a film. They select cameras, lenses, and lighting setups, and work with the director to plan shot composition and camera movement. The DP oversees the camera and electrical departments on set."], ["lex", "cinematographer role film camera director of photography"], ["lex", "cinematographer lighting shot composition"], ["vec", "what does a cinematographer do on a film set and what creative decisions do they make"], ["vec", "how does the director of photography control lighting, camera, and visual storytelling in film"]]} +{"query": "landscape photography", "output": [["hyde", "For landscape photography, use a wide-angle lens (16-35mm), aperture of f/8-f/11 for maximum sharpness, and a low ISO (100). Shoot during golden hour for warm, directional light. Use a tripod, compose with the rule of thirds, and include a strong foreground element to create depth."], ["lex", "landscape photography techniques composition"], ["lex", "landscape photography camera lens settings"], ["lex", "landscape photography golden hour"], ["vec", "what camera settings and techniques produce stunning landscape photographs"], ["vec", "how to compose and shoot landscape photography with proper exposure and depth of field"]]} +{"query": "what are literary movements?", "output": [["hyde", "Literary movements are periods defined by shared styles, themes, and philosophies. Romanticism (1800-1850) emphasized emotion and nature. Realism (1850-1900) depicted ordinary life accurately. Modernism (1900-1945) experimented with form and stream of consciousness. Postmodernism questioned grand narratives through irony and fragmentation."], ["lex", "literary movements periods history"], ["lex", "literary movements Romanticism Modernism Realism"], ["vec", "what are the major literary movements in history and what defines each one"], ["vec", "how do literary movements like Romanticism, Realism, and Modernism differ from each other"]]} +{"query": "what is the capital of france?", "output": [["hyde", "Paris is the capital and largest city of France, located on the Seine River in northern France. With a population of over 2 million in the city proper and 12 million in the metropolitan area, it is the country's political, economic, and cultural center."], ["lex", "capital France Paris"], ["lex", "Paris capital city France"], ["vec", "what city is the capital of France"], ["vec", "where is the capital of France located and what is it known for"]]} +{"query": "golf play", "output": [["hyde", "A round of golf consists of 18 holes. At each hole, tee off from the tee box, play through the fairway, and putt on the green. The objective is to complete each hole in the fewest strokes. Beginners should start at a driving range, learn basic grip and stance, and play executive (par-3) courses."], ["lex", "golf playing tips beginner"], ["lex", "golf swing technique course"], ["lex", "golf rules gameplay etiquette"], ["vec", "how do you play golf and what are the basic rules for beginners"], ["vec", "what techniques and etiquette should new golfers learn before playing on a course"]]} +{"query": "build a treehouse", "output": [["hyde", "Choose a healthy hardwood tree (oak, maple, beech) with a trunk at least 12 inches in diameter. Use treehouse attachment bolts (TABs) rather than nails, which damage the tree. Build the platform at 6-8 feet high using pressure-treated lumber. Frame with 2x6 joists on 16-inch centers and deck with 5/4 boards."], ["lex", "treehouse building construction plans"], ["lex", "treehouse DIY wood platform tree"], ["vec", "how to design and build a treehouse safely in a backyard tree"], ["vec", "what materials and tools do you need to build a treehouse for kids"]]} +{"query": "where to buy classic car parts", "output": [["hyde", "Find classic car parts at specialty suppliers like Summit Racing, Classic Industries, and Hemmings. Year One stocks OEM-quality parts for GM, Ford, and Mopar vehicles from the 1950s-80s. JEGS and Rock Auto also carry a wide selection. Check eBay Motors and swap meets for rare NOS (new old stock) parts."], ["lex", "classic car parts buy online supplier"], ["lex", "vintage car parts restoration OEM"], ["vec", "where can you purchase replacement parts for classic and vintage cars"], ["vec", "which online stores and suppliers specialize in classic car restoration parts"]]} +{"query": "how to set business goals", "output": [["hyde", "Set business goals using the SMART framework: Specific (\"increase monthly revenue by 15%\"), Measurable (track with KPIs), Achievable (realistic given resources), Relevant (aligned with company mission), and Time-bound (complete by Q3). Break annual goals into quarterly milestones and review progress monthly."], ["lex", "business goals setting SMART strategy"], ["lex", "business goal planning objectives targets"], ["vec", "how to set effective business goals using the SMART framework"], ["vec", "what process should entrepreneurs follow to define and track business objectives"]]} +{"query": "what are the characteristics of neolithic societies?", "output": [["hyde", "Neolithic societies (approximately 10,000-3,000 BCE) were characterized by the transition from hunting-gathering to agriculture. People domesticated plants and animals, formed permanent settlements, developed pottery and polished stone tools, and created increasingly complex social hierarchies with specialized labor roles."], ["lex", "Neolithic society characteristics agriculture settlement"], ["lex", "Neolithic period farming tools social structure"], ["vec", "what were the key characteristics of Neolithic societies after the agricultural revolution"], ["vec", "how did Neolithic communities organize their social structure, farming, and settlements"]]} +{"query": "what is the significance of rituals in judaism?", "output": [["hyde", "Rituals in Judaism (mitzvot) structure daily, weekly, and yearly life around sacred observance. Shabbat, observed from Friday evening to Saturday night, sanctifies time through rest, prayer, and family meals. Rituals connect Jews to their covenant with God, collective memory, and community identity across generations."], ["lex", "Judaism rituals significance religious practice"], ["lex", "Jewish rituals Shabbat observance tradition"], ["vec", "what role do rituals play in Jewish religious life and spiritual practice"], ["vec", "why are rituals like Shabbat, kashrut, and prayer important in Judaism"]]} +{"query": "how to increase productivity at work?", "output": [["hyde", "Increase workplace productivity by time-blocking your calendar in 90-minute focus sessions. Tackle your hardest task first (eat the frog). Batch similar tasks like email and meetings. Eliminate distractions by silencing notifications. Use the Pomodoro Technique: 25 minutes of work, 5-minute break, repeat."], ["lex", "productivity work increase tips"], ["lex", "workplace productivity time management techniques"], ["vec", "what proven strategies help people increase their productivity at work"], ["vec", "how can you manage your time better to get more done during the workday"]]} +{"query": "what is panorama photography?", "output": [["hyde", "Panorama photography captures wide scenes by shooting multiple overlapping images and stitching them together. Use a tripod with a panoramic head, shoot in manual mode to keep exposure consistent, and overlap each frame by 30-50%. Stitch in software like Lightroom, PTGui, or Hugin."], ["lex", "panorama photography wide angle stitching"], ["lex", "panoramic photo technique camera rotation"], ["vec", "what is panorama photography and how do you capture and stitch panoramic images"], ["vec", "what camera techniques and software are used to create panoramic photographs"]]} +{"query": "what are the key periods in chinese history", "output": [["hyde", "Key periods in Chinese history include: Shang Dynasty (1600-1046 BCE), Zhou Dynasty (1046-256 BCE), Qin Dynasty (221-206 BCE, first unified empire), Han Dynasty (206 BCE-220 CE), Tang Dynasty (618-907, golden age), Song Dynasty (960-1279), Ming Dynasty (1368-1644), Qing Dynasty (1644-1912), and the People's Republic (1949-present)."], ["lex", "Chinese history periods dynasties timeline"], ["lex", "China historical periods Qin Han Tang"], ["vec", "what are the major periods and dynasties in Chinese history from ancient to modern times"], ["vec", "how is Chinese history divided into dynastic periods and what defined each era"]]} +{"query": "what are the elements of a good story?", "output": [["hyde", "A good story requires compelling characters, a clear conflict, a structured plot (beginning, rising action, climax, resolution), a vivid setting, and a consistent point of view. Theme gives the story meaning beyond its events. Strong dialogue reveals character and advances the plot naturally."], ["lex", "story elements plot character setting"], ["lex", "storytelling elements narrative structure"], ["vec", "what are the essential elements that make a story compelling and well-crafted"], ["vec", "how do plot, character, setting, and conflict work together in a good story"]]} +{"query": "latest news in artificial intelligence research", "output": [["hyde", "In 2025-2026, AI research advanced with larger multimodal models capable of reasoning across text, image, and video. Key developments include improved chain-of-thought reasoning, AI agents that can use tools and write code, and open-weight models matching proprietary performance."], ["lex", "artificial intelligence research news 2025 2026"], ["lex", "AI research breakthroughs latest developments"], ["lex", "machine learning AI news recent"], ["vec", "what are the most recent breakthroughs and developments in artificial intelligence research in 2025-2026"], ["vec", "what new AI models and techniques have been published in the latest research"]]} +{"query": "what are the main beliefs of new age spirituality?", "output": [["hyde", "New Age spirituality encompasses diverse beliefs including holistic healing, the interconnectedness of all life, personal spiritual growth, and the existence of higher consciousness. Practitioners may draw from Eastern religions, astrology, crystal healing, meditation, and the idea that individuals can channel divine energy."], ["lex", "New Age spirituality beliefs practices"], ["lex", "New Age movement spiritual holistic"], ["vec", "what are the central beliefs and practices of New Age spirituality"], ["vec", "how does the New Age movement define spirituality, consciousness, and healing"]]} +{"query": "how to plan a camping trip with kids", "output": [["hyde", "Plan a family camping trip by choosing a campground with bathrooms and short hiking trails. Pack extra layers, rain gear, and familiar snacks. Bring activities: nature scavenger hunts, glow sticks, and star charts. Set up camp early to let kids explore. Practice tent setup in the backyard first."], ["lex", "camping trip kids family planning"], ["lex", "family camping children gear checklist"], ["vec", "how to plan and prepare for a family camping trip with young children"], ["vec", "what gear and activities should you bring when camping with kids for the first time"]]} +{"query": "how do philosophers conceptualize identity", "output": [["hyde", "Philosophers debate what constitutes personal identity over time. John Locke argued identity rests on continuity of consciousness and memory. David Hume denied a fixed self, viewing identity as a bundle of perceptions. Derek Parfit argued identity is not what matters—psychological continuity is."], ["lex", "personal identity philosophy self"], ["lex", "identity philosophy Locke consciousness persistence"], ["vec", "how do philosophers define and explain personal identity and what makes someone the same person over time"], ["vec", "what are the major philosophical theories of identity from Locke to modern philosophy of mind"]]} +{"query": "what is the role of civil society in politics", "output": [["hyde", "Civil society—NGOs, advocacy groups, unions, and community organizations—serves as a check on government power. These groups mobilize citizens, advocate for policy changes, monitor elections, and provide services the state cannot. A strong civil society is considered essential for healthy democracy and government accountability."], ["lex", "civil society political role organizations"], ["lex", "civil society democracy NGOs advocacy"], ["vec", "what role do civil society organizations play in democratic politics and governance"], ["vec", "how does civil society influence government policy and hold political leaders accountable"]]} +{"query": "how to handle inflation impact", "output": [["hyde", "To handle inflation, review your budget and cut discretionary spending. Move savings to high-yield accounts or I-bonds that adjust for inflation. Lock in fixed-rate loans before rates rise. Invest in assets that historically outpace inflation: equities, real estate, and TIPS (Treasury Inflation-Protected Securities)."], ["lex", "inflation impact personal finance manage"], ["lex", "inflation coping strategies budget investment"], ["vec", "how can individuals protect their finances and manage the impact of high inflation"], ["vec", "what financial strategies help people cope with rising prices and reduced purchasing power"]]} +{"query": "how is energy conserved during chemical reactions", "output": [["hyde", "In chemical reactions, energy is neither created nor destroyed (first law of thermodynamics). Exothermic reactions release energy—bonds formed in products are stronger than bonds broken in reactants. Endothermic reactions absorb energy—more energy is needed to break reactant bonds than is released forming product bonds."], ["lex", "energy conservation chemical reactions thermodynamics"], ["lex", "chemical reaction energy transfer exothermic endothermic"], ["vec", "how does the law of conservation of energy apply to chemical reactions"], ["vec", "how is energy transferred and conserved in exothermic and endothermic chemical reactions"]]} +{"query": "how to make sourdough bread", "output": [["hyde", "Mix 100g active starter, 375g water, 500g bread flour, and 10g salt. Stretch and fold every 30 minutes for 2 hours, then bulk ferment 4-8 hours until doubled. Shape, place in a banneton, and cold-proof in the fridge overnight. Bake in a Dutch oven at 450°F: 20 min covered, 20 min uncovered."], ["lex", "sourdough bread recipe starter"], ["lex", "sourdough bread baking fermentation dough"], ["vec", "what is the step-by-step process for making sourdough bread from a starter"], ["vec", "how do you feed a sourdough starter and bake a loaf of sourdough bread at home"]]} +{"query": "what is the philosophy of aesthetics", "output": [["hyde", "Aesthetics is the branch of philosophy concerned with the nature of beauty, art, and taste. Kant argued that aesthetic judgments are subjective yet claim universal validity—when we call something beautiful, we expect others to agree. Hume held that taste varies but can be refined through experience and education."], ["lex", "aesthetics philosophy beauty art"], ["lex", "philosophy aesthetics theory judgment taste"], ["vec", "what is the philosophy of aesthetics and how does it define beauty and art"], ["vec", "how do philosophers like Kant and Hume approach questions of aesthetic judgment and taste"]]} +{"query": "what to pack for a hike?", "output": [["hyde", "The ten essentials for hiking: navigation (map/compass/GPS), sun protection, insulation (extra layers), illumination (headlamp), first aid kit, fire starter, repair tools, nutrition (extra food), hydration (extra water), and emergency shelter. Also bring a whistle, trekking poles, and broken-in boots."], ["lex", "hiking packing list gear essentials"], ["lex", "hiking pack checklist day hike"], ["vec", "what essential items should you pack for a day hike in the outdoors"], ["vec", "what gear and supplies do you need to bring on a hiking trip for safety and comfort"]]} +{"query": "what is the philosophy of existentialism?", "output": [["hyde", "Existentialism holds that existence precedes essence—humans are not born with a fixed nature but create themselves through choices. Sartre argued we are \"condemned to be free,\" fully responsible for our actions. Kierkegaard emphasized the anxiety of individual choice, while Camus explored the absurdity of seeking meaning in an indifferent universe."], ["lex", "existentialism philosophy Sartre Kierkegaard"], ["lex", "existentialism existence precedes essence freedom"], ["vec", "what is existentialist philosophy and what are its core claims about human freedom and meaning"], ["vec", "how did Sartre, Kierkegaard, and Camus define existentialism and its key ideas"]]} +{"query": "battery test", "output": [["hyde", "Test a 12V car battery with a multimeter set to DC volts. A fully charged battery reads 12.6V or higher. Between 12.0-12.4V indicates partial charge. Below 12.0V means the battery is discharged. For a load test, apply a load equal to half the CCA rating for 15 seconds—voltage should stay above 9.6V."], ["lex", "battery test multimeter voltage"], ["lex", "battery test car 12V load"], ["lex", "battery testing health capacity"], ["vec", "how to test a battery's charge level and health using a multimeter or load tester"], ["vec", "how to check if a car battery or device battery needs replacement"]]} +{"query": "what is hdr photography?", "output": [["hyde", "HDR (High Dynamic Range) photography combines multiple exposures of the same scene—typically 3-5 bracketed shots—to capture detail in both highlights and shadows. The images are merged using software like Photomatix or Lightroom, then tone-mapped to produce a single image with a wider dynamic range than a single exposure."], ["lex", "HDR photography high dynamic range"], ["lex", "HDR photo bracketing tone mapping"], ["vec", "what is HDR photography and how does it capture a wider range of light and shadow"], ["vec", "how do you shoot and process HDR photos using exposure bracketing and tone mapping"]]} +{"query": "what is the significance of literary awards?", "output": [["hyde", "Literary awards elevate authors' visibility and boost book sales—Booker Prize winners typically see a 600% increase in sales. Awards canonize works in literary culture, influence academic curricula, and bring attention to underrepresented voices. They also shape publishers' marketing strategies and readers' choices."], ["lex", "literary awards significance publishing"], ["lex", "literary prizes Nobel Pulitzer Booker impact"], ["vec", "why are literary awards significant for authors and the publishing industry"], ["vec", "how do prizes like the Nobel, Pulitzer, and Booker Prize affect book sales and literary reputation"]]} +{"query": "what is cubism?", "output": [["hyde", "Cubism, pioneered by Pablo Picasso and Georges Braque around 1907-1914, broke objects into geometric fragments and depicted multiple viewpoints simultaneously on a flat canvas. Analytic Cubism (1907-1912) deconstructed forms into monochrome facets. Synthetic Cubism (1912-1914) introduced collage, color, and simpler shapes."], ["lex", "Cubism art movement Picasso Braque"], ["lex", "Cubism painting geometric abstraction"], ["vec", "what is Cubism as an art movement and how did it change visual representation in painting"], ["vec", "how did Picasso and Braque develop Cubism and what are its defining visual characteristics"]]} +{"query": "cache hit", "output": [["hyde", "A cache hit occurs when the requested data is found in the cache layer, avoiding a slower lookup to the backing store. Hit rates above 90% typically indicate effective caching."], ["lex", "cache hit rate ratio"], ["lex", "CPU cache hit miss latency"], ["lex", "web cache hit response time"], ["vec", "what happens when data is found in cache memory"], ["vec", "how cache hits improve application performance versus cache misses"]]} +{"query": "current applications of machine learning in research", "output": [["hyde", "Machine learning is now routinely used in genomics for variant calling, in climate science for weather prediction, and in materials science for discovering novel compounds. Recent breakthroughs include protein structure prediction and automated literature review."], ["lex", "machine learning research applications 2025 2026"], ["lex", "ML models scientific research use cases"], ["lex", "deep learning academic research tools"], ["vec", "how is machine learning being applied in scientific research today"], ["vec", "what are the latest ways researchers use ML models in their studies"]]} +{"query": "how to plant a vegetable garden", "output": [["hyde", "Choose a site with 6-8 hours of direct sunlight. Amend the soil with compost, till to 12 inches deep, and plant seedlings after the last frost date. Space rows 18-24 inches apart depending on the crop."], ["lex", "vegetable garden planting steps"], ["lex", "backyard vegetable garden soil preparation"], ["lex", "raised bed vegetable garden layout"], ["vec", "what are the steps to start a vegetable garden from scratch"], ["vec", "how to prepare soil and plant vegetables for beginners"]]} +{"query": "how does existentialism view authenticity", "output": [["hyde", "For Sartre, authenticity means acknowledging radical freedom and refusing bad faith—the self-deception of pretending our choices are determined by external forces. Heidegger's Eigentlichkeit calls us to own our finitude rather than losing ourselves in das Man."], ["lex", "existentialism authenticity Sartre Heidegger"], ["lex", "authentic existence existentialist philosophy"], ["vec", "what does authenticity mean in existentialist philosophy"], ["vec", "how do existentialist thinkers define living an authentic life"]]} +{"query": "what is the great depression", "output": [["hyde", "The Great Depression began with the stock market crash of October 1929 and lasted until the late 1930s. Unemployment peaked at 25%, thousands of banks failed, and GDP fell by nearly 30%. The New Deal introduced federal relief programs."], ["lex", "Great Depression 1929 economic collapse"], ["lex", "Great Depression causes unemployment stock market crash"], ["vec", "what caused the Great Depression and how did it affect the economy"], ["vec", "what were the major events and consequences of the Great Depression in the 1930s"]]} +{"query": "what is the international court of justice", "output": [["hyde", "The International Court of Justice (ICJ) is the principal judicial organ of the United Nations, located in The Hague, Netherlands. It settles legal disputes between states and gives advisory opinions on questions referred by UN organs."], ["lex", "International Court of Justice ICJ United Nations"], ["lex", "ICJ jurisdiction Hague rulings"], ["vec", "what is the purpose and function of the International Court of Justice"], ["vec", "how does the ICJ at The Hague resolve disputes between countries"]]} +{"query": "what is influencer marketing", "output": [["hyde", "Influencer marketing is a strategy where brands partner with social media creators who have engaged followings to promote products. Campaigns may involve sponsored posts, affiliate links, or product reviews. ROI is measured through engagement rates, conversions, and reach."], ["lex", "influencer marketing social media brand promotion"], ["lex", "influencer campaigns Instagram TikTok sponsorship"], ["vec", "how does influencer marketing work for promoting brands on social media"], ["vec", "what is influencer marketing and why do companies pay content creators"]]} +{"query": "how to change a flat tire?", "output": [["hyde", "Loosen the lug nuts before jacking. Place the jack under the frame near the flat tire, raise the vehicle, remove the lug nuts, swap in the spare, hand-tighten the nuts in a star pattern, lower the car, then torque to 80-100 ft-lbs."], ["lex", "change flat tire steps jack lug nuts"], ["lex", "flat tire replacement spare wheel"], ["vec", "step-by-step instructions for changing a flat tire on the side of the road"], ["vec", "how to safely jack up a car and replace a flat tire with the spare"]]} +{"query": "what is the significance of the lotus in buddhism?", "output": [["hyde", "The lotus grows from muddy water yet blooms immaculately, symbolizing the journey from suffering to enlightenment. In Buddhist iconography, the Buddha is often depicted seated on a lotus throne, representing purity of mind arising from the world of samsara."], ["lex", "lotus flower Buddhism symbolism"], ["lex", "lotus Buddhist enlightenment purity"], ["vec", "why is the lotus flower an important symbol in Buddhism"], ["vec", "what does the lotus represent in Buddhist art and teachings"]]} +{"query": "code lint", "output": [["hyde", "A linter performs static analysis on source code to detect syntax errors, stylistic issues, and potential bugs without executing the program. Popular linters include ESLint for JavaScript, Pylint for Python, and Clippy for Rust."], ["lex", "code linter static analysis"], ["lex", "linting tools ESLint Pylint code quality"], ["lex", "lint rules syntax errors warnings"], ["vec", "what is code linting and how do linting tools check source code for errors"], ["vec", "how to set up a code linter for catching bugs and enforcing style rules"]]} +{"query": "what is content marketing", "output": [["hyde", "Content marketing focuses on creating and distributing valuable, relevant content—blog posts, videos, podcasts, whitepapers—to attract and retain a target audience. Rather than directly promoting a product, it builds authority and nurtures leads through the sales funnel."], ["lex", "content marketing strategy blog SEO"], ["lex", "content marketing audience engagement brand"], ["vec", "what is content marketing and how does it attract customers"], ["vec", "how do businesses use content marketing to drive traffic and build trust"]]} +{"query": "what is the meaning of hanukkah", "output": [["hyde", "Hanukkah commemorates the rededication of the Second Temple in Jerusalem after the Maccabean revolt against the Seleucid Empire in 164 BCE. The miracle of the oil—one day's supply lasting eight days—is celebrated by lighting the menorah each night."], ["lex", "Hanukkah meaning Jewish festival of lights"], ["lex", "Hanukkah menorah Maccabees temple rededication"], ["vec", "what is the history and significance of Hanukkah in Judaism"], ["vec", "why do Jewish people celebrate Hanukkah and what does it commemorate"]]} +{"query": "what is existential angst", "output": [["hyde", "Existential angst, or Angst, is the deep anxiety that arises from confronting freedom, mortality, and the absence of inherent meaning. Kierkegaard described it as the dizziness of freedom; Heidegger linked it to awareness of one's Being-toward-death."], ["lex", "existential angst anxiety Kierkegaard"], ["lex", "existential dread absurdity freedom"], ["vec", "what does existential angst mean in philosophy"], ["vec", "how do existentialist philosophers describe the feeling of existential anxiety"]]} +{"query": "how to style open shelves", "output": [["hyde", "Group items in odd numbers and vary heights. Mix functional pieces like dishes with decorative objects like plants or small art. Leave 30% of the shelf empty to avoid clutter. Use a consistent color palette to tie everything together."], ["lex", "open shelf styling tips decor"], ["lex", "kitchen open shelving arrangement display"], ["vec", "how to arrange and decorate open shelves so they look good"], ["vec", "what are tips for styling open shelves in a kitchen or living room"]]} +{"query": "linkedin profile", "output": [["hyde", "Your LinkedIn headline should go beyond your job title—include keywords and your value proposition. Use the summary section to tell your professional story in first person. Add a professional headshot; profiles with photos get 21x more views."], ["lex", "LinkedIn profile optimization headline"], ["lex", "LinkedIn profile tips summary photo"], ["lex", "LinkedIn profile writing professional"], ["vec", "how to create an effective LinkedIn profile that attracts recruiters"], ["vec", "what should you include in your LinkedIn profile headline and summary"]]} +{"query": "what are the benefits of yoga", "output": [["hyde", "Regular yoga practice improves flexibility, builds core strength, and lowers cortisol levels. Studies show it reduces chronic back pain, lowers blood pressure, and decreases symptoms of anxiety and depression. Even 20 minutes daily produces measurable benefits."], ["lex", "yoga benefits health flexibility stress"], ["lex", "yoga physical mental health advantages"], ["vec", "what are the physical and mental health benefits of practicing yoga regularly"], ["vec", "how does yoga improve flexibility, strength, and stress levels"]]} +{"query": "what is virtue ethics", "output": [["hyde", "Virtue ethics, rooted in Aristotle's Nicomachean Ethics, holds that morality centers on developing virtuous character traits—courage, temperance, justice, prudence—rather than following rules or calculating consequences. The goal is eudaimonia, or human flourishing."], ["lex", "virtue ethics Aristotle character moral"], ["lex", "virtue ethics eudaimonia moral philosophy"], ["vec", "what is virtue ethics and how does it differ from other moral theories"], ["vec", "how does Aristotle's virtue ethics define moral character and the good life"]]} +{"query": "how to calculate carbon emissions?", "output": [["hyde", "To calculate CO2 emissions, multiply the activity data (e.g., kWh of electricity, liters of fuel) by the appropriate emission factor. For gasoline: 2.31 kg CO2 per liter burned. For grid electricity, use the regional emission factor, typically 0.3-0.9 kg CO2/kWh."], ["lex", "carbon emissions calculation formula CO2"], ["lex", "carbon footprint calculator methodology"], ["vec", "how do you calculate the carbon emissions from energy use and transportation"], ["vec", "what formulas and data are used to measure carbon dioxide emissions"]]} +{"query": "how to start rock climbing", "output": [["hyde", "Start at an indoor climbing gym where you can rent shoes and a harness. Take a belay certification class to learn rope handling. Begin on easy routes graded V0-V1 for bouldering or 5.6-5.8 for top-rope. Focus on footwork over arm strength."], ["lex", "rock climbing beginner indoor gym"], ["lex", "rock climbing gear shoes harness belay"], ["vec", "how to get started with rock climbing as a complete beginner"], ["vec", "what equipment and skills do beginners need for indoor rock climbing"]]} +{"query": "how to create a moon garden?", "output": [["hyde", "A moon garden features white and pale-colored flowers, silver foliage, and night-blooming plants that glow under moonlight. Include moonflower (Ipomoea alba), white nicotiana, night-blooming jasmine, dusty miller, and lamb's ear. Add light-colored gravel paths for reflection."], ["lex", "moon garden white flowers night-blooming plants"], ["lex", "moon garden design layout fragrant plants"], ["vec", "how to plan and plant a garden designed to be enjoyed at night"], ["vec", "what plants and flowers work best in a moon garden"]]} +{"query": "what is the significance of the bildungsroman?", "output": [["hyde", "The bildungsroman, or coming-of-age novel, follows a protagonist's psychological and moral development from youth to adulthood. Examples include Goethe's Wilhelm Meister, Dickens' Great Expectations, and Joyce's A Portrait of the Artist as a Young Man."], ["lex", "bildungsroman coming-of-age novel literary genre"], ["lex", "bildungsroman significance literature examples"], ["vec", "what is a bildungsroman and why is it an important literary genre"], ["vec", "how does the bildungsroman novel trace a character's growth and development"]]} +{"query": "what is moral behavior", "output": [["hyde", "Moral behavior refers to actions that conform to standards of right conduct within a society or ethical framework. It involves making choices that consider the well-being of others, guided by principles such as fairness, honesty, empathy, and respect for autonomy."], ["lex", "moral behavior ethics right wrong conduct"], ["lex", "moral behavior definition philosophy psychology"], ["vec", "what defines moral behavior and how do people distinguish right from wrong"], ["vec", "what is moral behavior according to ethics and psychology"]]} +{"query": "how to use a rototiller?", "output": [["hyde", "Set the tilling depth to 6-8 inches for new beds. Walk slowly and let the tines do the work—don't force it forward. Make overlapping passes in parallel rows. Avoid tilling wet soil, which creates compaction. Clean tines after each use."], ["lex", "rototiller operation tilling soil garden"], ["lex", "rototiller how to use depth settings"], ["vec", "step-by-step instructions for using a rototiller to prepare garden soil"], ["vec", "how to operate a rototiller safely and effectively"]]} +{"query": "how to build a greenhouse?", "output": [["hyde", "Start with a level foundation of treated lumber or concrete blocks. Build the frame from galvanized steel or cedar. Cover with 8mm twin-wall polycarbonate panels, which insulate better than glass. Include ridge vents for airflow and a door on the south-facing end."], ["lex", "greenhouse build DIY construction plans"], ["lex", "greenhouse frame polycarbonate panels foundation"], ["vec", "how to build a small greenhouse in your backyard step by step"], ["vec", "what materials and design are needed to construct a DIY greenhouse"]]} +{"query": "how to handle sibling rivalry?", "output": [["hyde", "Avoid comparing siblings or taking sides. Acknowledge each child's feelings before mediating. Teach conflict resolution skills: use I-statements, take turns speaking, and brainstorm solutions together. Spend one-on-one time with each child to reduce jealousy."], ["lex", "sibling rivalry parenting tips conflict"], ["lex", "sibling fighting jealousy children strategies"], ["vec", "how can parents manage sibling rivalry and reduce fighting between children"], ["vec", "what strategies help siblings get along and resolve conflicts"]]} +{"query": "how to polish car paint?", "output": [["hyde", "Wash and clay bar the surface first. Apply a small amount of polishing compound to a foam pad on a dual-action polisher. Work in 2x2 foot sections at 1200-1500 RPM with medium pressure. Wipe residue with a microfiber towel, then apply sealant or wax."], ["lex", "car paint polish compound buffing"], ["lex", "auto paint polishing scratch removal swirl marks"], ["vec", "how to polish car paint to remove scratches and restore shine"], ["vec", "what is the correct technique for machine polishing automotive paint"]]} +{"query": "what is intrinsic value", "output": [["hyde", "In philosophy, intrinsic value is the worth something has in itself, independent of its usefulness. Kant argued that rational beings have intrinsic value as ends in themselves. In finance, intrinsic value refers to the calculated true worth of an asset based on fundamentals."], ["lex", "intrinsic value philosophy ethics"], ["lex", "intrinsic value stock valuation finance"], ["vec", "what does intrinsic value mean in philosophy and in finance"], ["vec", "how is intrinsic value defined as something valuable in itself regardless of consequences"]]} +{"query": "how to get rid of weeds naturally", "output": [["hyde", "Apply a 3-4 inch layer of mulch to suppress weed growth. Pour boiling water directly on weeds in cracks. Spray a mixture of white vinegar, salt, and dish soap on foliage in full sun. Hand-pull weeds after rain when roots come out easily."], ["lex", "natural weed killer organic herbicide"], ["lex", "remove weeds without chemicals mulch vinegar"], ["vec", "what are natural methods for killing and preventing weeds in a garden"], ["vec", "how to get rid of weeds without using chemical herbicides"]]} +{"query": "what is the concept of original sin", "output": [["hyde", "Original sin is the Christian doctrine that humanity inherited a sinful nature from Adam and Eve's disobedience in the Garden of Eden. Augustine of Hippo formalized the teaching, arguing that all humans are born in a state of sin, redeemable only through divine grace."], ["lex", "original sin Christian theology Adam Eve"], ["lex", "original sin doctrine fall of man"], ["vec", "what is original sin in Christian theology and where does the idea come from"], ["vec", "how does the concept of original sin explain human nature in Christianity"]]} +{"query": "how to build a successful brand", "output": [["hyde", "Define your brand's mission, values, and target audience. Develop a distinctive visual identity—logo, color palette, typography. Craft a consistent brand voice across all channels. Differentiate with a clear value proposition and deliver on your brand promise consistently."], ["lex", "brand building strategy identity positioning"], ["lex", "brand identity logo messaging target audience"], ["vec", "what steps are needed to build a strong and recognizable brand"], ["vec", "how do companies create a successful brand identity and positioning"]]} +{"query": "what are the teachings of the baha'i faith?", "output": [["hyde", "The Baha'i faith, founded by Baha'u'llah in 19th-century Persia, teaches the oneness of God, the oneness of religion, and the oneness of humanity. Core principles include elimination of prejudice, equality of men and women, universal education, and harmony of science and religion."], ["lex", "Baha'i faith teachings principles Baha'u'llah"], ["lex", "Baha'i beliefs unity humanity religion"], ["vec", "what are the core beliefs and teachings of the Baha'i faith"], ["vec", "what did Baha'u'llah teach about unity, equality, and world peace"]]} +{"query": "how to potty train a toddler?", "output": [["hyde", "Watch for readiness signs: staying dry for 2 hours, showing interest in the toilet, and communicating the need to go. Start with a child-sized potty, establish a routine after meals and naps, use positive reinforcement, and expect accidents—avoid punishment."], ["lex", "potty training toddler tips methods"], ["lex", "toddler toilet training readiness signs"], ["vec", "how to potty train a toddler and what are the signs of readiness"], ["vec", "what is the best approach to potty training a 2-year-old child"]]} +{"query": "how to reduce waste in everyday life?", "output": [["hyde", "Bring reusable bags, bottles, and containers when shopping. Buy in bulk to reduce packaging. Compost food scraps instead of sending them to landfill. Choose products with minimal packaging, repair items before replacing, and donate what you no longer need."], ["lex", "reduce waste zero waste lifestyle tips"], ["lex", "waste reduction recycling composting reuse"], ["vec", "what are practical ways to reduce household waste in daily life"], ["vec", "how can individuals cut down on trash and move toward zero waste living"]]} +{"query": "how international relations affect trade", "output": [["hyde", "Diplomatic relations directly shape trade flows through tariffs, sanctions, and trade agreements. Countries with strong bilateral ties negotiate favorable terms—like the USMCA between the US, Mexico, and Canada—while geopolitical tensions can trigger trade wars and export controls."], ["lex", "international relations trade policy tariffs"], ["lex", "geopolitics trade agreements bilateral multilateral"], ["vec", "how do international political relationships influence global trade and tariffs"], ["vec", "what is the connection between diplomacy and international trade policy"]]} +{"query": "what is business continuity planning", "output": [["hyde", "Business continuity planning (BCP) ensures an organization can maintain critical functions during and after a disruption. It includes risk assessment, identifying essential operations, establishing recovery time objectives, and defining procedures for communication, IT recovery, and alternate work sites."], ["lex", "business continuity planning BCP disaster recovery"], ["lex", "BCP risk assessment contingency plan"], ["vec", "what is a business continuity plan and why do organizations need one"], ["vec", "how do companies create a business continuity plan for disaster recovery"]]} +{"query": "how to have a successful playdate?", "output": [["hyde", "Keep playdates short—90 minutes is ideal for toddlers. Prepare a few structured activities but allow free play. Put away special toys to avoid conflicts. Have snacks ready, discuss allergies with the other parent beforehand, and supervise without hovering."], ["lex", "playdate tips children toddler socializing"], ["lex", "kids playdate activities hosting"], ["vec", "how to plan and host a successful playdate for young children"], ["vec", "what tips help make a playdate fun and smooth for kids and parents"]]} +{"query": "what are the major forms of poetry?", "output": [["hyde", "Major poetic forms include the sonnet (14 lines, iambic pentameter), haiku (3 lines, 5-7-5 syllables), epic (long narrative), ballad (storytelling with rhyme), ode (lyrical praise), limerick (humorous five-line form), villanelle (19 lines with refrains), and free verse (no fixed structure)."], ["lex", "poetry forms types sonnet haiku epic"], ["lex", "poetic forms verse structures literary"], ["vec", "what are the main types and forms of poetry in literature"], ["vec", "how do different poetry forms like sonnets, haiku, and free verse differ"]]} +{"query": "when to plant tulip bulbs?", "output": [["hyde", "Plant tulip bulbs in fall, 6-8 weeks before the ground freezes—typically October to November in most zones. Set bulbs 6-8 inches deep, pointed end up, spaced 4-6 inches apart. They need a cold period of 12-16 weeks to bloom in spring."], ["lex", "tulip bulbs planting time season fall"], ["lex", "tulip bulb planting depth spacing"], ["vec", "what time of year should you plant tulip bulbs for spring blooms"], ["vec", "when is the best season to plant tulips and how deep should the bulbs go"]]} +{"query": "where to buy raised garden beds?", "output": [["hyde", "Raised garden beds are available at Home Depot, Lowe's, and garden centers. Online retailers like Gardener's Supply, Amazon, and Birdies offer metal and cedar kits. Cedar is rot-resistant and long-lasting; galvanized steel beds are durable and modern-looking."], ["lex", "raised garden beds buy online store"], ["lex", "raised bed garden kits cedar metal"], ["vec", "where can I buy raised garden beds and what materials are best"], ["vec", "what are the best places to purchase raised bed garden kits"]]} +{"query": "how to plant a tree properly?", "output": [["hyde", "Dig a hole 2-3 times wider than the root ball but only as deep. Set the tree so the root flare sits at ground level. Backfill with native soil, water deeply, and apply 2-4 inches of mulch in a ring, keeping it away from the trunk to prevent rot."], ["lex", "tree planting technique hole depth root ball"], ["lex", "plant tree correctly mulch watering"], ["vec", "what is the correct way to plant a tree so it grows healthy"], ["vec", "how deep and wide should the hole be when planting a new tree"]]} +{"query": "what is the role of enzymes in digestion", "output": [["hyde", "Digestive enzymes catalyze the breakdown of macronutrients into absorbable units. Amylase in saliva and the pancreas breaks starch into sugars. Pepsin in the stomach cleaves proteins. Lipase from the pancreas breaks fats into fatty acids and glycerol in the small intestine."], ["lex", "enzymes digestion amylase protease lipase"], ["lex", "digestive enzymes stomach intestine breakdown"], ["vec", "how do enzymes help break down food during the digestive process"], ["vec", "what role do specific enzymes like amylase and protease play in digestion"]]} +{"query": "what to wear for rock climbing", "output": [["hyde", "Wear stretchy, moisture-wicking pants or shorts that allow full range of motion. Choose a fitted athletic shirt—avoid loose fabric that catches on holds. Climbing shoes should fit snugly. Bring a chalk bag for grip and a harness for roped routes."], ["lex", "rock climbing clothing gear outfit"], ["lex", "climbing shoes harness chalk bag apparel"], ["vec", "what clothes and gear should you wear for indoor or outdoor rock climbing"], ["vec", "what is the best clothing to wear when rock climbing for comfort and safety"]]} +{"query": "latest uses of bioinformatics in research", "output": [["hyde", "Recent bioinformatics advances include single-cell RNA sequencing analysis pipelines, AlphaFold-based protein structure prediction for drug targets, CRISPR off-target analysis algorithms, and large-scale metagenomic assembly for microbiome studies."], ["lex", "bioinformatics research applications 2025 2026"], ["lex", "bioinformatics genomics proteomics computational biology"], ["vec", "how is bioinformatics being used in current scientific research"], ["vec", "what are the newest bioinformatics tools and applications in genomics and drug discovery"]]} +{"query": "how the scientific community addresses research bias", "output": [["hyde", "To combat research bias, journals require pre-registration of study protocols, blinded peer review, and reporting of negative results. Replication studies verify findings. Statistical safeguards like p-value corrections and effect size reporting reduce publication bias."], ["lex", "research bias scientific community peer review"], ["lex", "scientific bias mitigation replication reproducibility"], ["vec", "how do scientists identify and reduce bias in research studies"], ["vec", "what methods does the scientific community use to address research bias and ensure reproducibility"]]} +{"query": "what is ethical dilemma in real life", "output": [["hyde", "A common ethical dilemma is discovering a coworker falsifying expense reports—report them and risk the relationship, or stay silent and condone dishonesty. Other examples include whistleblowing, end-of-life medical decisions, and allocating scarce resources during emergencies."], ["lex", "ethical dilemma real life examples"], ["lex", "moral dilemma everyday situations conflict"], ["vec", "what are examples of ethical dilemmas people face in everyday life"], ["vec", "how do real-life ethical dilemmas force people to choose between conflicting values"]]} +{"query": "best techniques for street photography", "output": [["hyde", "Shoot at f/8 for deep depth of field and zone focus at 3 meters for quick candid shots. Use a 28mm or 35mm lens. Anticipate moments—find good light or backgrounds and wait for subjects to enter the frame. Shoot from the hip to stay inconspicuous."], ["lex", "street photography techniques composition tips"], ["lex", "street photography candid camera settings"], ["vec", "what are the best techniques for capturing compelling street photographs"], ["vec", "how do street photographers take candid shots of people in public spaces"]]} +{"query": "how to become a researcher", "output": [["hyde", "Start with an undergraduate degree in your field, seek research assistant positions, and publish early. Apply to graduate programs for a master's or PhD. Build a publication record, attend conferences, and network with established researchers. Postdoctoral positions lead to faculty or industry research roles."], ["lex", "become researcher academic career path"], ["lex", "research career PhD graduate school publish"], ["vec", "what steps do you need to take to become a professional researcher"], ["vec", "how do you build a career in academic or scientific research"]]} +{"query": "web socket", "output": [["hyde", "WebSocket provides full-duplex communication over a single TCP connection. After an HTTP upgrade handshake, client and server can send messages in both directions without polling. Use `new WebSocket('ws://host/path')` on the client and a library like ws on the server."], ["lex", "WebSocket protocol real-time connection"], ["lex", "WebSocket API JavaScript server client"], ["lex", "WebSocket vs HTTP persistent connection"], ["vec", "how do WebSockets work for real-time bidirectional communication"], ["vec", "how to implement a WebSocket connection between a client and server"]]} +{"query": "what is lean manufacturing", "output": [["hyde", "Lean manufacturing, derived from the Toyota Production System, aims to minimize waste (muda) while maximizing value. Its five principles: define value from the customer's perspective, map the value stream, create flow, establish pull, and pursue perfection through continuous improvement (kaizen)."], ["lex", "lean manufacturing Toyota production system"], ["lex", "lean manufacturing waste reduction kaizen"], ["vec", "what is lean manufacturing and what principles does it follow"], ["vec", "how does lean manufacturing eliminate waste and improve production efficiency"]]} +{"query": "what are writing prompts?", "output": [["hyde", "Writing prompts are short scenarios, questions, or opening lines designed to spark creative writing. Examples: \"Write about a door that appeared overnight\" or \"Describe your earliest memory from a stranger's perspective.\" They help overcome writer's block and build a daily writing habit."], ["lex", "writing prompts creative fiction ideas"], ["lex", "writing prompts exercises journal story starters"], ["vec", "what are writing prompts and how do writers use them for inspiration"], ["vec", "how do writing prompts help overcome writer's block and spark creativity"]]} +{"query": "how to capture bokeh effect", "output": [["hyde", "Use a wide aperture (f/1.4 to f/2.8) to create shallow depth of field. A fast prime lens like a 50mm f/1.8 or 85mm f/1.4 produces smooth bokeh. Increase the distance between subject and background, and get close to your subject for maximum blur."], ["lex", "bokeh effect photography aperture lens"], ["lex", "bokeh background blur shallow depth of field"], ["vec", "how to achieve a bokeh effect with blurred background in photography"], ["vec", "what camera settings and lenses produce the best bokeh"]]} +{"query": "what is a controlled experiment", "output": [["hyde", "A controlled experiment tests a hypothesis by changing one independent variable while keeping all other conditions constant. The control group receives no treatment, while the experimental group does. Comparing outcomes isolates the effect of the variable being tested."], ["lex", "controlled experiment scientific method variables"], ["lex", "control group experimental group independent variable"], ["vec", "what is a controlled experiment and how does it work in science"], ["vec", "how do scientists set up control and experimental groups in a controlled experiment"]]} +{"query": "what is telemedicine", "output": [["hyde", "Telemedicine uses video calls, phone consultations, and remote monitoring to deliver healthcare without in-person visits. Patients can consult doctors from home for diagnoses, prescriptions, and follow-ups. It expanded rapidly during COVID-19 and now covers specialties from dermatology to psychiatry."], ["lex", "telemedicine telehealth virtual doctor visit"], ["lex", "telemedicine remote healthcare video consultation"], ["vec", "what is telemedicine and how does it deliver healthcare remotely"], ["vec", "how do patients use telemedicine for virtual doctor appointments"]]} +{"query": "what are the teachings of jainism", "output": [["hyde", "Jainism, taught by Mahavira in the 6th century BCE, centers on ahimsa (non-violence), satya (truth), and aparigraha (non-attachment). Jains believe the soul is eternal, bound by karma accumulated through actions. Liberation (moksha) is achieved through right faith, right knowledge, and right conduct."], ["lex", "Jainism teachings principles ahimsa karma"], ["lex", "Jain philosophy non-violence Mahavira"], ["vec", "what are the core teachings and beliefs of Jainism"], ["vec", "what did Mahavira teach about non-violence and the path to liberation in Jainism"]]} +{"query": "what is sustainable living", "output": [["hyde", "Sustainable living means reducing your environmental impact by consuming fewer resources, choosing renewable energy, eating locally, minimizing waste, and favoring durable goods over disposable ones. It applies to housing, transportation, food, clothing, and daily consumption habits."], ["lex", "sustainable living eco-friendly lifestyle"], ["lex", "sustainable living reduce reuse recycle carbon footprint"], ["vec", "what does sustainable living mean and how can people practice it"], ["vec", "what are the key principles and habits of a sustainable lifestyle"]]} +{"query": "xml parse", "output": [["hyde", "To parse XML in Python, use `xml.etree.ElementTree`: `tree = ET.parse('file.xml'); root = tree.getroot()`. For streaming large files, use SAX with `xml.sax`. In JavaScript, use `DOMParser` or libraries like `fast-xml-parser`."], ["lex", "XML parser parsing library"], ["lex", "XML DOM SAX parser programming"], ["lex", "XML parse Python JavaScript Java"], ["vec", "how to parse XML documents programmatically in different languages"], ["vec", "what are the common methods for reading and parsing XML files in code"]]} +{"query": "how does compound interest work", "output": [["hyde", "Compound interest is calculated on both the principal and accumulated interest. The formula is A = P(1 + r/n)^(nt), where P is principal, r is annual rate, n is compounding frequency, and t is time in years. Monthly compounding on $10,000 at 5% yields $16,470 after 10 years."], ["lex", "compound interest formula calculation rate"], ["lex", "compound interest savings investment growth"], ["vec", "how does compound interest grow money over time compared to simple interest"], ["vec", "what is the formula for compound interest and how is it calculated"]]} +{"query": "what is the role of reason in ethics", "output": [["hyde", "Kant held that reason alone can determine moral duty through the categorical imperative: act only according to maxims you could universalize. Rationalist ethics contrasts with sentimentalism (Hume), which grounds morality in emotion rather than rational deliberation."], ["lex", "reason ethics moral philosophy rationalism"], ["lex", "reason morality Kant rational ethical judgment"], ["vec", "what role does reason play in making moral and ethical decisions"], ["vec", "how do philosophers like Kant argue that reason is the foundation of ethics"]]} +{"query": "videography tips", "output": [["hyde", "Stabilize shots with a gimbal or tripod. Follow the rule of thirds for framing. Shoot at 24fps for cinematic feel or 60fps for smooth slow motion. Use three-point lighting. Record clean audio separately with a lavalier or shotgun mic—audio quality matters more than resolution."], ["lex", "videography tips filming techniques camera"], ["lex", "video production shooting composition stabilization"], ["vec", "what are practical tips for improving videography and video shooting quality"], ["vec", "how to shoot better video with camera movement, lighting, and composition techniques"]]} +{"query": "how to choose a daycare?", "output": [["hyde", "Visit multiple centers and observe interactions between staff and children. Check the staff-to-child ratio (1:4 for infants is ideal), licensing status, cleanliness, and safety measures. Ask about daily routines, curriculum, discipline policies, and staff qualifications and turnover."], ["lex", "daycare choose selection criteria childcare"], ["lex", "daycare center evaluation safety ratio"], ["vec", "what should parents look for when choosing a daycare for their child"], ["vec", "how to evaluate and compare daycare centers for quality and safety"]]} +{"query": "how to replace car alternator?", "output": [["hyde", "Disconnect the negative battery terminal. Remove the serpentine belt by releasing the tensioner. Unplug the electrical connectors and unbolt the alternator. Install the new unit, reconnect the wiring, route the belt back on, and reconnect the battery. Test by checking voltage at 13.5-14.5V."], ["lex", "replace car alternator DIY steps"], ["lex", "alternator replacement belt removal installation"], ["vec", "step-by-step instructions for replacing a car alternator yourself"], ["vec", "how to remove and install a new alternator in a vehicle"]]} +{"query": "how to create a youtube channel", "output": [["hyde", "Sign in to YouTube with a Google account, click Create a Channel, and choose your channel name. Upload a profile picture and banner. Write a channel description with keywords. Plan a content schedule, create your first video, and optimize titles, thumbnails, and tags for search."], ["lex", "create YouTube channel setup steps"], ["lex", "YouTube channel start grow subscribers content"], ["vec", "how to set up and launch a new YouTube channel from scratch"], ["vec", "what steps do you need to take to create and grow a YouTube channel"]]} +{"query": "what is dualism in mind-body philosophy", "output": [["hyde", "Cartesian dualism, proposed by René Descartes, holds that mind and body are two distinct substances: res cogitans (thinking substance) and res extensa (extended substance). The mind is non-physical and conscious; the body is physical and mechanistic. Their interaction remains the central problem."], ["lex", "mind-body dualism Descartes substance"], ["lex", "dualism philosophy of mind mental physical"], ["vec", "what is mind-body dualism and how does Descartes explain the relationship between mind and body"], ["vec", "how does dualism in philosophy argue that mind and body are separate substances"]]} +{"query": "what is cliffhanger?", "output": [["hyde", "A cliffhanger is a narrative device that ends a chapter, episode, or story at a moment of high suspense, leaving the outcome unresolved. It compels the audience to continue reading or watching. The term originates from serialized fiction where characters were literally left hanging from cliffs."], ["lex", "cliffhanger literary device narrative suspense"], ["lex", "cliffhanger ending story plot tension"], ["vec", "what is a cliffhanger in storytelling and how does it create suspense"], ["vec", "how do writers use cliffhangers to keep readers or viewers engaged"]]} +{"query": "how to volunteer for civic initiatives", "output": [["hyde", "Check your city's website or community board for volunteer openings on advisory committees, park cleanups, and voter registration drives. Organizations like VolunteerMatch and local nonprofits connect volunteers with civic projects. Attend town hall meetings to learn about current needs."], ["lex", "volunteer civic initiatives community service"], ["lex", "volunteering local government community projects"], ["vec", "how can someone find and volunteer for civic engagement and community initiatives"], ["vec", "what are ways to get involved in local civic volunteer opportunities"]]} +{"query": "how does hinduism view the divine cycle of creation?", "output": [["hyde", "In Hindu cosmology, creation is cyclical. Brahma creates the universe, Vishnu preserves it, and Shiva destroys it so it can be reborn. Each cycle spans a kalpa (4.32 billion years). The universe undergoes endless cycles of srishti (creation), sthiti (preservation), and pralaya (dissolution)."], ["lex", "Hinduism creation cycle Brahma Vishnu Shiva"], ["lex", "Hindu cosmology srishti sthiti pralaya"], ["vec", "how does Hinduism explain the cosmic cycle of creation, preservation, and destruction"], ["vec", "what is the Hindu view of the divine cycle involving Brahma, Vishnu, and Shiva"]]} +{"query": "what is consequentialist ethics", "output": [["hyde", "Consequentialism judges actions solely by their outcomes. The most influential form, utilitarianism (Bentham, Mill), holds that the right action maximizes overall happiness or well-being. Unlike deontology, which focuses on duties and rules, consequentialism permits any action if the results are good."], ["lex", "consequentialism ethics utilitarianism outcomes"], ["lex", "consequentialist moral theory consequences actions"], ["vec", "what is consequentialist ethics and how does it judge the morality of actions"], ["vec", "how does consequentialism differ from deontological ethics in evaluating right and wrong"]]} +{"query": "how to promote environmental awareness?", "output": [["hyde", "Organize community cleanups, host documentary screenings, and partner with schools for environmental education programs. Use social media campaigns with clear calls to action. Start a local recycling or composting initiative. Create informational signage at parks and public spaces."], ["lex", "environmental awareness promotion education campaigns"], ["lex", "promote environmental sustainability community outreach"], ["vec", "how can individuals and organizations promote environmental awareness in their communities"], ["vec", "what are effective strategies for raising public awareness about environmental issues"]]} +{"query": "how to practice self-love", "output": [["hyde", "Practice self-love by setting boundaries, speaking to yourself with kindness, and prioritizing rest without guilt. Journal about what you appreciate about yourself. Replace self-criticism with curiosity: ask \"what do I need right now?\" instead of \"what's wrong with me?\""], ["lex", "self-love self-care practices mental health"], ["lex", "self-love habits self-compassion boundaries"], ["vec", "what are practical ways to practice self-love and self-compassion daily"], ["vec", "how to build self-love through healthy habits and positive self-talk"]]} +{"query": "what is companion planting with vegetables", "output": [["hyde", "Companion planting pairs vegetables that benefit each other. Basil planted near tomatoes repels aphids and may improve flavor. Marigolds deter nematodes around most vegetables. The Three Sisters—corn, beans, and squash—is a classic trio: corn supports beans, beans fix nitrogen, squash shades soil."], ["lex", "companion planting vegetables garden chart"], ["lex", "companion planting tomato basil marigold"], ["vec", "what is companion planting and which vegetables grow well together"], ["vec", "how does companion planting benefit vegetable gardens and deter pests"]]} +{"query": "how to set achievable goals?", "output": [["hyde", "Use the SMART framework: Specific (define exactly what you want), Measurable (quantify progress), Achievable (within your capabilities), Relevant (aligned with larger objectives), Time-bound (set a deadline). Break large goals into weekly milestones and track progress visually."], ["lex", "set achievable goals SMART goal setting"], ["lex", "goal setting strategy actionable realistic"], ["vec", "how to set realistic and achievable goals using the SMART framework"], ["vec", "what techniques help people set goals they can actually accomplish"]]} +{"query": "how do scientists study animal behavior", "output": [["hyde", "Ethologists use direct observation, video tracking, and GPS telemetry to study animal behavior in natural habitats. Lab experiments control variables to test hypotheses about cognition and social behavior. Focal sampling follows one individual; scan sampling records group behavior at intervals."], ["lex", "animal behavior study ethology methods"], ["lex", "animal behavior research observation field experiments"], ["vec", "what methods do scientists use to study and analyze animal behavior"], ["vec", "how do ethologists observe and research animal behavior in the wild and in labs"]]} +{"query": "how to maintain motivation through challenges?", "output": [["hyde", "Break the challenge into small wins to maintain a sense of progress. Revisit your original purpose—why did you start? Celebrate incremental achievements. Build accountability through a partner or group. Accept setbacks as data rather than failure, and adjust your approach rather than your goal."], ["lex", "maintain motivation challenges resilience"], ["lex", "staying motivated difficult times strategies"], ["vec", "how to stay motivated when facing setbacks and difficult challenges"], ["vec", "what strategies help maintain motivation during tough periods in life or work"]]} +{"query": "what is the philosophy of mind", "output": [["hyde", "Philosophy of mind investigates the nature of consciousness, mental states, and their relationship to the physical brain. Central questions include the hard problem of consciousness (why subjective experience exists), whether mental states reduce to brain states, and the nature of intentionality and qualia."], ["lex", "philosophy of mind consciousness mental states"], ["lex", "philosophy of mind problem qualia dualism physicalism"], ["vec", "what is the philosophy of mind and what questions does it explore"], ["vec", "how does philosophy of mind address consciousness, mental states, and the mind-body problem"]]} +{"query": "enum class", "output": [["hyde", "In C++11, `enum class` creates a scoped, strongly typed enumeration. Unlike plain enums, values don't implicitly convert to int and must be accessed with the scope operator: `enum class Color { Red, Green, Blue }; Color c = Color::Red;`"], ["lex", "enum class C++ Java strongly typed"], ["lex", "enum class Python enumeration members"], ["lex", "enum class scoped enumeration"], ["vec", "how to define and use enum classes in C++ or Java for type-safe enumerations"], ["vec", "what is the difference between an enum and an enum class in C++"]]} +{"query": "how to sell art on etsy?", "output": [["hyde", "Create an Etsy seller account and set up your shop with a clear brand name and banner. Photograph art in natural light with a neutral background. Write detailed listings with keywords buyers search for. Price to cover materials, time, Etsy fees (6.5%), and shipping. Offer prints alongside originals."], ["lex", "sell art Etsy shop setup listing"], ["lex", "Etsy art shop pricing shipping prints"], ["vec", "how to set up an Etsy shop to sell original art and prints"], ["vec", "what tips help artists successfully sell artwork on Etsy"]]} +{"query": "what is virtue epistemology", "output": [["hyde", "Virtue epistemology evaluates beliefs based on the intellectual character of the knower rather than just the properties of the belief. Ernest Sosa's reliabilism treats virtues as reliable cognitive faculties; Linda Zagzebski's responsibilism focuses on traits like open-mindedness, intellectual courage, and thoroughness."], ["lex", "virtue epistemology intellectual virtues knowledge"], ["lex", "virtue epistemology Sosa Zagzebski epistemic"], ["vec", "what is virtue epistemology and how does it differ from traditional theories of knowledge"], ["vec", "how does virtue epistemology evaluate knowledge based on intellectual character traits"]]} +{"query": "what is ethical egoism", "output": [["hyde", "Ethical egoism holds that agents ought to act in their own self-interest. Unlike psychological egoism (a descriptive claim that people always act selfishly), ethical egoism is normative—it prescribes self-interest as the moral standard. Ayn Rand's rational self-interest is a well-known variant."], ["lex", "ethical egoism moral theory self-interest"], ["lex", "ethical egoism Ayn Rand rational selfishness"], ["vec", "what is ethical egoism and how does it differ from psychological egoism"], ["vec", "how does ethical egoism argue that acting in self-interest is morally right"]]} +{"query": "tech fix", "output": [["hyde", "Start with a restart—it resolves most transient issues. Clear browser cache for web problems. Check cables and connections for hardware failures. Update drivers and firmware. For persistent crashes, check event logs and run diagnostics. Factory reset as a last resort after backing up data."], ["lex", "tech troubleshooting fix repair computer"], ["lex", "technology fix common problems software hardware"], ["lex", "tech support fix device issue"], ["vec", "how to troubleshoot and fix common technology problems with computers and devices"], ["vec", "what are basic tech fixes for common software and hardware issues"]]} +{"query": "how to evaluate scientific sources", "output": [["hyde", "Check if the study is published in a peer-reviewed journal with an impact factor. Examine the sample size, methodology, and statistical analysis. Look for conflicts of interest in funding disclosures. Verify the authors' credentials and institutional affiliations. Check citation count and whether results have been replicated."], ["lex", "evaluate scientific sources credibility peer-reviewed"], ["lex", "scientific source evaluation criteria journal"], ["vec", "how to evaluate whether a scientific source or study is credible and reliable"], ["vec", "what criteria should you use to assess the quality of scientific research papers"]]} +{"query": "what is taoism", "output": [["hyde", "Taoism (Daoism) is a Chinese philosophical and spiritual tradition rooted in the Tao Te Ching by Lao Tzu. The Tao (\"the Way\") is the fundamental, nameless force underlying all things. Core concepts include wu wei (effortless action), yin-yang balance, simplicity, and harmony with nature."], ["lex", "Taoism Daoism Lao Tzu Tao Te Ching"], ["lex", "Taoism philosophy wu wei yin yang"], ["vec", "what are the core beliefs and principles of Taoism"], ["vec", "what did Lao Tzu teach in the Tao Te Ching about the way and harmony with nature"]]} +{"query": "how neural networks function", "output": [["hyde", "A neural network processes input through layers of interconnected neurons. Each neuron computes a weighted sum of its inputs, applies an activation function (ReLU, sigmoid), and passes the result forward. Training uses backpropagation to adjust weights by computing gradients of the loss function."], ["lex", "neural network layers neurons weights backpropagation"], ["lex", "neural network deep learning forward pass activation"], ["vec", "how do artificial neural networks process data and learn from training"], ["vec", "what is the architecture and learning mechanism of a neural network"]]} +{"query": "how to maintain a bonsai tree?", "output": [["hyde", "Water bonsai when the top half-inch of soil feels dry—never on a schedule. Place in bright indirect light for indoor species or full sun for outdoor varieties. Prune new growth to maintain shape. Repot every 2-3 years in spring using well-draining akadama-based soil. Fertilize biweekly during growing season."], ["lex", "bonsai tree care maintenance watering pruning"], ["lex", "bonsai trimming repotting soil fertilizer"], ["vec", "how to properly care for and maintain a bonsai tree at home"], ["vec", "what are the watering, pruning, and soil requirements for bonsai trees"]]} +{"query": "what role does language play in philosophy", "output": [["hyde", "The linguistic turn of the 20th century made language central to philosophy. Wittgenstein argued that philosophical problems arise from misunderstandings of language. Analytic philosophers examine how meaning, reference, and truth conditions work. Ordinary language philosophy holds that everyday usage resolves many metaphysical puzzles."], ["lex", "language philosophy linguistic turn Wittgenstein"], ["lex", "philosophy of language meaning reference semantics"], ["vec", "what role does language play in philosophical inquiry and analysis"], ["vec", "how did Wittgenstein and analytic philosophers view the relationship between language and thought"]]} +{"query": "how to fight pests organically", "output": [["hyde", "Spray neem oil or insecticidal soap to kill soft-bodied pests like aphids and whiteflies. Introduce beneficial insects: ladybugs eat aphids, parasitic wasps target caterpillars. Use row covers to physically exclude pests. Apply diatomaceous earth around plant bases for slugs and beetles."], ["lex", "organic pest control garden insects"], ["lex", "organic pesticide neem oil insecticidal soap"], ["vec", "how to control garden pests using organic and natural methods"], ["vec", "what organic pest control methods work for vegetable gardens"]]} +{"query": "what is the role of research institutions", "output": [["hyde", "Research institutions—universities, government labs, and private research organizations—drive scientific progress through funded investigations, peer-reviewed publications, and training of new researchers. They provide infrastructure (labs, equipment, libraries), facilitate collaboration, and translate findings into real-world applications."], ["lex", "research institutions universities role science"], ["lex", "research institutions funding labs innovation"], ["vec", "what role do research institutions and universities play in advancing science"], ["vec", "how do research institutions contribute to knowledge creation and innovation"]]} +{"query": "what is narrative ethics", "output": [["hyde", "Narrative ethics holds that moral understanding is shaped by the stories we tell and hear. Rather than abstract principles, it emphasizes particular cases and lived experience. Literature, patient narratives in medicine, and personal testimony illuminate moral complexity that rules-based ethics may miss."], ["lex", "narrative ethics storytelling moral philosophy"], ["lex", "narrative ethics literature moral reasoning"], ["vec", "what is narrative ethics and how does storytelling relate to moral understanding"], ["vec", "how do narrative ethicists use stories and literature to explore moral questions"]]} +{"query": "ai ops", "output": [["hyde", "AIOps (Artificial Intelligence for IT Operations) applies machine learning to IT operations data—logs, metrics, events—to detect anomalies, predict outages, and automate incident response. Platforms like Datadog, Splunk, and Moogsoft correlate alerts to reduce noise and speed up root cause analysis."], ["lex", "AIOps artificial intelligence IT operations"], ["lex", "AIOps monitoring anomaly detection automation"], ["lex", "AIOps MLOps machine learning operations"], ["vec", "what is AIOps and how does AI improve IT operations management"], ["vec", "how do AIOps platforms use machine learning for monitoring and incident response"]]} +{"query": "how to negotiate a business deal", "output": [["hyde", "Prepare by researching the other party's priorities and constraints. Define your BATNA (best alternative to a negotiated agreement) and walk-away point. Open with an ambitious but defensible anchor. Listen more than you talk. Focus on interests, not positions, to find creative win-win solutions."], ["lex", "negotiate business deal tactics strategy"], ["lex", "business negotiation skills contract terms"], ["vec", "what are effective strategies for negotiating a business deal successfully"], ["vec", "how to prepare for and conduct a business negotiation to reach a favorable agreement"]]} +{"query": "how to protest peacefully", "output": [["hyde", "Know your rights: peaceful assembly is protected by the First Amendment. Organize with clear goals, designated marshals, and a planned route. Coordinate with local authorities for permits. Bring water, ID, and emergency contacts. Stay nonviolent, document with video, and have legal observers present."], ["lex", "peaceful protest demonstration rights organizing"], ["lex", "nonviolent protest civil disobedience activism"], ["vec", "how to organize and participate in a peaceful protest effectively"], ["vec", "what are the principles and logistics of peaceful demonstration and nonviolent activism"]]} +{"query": "how to start oil painting?", "output": [["hyde", "Start with a basic set of oil paints: titanium white, cadmium yellow, cadmium red, ultramarine blue, and burnt umber. Use medium-grade bristle brushes in sizes 4, 8, and 12. Work on pre-primed canvas. Thin early layers with odorless mineral spirits and use linseed oil for later layers (fat over lean)."], ["lex", "oil painting beginner supplies techniques"], ["lex", "oil painting start canvas brushes paints medium"], ["vec", "how to get started with oil painting as a beginner"], ["vec", "what supplies and techniques do beginners need to start oil painting"]]} +{"query": "what is the significance of archetypes?", "output": [["hyde", "Carl Jung described archetypes as universal, inherited patterns in the collective unconscious—the Hero, the Shadow, the Trickster, the Great Mother. They recur across myths, dreams, and stories worldwide because they reflect fundamental human experiences and psychological structures shared by all cultures."], ["lex", "archetypes Carl Jung collective unconscious"], ["lex", "archetypes significance literature psychology"], ["vec", "what is the significance of archetypes in psychology and literature"], ["vec", "how did Carl Jung define archetypes and why do they appear across cultures"]]} +{"query": "how to mix colors in oil painting?", "output": [["hyde", "Mix on a glass or wood palette using a palette knife for clean blends. Start with the lighter color and add the darker one gradually. To mute a color, mix in its complement: add green to red, purple to yellow. Mix value (light/dark) separately from hue for better control."], ["lex", "oil painting color mixing palette technique"], ["lex", "mix oil paint colors complementary warm cool"], ["vec", "how to mix oil paint colors to achieve the right hues and values"], ["vec", "what is the proper technique for blending and mixing colors in oil painting"]]} +{"query": "how do different religions define good and evil?", "output": [["hyde", "Christianity frames evil as separation from God through sin, with goodness as alignment with divine will. Islam teaches that evil arises from disobeying Allah's commands. Buddhism sees evil as rooted in ignorance, greed, and hatred rather than a cosmic force. Hinduism links good and evil to dharma and karma."], ["lex", "good evil religion definition theology"], ["lex", "good evil Christianity Islam Buddhism Hinduism"], ["vec", "how do different world religions define and explain the concepts of good and evil"], ["vec", "what are the religious perspectives on good versus evil across Christianity, Islam, Buddhism, and Hinduism"]]} +{"query": "sail boat", "output": [["hyde", "Sailboats are propelled by wind acting on sails. Common types include dinghies (small, single-hull), keelboats (weighted keel for stability), catamarans (twin hulls), and sloops (single mast, fore-and-aft rigged). Key parts include the hull, mast, boom, jib, mainsail, rudder, and keel."], ["lex", "sailboat sailing types rigging"], ["lex", "sailboat buy beginner learn to sail"], ["lex", "sailboat parts hull keel mast"], ["vec", "what are the different types of sailboats and how do they work"], ["vec", "how to get started with sailboat sailing as a beginner"]]} +{"query": "how crispr technology works", "output": [["hyde", "CRISPR-Cas9 uses a guide RNA (gRNA) complementary to the target DNA sequence. The gRNA directs the Cas9 nuclease to the precise genomic location, where it creates a double-strand break. The cell's repair machinery then either disrupts the gene (NHEJ) or inserts a new sequence (HDR) using a provided template."], ["lex", "CRISPR Cas9 gene editing mechanism"], ["lex", "CRISPR technology DNA guide RNA"], ["vec", "how does CRISPR-Cas9 gene editing technology work at the molecular level"], ["vec", "what is the mechanism by which CRISPR cuts and edits DNA sequences"]]} +{"query": "hair cut", "output": [["hyde", "Popular haircuts include the bob, pixie cut, and layers for women, and the fade, crew cut, and textured crop for men. Choose based on face shape: round faces suit angular cuts, long faces benefit from volume at the sides. Bring reference photos to your appointment for clear communication."], ["lex", "haircut styles men women trends"], ["lex", "haircut salon barbershop near me"], ["lex", "haircut techniques layered fade trim"], ["vec", "what are the popular haircut styles and how to choose the right one"], ["vec", "how to communicate what haircut you want to a stylist or barber"]]} +{"query": "how to develop an art portfolio?", "output": [["hyde", "Select 15-20 of your strongest, most cohesive pieces that demonstrate range and skill. Open and close with your best work. Show process sketches alongside finished pieces. Use consistent, high-quality photography. For digital portfolios, use platforms like Behance or a personal website with clean navigation."], ["lex", "art portfolio development pieces selection"], ["lex", "art portfolio presentation layout artist"], ["vec", "how to build a strong art portfolio for school applications or professional work"], ["vec", "what should an art portfolio include and how should it be organized"]]} +{"query": "what is atmospheric science", "output": [["hyde", "Atmospheric science studies the Earth's atmosphere—its composition, structure, and dynamics. Sub-fields include meteorology (weather forecasting), climatology (long-term patterns), atmospheric chemistry (ozone, pollutants), and atmospheric physics (radiation, cloud formation). It underpins weather prediction and climate change research."], ["lex", "atmospheric science meteorology climate weather"], ["lex", "atmospheric science atmosphere composition dynamics"], ["vec", "what is atmospheric science and what topics does it study"], ["vec", "how does atmospheric science explain weather, climate, and the Earth's atmosphere"]]} +{"query": "how to apply for a mortgage", "output": [["hyde", "Check your credit score (aim for 620+, 740+ for best rates). Save for a down payment of 3-20%. Get pre-approved with a lender by submitting W-2s, pay stubs, bank statements, and tax returns. Compare rates from multiple lenders. Once you find a home, submit the full application and await underwriting."], ["lex", "mortgage application process requirements"], ["lex", "apply mortgage home loan pre-approval credit score"], ["vec", "what are the steps to apply for a home mortgage loan"], ["vec", "how to prepare your finances and documents to apply for a mortgage"]]} +{"query": "how to analyze political polls", "output": [["hyde", "To analyze a political poll, start by examining the sample size, methodology, and margin of error. A poll of 1,000 likely voters with a ±3% margin means the true value falls within that range 95% of the time. Compare results across multiple polls using polling averages to reduce noise."], ["lex", "political poll analysis methodology"], ["lex", "polling data interpretation margin error"], ["lex", "election survey statistics"], ["vec", "what methods are used to analyze and interpret political polling data"], ["vec", "how to evaluate the accuracy and reliability of election polls"], ["vec", "understanding margin of error and sample size in political surveys"]]} +{"query": "how does the body maintain homeostasis", "output": [["hyde", "The body maintains homeostasis through negative feedback loops. When blood glucose rises after a meal, the pancreas releases insulin, signaling cells to absorb glucose. When body temperature drops, the hypothalamus triggers shivering and vasoconstriction to conserve heat."], ["lex", "homeostasis regulation human body"], ["lex", "negative feedback loop physiology"], ["lex", "body temperature pH blood glucose regulation"], ["vec", "what mechanisms does the human body use to maintain internal stability"], ["vec", "how do feedback loops help regulate body temperature and blood sugar levels"]]} +{"query": "how to transplant seedlings?", "output": [["hyde", "Transplant seedlings after hardening them off for 7-10 days. Dig a hole slightly larger than the root ball, gently remove the seedling from its pot, and place it at the same depth it was growing. Water thoroughly and mulch around the base to retain moisture."], ["lex", "transplant seedlings garden"], ["lex", "seedling hardening off repotting"], ["lex", "moving seedlings outdoors soil"], ["vec", "what is the correct process for transplanting seedlings from pots into the garden"], ["vec", "when and how should you harden off and transplant young plants outdoors"]]} +{"query": "how to interpret graphs and charts", "output": [["hyde", "To interpret a graph, first read the title and axis labels to understand what is being measured. Identify the scale and units. For line charts, look at trends over time. For bar charts, compare heights across categories. Always check whether the y-axis starts at zero, as truncated axes can exaggerate differences."], ["lex", "reading graphs charts data visualization"], ["lex", "interpret bar line pie chart"], ["lex", "graph axis scale data trends"], ["vec", "how do you read and interpret different types of graphs and charts correctly"], ["vec", "what should you look for when analyzing data presented in visual charts"]]} +{"query": "how to start a sketchbook?", "output": [["hyde", "Start your sketchbook by choosing a book with paper weight of at least 80gsm. Begin with simple observational drawings of everyday objects. Draw for 10-15 minutes daily without worrying about perfection. Use pencil, pen, or whatever feels comfortable. Date each page to track your progress."], ["lex", "sketchbook practice beginner drawing"], ["lex", "daily sketching habit art journal"], ["lex", "first sketchbook tips supplies"], ["vec", "how do beginners start and maintain a regular sketchbook practice"], ["vec", "what supplies and techniques should you use when starting your first sketchbook"]]} +{"query": "what are the main teachings of jainism?", "output": [["hyde", "Jainism teaches three core principles: ahimsa (nonviolence toward all living beings), anekantavada (many-sidedness of truth), and aparigraha (non-attachment to possessions). The path to liberation involves the Three Jewels: right faith, right knowledge, and right conduct. Jains practice strict vegetarianism and asceticism."], ["lex", "jainism core teachings principles"], ["lex", "ahimsa anekantavada aparigraha jain"], ["lex", "jain dharma beliefs nonviolence"], ["vec", "what are the central beliefs and philosophical teachings of Jainism"], ["vec", "how do Jain principles like ahimsa and anekantavada guide ethical living"]]} +{"query": "how to choose curtains for living room", "output": [["hyde", "Choose curtains that hang 1-2 inches above the floor for a polished look. For a small living room, use light-colored sheer fabrics to maximize natural light. Mount the curtain rod 4-6 inches above the window frame and extend it 3-8 inches beyond each side to make windows appear larger."], ["lex", "living room curtain selection fabric"], ["lex", "curtain length style window treatment"], ["lex", "drapes color pattern room decor"], ["vec", "how do you choose the right curtains for a living room based on style and function"], ["vec", "what curtain fabric length and color work best for different living room windows"]]} +{"query": "how to take macro photos", "output": [["hyde", "For macro photography, use a dedicated macro lens (60mm or 100mm) or extension tubes. Set your aperture to f/8-f/16 for sufficient depth of field. Use a tripod and remote shutter to eliminate camera shake. Focus stacking—taking multiple shots at different focus distances—produces sharp images throughout the subject."], ["lex", "macro photography technique close-up"], ["lex", "macro lens focus stacking lighting"], ["lex", "close-up photography camera settings"], ["vec", "what camera settings and equipment do you need for macro photography"], ["vec", "how to achieve sharp focus and good lighting in close-up macro shots"]]} +{"query": "how to write a query letter?", "output": [["hyde", "A query letter has three paragraphs: the hook (a compelling one-sentence pitch), the mini-synopsis (250 words covering the protagonist, conflict, and stakes), and the bio (your credentials and comp titles). Address the agent by name, mention why you chose them, and keep the entire letter under one page."], ["lex", "query letter writing literary agent"], ["lex", "book manuscript submission query format"], ["lex", "query letter hook synopsis comp titles"], ["vec", "how do you write an effective query letter to a literary agent for your novel"], ["vec", "what structure and elements should a query letter include for book submissions"]]} +{"query": "what are plasmids", "output": [["hyde", "Plasmids are small, circular, double-stranded DNA molecules found in bacteria that replicate independently of chromosomal DNA. They often carry genes for antibiotic resistance. In genetic engineering, plasmids serve as vectors to insert foreign genes into host cells for cloning and protein expression."], ["lex", "plasmid DNA circular extrachromosomal"], ["lex", "plasmid bacteria gene transfer cloning"], ["lex", "plasmid vector molecular biology"], ["vec", "what are plasmids and what role do they play in bacterial genetics"], ["vec", "how are plasmids used as vectors in molecular biology and genetic engineering"]]} +{"query": "how do scientists accurately measure time", "output": [["hyde", "The SI second is defined by the cesium-133 atom, which oscillates 9,192,631,770 times per second. Atomic clocks use this transition frequency to achieve accuracy within one second over millions of years. Optical lattice clocks using strontium atoms are even more precise, losing less than one second over the age of the universe."], ["lex", "atomic clock time measurement precision"], ["lex", "cesium clock seconds SI definition"], ["lex", "timekeeping scientific instruments"], ["vec", "how do atomic clocks and other instruments allow scientists to measure time with extreme precision"], ["vec", "what is the scientific definition of a second and how is it measured"]]} +{"query": "how to build a professional network?", "output": [["hyde", "Build your professional network by attending industry conferences, joining professional associations, and engaging on LinkedIn. Follow up within 48 hours of meeting someone new. Offer value before asking for favors—share articles, make introductions, or provide feedback. Schedule regular coffee chats to maintain relationships."], ["lex", "professional networking career connections"], ["lex", "LinkedIn networking events industry contacts"], ["lex", "building professional relationships mentorship"], ["vec", "what are effective strategies for building and maintaining a professional network"], ["vec", "how can attending events and using LinkedIn help grow your career network"]]} +{"query": "what is the significance of sacred symbols?", "output": [["hyde", "Sacred symbols serve as tangible expressions of spiritual truths across religions. The Christian cross represents sacrifice and redemption, the Hindu Om embodies the primordial sound of creation, and the Jewish menorah symbolizes divine light. These symbols anchor believers' faith and create shared identity within communities."], ["lex", "sacred symbols religious meaning"], ["lex", "spiritual symbols cross om menorah lotus"], ["lex", "religious iconography symbolism significance"], ["vec", "what role do sacred symbols play in religious and spiritual traditions"], ["vec", "how do symbols like the cross, om, and menorah carry meaning in their respective faiths"]]} +{"query": "how to succeed in a digital marketing career?", "output": [["hyde", "A digital marketing career requires proficiency in SEO, paid advertising (Google Ads, Meta Ads), content marketing, email marketing, and analytics tools like Google Analytics. Build a portfolio with real campaigns. Earn certifications from Google, HubSpot, or Meta. Entry-level roles include marketing coordinator or social media specialist."], ["lex", "digital marketing career skills"], ["lex", "SEO social media analytics marketing job"], ["lex", "digital marketing certifications portfolio"], ["vec", "what skills and experience do you need to build a successful digital marketing career"], ["vec", "how to get started in digital marketing and advance to senior roles"]]} +{"query": "how to plan a trip to europe?", "output": [["hyde", "Plan your Europe trip 3-6 months ahead. Book flights early for the best fares. Get a Eurail pass if visiting 3+ countries. Budget €50-150/day depending on the country. Book accommodations on Booking.com or Hostelworld. Check visa requirements—US citizens can stay 90 days in the Schengen Area without a visa."], ["lex", "Europe trip planning itinerary budget"], ["lex", "European travel visa flights accommodations"], ["lex", "backpacking Europe route booking tips"], ["vec", "how do you plan and budget for a multi-country trip across Europe"], ["vec", "what are the steps for organizing flights, accommodations, and itineraries for European travel"]]} +{"query": "how machine learning influences businesses", "output": [["hyde", "Machine learning transforms businesses through demand forecasting, customer churn prediction, fraud detection, and recommendation engines. Retailers use ML to optimize pricing and inventory. Banks deploy ML models for credit scoring. Companies using ML-driven analytics report 5-10% increases in revenue through personalized marketing."], ["lex", "machine learning business applications"], ["lex", "ML AI enterprise automation prediction"], ["lex", "machine learning revenue customer analytics"], ["vec", "how are businesses using machine learning to improve operations and decision-making"], ["vec", "what impact does machine learning have on business revenue and efficiency"]]} +{"query": "what are the main characteristics of memoirs?", "output": [["hyde", "A memoir focuses on a specific theme or period in the author's life, unlike an autobiography which covers an entire life chronologically. Key characteristics include a first-person narrative voice, emotional honesty, reflection on personal growth, vivid sensory details, and a thematic arc that gives the story universal resonance."], ["lex", "memoir characteristics literary genre"], ["lex", "memoir vs autobiography personal narrative"], ["lex", "memoir writing elements structure"], ["vec", "what distinguishes a memoir from other forms of autobiographical writing"], ["vec", "what are the key literary features and structure of a memoir"]]} +{"query": "how do sikhs practice their faith", "output": [["hyde", "Sikhs practice their faith through daily prayers (Nitnem), including Japji Sahib at dawn. They worship at the gurdwara, where the Guru Granth Sahib is read aloud. Baptized Sikhs wear the five Ks: kesh (uncut hair), kangha (comb), kara (steel bracelet), kachera (undergarment), and kirpan (ceremonial sword). Langar, the communal kitchen, serves free meals to all visitors."], ["lex", "Sikh faith practices worship"], ["lex", "gurdwara langar five Ks Sikhism"], ["lex", "Sikh prayer Guru Granth Sahib"], ["vec", "what are the daily religious practices and rituals observed by Sikhs"], ["vec", "how do Sikhs worship in the gurdwara and observe the five Ks"]]} +{"query": "what are the foundations of feminist ethics", "output": [["hyde", "Feminist ethics emerged from Carol Gilligan's critique of Kohlberg's moral development theory, arguing that women's moral reasoning emphasizes care and relationships rather than abstract principles of justice. Nel Noddings developed the ethics of care, centering moral life on attentiveness, responsibility, and responsiveness to the needs of particular others."], ["lex", "feminist ethics care theory foundations"], ["lex", "feminist moral philosophy gender justice"], ["lex", "ethics of care Gilligan Noddings feminist"], ["vec", "what are the core principles and philosophical foundations of feminist ethics"], ["vec", "how does feminist ethics differ from traditional moral philosophy in its approach to care and justice"]]} +{"query": "how do antibiotics work", "output": [["hyde", "Antibiotics work by targeting structures unique to bacteria. Penicillin and cephalosporins inhibit cell wall synthesis, causing bacteria to burst. Tetracyclines block the 30S ribosomal subunit, preventing protein synthesis. Fluoroquinolones inhibit DNA gyrase, stopping bacterial DNA replication. Antibiotics are classified as bactericidal (kill bacteria) or bacteriostatic (stop growth)."], ["lex", "antibiotics mechanism action bacteria"], ["lex", "antibiotic cell wall protein synthesis inhibition"], ["lex", "bactericidal bacteriostatic penicillin"], ["vec", "how do antibiotics kill or inhibit the growth of bacteria in the human body"], ["vec", "what are the different mechanisms by which antibiotics target bacterial cells"]]} +{"query": "what is geothermal energy?", "output": [["hyde", "Geothermal energy harnesses heat from the Earth's interior. Hot water and steam from underground reservoirs drive turbines to generate electricity. Geothermal power plants operate at over 90% capacity factor, far higher than wind or solar. Iceland generates 25% of its electricity from geothermal sources."], ["lex", "geothermal energy heat earth power"], ["lex", "geothermal power plant electricity generation"], ["lex", "geothermal renewable energy underground"], ["vec", "how does geothermal energy work and how is it used to generate electricity"], ["vec", "what are the advantages and limitations of geothermal energy as a renewable source"]]} +{"query": "how does a bill become a law", "output": [["hyde", "A bill is introduced in the House or Senate and assigned to a committee. The committee holds hearings, marks up the bill, and votes. If passed, it goes to the full chamber for debate and a vote. Both chambers must pass identical versions. Differences are resolved in a conference committee. The final bill goes to the President, who can sign it into law or veto it."], ["lex", "bill becomes law legislative process"], ["lex", "US Congress legislation committee vote"], ["lex", "bill passage House Senate president sign"], ["vec", "what are the steps a bill goes through in the US Congress to become a law"], ["vec", "how does the legislative process work from bill introduction to presidential signature"]]} +{"query": "what is the difference between ethics and morals", "output": [["hyde", "Ethics refers to systematic, philosophical frameworks for determining right and wrong—such as utilitarianism or deontology. Morals are personal beliefs about right and wrong shaped by culture, religion, and upbringing. Ethics are prescriptive rules applied to groups (medical ethics, business ethics), while morals are individual convictions."], ["lex", "ethics vs morals difference"], ["lex", "ethics morals philosophy distinction"], ["lex", "moral principles ethical systems comparison"], ["vec", "what is the distinction between ethics and morals in philosophy"], ["vec", "how do personal morals differ from ethical systems and codes of conduct"]]} +{"query": "what was the silk road", "output": [["hyde", "The Silk Road was a network of trade routes connecting China to the Mediterranean from the 2nd century BCE to the 15th century CE. Merchants traded silk, spices, gold, and jade. Beyond goods, the Silk Road facilitated the spread of Buddhism, Islam, papermaking, and gunpowder across Eurasia."], ["lex", "Silk Road ancient trade route"], ["lex", "Silk Road China Rome trade network"], ["lex", "Silk Road history commerce cultural exchange"], ["vec", "what was the historical Silk Road and what goods and ideas were traded along it"], ["vec", "how did the Silk Road connect civilizations between China and the Mediterranean"]]} +{"query": "what is the significance of beauty in philosophy", "output": [["hyde", "In Plato's Symposium, beauty is a ladder ascending from physical attraction to the Form of Beauty itself. Kant distinguished between the beautiful (harmonious, universal pleasure) and the sublime (overwhelming grandeur). For Hegel, beauty in art reveals truth through sensory form. Contemporary aesthetics debates whether beauty is objective or culturally constructed."], ["lex", "beauty philosophy aesthetics significance"], ["lex", "aesthetics Kant Plato beauty philosophical"], ["lex", "philosophy of beauty sublime art"], ["vec", "how have philosophers understood and defined the concept of beauty throughout history"], ["vec", "what is the philosophical significance of beauty in aesthetics from Plato to Kant"]]} +{"query": "how to communicate with elected officials", "output": [["hyde", "The most effective way to reach your elected officials is a phone call to their district office. Identify yourself as a constituent, state the bill number, and clearly state your position in under 60 seconds. Personalized letters are more impactful than form emails. Attend town halls for face-to-face interaction."], ["lex", "contact elected officials representatives"], ["lex", "write letter call congressman senator"], ["lex", "constituent advocacy elected official communication"], ["vec", "what are effective ways to communicate your concerns to elected officials"], ["vec", "how to write letters or make phone calls to your congressional representatives"]]} +{"query": "what is phenomenology", "output": [["hyde", "Phenomenology is a philosophical method founded by Edmund Husserl that studies the structures of conscious experience as they appear to the subject. Through \"bracketing\" (epoché), the phenomenologist suspends assumptions about the external world to describe phenomena as they are experienced. Heidegger extended this into an analysis of Being-in-the-world."], ["lex", "phenomenology philosophy Husserl"], ["lex", "phenomenological method consciousness experience"], ["lex", "phenomenology Heidegger Merleau-Ponty intentionality"], ["vec", "what is phenomenology and how does it study conscious experience"], ["vec", "how did Husserl and Heidegger develop phenomenology as a philosophical method"]]} +{"query": "how to enhance concentration", "output": [["hyde", "Improve concentration by eliminating distractions: silence notifications, use website blockers, and work in a quiet environment. The Pomodoro Technique—25 minutes of focused work followed by a 5-minute break—builds sustained attention. Regular exercise, adequate sleep (7-9 hours), and mindfulness meditation physically strengthen the brain's prefrontal cortex."], ["lex", "improve concentration focus techniques"], ["lex", "attention span deep work focus tips"], ["lex", "concentration exercises mindfulness pomodoro"], ["vec", "what techniques and habits can help you improve focus and concentration"], ["vec", "how can mindfulness and time management methods like Pomodoro improve attention"]]} +{"query": "what is the theory of relativity", "output": [["hyde", "Einstein's special relativity (1905) states that the speed of light is constant for all observers and that time dilates at high velocities (E=mc²). General relativity (1915) describes gravity not as a force but as the curvature of spacetime caused by mass and energy. Massive objects bend spacetime, and objects follow curved paths."], ["lex", "theory of relativity Einstein"], ["lex", "special general relativity spacetime gravity"], ["lex", "E=mc2 Einstein relativity physics"], ["vec", "what are Einstein's special and general theories of relativity and what do they explain"], ["vec", "how does the theory of relativity describe the relationship between space time and gravity"]]} +{"query": "what is depth of field?", "output": [["hyde", "Depth of field (DOF) is the range of distance in a photo that appears acceptably sharp. A wide aperture (f/1.8) produces a shallow DOF with a blurred background (bokeh), ideal for portraits. A narrow aperture (f/16) produces deep DOF where everything is sharp, suited for landscapes. Focal length and subject distance also affect DOF."], ["lex", "depth of field photography aperture"], ["lex", "DOF shallow deep focus bokeh"], ["lex", "aperture f-stop focal length depth field"], ["vec", "what is depth of field in photography and how does aperture affect it"], ["vec", "how do aperture, focal length, and distance control the depth of field in a photo"]]} +{"query": "how to write a haiku", "output": [["hyde", "A haiku is a three-line Japanese poem with a 5-7-5 syllable structure. Traditional haiku includes a kigo (seasonal word) and a kireji (cutting word) that creates a pause or shift. Example: \"An old silent pond / A frog jumps into the pond— / Splash! Silence again.\" Focus on a single moment in nature observed with clarity."], ["lex", "haiku poem writing syllable"], ["lex", "haiku 5-7-5 Japanese poetry"], ["lex", "haiku nature season kigo structure"], ["vec", "what are the rules and structure for writing a traditional haiku poem"], ["vec", "how do you compose a haiku with the 5-7-5 syllable pattern and seasonal reference"]]} +{"query": "how to address misinformation in politics", "output": [["hyde", "Combat political misinformation by checking claims against nonpartisan fact-checkers like PolitiFact, Snopes, and FactCheck.org. Verify the original source before sharing. Teach media literacy skills: examine the URL, author credentials, and whether other outlets confirm the story. Prebunking—warning people about manipulation techniques before exposure—is more effective than debunking after the fact."], ["lex", "political misinformation combat fact-checking"], ["lex", "fake news disinformation media literacy"], ["lex", "countering political misinformation strategies"], ["vec", "what strategies can be used to identify and counter political misinformation"], ["vec", "how can media literacy and fact-checking help address false political claims"]]} +{"query": "what is the philosophy of humor?", "output": [["hyde", "Three major theories explain humor. Superiority theory (Hobbes) says we laugh at others' misfortunes. Relief theory (Freud) says laughter releases nervous energy. Incongruity theory (Kant, Schopenhauer) says humor arises when expectations are violated—we laugh at the gap between what we expect and what occurs."], ["lex", "philosophy of humor laughter theory"], ["lex", "incongruity superiority relief theory humor"], ["lex", "humor philosophy comedy Bergson"], ["vec", "what are the main philosophical theories that explain why things are funny"], ["vec", "how do incongruity theory, superiority theory, and relief theory explain humor"]]} +{"query": "how does determinism challenge free will", "output": [["hyde", "Determinism holds that every event, including human choices, is the inevitable result of prior causes. If our decisions are fully determined by brain states, genetics, and environment, then free will appears illusory. Compatibilists like Hume argue free will means acting on one's desires without external coercion, which is compatible with determinism."], ["lex", "determinism free will debate"], ["lex", "causal determinism libertarian compatibilism"], ["lex", "free will philosophy hard determinism"], ["vec", "how does philosophical determinism pose a challenge to the concept of free will"], ["vec", "can free will exist if every event is causally determined by prior events"]]} +{"query": "how to write compelling endings?", "output": [["hyde", "A compelling ending resolves the central conflict while delivering an emotional payoff. Techniques include the circular ending (returning to an opening image with new meaning), the surprise twist (recontextualizing everything), and the resonant final image. Avoid deus ex machina. The ending should feel both surprising and inevitable—earned by what came before."], ["lex", "writing compelling story ending"], ["lex", "novel ending techniques resolution climax"], ["lex", "satisfying conclusion fiction writing"], ["vec", "what techniques do authors use to write powerful and satisfying story endings"], ["vec", "how to craft a compelling ending that resolves the plot and resonates emotionally"]]} +{"query": "how to make scientific presentations engaging", "output": [["hyde", "Make scientific presentations engaging by opening with a question or surprising finding rather than an outline slide. Use large visuals and minimal text—no more than 6 words per slide. Tell a story: setup the problem, build tension with the data, and deliver the conclusion as a punchline. Practice to stay under time and make eye contact."], ["lex", "scientific presentation engaging tips"], ["lex", "science talk slides audience storytelling"], ["lex", "research presentation design delivery"], ["vec", "how can scientists make their research presentations more engaging and accessible"], ["vec", "what techniques improve the delivery and visual design of scientific talks"]]} +{"query": "how to draw with a graphic tablet?", "output": [["hyde", "Set up your graphic tablet by installing the driver software and calibrating pen pressure. Start in a drawing program like Clip Studio Paint or Krita. The key challenge is hand-eye coordination—you draw on the tablet but look at the screen. Practice simple lines and circles to build muscle memory. Adjust pressure sensitivity curves to match your drawing style."], ["lex", "graphic tablet drawing digital art"], ["lex", "Wacom drawing tablet pen pressure"], ["lex", "digital drawing tablet beginner setup"], ["vec", "how do you set up and start drawing with a graphic tablet for digital art"], ["vec", "what are tips for beginners learning to draw on a Wacom or similar tablet"]]} +{"query": "how to build a capsule wardrobe", "output": [["hyde", "A capsule wardrobe consists of 30-40 versatile pieces that mix and match. Start by choosing a neutral color palette (black, navy, white, beige). Include 2-3 pairs of pants, 5-7 tops, 2 jackets, 2 pairs of shoes, and 1-2 dresses or suits. Remove items you haven't worn in a year. Invest in quality basics over trendy pieces."], ["lex", "capsule wardrobe essentials minimalist"], ["lex", "capsule wardrobe build pieces mix match"], ["lex", "minimalist wardrobe basics clothing"], ["vec", "how do you create a capsule wardrobe with a minimal set of versatile clothing pieces"], ["vec", "what are the essential items and steps to build a functional capsule wardrobe"]]} +{"query": "what was the impact of the berlin wall?", "output": [["hyde", "The Berlin Wall divided East and West Berlin from 1961 to 1989, symbolizing the Iron Curtain between communist and capitalist worlds. Its fall on November 9, 1989, triggered German reunification in 1990 and accelerated the collapse of communist regimes across Eastern Europe, effectively ending the Cold War."], ["lex", "Berlin Wall impact fall 1989"], ["lex", "Berlin Wall Cold War Germany division"], ["lex", "Berlin Wall consequences reunification"], ["vec", "what was the historical impact of the Berlin Wall on Germany and the Cold War"], ["vec", "how did the fall of the Berlin Wall in 1989 change Europe and global politics"]]} +{"query": "classic literature", "output": [["hyde", "Classic literature includes works that have stood the test of time for their artistic merit, universal themes, and cultural influence. Essential classics include Homer's Odyssey, Shakespeare's Hamlet, Austen's Pride and Prejudice, Dostoevsky's Crime and Punishment, and Fitzgerald's The Great Gatsby."], ["lex", "classic literature novels canon"], ["lex", "classic books literary fiction great works"], ["lex", "classic literature reading list authors"], ["vec", "what are the most important works of classic literature and why are they significant"], ["vec", "which classic novels and authors are considered essential reading in the Western literary canon"]]} +{"query": "how to make slime at home", "output": [["hyde", "Mix 1/2 cup of white PVA glue with 1/2 cup of liquid starch or 1 tablespoon of borax dissolved in 1 cup of water. Stir until the slime pulls away from the bowl. Knead with your hands for 2-3 minutes until smooth. Add food coloring or glitter before mixing for a custom look. Store in an airtight container."], ["lex", "homemade slime recipe DIY"], ["lex", "slime glue borax contact solution"], ["lex", "make slime kids craft"], ["vec", "what ingredients and steps do you need to make slime at home"], ["vec", "how to make homemade slime using glue and borax or contact lens solution"]]} +{"query": "what is the ethics of climate change", "output": [["hyde", "Climate ethics addresses who bears moral responsibility for carbon emissions and their consequences. Key questions include intergenerational justice (obligations to future generations), distributive justice (developing nations suffer most but polluted least), and the tragedy of the commons. Philosophers debate whether current generations owe a carbon debt to those who will inherit a warmer world."], ["lex", "climate change ethics moral responsibility"], ["lex", "climate ethics justice intergenerational"], ["lex", "environmental ethics carbon emissions moral"], ["vec", "what are the ethical and moral dimensions of climate change and environmental responsibility"], ["vec", "how do philosophers approach questions of climate justice and intergenerational obligation"]]} +{"query": "what are leadership qualities", "output": [["hyde", "Effective leaders demonstrate integrity, clear communication, empathy, and decisiveness. They articulate a compelling vision and inspire others to work toward shared goals. Key qualities include emotional intelligence, accountability, adaptability under pressure, and the ability to delegate while empowering team members to take ownership."], ["lex", "leadership qualities traits effective"], ["lex", "leader skills communication vision integrity"], ["lex", "leadership characteristics management"], ["vec", "what personal qualities and traits define an effective leader"], ["vec", "which skills and characteristics are most important for strong leadership"]]} +{"query": "what is the difference between a credit score and a credit report", "output": [["hyde", "A credit report is a detailed record of your credit history maintained by bureaus (Equifax, Experian, TransUnion). It lists accounts, payment history, balances, and inquiries. A credit score is a three-digit number (300-850) calculated from your credit report data. FICO scores weigh payment history (35%), amounts owed (30%), length of history (15%), new credit (10%), and credit mix (10%)."], ["lex", "credit score vs credit report difference"], ["lex", "credit report FICO score bureaus"], ["lex", "credit score number credit report history"], ["vec", "what is the difference between a credit score and a credit report"], ["vec", "how does a credit report relate to the credit score number lenders use"]]} +{"query": "how to make homemade pizza", "output": [["hyde", "Mix 3 cups flour, 1 packet yeast, 1 tsp salt, 1 tbsp olive oil, and 1 cup warm water. Knead for 10 minutes and let rise 1 hour. Stretch the dough on a floured surface, spread tomato sauce, add mozzarella and toppings. Bake at 475°F (245°C) on a preheated pizza stone for 10-12 minutes until the crust is golden."], ["lex", "homemade pizza dough recipe"], ["lex", "pizza from scratch oven toppings"], ["lex", "make pizza dough sauce crust"], ["vec", "how do you make pizza from scratch at home with homemade dough and sauce"], ["vec", "what is the best recipe for homemade pizza dough and how do you bake it"]]} +{"query": "how to improve workplace productivity", "output": [["hyde", "Improve workplace productivity by eliminating unnecessary meetings, batching similar tasks together, and protecting blocks of uninterrupted focus time. Use the Eisenhower Matrix to prioritize tasks by urgency and importance. Managers should set clear goals, reduce bureaucratic overhead, and ensure employees have the tools and autonomy they need."], ["lex", "workplace productivity improvement strategies"], ["lex", "employee productivity time management office"], ["lex", "work efficiency focus deep work"], ["vec", "what strategies and techniques can improve productivity in the workplace"], ["vec", "how can employees and managers increase work output and reduce wasted time"]]} +{"query": "what is the role of clergy in christianity", "output": [["hyde", "Christian clergy serve as spiritual leaders, administering sacraments, preaching sermons, and providing pastoral care. In Catholicism, ordained priests celebrate Mass, hear confessions, and perform baptisms. Protestant pastors focus on preaching and teaching Scripture. Deacons serve the community through charity and administrative support. The clergy structure varies widely across denominations."], ["lex", "clergy role Christianity priest pastor"], ["lex", "Christian minister ordained church leadership"], ["lex", "priest pastor deacon church clergy duties"], ["vec", "what roles and responsibilities do clergy members serve in Christian churches"], ["vec", "how do priests, pastors, and deacons function within different Christian denominations"]]} +{"query": "how does virtue ethics work", "output": [["hyde", "Virtue ethics, rooted in Aristotle's Nicomachean Ethics, holds that moral action flows from virtuous character rather than following rules (deontology) or maximizing outcomes (consequentialism). Virtues like courage, temperance, and justice are developed through practice. The goal is eudaimonia—human flourishing—achieved by living according to reason and cultivating the mean between excess and deficiency."], ["lex", "virtue ethics Aristotle moral character"], ["lex", "virtue ethics eudaimonia character traits"], ["lex", "Aristotelian ethics virtues vices"], ["vec", "how does virtue ethics evaluate moral action based on character rather than rules"], ["vec", "what is Aristotle's approach to virtue ethics and how does it define the good life"]]} +{"query": "what are the challenges of climate science", "output": [["hyde", "Climate science faces challenges including modeling complex feedback loops (clouds, ocean currents, ice sheets), limited historical data from pre-instrumental periods, and the chaotic nature of weather systems. Regional predictions are harder than global ones. Tipping points—thresholds beyond which changes become irreversible—are difficult to predict with current models."], ["lex", "climate science challenges research"], ["lex", "climate modeling uncertainty data gaps"], ["lex", "climate change research limitations predictions"], ["vec", "what are the major scientific challenges in studying and predicting climate change"], ["vec", "why is climate modeling difficult and what uncertainties do climate scientists face"]]} +{"query": "how to reduce stress naturally", "output": [["hyde", "Reduce stress naturally by exercising 30 minutes daily—aerobic exercise lowers cortisol and releases endorphins. Practice deep breathing: inhale for 4 counts, hold for 7, exhale for 8. Meditate for 10 minutes each morning. Limit caffeine and alcohol, sleep 7-9 hours, and spend time in nature. Progressive muscle relaxation and journaling also help."], ["lex", "reduce stress naturally techniques"], ["lex", "stress relief meditation exercise breathing"], ["lex", "natural stress management relaxation"], ["vec", "what natural methods and lifestyle changes can help reduce stress without medication"], ["vec", "how do exercise, meditation, and breathing techniques reduce stress levels"]]} +{"query": "how to start trail running", "output": [["hyde", "Start trail running on well-marked, relatively flat trails. Invest in trail running shoes with lugged soles for traction. Run by effort, not pace—expect to be 1-2 minutes per mile slower than road pace. Walk the uphills, run the flats and downhills. Carry water on runs over 45 minutes. Watch your footing and shorten your stride on technical terrain."], ["lex", "trail running beginner start"], ["lex", "trail running shoes gear technique"], ["lex", "off-road running trails tips"], ["vec", "how do beginners get started with trail running and what gear is needed"], ["vec", "what training tips and safety advice should new trail runners follow"]]} +{"query": "how to write a literary essay?", "output": [["hyde", "A literary essay argues a specific thesis about a text using evidence from the work itself. Open with a hook and thesis statement. Each body paragraph should present a claim, textual evidence (quotations), and analysis explaining how the evidence supports your argument. Use close reading to examine language, imagery, symbolism, and structure. Conclude by synthesizing your argument."], ["lex", "literary essay writing analysis"], ["lex", "literary analysis thesis evidence essay"], ["lex", "English literature essay structure argument"], ["vec", "how do you write a strong literary analysis essay with a clear thesis and evidence"], ["vec", "what is the structure and approach for writing an essay analyzing a work of literature"]]} +{"query": "sustainable development goals", "output": [["hyde", "The 17 Sustainable Development Goals (SDGs) were adopted by the United Nations in 2015 as a universal call to action by 2030. They include: No Poverty (SDG 1), Zero Hunger (SDG 2), Good Health (SDG 3), Quality Education (SDG 4), Gender Equality (SDG 5), Clean Water (SDG 6), and Climate Action (SDG 13), among others."], ["lex", "sustainable overview development goals SDGs UN"], ["lex", "SDG 2030 agenda United Nations"], ["lex", "UN sustainability goals poverty climate"], ["vec", "what are the United Nations Sustainable Development Goals and what do they aim to achieve"], ["vec", "how are the 17 SDGs structured and what progress has been made toward the 2030 agenda"]]} +{"query": "how to navigate with gps", "output": [["hyde", "To navigate with GPS, first mark your starting point as a waypoint. Enter your destination coordinates or select a point on the map. The GPS receiver triangulates your position using signals from at least 4 satellites. Follow the bearing and distance readings to your waypoint. Always carry a paper map and compass as backup in case of battery failure."], ["lex", "GPS navigation outdoor use"], ["lex", "GPS coordinates waypoint route handheld"], ["lex", "GPS device map navigation hiking"], ["vec", "how do you use a GPS device or app for outdoor navigation and route finding"], ["vec", "how to read GPS coordinates and set waypoints for hiking or travel"]]} +{"query": "how to conduct a scientific experiment", "output": [["hyde", "A scientific experiment follows these steps: 1) Ask a question, 2) Research background, 3) Form a hypothesis, 4) Design the experiment with independent, dependent, and controlled variables, 5) Collect data through repeated trials, 6) Analyze results using statistics, 7) Draw conclusions. Always include a control group and change only one variable at a time."], ["lex", "scientific experiment method steps"], ["lex", "scientific method hypothesis variables control"], ["lex", "experiment design procedure data collection"], ["vec", "what are the steps involved in designing and conducting a proper scientific experiment"], ["vec", "how do you set up controls, variables, and data collection for a science experiment"]]} +{"query": "digital transformation strategy implementation", "output": [["hyde", "Digital transformation strategy begins with assessing current technology maturity and identifying high-impact processes for digitization. Build a roadmap with quick wins (cloud migration, workflow automation) and long-term goals (data-driven decision making, AI integration). Assign executive sponsorship, train employees, and measure success with KPIs like cycle time reduction and customer satisfaction scores."], ["lex", "digital transformation strategy enterprise"], ["lex", "digital transformation implementation roadmap"], ["lex", "enterprise digitalization technology adoption"], ["vec", "how do organizations plan and implement a digital transformation strategy"], ["vec", "what are the key phases and challenges of enterprise digital transformation"]]} +{"query": "how to improve sleep quality naturally?", "output": [["hyde", "Improve sleep quality by maintaining a consistent schedule—go to bed and wake at the same time daily. Keep your bedroom cool (65-68°F), dark, and quiet. Avoid screens for 1 hour before bed since blue light suppresses melatonin. Limit caffeine after noon. Exercise regularly but not within 3 hours of bedtime. Try magnesium supplements or chamomile tea."], ["lex", "improve sleep quality natural remedies"], ["lex", "sleep hygiene tips better rest"], ["lex", "insomnia natural treatment melatonin"], ["vec", "what natural methods and sleep hygiene habits improve the quality of sleep"], ["vec", "how can you fall asleep faster and sleep more deeply without medication"]]} +{"query": "how to build customer loyalty", "output": [["hyde", "Build customer loyalty by delivering consistent quality and exceeding expectations. Implement a points-based loyalty program offering meaningful rewards. Personalize communications using purchase history data. Respond to complaints within 24 hours and resolve them generously. Customers who feel valued spend 67% more than new customers. Track Net Promoter Score to measure loyalty over time."], ["lex", "customer loyalty retention strategies"], ["lex", "loyalty program repeat customers brand"], ["lex", "customer retention engagement satisfaction"], ["vec", "what strategies do businesses use to build long-term customer loyalty and retention"], ["vec", "how do loyalty programs and customer experience drive repeat business"]]} +{"query": "what is consequentialism", "output": [["hyde", "Consequentialism is a moral theory holding that the rightness of an action depends solely on its outcomes. The most well-known form is utilitarianism (Bentham, Mill), which aims to maximize overall happiness or well-being. An action is morally right if it produces the best consequences for the greatest number of people, regardless of the actor's intentions."], ["lex", "consequentialism ethics moral theory"], ["lex", "consequentialism utilitarianism outcomes"], ["lex", "consequentialist ethics Mill Bentham"], ["vec", "what is consequentialism and how does it evaluate the morality of actions"], ["vec", "how does consequentialist ethics judge right and wrong based on outcomes and consequences"]]} +{"query": "how does philosophy approach artificial intelligence?", "output": [["hyde", "Philosophers approach AI through questions of consciousness (can machines be conscious?), the Chinese Room argument (Searle argued symbol manipulation isn't understanding), the Turing test (behavioral equivalence), and moral status (should sentient AI have rights?). The alignment problem—ensuring AI systems pursue human values—has become a central concern in philosophy of technology."], ["lex", "philosophy artificial intelligence AI ethics"], ["lex", "AI philosophy consciousness mind machine"], ["lex", "philosophy of AI Turing test Chinese room"], ["vec", "how do philosophers analyze questions about artificial intelligence and machine consciousness"], ["vec", "what philosophical problems does AI raise about minds, consciousness, and moral status"]]} +{"query": "how to reduce sugar intake", "output": [["hyde", "Reduce sugar intake by reading nutrition labels—sugar hides in sauces, bread, and yogurt under names like dextrose, maltose, and high-fructose corn syrup. Replace sugary drinks with water or sparkling water. Eat whole fruit instead of juice. Gradually reduce sugar in coffee over 2 weeks. Protein and fiber at each meal stabilize blood sugar and reduce cravings."], ["lex", "reduce sugar intake diet"], ["lex", "cut sugar cravings low sugar eating"], ["lex", "sugar consumption health alternatives"], ["vec", "what practical strategies help reduce daily sugar consumption and manage cravings"], ["vec", "how can you cut back on added sugar in your diet without feeling deprived"]]} +{"query": "building resilience", "output": [["hyde", "Building resilience involves developing a growth mindset, maintaining social connections, and practicing self-care. Reframe setbacks as learning opportunities. Cultivate problem-solving skills rather than ruminating on what went wrong. Regular exercise, adequate sleep, and mindfulness strengthen your capacity to recover from stress. Resilient people accept what they cannot control and focus energy on what they can."], ["lex", "building resilience mental toughness"], ["lex", "emotional resilience coping skills adversity"], ["lex", "psychological resilience strategies stress"], ["vec", "how can individuals build emotional and psychological resilience to handle adversity"], ["vec", "what habits and mindset shifts help develop personal resilience and mental toughness"]]} +{"query": "how to attend a town hall meeting", "output": [["hyde", "Find town hall meetings through your representative's website, social media, or local newspaper. Arrive early to get a seat. Prepare a concise question or statement under 60 seconds. Introduce yourself as a constituent and mention your town. Be respectful and specific—reference a bill number or policy. Many representatives also hold virtual town halls you can join online."], ["lex", "town hall meeting attend participate"], ["lex", "local government town hall public forum"], ["lex", "town hall meeting preparation questions"], ["vec", "how do you find and attend a local town hall meeting to participate in government"], ["vec", "what should you prepare before attending a town hall meeting with your representative"]]} +{"query": "google sheets", "output": [["hyde", "Google Sheets is a free cloud-based spreadsheet application. Key functions include VLOOKUP for searching data across columns, SUMIF for conditional totals, and QUERY for SQL-like data filtering. Use Ctrl+/ to view keyboard shortcuts. Create pivot tables via Data > Pivot table. Share sheets with collaborators for real-time editing."], ["lex", "Google Sheets spreadsheet formulas"], ["lex", "Google Sheets tutorial functions tips"], ["lex", "Google Sheets pivot table VLOOKUP"], ["vec", "how to use Google Sheets for data analysis with formulas and functions"], ["vec", "what are the most useful Google Sheets features, formulas, and keyboard shortcuts"]]} +{"query": "how to manage digital distractions?", "output": [["hyde", "Manage digital distractions by turning off non-essential notifications. Use app blockers like Freedom or Cold Turkey during focus periods. Set your phone to Do Not Disturb and place it in another room. Schedule specific times to check email and social media rather than responding in real-time. Use Screen Time (iOS) or Digital Wellbeing (Android) to track and limit usage."], ["lex", "manage digital distractions focus"], ["lex", "phone screen time notification blocking"], ["lex", "digital distraction productivity apps"], ["vec", "how can you reduce digital distractions from phones and social media to stay focused"], ["vec", "what tools and strategies help manage screen time and notification overload"]]} +{"query": "what are stem cells", "output": [["hyde", "Stem cells are undifferentiated cells that can self-renew and differentiate into specialized cell types. Embryonic stem cells are pluripotent—they can become any cell type. Adult stem cells are multipotent, limited to specific tissues (e.g., hematopoietic stem cells produce blood cells). Induced pluripotent stem cells (iPSCs) are adult cells reprogrammed to an embryonic-like state."], ["lex", "stem cells types function biology"], ["lex", "stem cell embryonic adult pluripotent"], ["lex", "stem cell therapy regenerative medicine"], ["vec", "what are stem cells and what makes them different from regular cells in the body"], ["vec", "how are stem cells used in medical research and regenerative medicine"]]} +{"query": "how does literary geography influence narratives?", "output": [["hyde", "Literary geography examines how real and imagined places shape narrative meaning. Faulkner's Yoknapatawpha County embodies Southern decay and racial tension. Hardy's Wessex landscapes mirror characters' emotional states. Setting is not just backdrop—it constrains plot, shapes character psychology, and carries symbolic weight. Urban and rural spaces generate distinct narrative possibilities."], ["lex", "literary geography narrative place setting"], ["lex", "geography literature landscape sense of place"], ["lex", "spatial narrative setting fiction geography"], ["vec", "how does the geography and physical setting of a story influence its narrative and themes"], ["vec", "what role does sense of place and landscape play in shaping literary narratives"]]} +{"query": "what were the causes of world war ii", "output": [["hyde", "World War II resulted from multiple causes: the punitive Treaty of Versailles (1919) imposed crippling reparations on Germany, fueling resentment. The Great Depression created economic desperation exploited by fascist movements. Hitler's expansionist aggression—remilitarizing the Rhineland, annexing Austria, and invading Czechoslovakia—met with appeasement from Britain and France until the invasion of Poland in September 1939."], ["lex", "causes World War II WWII origins"], ["lex", "WWII causes Treaty Versailles Hitler aggression"], ["lex", "World War 2 causes appeasement fascism"], ["vec", "what were the main political and economic causes that led to World War II"], ["vec", "how did the Treaty of Versailles, fascism, and appeasement contribute to the outbreak of WWII"]]} +{"query": "what is the role of faith in spirituality", "output": [["hyde", "Faith in spirituality serves as the foundation for trust in a reality beyond the material world. It enables surrender to uncertainty and provides a framework for interpreting suffering and purpose. Unlike dogmatic belief, spiritual faith often involves personal experience—a felt sense of connection to something greater that sustains practice through doubt and difficulty."], ["lex", "faith role spirituality belief"], ["lex", "spiritual faith trust divine religious"], ["lex", "faith spirituality meaning transcendence"], ["vec", "what role does faith play in spiritual practice and personal transcendence"], ["vec", "how does faith relate to spiritual growth and the search for meaning"]]} +{"query": "how to contribute to political campaigns", "output": [["hyde", "Contribute to political campaigns by donating through the candidate's official website (individual contributions are limited to $3,300 per election per candidate in federal races). Volunteer to canvass door-to-door, phone bank, or text bank. Attend campaign events, host a house party, or share the candidate's message on social media. Small-dollar donations are increasingly impactful."], ["lex", "political campaign contribution donate volunteer"], ["lex", "volunteer political campaign canvassing"], ["lex", "campaign donation fundraising grassroots"], ["vec", "how can individuals contribute to political campaigns through donations or volunteering"], ["vec", "what are the different ways to get involved in a political campaign as a volunteer"]]} +{"query": "what is the importance of meditation in spirituality?", "output": [["hyde", "Meditation is central to nearly every spiritual tradition. In Buddhism, vipassana meditation cultivates insight into impermanence. Hindu dhyana aims for union with Brahman. Christian contemplative prayer seeks direct experience of God. Across traditions, meditation quiets mental chatter, develops present-moment awareness, and opens practitioners to transcendent experience."], ["lex", "meditation spirituality importance practice"], ["lex", "spiritual meditation mindfulness contemplation"], ["lex", "meditation enlightenment inner peace spiritual"], ["vec", "why is meditation considered essential to many spiritual traditions and practices"], ["vec", "how does meditation contribute to spiritual growth and inner transformation"]]} +{"query": "how to prune fruit trees?", "output": [["hyde", "Prune fruit trees during late winter dormancy (January-March) before buds break. Remove dead, diseased, and crossing branches first. Open the center of the tree to allow sunlight and air circulation. Make cuts at a 45-degree angle just above an outward-facing bud. Remove water sprouts (vertical shoots) and suckers from the base. Never remove more than 25% of the canopy in one season."], ["lex", "prune fruit trees technique timing"], ["lex", "fruit tree pruning winter dormant cuts"], ["lex", "apple pear tree pruning branches"], ["vec", "when and how should you prune fruit trees for better growth and fruit production"], ["vec", "what pruning techniques are used for apple, pear, and other fruit trees"]]} +{"query": "what is conservation biology", "output": [["hyde", "Conservation biology is the scientific study of preserving biodiversity and preventing extinction. It combines ecology, genetics, and landscape management to protect threatened species and ecosystems. Key approaches include habitat restoration, establishing wildlife corridors, captive breeding programs, and designating protected areas. The field was formalized in the 1980s by Michael Soulé."], ["lex", "conservation biology biodiversity preservation"], ["lex", "conservation biology endangered species habitat"], ["lex", "wildlife conservation ecology management"], ["vec", "what is conservation biology and what are its main goals and methods"], ["vec", "how do conservation biologists work to protect endangered species and biodiversity"]]} +{"query": "how do muslims observe hajj?", "output": [["hyde", "Hajj occurs annually during Dhul Hijjah, the 12th month of the Islamic calendar. Pilgrims enter a state of ihram (ritual purity) and wear simple white garments. They perform tawaf (circling the Kaaba seven times), sa'i (walking between Safa and Marwah), stand at Arafat in prayer, and stone the pillars at Mina. Hajj concludes with Eid al-Adha, the Festival of Sacrifice."], ["lex", "Hajj Muslim pilgrimage Mecca rituals"], ["lex", "Hajj rites Kaaba Arafat Mina Islam"], ["lex", "Islamic pilgrimage Hajj steps obligations"], ["vec", "what are the rituals and steps Muslims follow during the Hajj pilgrimage to Mecca"], ["vec", "how do Muslims prepare for and perform the Hajj pilgrimage"]]} +{"query": "digital economy transformation", "output": [["hyde", "The digital economy encompasses all economic activity enabled by digital technologies. E-commerce, fintech, cloud computing, and platform businesses (Uber, Airbnb) have disrupted traditional industries. By 2025, the digital economy accounts for over 15% of global GDP. Key drivers include mobile internet penetration, AI automation, and the shift to subscription-based and data-driven business models."], ["lex", "digital overview economy transformation trends"], ["lex", "digital economy e-commerce fintech platform"], ["lex", "economic digitalization technology market 2025"], ["vec", "how is the digital economy transforming traditional industries and business models"], ["vec", "what are the key drivers and trends of digital economic transformation"]]} +{"query": "how does philosophy address systemic injustice?", "output": [["hyde", "Philosophers address systemic injustice through multiple frameworks. Rawls's veil of ignorance argues just institutions would be designed without knowing one's social position. Critical race theory examines how legal and social structures perpetuate racial inequality. Iris Marion Young distinguished five faces of oppression: exploitation, marginalization, powerlessness, cultural imperialism, and violence."], ["lex", "philosophy systemic injustice structural oppression"], ["lex", "social justice philosophy racial gender inequality"], ["lex", "systemic injustice Rawls critical race theory"], ["vec", "how do philosophers analyze and propose solutions to systemic injustice and structural oppression"], ["vec", "what philosophical frameworks address racial, gender, and economic systemic inequality"]]} +{"query": "how to analyze a political speech", "output": [["hyde", "Analyze a political speech by examining its rhetorical appeals: ethos (credibility—does the speaker establish authority?), pathos (emotion—what feelings are evoked?), and logos (logic—are arguments supported by evidence?). Identify rhetorical devices like repetition, anaphora, and metaphor. Consider the audience, context, and what the speaker wants listeners to do."], ["lex", "political speech analysis rhetoric"], ["lex", "speech analysis persuasion ethos pathos logos"], ["lex", "rhetorical analysis political discourse"], ["vec", "what techniques are used to analyze the rhetoric and persuasive strategies in political speeches"], ["vec", "how do you evaluate a political speech for logical arguments, emotional appeals, and credibility"]]} +{"query": "how to support clean energy initiatives?", "output": [["hyde", "Support clean energy by installing solar panels or subscribing to community solar. Switch to a green electricity provider. Contact elected officials to support renewable energy legislation and tax credits. Invest in clean energy funds. Drive electric or hybrid vehicles. Advocate for local building codes that require energy efficiency standards. Join or donate to organizations like the Sierra Club or local clean energy cooperatives."], ["lex", "clean energy support renewable initiatives"], ["lex", "renewable energy advocacy solar wind policy"], ["lex", "clean energy action community support"], ["vec", "how can individuals and communities support clean energy initiatives and policies"], ["vec", "what actions can people take to promote renewable energy adoption in their area"]]} +{"query": "how to diagnose car starting problems?", "output": [["hyde", "If the car clicks but won't crank, the battery is likely dead—test with a multimeter (should read 12.6V). If the engine cranks but won't start, check fuel delivery (listen for the fuel pump whine) and spark (pull a plug and check for spark). A no-crank, no-click condition often points to a failed starter motor or corroded battery terminals."], ["lex", "car starting problems diagnosis troubleshoot"], ["lex", "car won't start battery starter ignition"], ["lex", "engine cranks no start fuel spark"], ["vec", "how do you diagnose why a car won't start and identify the root cause"], ["vec", "what are the common reasons a car fails to start and how to troubleshoot them"]]} +{"query": "how to identify personal values and beliefs?", "output": [["hyde", "Identify your core values by reflecting on peak experiences—moments when you felt most fulfilled and authentic. Write down 10-15 values (integrity, creativity, family, freedom) and narrow to your top 5. Ask: what angers you when it's violated? What would you fight for? A values card sort exercise—ranking printed values—can clarify priorities you struggle to articulate."], ["lex", "identify personal values beliefs self-reflection"], ["lex", "core values assessment life priorities"], ["lex", "personal values exercise self-awareness"], ["vec", "how can you identify and clarify your core personal values and beliefs"], ["vec", "what exercises and reflection methods help discover what you truly value in life"]]} +{"query": "what is the significance of the gnostic gospels?", "output": [["hyde", "The gnostic gospels are early Christian texts discovered at Nag Hammadi, Egypt in 1945. They include the Gospel of Thomas, Gospel of Philip, and Gospel of Truth. These texts reveal diverse beliefs in early Christianity—including the idea that salvation comes through secret knowledge (gnosis) rather than faith alone. They were excluded from the biblical canon as heretical by the 4th century church."], ["lex", "gnostic gospels significance Nag Hammadi"], ["lex", "gnostic texts Gospel Thomas early Christianity"], ["lex", "gnostic gospels meaning heresy Christian"], ["vec", "what are the gnostic gospels and why are they significant for understanding early Christianity"], ["vec", "how did the Nag Hammadi discovery change our knowledge of gnostic Christian texts"]]} +{"query": "russia train", "output": [["hyde", "The Trans-Siberian Railway is the longest railway line in the world, spanning 9,289 km from Moscow to Vladivostok over 6 days. Book tickets through Russian Railways (RZD) at rzd.ru or through agents like RealRussia. Classes include platzkart (open berth), kupe (4-person compartment), and SV (2-person sleeper). Bring your own food for long journeys."], ["lex", "Russia train travel Trans-Siberian railway"], ["lex", "Russian railway routes tickets booking"], ["lex", "Trans-Siberian Express Moscow Vladivostok"], ["vec", "how to travel by train in Russia and what are the major railway routes"], ["vec", "what is the Trans-Siberian Railway and how do you book tickets for Russian trains"]]} +{"query": "how do you write an effective book review?", "output": [["hyde", "An effective book review opens with the book's title, author, genre, and a one-sentence summary. Discuss the main themes and the author's writing style. Include specific examples and short quotations. Evaluate strengths and weaknesses honestly. Avoid spoilers for fiction. End with a recommendation and who would enjoy the book. Aim for 500-800 words."], ["lex", "book review writing effective structure"], ["lex", "write book review summary critique"], ["lex", "book review template opinion analysis"], ["vec", "how do you write a thoughtful and effective book review with summary and analysis"], ["vec", "what structure and elements make a strong book review for publication or school"]]} +{"query": "how to practice self-compassion?", "output": [["hyde", "Kristin Neff defines self-compassion as three components: self-kindness (treating yourself as you would a friend), common humanity (recognizing suffering is shared), and mindfulness (acknowledging pain without over-identifying). Practice by placing your hand on your heart when distressed and saying: \"This is a moment of suffering. Suffering is part of life. May I be kind to myself.\""], ["lex", "self-compassion practice exercises"], ["lex", "self-compassion Kristin Neff mindfulness"], ["lex", "self-kindness inner critic self-care"], ["vec", "what are practical ways to practice self-compassion and quiet your inner critic"], ["vec", "how does Kristin Neff's framework for self-compassion work in daily life"]]} +{"query": "what is the significance of pilgrimage in religion?", "output": [["hyde", "Pilgrimage holds deep significance across religions. Muslims perform Hajj to Mecca as one of the Five Pillars. Christians journey to Jerusalem, Rome, and Santiago de Compostela. Hindus bathe in the Ganges at Varanasi. The physical journey symbolizes an inner spiritual transformation—leaving ordinary life, enduring hardship, and arriving at a sacred place of renewal and encounter with the divine."], ["lex", "pilgrimage religion significance spiritual"], ["lex", "religious pilgrimage Mecca Jerusalem Varanasi"], ["lex", "pilgrimage sacred journey faith tradition"], ["vec", "why is pilgrimage important across different religious traditions"], ["vec", "what spiritual significance does the act of pilgrimage carry in major world religions"]]} +{"query": "api doc", "output": [["hyde", "API documentation describes available endpoints, request/response formats, authentication methods, and error codes. RESTful APIs typically document each endpoint with its HTTP method (GET, POST, PUT, DELETE), URL path, query parameters, request body schema, and example responses. Tools like Swagger/OpenAPI generate interactive docs where developers can test endpoints directly."], ["lex", "API documentation reference endpoints"], ["lex", "REST API docs developer guide"], ["lex", "API documentation Swagger OpenAPI"], ["vec", "how to read and use API documentation for integrating with a web service"], ["vec", "what tools and formats are used for creating and hosting API documentation"]]} +{"query": "how to boil an egg perfectly", "output": [["hyde", "Place eggs in a single layer in a pot and cover with cold water by 1 inch. Bring to a rolling boil, then remove from heat and cover. For soft-boiled: 6-7 minutes. For medium: 9-10 minutes. For hard-boiled: 12-13 minutes. Transfer immediately to an ice bath for 5 minutes. Older eggs (7-10 days) peel more easily than fresh ones."], ["lex", "boil egg perfectly soft hard"], ["lex", "boiled egg timing minutes technique"], ["lex", "perfect hard soft boiled egg recipe"], ["vec", "how long do you boil an egg for soft-boiled and hard-boiled results"], ["vec", "what is the best technique for boiling eggs so they peel easily and cook perfectly"]]} +{"query": "how to create a home office space", "output": [["hyde", "Set up your home office in a quiet room with natural light. Invest in an ergonomic chair with lumbar support and a desk at elbow height (28-30 inches). Position your monitor at arm's length with the top at eye level. Use a desk lamp with 4000-5000K color temperature. Keep cables organized and add a plant—studies show greenery reduces stress and improves focus."], ["lex", "home office setup design workspace"], ["lex", "home office desk chair ergonomic"], ["lex", "work from home office organization"], ["vec", "how do you set up a productive and ergonomic home office workspace"], ["vec", "what furniture, lighting, and layout create the best home office environment"]]} +{"query": "what are the basic laws of thermodynamics", "output": [["hyde", "The zeroth law establishes thermal equilibrium: if A and B are each in equilibrium with C, they are in equilibrium with each other. The first law states energy cannot be created or destroyed (conservation of energy). The second law says entropy in a closed system always increases—heat flows from hot to cold, never the reverse. The third law states entropy approaches zero as temperature approaches absolute zero."], ["lex", "laws of thermodynamics basic physics"], ["lex", "thermodynamics first second third law entropy"], ["lex", "thermodynamic laws energy heat transfer"], ["vec", "what are the four laws of thermodynamics and what does each one describe"], ["vec", "how do the laws of thermodynamics govern energy transfer and entropy"]]} +{"query": "how to create a home yoga space", "output": [["hyde", "Create a home yoga space in an area with at least 6x8 feet of clear floor space. Use a non-slip yoga mat (6mm thickness for comfort). Add blocks, a strap, and a bolster for supported poses. Keep the space clutter-free and at a comfortable temperature (68-72°F). Soft natural light and a small speaker for calming music enhance the atmosphere."], ["lex", "home yoga space setup room"], ["lex", "yoga room design mat props space"], ["lex", "home yoga studio create practice area"], ["vec", "how do you set up a dedicated yoga practice space in your home"], ["vec", "what equipment and room setup do you need for a home yoga studio"]]} +{"query": "what is the bible?", "output": [["hyde", "The Bible is the sacred scripture of Christianity, consisting of the Old Testament (39 books in Protestant tradition, 46 in Catholic) and the New Testament (27 books). The Old Testament includes the Torah, historical books, poetry, and prophets, written primarily in Hebrew. The New Testament contains the Gospels, Acts, Epistles, and Revelation, written in Greek during the 1st century CE."], ["lex", "Bible Christian scripture holy book"], ["lex", "Bible Old New Testament books"], ["lex", "Bible history composition canon"], ["vec", "what is the Bible and how is it organized into Old and New Testaments"], ["vec", "how was the Bible composed and compiled over time as a sacred text"]]} +{"query": "how does virtue ethics differ from other ethical theories", "output": [["hyde", "Virtue ethics (Aristotle) asks \"What kind of person should I be?\" rather than \"What should I do?\" Deontology (Kant) focuses on following moral rules regardless of outcomes. Consequentialism (Mill) judges actions by their results. Virtue ethics emphasizes developing moral character through habit and practical wisdom, while the others prescribe universal principles or calculations."], ["lex", "virtue ethics vs deontology consequentialism"], ["lex", "virtue ethics comparison ethical theories"], ["lex", "Aristotle virtue ethics Kant Mill contrast"], ["vec", "how does virtue ethics differ from deontological and consequentialist moral theories"], ["vec", "what makes virtue ethics unique compared to rule-based and outcome-based ethical frameworks"]]} +{"query": "how genetic research impacts medicine", "output": [["hyde", "Genetic research has revolutionized medicine through pharmacogenomics (tailoring drug dosages to genetic profiles), gene therapy (correcting defective genes, as in the FDA-approved Luxturna for inherited blindness), and CRISPR gene editing (potential cures for sickle cell disease). Genetic testing identifies cancer risk (BRCA1/2 mutations) enabling early screening and prevention."], ["lex", "genetic research medicine impact"], ["lex", "genomics personalized medicine gene therapy"], ["lex", "genetic testing pharmacogenomics CRISPR"], ["vec", "how has genetic research transformed medical treatments and diagnosis"], ["vec", "what advances in genomics and gene therapy are changing the future of medicine"]]} +{"query": "how to fix car scratches?", "output": [["hyde", "Car scratches fall into three categories: clear coat scratches (light, fingernail doesn't catch), base coat scratches (deeper, white visible), and primer/metal scratches (deepest). For clear coat scratches, use rubbing compound followed by polish. For deeper scratches, apply touch-up paint matching your car's color code (found on the door jamb sticker), then clear coat and wet sand with 2000-grit."], ["lex", "fix car scratches paint repair"], ["lex", "car scratch removal polish compound"], ["lex", "auto paint scratch repair DIY"], ["vec", "how do you repair and remove scratches from a car's paint finish at home"], ["vec", "what products and techniques fix different types of car paint scratches"]]} +{"query": "how digital currencies work", "output": [["hyde", "Digital currencies operate on blockchain technology—a decentralized ledger distributed across thousands of computers. When you send Bitcoin, the transaction is broadcast to the network. Miners validate transactions by solving cryptographic puzzles (proof of work), adding them to a block. Each block links to the previous one, creating an immutable chain. Wallets store private keys that prove ownership."], ["lex", "digital currency cryptocurrency blockchain"], ["lex", "Bitcoin cryptocurrency how it works"], ["lex", "digital currency blockchain mining wallet"], ["vec", "how do digital currencies like Bitcoin use blockchain technology to process transactions"], ["vec", "what is the technical process behind cryptocurrency transactions and mining"]]} +{"query": "what is existentialism", "output": [["hyde", "Existentialism holds that existence precedes essence—humans are not born with a fixed nature but create meaning through choices and actions. Kierkegaard emphasized individual faith and anxiety. Sartre declared we are \"condemned to be free\"—radical freedom brings radical responsibility. Camus confronted the absurd: life has no inherent meaning, yet we must live as if it does."], ["lex", "existentialism philosophy Sartre Kierkegaard"], ["lex", "existentialism existence precedes essence freedom"], ["lex", "existentialist philosophy meaning absurd"], ["vec", "what is existentialism and what are its core philosophical claims about human existence"], ["vec", "how did Sartre, Kierkegaard, and Camus develop existentialist philosophy"]]} +{"query": "what are the key concepts in marxist philosophy", "output": [["hyde", "Key concepts in Marxist philosophy include historical materialism (material conditions drive historical change), dialectical materialism (contradictions between productive forces and relations of production), class struggle (bourgeoisie vs. proletariat), alienation (workers separated from their labor's product), surplus value (profit extracted from unpaid labor), and ideology (ruling class ideas that justify the status quo)."], ["lex", "Marxist philosophy key concepts"], ["lex", "Marx dialectical materialism class struggle surplus"], ["lex", "Marxism alienation historical materialism ideology"], ["vec", "what are the central ideas and concepts in Karl Marx's philosophical framework"], ["vec", "how do dialectical materialism, class struggle, and alienation function in Marxist thought"]]} +{"query": "how to find emotional support", "output": [["hyde", "Find emotional support through multiple channels: talk to a trusted friend or family member. Contact a therapist through Psychology Today's directory or your insurance provider. Call the 988 Suicide and Crisis Lifeline (dial 988) for immediate help. Join support groups through NAMI or local community centers. Online therapy platforms like BetterHelp and Talkspace offer accessible counseling."], ["lex", "emotional support resources help"], ["lex", "finding emotional support therapy counseling"], ["lex", "mental health support groups crisis helpline"], ["vec", "where can someone find emotional support during difficult times or mental health challenges"], ["vec", "what resources are available for people seeking emotional support and counseling"]]} +{"query": "relationship goals", "output": [["hyde", "Healthy relationship goals include open and honest communication, maintaining individual identities while building shared experiences, resolving conflicts respectfully without contempt or stonewalling, expressing appreciation daily, supporting each other's personal growth, maintaining physical intimacy, and aligning on major life decisions like finances, children, and career priorities."], ["lex", "relationship goals healthy couple"], ["lex", "relationship goals communication trust partnership"], ["lex", "healthy relationship habits couples"], ["vec", "what are realistic and healthy relationship goals for couples to work toward"], ["vec", "how do couples build a strong relationship through communication and shared goals"]]} +{"query": "what is the role of media in politics", "output": [["hyde", "The media serves as the \"fourth estate\" in democracy—informing citizens, holding officials accountable, and setting the public agenda. Media framing shapes which issues voters prioritize. Agenda-setting theory shows that what the media covers becomes what the public considers important. The rise of partisan media and social media algorithms has increased polarization by creating ideological echo chambers."], ["lex", "media role politics influence"], ["lex", "political media coverage news bias"], ["lex", "media politics democracy journalism fourth estate"], ["vec", "what role does the media play in shaping political discourse and public opinion"], ["vec", "how does news coverage and media bias influence political outcomes and democracy"]]} +{"query": "what is stream of consciousness", "output": [["hyde", "Stream of consciousness is a narrative technique that presents a character's continuous flow of thoughts, feelings, and sensory impressions as they occur. Pioneered by writers like Virginia Woolf and James Joyce, it mimics the unstructured way the human mind processes experience."], ["lex", "stream of consciousness literary technique"], ["lex", "stream of consciousness narrative style"], ["vec", "what does stream of consciousness mean as a writing technique in literature"], ["vec", "how does stream of consciousness narration work in novels and fiction"]]} +{"query": "where to find budget travel tips", "output": [["hyde", "To travel on a budget, book flights midweek, use fare comparison tools like Google Flights or Skyscanner, stay in hostels or use house-sitting platforms, and eat at local markets instead of tourist restaurants."], ["lex", "budget travel tips cheap flights accommodations"], ["lex", "affordable travel planning money saving"], ["vec", "where can I find reliable tips for traveling on a tight budget"], ["vec", "what are the best resources for planning cheap vacations and budget trips"]]} +{"query": "what is fallibilism", "output": [["hyde", "Fallibilism is the philosophical doctrine that no belief or claim can ever be conclusively justified or proven beyond all doubt. Associated with Charles Sanders Peirce and Karl Popper, it holds that all human knowledge is provisional and subject to revision."], ["lex", "fallibilism epistemology philosophy"], ["lex", "fallibilism knowledge certainty"], ["vec", "what does fallibilism mean in philosophy and epistemology"], ["vec", "how does fallibilism challenge the idea that knowledge requires absolute certainty"]]} +{"query": "auth flow", "output": [["hyde", "The OAuth 2.0 authorization code flow begins when the client redirects the user to the authorization server. After login, the server returns an authorization code, which the client exchanges for an access token and refresh token via the token endpoint."], ["lex", "authentication flow OAuth JWT"], ["lex", "authorization code flow token exchange"], ["lex", "auth login session management"], ["vec", "how does an authentication and authorization flow work in web applications"], ["vec", "what are the steps in an OAuth 2.0 authorization code flow"]]} +{"query": "where to find datasets for scientific research", "output": [["hyde", "Public research datasets are available from repositories such as Kaggle, the UCI Machine Learning Repository, NASA's Open Data Portal, NOAA Climate Data, and institutional data archives like Harvard Dataverse and Zenodo."], ["lex", "scientific research datasets open data repositories"], ["lex", "public datasets academic research download"], ["vec", "where can researchers find free datasets for scientific studies"], ["vec", "what are the best open data repositories for academic and scientific research"]]} +{"query": "ui build", "output": [["hyde", "To build a responsive UI, start by choosing a component framework such as React, Vue, or Svelte. Use a build tool like Vite or Webpack to bundle assets, and style with CSS modules or Tailwind CSS for rapid layout development."], ["lex", "UI build frontend framework components"], ["lex", "user interface build tooling bundler"], ["lex", "UI component library development"], ["vec", "how to build a user interface for a web or mobile application"], ["vec", "what tools and frameworks are used to build modern frontend UIs"]]} +{"query": "how to conserve water at home?", "output": [["hyde", "Fix leaky faucets promptly—a single drip can waste over 3,000 gallons per year. Install low-flow showerheads and dual-flush toilets, run dishwashers and washing machines only with full loads, and water your garden early in the morning to minimize evaporation."], ["lex", "water conservation home tips"], ["lex", "reduce household water usage"], ["vec", "what are practical ways to conserve water at home and reduce water bills"], ["vec", "how can I use less water in my house for everyday tasks"]]} +{"query": "how to obtain information on state legislation", "output": [["hyde", "To track state legislation, visit your state legislature's official website, which provides bill text, status, and voting records. Tools like LegiScan and the National Conference of State Legislatures (NCSL) aggregate bills across all 50 states."], ["lex", "state legislation tracking bill search"], ["lex", "state law lookup legislative database"], ["vec", "how can I find and track state legislation and bills currently being considered"], ["vec", "what websites or tools let you look up state laws and legislative history"]]} +{"query": "what shoes for hiking?", "output": [["hyde", "For day hikes on well-maintained trails, lightweight hiking shoes with good tread provide enough support. For rocky or wet terrain, mid-cut waterproof boots with ankle support and Vibram soles offer better protection and stability."], ["lex", "hiking shoes boots trail footwear"], ["lex", "best hiking boots waterproof ankle support"], ["vec", "what type of shoes or boots should I wear for hiking on trails"], ["vec", "how to choose the right hiking footwear for different terrain and conditions"]]} +{"query": "what is the role of empathy in moral decision-making", "output": [["hyde", "Empathy allows individuals to imagine the experiences of others, which directly influences moral judgment. Studies show that people who score higher on empathy scales are more likely to make prosocial decisions, though critics like Paul Bloom argue empathy can also bias moral reasoning."], ["lex", "empathy moral decision-making ethics"], ["lex", "empathy role ethical judgment"], ["vec", "how does empathy influence the way people make moral and ethical decisions"], ["vec", "what role does feeling empathy play in moral reasoning and ethical behavior"]]} +{"query": "how to improve self-worth?", "output": [["hyde", "To improve self-worth, start by identifying and challenging negative self-talk. Practice self-compassion, set small achievable goals, keep a journal of accomplishments, and surround yourself with supportive people. Cognitive behavioral techniques can help reframe core beliefs about your value."], ["lex", "improve self-worth self-esteem building"], ["lex", "boost self-confidence self-value exercises"], ["vec", "what are effective strategies to improve your sense of self-worth and self-esteem"], ["vec", "how can someone build stronger self-worth through daily habits and mindset shifts"]]} +{"query": "what is cryptography", "output": [["hyde", "Cryptography is the science of encoding and decoding information to prevent unauthorized access. It uses algorithms like AES (symmetric) and RSA (asymmetric) to encrypt plaintext into ciphertext. Only parties with the correct key can decrypt the message back to its original form."], ["lex", "cryptography encryption decryption"], ["lex", "cryptographic algorithms symmetric asymmetric"], ["vec", "what is cryptography and how does it protect data through encryption"], ["vec", "how do cryptographic systems work to secure communications and information"]]} +{"query": "how to photograph reflections", "output": [["hyde", "To photograph reflections, use a polarizing filter to control glare and increase clarity. Shoot at a low angle to maximize the reflected image in water. For mirror or glass reflections, focus manually on the reflected subject rather than the surface itself."], ["lex", "photography reflections water glass mirror"], ["lex", "reflection photography techniques composition"], ["vec", "what techniques help capture sharp and creative reflection photographs"], ["vec", "how to photograph reflections in water, mirrors, and glass surfaces"]]} +{"query": "how do black holes form", "output": [["hyde", "Black holes form when a massive star—typically more than 20 solar masses—exhausts its nuclear fuel and can no longer support itself against gravitational collapse. The core implodes past the neutron star stage, compressing into a singularity surrounded by an event horizon."], ["lex", "black hole formation stellar collapse"], ["lex", "black holes neutron star supernova"], ["vec", "how do black holes form from dying stars and gravitational collapse"], ["vec", "what is the process by which a massive star becomes a black hole"]]} +{"query": "how to conduct literature review in research", "output": [["hyde", "Begin by defining your research question, then search databases like PubMed, Google Scholar, and Web of Science using targeted keywords. Screen abstracts for relevance, organize selected papers by theme, and synthesize findings to identify gaps in existing knowledge."], ["lex", "literature review research methodology"], ["lex", "academic literature review systematic search"], ["vec", "how do you conduct a thorough literature review for an academic research paper"], ["vec", "what are the steps to search, organize, and synthesize sources in a literature review"]]} +{"query": "how do scientists use models", "output": [["hyde", "Scientists use mathematical, computational, and physical models to represent complex systems. Climate models simulate atmospheric interactions, molecular models predict protein folding, and epidemiological models forecast disease spread. Models are validated against observed data and refined iteratively."], ["lex", "scientific models simulation prediction"], ["lex", "scientific modeling research methodology"], ["vec", "how do scientists use models to understand and predict natural phenomena"], ["vec", "what types of models do scientists build to test hypotheses and simulate systems"]]} +{"query": "how to stage a home for sale", "output": [["hyde", "Declutter every room, remove personal photos, and use neutral paint colors. Arrange furniture to maximize space and natural light. Add fresh flowers, clean all surfaces, and improve curb appeal with trimmed landscaping and a freshly painted front door."], ["lex", "home staging tips selling house"], ["lex", "stage house real estate curb appeal"], ["vec", "how do you stage a home to make it more appealing to potential buyers"], ["vec", "what are the key steps to prepare and stage a house before listing it for sale"]]} +{"query": "rim fix", "output": [["hyde", "Minor curb rash on alloy rims can be sanded, filled with body filler, and repainted at home. Bent rims require professional straightening on a hydraulic press. If the rim has cracks, replacement is safer than repair."], ["lex", "rim repair bent wheel fix"], ["lex", "alloy rim curb damage repair"], ["lex", "car wheel rim straightening"], ["vec", "how to fix a bent or damaged car wheel rim"], ["vec", "can a curb-damaged alloy rim be repaired and how much does it cost"]]} +{"query": "what is speculative fiction?", "output": [["hyde", "Speculative fiction is an umbrella genre that includes science fiction, fantasy, horror, dystopian, and alternate history literature. It explores \"what if\" scenarios by altering known reality—imagining different technologies, social structures, or natural laws."], ["lex", "speculative fiction genre definition"], ["lex", "speculative fiction sci-fi fantasy dystopia"], ["vec", "what is speculative fiction and what genres does it encompass"], ["vec", "how is speculative fiction different from science fiction and fantasy"]]} +{"query": "what are algorithms in computer science", "output": [["hyde", "An algorithm is a finite sequence of well-defined instructions for solving a class of problems or performing a computation. Common examples include sorting algorithms (quicksort, mergesort), search algorithms (binary search), and graph algorithms (Dijkstra's shortest path)."], ["lex", "algorithms computer science data structures"], ["lex", "algorithm sorting searching complexity"], ["vec", "what are algorithms in computer science and why are they fundamental"], ["vec", "how do computer science algorithms solve problems through step-by-step procedures"]]} +{"query": "how to calculate car loan payments?", "output": [["hyde", "The monthly car loan payment is calculated using the formula: M = P × [r(1+r)^n] / [(1+r)^n − 1], where P is the principal, r is the monthly interest rate (annual rate divided by 12), and n is the total number of monthly payments."], ["lex", "car loan payment calculator formula"], ["lex", "auto loan monthly payment interest rate"], ["vec", "how do you calculate monthly car loan payments based on principal, interest rate, and term"], ["vec", "what formula is used to determine monthly auto loan payments"]]} +{"query": "how to recycle electronics?", "output": [["hyde", "Many retailers like Best Buy and Staples offer free electronics drop-off recycling. Check Earth911.org for local e-waste facilities. Before recycling, wipe personal data from devices. Never throw electronics in regular trash—they contain lead, mercury, and other hazardous materials."], ["lex", "electronics recycling e-waste disposal"], ["lex", "recycle old computers phones e-waste"], ["vec", "how and where can I recycle old electronics like phones, computers, and TVs"], ["vec", "what is the proper way to dispose of electronic waste responsibly"]]} +{"query": "what is the significance of the anti-hero?", "output": [["hyde", "The anti-hero challenges traditional notions of heroism by embodying flawed, morally ambiguous traits. Characters like Raskolnikov, Walter White, and Deadpool resonate because they reflect the complexity of human nature, blurring the line between virtue and vice."], ["lex", "anti-hero literary significance character"], ["lex", "anti-hero fiction protagonist flawed"], ["vec", "what is the literary significance of the anti-hero as a character type in fiction"], ["vec", "why are anti-heroes important in storytelling and what do they represent"]]} +{"query": "what is the significance of ramadan", "output": [["hyde", "Ramadan is the ninth month of the Islamic lunar calendar, during which Muslims fast from dawn to sunset. It commemorates the first revelation of the Quran to Prophet Muhammad. The fast cultivates self-discipline, empathy for the hungry, and spiritual closeness to God."], ["lex", "Ramadan significance Islam fasting"], ["lex", "Ramadan holy month Muslim observance"], ["vec", "what is the spiritual and cultural significance of Ramadan in Islam"], ["vec", "why do Muslims observe Ramadan and what does the month represent"]]} +{"query": "where to find landscaping stones?", "output": [["hyde", "Landscaping stones can be purchased from home improvement stores like Home Depot and Lowe's, local stone yards, and quarries. For bulk orders, landscape supply companies deliver directly. River rock, flagstone, and pea gravel are popular choices for garden paths and borders."], ["lex", "landscaping stones buy garden rocks"], ["lex", "landscape stone supply yard near me"], ["vec", "where can I buy landscaping stones and decorative rocks for my yard"], ["vec", "what are the best places to find affordable landscaping stones and pavers"]]} +{"query": "where to watch latest movies online", "output": [["hyde", "New theatrical releases typically arrive on streaming platforms 45-90 days after their cinema debut. Netflix, Amazon Prime Video, Disney+, Apple TV+, and Max each acquire exclusive titles. Check JustWatch.com to see which service currently streams a specific movie."], ["lex", "watch movies online streaming platforms 2026"], ["lex", "latest movies streaming services new releases"], ["vec", "where can I watch the latest movies online through streaming services in 2026"], ["vec", "which streaming platforms have the newest movie releases available to watch"]]} +{"query": "what is contemporary art?", "output": [["hyde", "Contemporary art refers to art produced from the late 20th century to the present day. Unlike modern art (roughly 1860s–1970s), contemporary art encompasses a wide range of media—installation, video, digital, and performance—and often engages with identity, globalization, and technology."], ["lex", "contemporary art definition movement"], ["lex", "contemporary art 21st century modern"], ["vec", "what defines contemporary art and how is it different from modern art"], ["vec", "what are the key characteristics and themes of contemporary art"]]} +{"query": "what is the significance of easter", "output": [["hyde", "Easter celebrates the resurrection of Jesus Christ on the third day after his crucifixion, as described in the New Testament Gospels. It is the most important feast in Christianity, marking the fulfillment of prophecy and the foundation of Christian faith in life after death."], ["lex", "Easter significance Christianity resurrection"], ["lex", "Easter religious meaning Christian holiday"], ["vec", "what is the religious and cultural significance of Easter in Christianity"], ["vec", "why is Easter considered the most important Christian holiday"]]} +{"query": "how to install peel and stick wallpaper", "output": [["hyde", "Clean the wall surface and let it dry completely. Start at the top, peeling back a few inches of backing at a time. Use a smoothing tool to press the wallpaper flat, working from the center outward to remove air bubbles. Trim excess at the ceiling and baseboard with a sharp blade."], ["lex", "peel and stick wallpaper installation"], ["lex", "self-adhesive wallpaper apply walls"], ["vec", "what are the steps to properly install peel and stick wallpaper on a wall"], ["vec", "how do you apply self-adhesive wallpaper without bubbles or wrinkles"]]} +{"query": "how do behavioral scientists study behavior", "output": [["hyde", "Behavioral scientists study behavior through controlled experiments, field observations, surveys, and neuroimaging. Randomized controlled trials isolate variables, while observational studies capture behavior in natural settings. Eye-tracking and fMRI provide physiological data on decision-making processes."], ["lex", "behavioral science research methods"], ["lex", "behavioral psychology experiments observation"], ["vec", "what methods do behavioral scientists use to study and measure human behavior"], ["vec", "how do behavioral researchers design experiments and observational studies"]]} +{"query": "soccer training drills", "output": [["hyde", "Set up a cone dribbling course with 10 cones spaced 2 meters apart. Players weave through using inside and outside touches at speed. For passing accuracy, pair players 15 meters apart and practice one-touch passes, alternating feet. Finish sessions with 1v1 attacking drills near the box."], ["lex", "soccer training drills exercises"], ["lex", "football practice drills passing shooting"], ["vec", "what are effective soccer training drills for improving skills and fitness"], ["vec", "which soccer drills help players improve dribbling, passing, and shooting"]]} +{"query": "how to invest in the stock market", "output": [["hyde", "To start investing, open a brokerage account with a platform like Fidelity, Schwab, or Vanguard. Begin with low-cost index funds that track the S&P 500 for broad diversification. Invest regularly through dollar-cost averaging and avoid trying to time the market."], ["lex", "stock market investing beginner guide"], ["lex", "invest stocks brokerage portfolio"], ["vec", "how do beginners start investing in the stock market and building a portfolio"], ["vec", "what are the basic steps to open a brokerage account and buy stocks"]]} +{"query": "what is the role of prophets in christianity?", "output": [["hyde", "In Christianity, prophets are individuals called by God to deliver divine messages and foretell events. Old Testament prophets like Isaiah and Jeremiah predicted the coming of the Messiah. In the New Testament, Jesus is seen as the ultimate fulfillment of prophetic tradition."], ["lex", "prophets Christianity role Bible"], ["lex", "Christian prophets Old Testament New Testament"], ["vec", "what role do prophets play in Christian theology and scripture"], ["vec", "how are prophets understood in Christianity compared to other Abrahamic religions"]]} +{"query": "what is a no-dig garden?", "output": [["hyde", "A no-dig garden is built by layering organic materials—cardboard, compost, straw, and leaf mold—directly on top of existing ground. This preserves soil structure, encourages worm activity, suppresses weeds, and builds fertile topsoil without the labor of digging or tilling."], ["lex", "no-dig garden method sheet mulching"], ["lex", "no-dig gardening lasagna layering technique"], ["vec", "what is a no-dig garden and how do you build one without tilling the soil"], ["vec", "how does the no-dig gardening method work to improve soil health"]]} +{"query": "how to raise startup capital", "output": [["hyde", "Startup capital can come from bootstrapping, friends and family, angel investors, venture capital firms, crowdfunding platforms like Kickstarter, or government grants. Prepare a pitch deck with your business model, market size, traction metrics, and financial projections before approaching investors."], ["lex", "raise startup capital funding sources"], ["lex", "startup fundraising seed investors venture capital"], ["vec", "what are the main ways to raise capital for a new startup company"], ["vec", "how do founders raise seed funding and early-stage investment for a startup"]]} +{"query": "how to save money effectively", "output": [["hyde", "Follow the 50/30/20 rule: allocate 50% of income to needs, 30% to wants, and 20% to savings. Automate transfers to a high-yield savings account on payday. Track spending with an app, cancel unused subscriptions, and build a 3-6 month emergency fund before investing."], ["lex", "save money tips budgeting strategies"], ["lex", "effective saving habits personal finance"], ["vec", "what are effective strategies and habits for saving money consistently"], ["vec", "how can I create a budget and save more money each month"]]} +{"query": "what is the problem of evil", "output": [["hyde", "The problem of evil asks: if an omnipotent, omniscient, and benevolent God exists, why does suffering occur? Epicurus first formulated this dilemma. Theodicies like the free will defense and soul-making theodicy attempt to reconcile God's existence with the reality of evil."], ["lex", "problem of evil philosophy theodicy"], ["lex", "problem of evil God suffering"], ["vec", "what is the philosophical problem of evil and how does it challenge belief in God"], ["vec", "how do philosophers and theologians respond to the problem of evil and suffering"]]} +{"query": "how to register to vote online", "output": [["hyde", "Most U.S. states offer online voter registration at vote.org or through the secretary of state's website. You'll need your state-issued ID number or last four digits of your Social Security number, your date of birth, and current residential address."], ["lex", "register to vote online voter registration"], ["lex", "online voter registration state website"], ["vec", "how can I register to vote online in my state"], ["vec", "what do I need to register to vote through an online voter registration system"]]} +{"query": "what are the principles of evolution", "output": [["hyde", "Evolution operates through four key principles: variation (individuals differ genetically), inheritance (traits pass from parents to offspring), selection (individuals better adapted to their environment survive and reproduce more), and time (changes accumulate across generations, leading to speciation)."], ["lex", "principles of evolution natural selection"], ["lex", "evolution theory variation inheritance selection"], ["vec", "what are the core principles of biological evolution by natural selection"], ["vec", "how do variation, inheritance, and selection drive the process of evolution"]]} +{"query": "explain the ten commandments", "output": [["hyde", "The Ten Commandments, given to Moses on Mount Sinai, include: (1) You shall have no other gods before me, (2) You shall not make idols, (3) You shall not take the Lord's name in vain, (4) Remember the Sabbath, (5) Honor your father and mother, (6) You shall not murder."], ["lex", "Ten Commandments Bible Exodus Deuteronomy"], ["lex", "Ten Commandments meaning list"], ["vec", "what are the Ten Commandments and what does each one mean"], ["vec", "how are the Ten Commandments explained in the Bible and interpreted by different faiths"]]} +{"query": "how to pose people for portraits", "output": [["hyde", "Have your subject shift their weight to one foot and angle their body 45 degrees from the camera. Turn the chin slightly down and toward the light. For hands, give them something to hold or rest them naturally. Ask them to breathe out before the shot to relax their expression."], ["lex", "portrait posing techniques photography"], ["lex", "portrait photography poses guide"], ["vec", "what are effective ways to pose people for flattering portrait photographs"], ["vec", "how do professional photographers direct subjects into natural-looking portrait poses"]]} +{"query": "css grid", "output": [["hyde", ".container { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } .item-wide { grid-column: span 2; } CSS Grid allows two-dimensional layout control with explicit row and column definitions, making it ideal for full-page layouts."], ["lex", "CSS grid layout template columns rows"], ["lex", "CSS grid container gap alignment"], ["lex", "CSS grid-template-areas responsive"], ["vec", "how to create page layouts using CSS grid with rows and columns"], ["vec", "what are the key CSS grid properties for building responsive layouts"]]} +{"query": "how to go plastic-free in the kitchen?", "output": [["hyde", "Replace plastic wrap with beeswax wraps or silicone lids. Store food in glass jars or stainless steel containers. Use bar dish soap instead of bottled liquid soap. Buy in bulk using cloth bags, and choose wooden or bamboo utensils over plastic ones."], ["lex", "plastic-free kitchen alternatives"], ["lex", "reduce plastic kitchen reusable containers"], ["vec", "how can I eliminate single-use plastics from my kitchen"], ["vec", "what are the best plastic-free alternatives for food storage and kitchen items"]]} +{"query": "what are the teachings of confucius?", "output": [["hyde", "Confucius emphasized ren (benevolence), li (ritual propriety), xiao (filial piety), and junzi (the ideal of a morally cultivated person). He taught that social harmony comes from fulfilling one's role in relationships—ruler to subject, parent to child, husband to wife, elder to younger, and friend to friend."], ["lex", "Confucius teachings Confucianism philosophy"], ["lex", "Confucian ethics filial piety ren li"], ["vec", "what are the main teachings and ethical principles of Confucius"], ["vec", "how did Confucius define virtue, proper conduct, and social harmony"]]} +{"query": "what is performance art?", "output": [["hyde", "Performance art is a live, time-based art form in which the artist's body and actions are the medium. Emerging in the 1960s and 70s, artists like Marina Abramović, Yoko Ono, and Joseph Beuys blurred boundaries between art and life, often engaging audiences directly."], ["lex", "performance art definition live medium"], ["lex", "performance art artists examples history"], ["vec", "what is performance art and how does it differ from traditional visual art"], ["vec", "what are the defining characteristics and famous examples of performance art"]]} +{"query": "how do vaccines work", "output": [["hyde", "Vaccines introduce a weakened, inactivated, or fragment form of a pathogen (or its mRNA blueprint) into the body. The immune system recognizes it as foreign, produces antibodies, and creates memory cells. If exposed to the real pathogen later, the immune system responds rapidly."], ["lex", "vaccines immune system antibodies mechanism"], ["lex", "how vaccines work immunization"], ["vec", "how do vaccines train the immune system to fight diseases"], ["vec", "what is the biological mechanism by which vaccines provide immunity"]]} +{"query": "ai-driven marketing", "output": [["hyde", "AI-driven marketing uses machine learning to segment audiences, predict customer behavior, and personalize content at scale. Tools like predictive analytics, chatbots, and recommendation engines increase conversion rates. A/B testing is automated, and ad spend is optimized in real time by algorithms."], ["lex", "AI-driven marketing automation personalization"], ["lex", "artificial intelligence marketing campaigns analytics"], ["vec", "how is artificial intelligence being used to drive marketing strategies and campaigns"], ["vec", "what AI tools and techniques improve marketing personalization and customer targeting"]]} +{"query": "how to pursue a career in scientific research", "output": [["hyde", "A career in scientific research typically starts with a bachelor's degree in a STEM field, followed by a PhD program where you specialize in a research area. After completing your doctorate, postdoctoral positions provide additional training before applying for faculty or industry research roles."], ["lex", "scientific research career path academia"], ["lex", "career scientist PhD research position"], ["vec", "what steps should I take to pursue a career in scientific research"], ["vec", "what education and experience are needed to become a professional researcher in science"]]} +{"query": "what is cryptocurrency trading?", "output": [["hyde", "Cryptocurrency trading involves buying and selling digital assets like Bitcoin and Ethereum on exchanges. Traders use market orders, limit orders, and stop-losses. Strategies range from long-term holding (HODLing) to day trading based on technical analysis of price charts and volume indicators."], ["lex", "cryptocurrency trading buy sell exchange"], ["lex", "crypto trading Bitcoin Ethereum strategies"], ["vec", "what is cryptocurrency trading and how do people buy and sell digital currencies"], ["vec", "how does cryptocurrency trading work on exchanges like Coinbase and Binance"]]} +{"query": "what is calculus used for", "output": [["hyde", "Calculus is used to model rates of change and accumulation. In physics, derivatives describe velocity and acceleration; integrals calculate areas and volumes. Engineers use calculus to design structures, economists model marginal cost and revenue, and biologists model population growth with differential equations."], ["lex", "calculus applications real world uses"], ["lex", "calculus derivatives integrals physics engineering"], ["vec", "what are the real-world applications of calculus in science and engineering"], ["vec", "how is calculus used in physics, economics, and other fields"]]} +{"query": "how does moral philosophy address human rights", "output": [["hyde", "Moral philosophy grounds human rights through several frameworks: natural law theory holds rights are inherent to human nature, Kantian ethics argues every person deserves dignity as a rational agent, and utilitarianism supports rights as instruments that maximize overall well-being."], ["lex", "moral philosophy human rights ethics"], ["lex", "philosophical foundations human rights natural rights"], ["vec", "how does moral philosophy provide a foundation for human rights"], ["vec", "what ethical theories support the concept of universal human rights"]]} +{"query": "how to choose a writing genre?", "output": [["hyde", "Consider what you love to read—your favorite genre as a reader often translates well. Experiment by writing short pieces in different genres: fantasy, mystery, literary fiction, memoir. Pay attention to which genre energizes you and where your voice feels most natural."], ["lex", "choose writing genre fiction nonfiction"], ["lex", "writing genre selection author style"], ["vec", "how should a writer choose the best genre for their writing style and interests"], ["vec", "what factors help an author decide which literary genre to write in"]]} +{"query": "how to write a standout personal statement", "output": [["hyde", "Open with a vivid, specific anecdote—not a generic quote. Show rather than tell by describing experiences that shaped your goals. Connect your past to your intended field of study. Be authentic; admissions officers read thousands of essays and recognize genuine voice immediately."], ["lex", "personal statement writing tips college application"], ["lex", "standout personal statement essay graduate school"], ["vec", "how do you write a compelling personal statement for college or graduate school admissions"], ["vec", "what makes a personal statement stand out to admissions committees"]]} +{"query": "how to improve sleep quality", "output": [["hyde", "Maintain a consistent sleep schedule, even on weekends. Keep your bedroom cool (65-68°F), dark, and quiet. Avoid screens for 30 minutes before bed. Limit caffeine after noon. Regular exercise improves sleep, but finish workouts at least 3 hours before bedtime."], ["lex", "improve sleep quality tips habits"], ["lex", "better sleep hygiene insomnia remedies"], ["vec", "what are proven ways to improve sleep quality and fall asleep faster"], ["vec", "how can I develop better sleep habits to get more restful sleep"]]} +{"query": "how to stay updated on global affairs", "output": [["hyde", "Follow reputable outlets like Reuters, AP News, BBC World, and The Economist for balanced global coverage. Use RSS readers or news aggregator apps like Feedly. Subscribe to daily briefing newsletters such as Morning Brew or The Daily from the New York Times."], ["lex", "global affairs news sources current events"], ["lex", "world news reliable sources daily updates"], ["vec", "what are the best ways to stay informed about global affairs and world news"], ["vec", "which news sources and tools help you keep up with international current events"]]} +{"query": "what are the characteristics of renaissance architecture?", "output": [["hyde", "Renaissance architecture, flourishing in 15th-16th century Italy, revived classical Greek and Roman forms. Key features include symmetrical facades, round arches, columns with Corinthian capitals, hemispherical domes (as in Brunelleschi's Florence Cathedral), and harmonious proportions based on geometry."], ["lex", "Renaissance architecture characteristics features"], ["lex", "Renaissance architecture columns dome symmetry"], ["vec", "what are the defining characteristics of Renaissance architecture in Europe"], ["vec", "how did Renaissance architects use symmetry, columns, and domes in their buildings"]]} +{"query": "what are color modes in photography?", "output": [["hyde", "Digital photographs use RGB color mode for screens, with sRGB as the standard web color space and Adobe RGB offering a wider gamut for print work. CMYK is used for commercial printing. ProPhoto RGB captures the widest range but requires careful color management to avoid banding."], ["lex", "color modes photography RGB CMYK sRGB"], ["lex", "photography color space Adobe RGB ProPhoto"], ["vec", "what are the different color modes and color spaces used in digital photography"], ["vec", "how do RGB, sRGB, Adobe RGB, and CMYK color modes affect photo editing and printing"]]} +{"query": "how to create a zen garden?", "output": [["hyde", "A zen garden (karesansui) uses raked white gravel or sand to represent water, with carefully placed rocks symbolizing mountains or islands. Rake parallel lines for calm or concentric circles around rocks. Keep the design minimal—moss, a few stones, and clean gravel on a flat rectangular area."], ["lex", "zen garden create Japanese rock garden"], ["lex", "zen garden design sand gravel stones"], ["vec", "how do you design and create a traditional Japanese zen rock garden"], ["vec", "what materials and layout principles are used in building a zen garden"]]} +{"query": "mountain peak", "output": [["hyde", "Mount Everest stands at 8,849 meters (29,032 ft), the highest peak on Earth. K2 at 8,611 m and Kangchenjunga at 8,586 m follow. For trekkers, peaks like Mont Blanc (4,808 m) and Mount Kilimanjaro (5,895 m) are accessible without technical climbing experience."], ["lex", "mountain peak climbing summit elevation"], ["lex", "highest mountain peaks world list"], ["lex", "mountain peak hiking trails"], ["vec", "what are the highest mountain peaks in the world and their elevations"], ["vec", "how to plan a hike or climb to a mountain peak summit"]]} +{"query": "how to follow campaign finance laws", "output": [["hyde", "Campaign finance laws require candidates to register with the FEC, disclose all contributions and expenditures, and adhere to contribution limits. Individual donors can give up to $3,300 per candidate per election. PACs and Super PACs have separate rules. File quarterly reports electronically."], ["lex", "campaign finance laws compliance regulations"], ["lex", "campaign finance rules FEC political donations"], ["vec", "how do political candidates and organizations comply with campaign finance laws"], ["vec", "what are the key campaign finance regulations and reporting requirements in the U.S."]]} +{"query": "how to advocate for education reform", "output": [["hyde", "Start by attending school board meetings and building relationships with elected officials. Join or form coalitions with parent groups, teachers' unions, and nonprofits. Write op-eds, organize town halls, and use data on student outcomes to make evidence-based arguments for specific policy changes."], ["lex", "education reform advocacy strategies"], ["lex", "advocate education policy change"], ["vec", "how can individuals effectively advocate for education reform in their community"], ["vec", "what strategies work for pushing education policy changes at the local and state level"]]} +{"query": "how do philosophical arguments work", "output": [["hyde", "A philosophical argument consists of premises (claims assumed to be true) and a conclusion that follows from them. In a deductive argument, if the premises are true and the form is valid, the conclusion must be true. An argument is sound when it is both valid and its premises are actually true."], ["lex", "philosophical arguments logic premises conclusion"], ["lex", "philosophical reasoning deductive inductive"], ["vec", "how are philosophical arguments structured with premises and conclusions"], ["vec", "what makes a philosophical argument valid or sound in logic"]]} +{"query": "fix roof", "output": [["hyde", "For minor roof leaks, locate the source from the attic during rain. Replace cracked or missing shingles by lifting surrounding shingles, removing nails, and sliding in a new one. Apply roofing cement under flashing for small gaps. For structural damage or large areas, hire a licensed roofer."], ["lex", "roof repair fix leak shingles"], ["lex", "roof damage repair DIY contractor"], ["lex", "fix roof leak flashing"], ["vec", "how to repair a damaged or leaking roof at home"], ["vec", "when should you DIY a roof fix versus hiring a professional roofer"]]} +{"query": "how to implement csr initiatives", "output": [["hyde", "Start by conducting a materiality assessment to identify social and environmental issues relevant to your business and stakeholders. Set measurable goals aligned with the UN Sustainable Development Goals. Allocate budget, assign a dedicated CSR team, and report progress annually using GRI standards."], ["lex", "CSR initiatives corporate social responsibility implementation"], ["lex", "corporate social responsibility programs strategy"], ["vec", "how do companies implement corporate social responsibility initiatives effectively"], ["vec", "what steps should a business take to launch a CSR program"]]} +{"query": "how to meditate for beginners", "output": [["hyde", "Sit comfortably with your back straight. Close your eyes and focus on your breath—notice each inhale and exhale. When thoughts arise, gently return attention to your breathing without judgment. Start with 5 minutes daily and gradually increase. Consistency matters more than duration."], ["lex", "meditation beginners guide mindfulness"], ["lex", "beginner meditation techniques breathing"], ["vec", "how do beginners start a daily meditation practice from scratch"], ["vec", "what are simple meditation techniques for people who have never meditated before"]]} +{"query": "how to boost immune system naturally", "output": [["hyde", "Eat a diet rich in fruits, vegetables, and lean protein to supply vitamins C, D, and zinc. Exercise moderately for 30 minutes most days. Sleep 7-9 hours per night. Manage stress through meditation or yoga. Fermented foods like yogurt and kimchi support gut health, which is linked to immune function."], ["lex", "boost immune system natural remedies"], ["lex", "strengthen immune system diet exercise sleep"], ["vec", "what natural methods help strengthen the immune system"], ["vec", "which foods, supplements, and lifestyle habits boost immune function naturally"]]} +{"query": "how to bake a cake from scratch", "output": [["hyde", "Preheat oven to 350°F (175°C). Mix 2 cups flour, 1.5 cups sugar, 3 eggs, 1 cup butter, 1 cup milk, 2 tsp baking powder, 1 tsp vanilla. Pour into greased 9-inch pans and bake 30-35 minutes until a toothpick comes out clean. Cool before frosting."], ["lex", "bake cake from scratch recipe"], ["lex", "homemade cake recipe flour butter eggs"], ["vec", "how do you bake a basic cake from scratch without a box mix"], ["vec", "what is a simple recipe for baking a homemade vanilla or chocolate cake"]]} +{"query": "what are the main festivals in hinduism", "output": [["hyde", "Diwali, the festival of lights, celebrates the triumph of light over darkness and honors Lakshmi. Holi marks the arrival of spring with colored powders. Navratri is a nine-night festival honoring the goddess Durga. Ganesh Chaturthi celebrates the birth of Lord Ganesha with elaborate processions."], ["lex", "Hindu festivals Diwali Holi Navratri"], ["lex", "Hinduism religious festivals celebrations"], ["vec", "what are the major festivals celebrated in Hinduism and their significance"], ["vec", "which Hindu festivals are the most widely observed and what do they celebrate"]]} +{"query": "how to replace car air filter?", "output": [["hyde", "Open the hood and locate the air filter housing—usually a black plastic box near the engine. Unclip the latches, remove the old filter, and note its orientation. Insert the new filter with the rubber rim facing up, close the housing, and secure the clips. Replace every 12,000-15,000 miles."], ["lex", "replace car air filter engine cabin"], ["lex", "car air filter replacement DIY steps"], ["vec", "how do you replace the engine air filter in a car yourself"], ["vec", "what are the steps to change a car's air filter at home without a mechanic"]]} +{"query": "digital transformation strategies", "output": [["hyde", "A digital transformation strategy begins with assessing current processes and identifying bottlenecks. Prioritize quick wins like automating manual workflows. Migrate infrastructure to cloud platforms, adopt data analytics for decision-making, and invest in employee training. Measure ROI with KPIs tied to business outcomes."], ["lex", "digital transformation strategy enterprise"], ["lex", "digital transformation cloud automation AI"], ["vec", "what strategies do organizations use to drive successful digital transformation"], ["vec", "how do enterprises plan and execute a digital transformation initiative"]]} +{"query": "how to argument for climate action", "output": [["hyde", "The scientific consensus is clear: global temperatures have risen 1.1°C since pre-industrial levels, causing more extreme weather, rising seas, and ecosystem collapse. Economic analyses show that the cost of inaction—estimated at $23 trillion by 2050—far exceeds the investment needed for a clean energy transition."], ["lex", "argue climate action policy advocacy"], ["lex", "climate change argument evidence persuasion"], ["vec", "how can you make a compelling argument for urgent climate action"], ["vec", "what evidence and reasoning support the case for strong climate change policies"]]} +{"query": "how does human activity affect climate change", "output": [["hyde", "Human activities—primarily burning fossil fuels for energy, deforestation, and industrial agriculture—release greenhouse gases like CO2 and methane into the atmosphere. Since 1850, atmospheric CO2 has risen from 280 to over 420 ppm, trapping heat and raising global average temperatures by 1.1°C."], ["lex", "human activity climate change greenhouse gas emissions"], ["lex", "anthropogenic climate change fossil fuels deforestation"], ["vec", "how do human activities like burning fossil fuels contribute to climate change"], ["vec", "what is the scientific evidence linking human activity to global warming"]]} +{"query": "how to create a wildlife-friendly garden?", "output": [["hyde", "Plant native flowering species to attract pollinators—coneflower, milkweed, and lavender support bees and butterflies. Add a shallow water dish, leave leaf litter for insects, install nest boxes for birds, and avoid pesticides. A log pile provides habitat for beetles, frogs, and hedgehogs."], ["lex", "wildlife-friendly garden habitat plants"], ["lex", "garden attract birds bees butterflies"], ["vec", "how can I design a garden that attracts and supports local wildlife"], ["vec", "what plants and features make a garden friendly to birds, bees, and butterflies"]]} +{"query": "how to prepare for a long hike", "output": [["hyde", "Train by walking with a loaded pack for progressively longer distances over 4-6 weeks. Pack the ten essentials: navigation, sun protection, insulation, illumination, first aid, fire, tools, nutrition, hydration, and shelter. Check the weather forecast and file a trip plan with someone you trust."], ["lex", "long hike preparation gear checklist"], ["lex", "hiking preparation training nutrition hydration"], ["vec", "how should I prepare physically and logistically for a long day hike or multi-day trek"], ["vec", "what gear, training, and planning is needed before a long hiking trip"]]} +{"query": "how to use photoshop for digital painting?", "output": [["hyde", "In Photoshop, start a digital painting by creating a new canvas at 300 DPI. Use the Brush tool (B) with pressure sensitivity enabled on a graphics tablet. Block in shapes on separate layers, then refine details. Use layer blend modes like Multiply for shadows and Screen for highlights."], ["lex", "Photoshop digital painting brushes techniques"], ["lex", "digital painting Photoshop tutorial layers"], ["vec", "how do you use Adobe Photoshop for digital painting and illustration"], ["vec", "what Photoshop tools, brushes, and techniques are essential for digital painting"]]} +{"query": "what changed in kubernetes latest version", "output": [["hyde", "Kubernetes v1.32 introduced improvements to sidecar containers (now GA), enhanced pod scheduling with dynamic resource allocation, graduated the Gateway API to stable, and deprecated legacy in-tree cloud provider integrations in favor of external cloud controller managers."], ["lex", "Kubernetes latest version changes release notes 2025 2026"], ["lex", "Kubernetes new features changelog update"], ["vec", "what are the notable changes and new features in the latest Kubernetes release"], ["vec", "what major features were added or deprecated in the most recent Kubernetes version in 2025 or 2026"]]} +{"query": "what is e-commerce?", "output": [["hyde", "E-commerce (electronic commerce) is the buying and selling of goods or services over the internet. Business models include B2C (Amazon, Shopify stores), B2B (Alibaba), C2C (eBay, Etsy), and D2C (brands selling directly). Transactions are processed through payment gateways like Stripe or PayPal."], ["lex", "e-commerce electronic commerce online shopping"], ["lex", "e-commerce platform business model"], ["vec", "what is e-commerce and how do online businesses sell products and services"], ["vec", "how does electronic commerce work from storefront to payment processing"]]} +{"query": "what is meant by 'the good life' in philosophy", "output": [["hyde", "In Aristotelian ethics, the good life (eudaimonia) is achieved through the practice of virtue and the exercise of reason over a complete lifetime. It is not mere pleasure but a state of flourishing—living in accordance with one's highest capacities within a community."], ["lex", "the good life philosophy eudaimonia ethics"], ["lex", "philosophical good life Aristotle virtue happiness"], ["vec", "what does the concept of the good life mean in philosophy and ethics"], ["vec", "how did Aristotle and other philosophers define what it means to live a good life"]]} +{"query": "how to obtain information on federal legislation", "output": [["hyde", "Congress.gov is the official source for federal legislation. Search by bill number, keyword, or sponsor. Each bill page shows full text, status, cosponsors, committee actions, and vote records. GovTrack.us and ProPublica's Congress API provide additional analysis and tracking tools."], ["lex", "federal legislation tracking Congress bills"], ["lex", "federal law lookup Congress.gov bill status"], ["vec", "how can I find information about federal legislation and bills in the U.S. Congress"], ["vec", "what resources are available to track federal bills and laws through the legislative process"]]} +{"query": "what are the elements of classical music?", "output": [["hyde", "Classical music is built on melody (a sequence of notes forming a theme), harmony (chords supporting the melody), rhythm (the timing and pattern of notes), dynamics (volume changes), and form (the structure, such as sonata, rondo, or theme and variations)."], ["lex", "classical music elements melody harmony rhythm"], ["lex", "classical music composition structure form"], ["vec", "what are the fundamental elements and structures of classical music"], ["vec", "how do melody, harmony, rhythm, and form work together in classical music compositions"]]} +{"query": "what are celtic traditions and customs", "output": [["hyde", "Celtic traditions include seasonal festivals marking the agricultural calendar: Samhain (Oct 31) honored the dead and the start of winter, Imbolc (Feb 1) marked spring's return, Beltane (May 1) celebrated fertility with bonfires, and Lughnasadh (Aug 1) was the harvest festival. Many survive in Irish and Scottish culture today."], ["lex", "Celtic traditions customs festivals Ireland Scotland"], ["lex", "Celtic culture Samhain Beltane druids"], ["vec", "what are the traditional customs and cultural practices of the Celtic peoples"], ["vec", "which Celtic traditions like Samhain and Beltane are still observed today"]]} +{"query": "hash code", "output": [["hyde", "A hash code is an integer value computed from an object's data, used to quickly locate it in a hash table. In Java, every object has a hashCode() method. For HashMap, objects with equal hashCodes go to the same bucket, and equals() resolves collisions. Override both hashCode() and equals() together."], ["lex", "hash code function programming"], ["lex", "hashCode Java hash table implementation"], ["lex", "cryptographic hash function SHA MD5"], ["vec", "what is a hash code and how are hash functions used in programming"], ["vec", "how does the hashCode method work in Java for hash tables and collections"]]} +{"query": "what is artificial intelligence", "output": [["hyde", "Artificial intelligence (AI) is the simulation of human intelligence by computer systems. It encompasses machine learning (learning from data), natural language processing (understanding language), and computer vision (interpreting images). AI systems are trained on large datasets to recognize patterns and make predictions."], ["lex", "artificial intelligence AI machine learning"], ["lex", "artificial intelligence definition applications"], ["vec", "what is artificial intelligence and how does it work at a fundamental level"], ["vec", "what are the main types and applications of artificial intelligence technology"]]} +{"query": "what is interfaith dialogue?", "output": [["hyde", "Interfaith dialogue is the cooperative interaction between people of different religious traditions, aimed at mutual understanding rather than conversion. Organizations like the Parliament of the World's Religions bring together leaders from Christianity, Islam, Judaism, Hinduism, Buddhism, and others to discuss shared values and address social issues."], ["lex", "interfaith dialogue religious traditions"], ["lex", "interfaith dialogue ecumenism interreligious"], ["vec", "what is interfaith dialogue and why is it important for religious communities"], ["vec", "how do different religious groups engage in interfaith dialogue to promote understanding"]]} +{"query": "what is darwin's theory of evolution", "output": [["hyde", "In On the Origin of Species (1859), Charles Darwin proposed that species evolve over generations through natural selection. Organisms with traits better suited to their environment survive and reproduce more, passing those advantageous traits to offspring. Over time, this leads to new species."], ["lex", "Darwin theory evolution natural selection"], ["lex", "Darwin Origin of Species evolution"], ["vec", "what is Charles Darwin's theory of evolution by natural selection"], ["vec", "how did Darwin explain the origin of species through natural selection and adaptation"]]} +{"query": "what is permaculture gardening?", "output": [["hyde", "Permaculture gardening applies ecological design principles to create self-sustaining food systems. It uses zones radiating from the home, guilds of companion plants, water harvesting with swales, and polyculture instead of monoculture. The goal is a garden that produces food with minimal external inputs."], ["lex", "permaculture gardening design principles"], ["lex", "permaculture garden sustainable agriculture"], ["vec", "what is permaculture gardening and how does it apply ecological design principles"], ["vec", "how do you design a permaculture garden that mimics natural ecosystems"]]} +{"query": "how to practice gratitude", "output": [["hyde", "Keep a gratitude journal and write three specific things you're grateful for each night—not vague statements, but concrete moments. Write a gratitude letter to someone who impacted you. During meals, pause to appreciate the food. Research shows consistent gratitude practice reduces anxiety and improves sleep."], ["lex", "gratitude practice daily journal techniques"], ["lex", "practicing gratitude mental health benefits"], ["vec", "what are effective ways to practice gratitude in everyday life"], ["vec", "how does a daily gratitude practice improve mental health and well-being"]]} +{"query": "what are digital credentials?", "output": [["hyde", "Digital credentials are electronic records that verify a person's qualifications, skills, or achievements. They include digital badges, certificates, and micro-credentials issued by platforms like Credly or Accredible. Verifiable credentials use cryptographic signatures so employers can instantly confirm authenticity without contacting the issuer."], ["lex", "digital credentials badges certificates verification"], ["lex", "digital credentials blockchain verifiable"], ["vec", "what are digital credentials and how are they used to verify qualifications"], ["vec", "how do digital badges and verifiable credentials work for education and employment"]]} +{"query": "how does culture influence ethics", "output": [["hyde", "Culture shapes ethics by defining what a society considers right or wrong. Collectivist cultures may prioritize group harmony and duty to family, while individualist cultures emphasize personal autonomy and rights. Cultural relativism argues that moral standards are culturally defined, while universalists hold that some ethical principles transcend culture."], ["lex", "culture ethics moral values influence"], ["lex", "cultural relativism ethics cross-cultural morality"], ["vec", "how does culture shape people's ethical beliefs and moral values"], ["vec", "what is the relationship between cultural norms and ethical decision-making"]]} +{"query": "what is stream of consciousness?", "output": [["hyde", "Stream of consciousness is a literary method that captures the continuous flow of a character's thoughts, memories, and perceptions without conventional structure. James Joyce's Ulysses and Virginia Woolf's Mrs Dalloway are landmark examples, using free-flowing prose, associative leaps, and minimal punctuation."], ["lex", "stream of consciousness writing technique"], ["lex", "stream of consciousness Joyce Woolf literature"], ["vec", "what is the stream of consciousness technique in literature and who pioneered it"], ["vec", "how do authors use stream of consciousness to portray inner thoughts in fiction"]]} +{"query": "how do body systems work together", "output": [["hyde", "The circulatory system delivers oxygen absorbed by the respiratory system to muscles controlled by the nervous system. The digestive system breaks down nutrients that the circulatory system distributes. The endocrine system releases hormones that regulate metabolism, growth, and the immune response."], ["lex", "body systems interaction physiology"], ["lex", "human body organ systems coordination"], ["vec", "how do the different organ systems in the human body work together to maintain health"], ["vec", "what are examples of body systems interacting with each other in human physiology"]]} +{"query": "what are the principles of sustainable development", "output": [["hyde", "Sustainable development meets present needs without compromising future generations' ability to meet theirs (Brundtland Report, 1987). Its three pillars are environmental protection, social equity, and economic viability. The UN's 17 Sustainable Development Goals (SDGs) provide a framework for global action through 2030."], ["lex", "sustainable development principles environmental social economic"], ["lex", "sustainable development goals UN SDGs"], ["vec", "what are the core principles of sustainable development and why do they matter"], ["vec", "how do the three pillars of sustainable development balance environmental, social, and economic needs"]]} +{"query": "how to evaluate startup ideas", "output": [["hyde", "Evaluate a startup idea on four dimensions: problem severity (is this a hair-on-fire problem?), market size (TAM > $1B?), competitive landscape (what's the unfair advantage?), and founder-market fit (do you have unique insight?). Validate by talking to 50+ potential customers before writing any code."], ["lex", "evaluate startup ideas validation framework"], ["lex", "startup idea assessment market viability"], ["vec", "how do entrepreneurs evaluate whether a startup idea is worth pursuing"], ["vec", "what frameworks and criteria help assess the viability of a new startup idea"]]} +{"query": "how to write a business plan", "output": [["hyde", "A business plan includes: executive summary, company description, market analysis, organization structure, product/service line, marketing strategy, funding request, and financial projections. Start with a clear problem statement and your unique solution. Include 3-year revenue forecasts with assumptions clearly stated."], ["lex", "business plan writing template sections"], ["lex", "business plan executive summary financial projections"], ["vec", "how do you write a comprehensive business plan for a new company"], ["vec", "what sections and information should be included in a startup business plan"]]} +{"query": "what are greenhouse gases?", "output": [["hyde", "Greenhouse gases—including carbon dioxide (CO2), methane (CH4), nitrous oxide (N2O), and fluorinated gases—trap infrared radiation in the atmosphere, warming the planet. CO2 is the most abundant from fossil fuel combustion. Methane, though shorter-lived, is 80 times more potent over 20 years."], ["lex", "greenhouse gases CO2 methane atmosphere"], ["lex", "greenhouse gas effect global warming climate"], ["vec", "what are greenhouse gases and how do they contribute to global warming"], ["vec", "which gases trap heat in Earth's atmosphere and cause the greenhouse effect"]]} +{"query": "how do religions interpret the concept of sacredness?", "output": [["hyde", "In Christianity, sacredness is conferred by God's presence—churches, sacraments, and scripture are holy. In Hinduism, sacred rivers like the Ganges and temples house divine energy. Indigenous traditions see sacredness in natural features—mountains, groves, and animals. Islam treats the Quran and Mecca as inviolably sacred."], ["lex", "sacredness religion sacred concept interpretation"], ["lex", "sacred space rituals holy religious traditions"], ["vec", "how do different world religions define and interpret the concept of sacredness"], ["vec", "what does sacredness mean across Christianity, Islam, Hinduism, Buddhism, and indigenous traditions"]]} +{"query": "when to introduce solid foods to a baby?", "output": [["hyde", "Most pediatricians recommend introducing solid foods around 6 months of age. Signs of readiness include sitting up with support, showing interest in food, and loss of the tongue-thrust reflex. Start with single-ingredient purees like sweet potato, avocado, or iron-fortified cereal, one new food every 3-5 days."], ["lex", "introduce solid foods baby age months"], ["lex", "baby first foods solids weaning schedule"], ["vec", "at what age should you start introducing solid foods to a baby"], ["vec", "what are the signs a baby is ready for solid foods and what foods to start with"]]} +{"query": "renaissance literature", "output": [["hyde", "Renaissance literature (14th-17th century) was shaped by humanism's emphasis on individual experience and classical learning. Key figures include Petrarch (sonnets), Boccaccio (Decameron), Shakespeare (plays and sonnets), Cervantes (Don Quixote), and Machiavelli (The Prince). Vernacular languages replaced Latin as the literary standard."], ["lex", "Renaissance literature authors works"], ["lex", "Renaissance literary period Shakespeare Petrarch humanism"], ["vec", "what are the major works and characteristics of Renaissance literature"], ["vec", "how did Renaissance humanism influence literature in Europe during the 14th-17th centuries"]]} +{"query": "how digital twins transform industries", "output": [["hyde", "A digital twin is a virtual replica of a physical asset, process, or system, updated in real time with IoT sensor data. In manufacturing, digital twins simulate production lines to predict failures. In healthcare, patient-specific organ models guide surgical planning. Energy companies use them to optimize wind turbine performance."], ["lex", "digital twins industry transformation simulation"], ["lex", "digital twin technology manufacturing IoT"], ["vec", "how are digital twins being used to transform industries like manufacturing and healthcare"], ["vec", "what is digital twin technology and how does it improve operational efficiency in industry"]]} +{"query": "resilience training programs", "output": [["hyde", "Resilience training programs teach participants to manage stress, adapt to adversity, and recover from setbacks. Common frameworks include cognitive behavioral techniques, mindfulness practices, and strengths-based coaching. The U.S. Army's Master Resilience Training and Penn Resilience Program are widely studied evidence-based models."], ["lex", "resilience training programs mental toughness"], ["lex", "resilience building workplace employee training"], ["vec", "what are resilience training programs and how do they build mental toughness"], ["vec", "how do organizations implement resilience training for employees and teams"]]} +{"query": "how to jump-start a car?", "output": [["hyde", "To jump-start a car, connect the red clamp to the dead battery positive terminal, then to the donor battery positive. Connect black to donor negative, then to unpainted metal on the dead car. Start the donor car, wait 2 minutes, then start the dead car."], ["lex", "jump-start car battery jumper cables"], ["lex", "jump start dead car battery steps"], ["vec", "what is the correct procedure to jump-start a car with a dead battery?"], ["vec", "how do you connect jumper cables between two cars to restart a dead battery?"]]} +{"query": "google maps", "output": [["hyde", "Open Google Maps on your phone or browser, type your destination in the search bar, and tap \"Directions.\" Choose driving, transit, walking, or cycling. The app will show estimated travel time and alternative routes."], ["lex", "google maps directions navigation"], ["lex", "google maps route planner"], ["lex", "google maps API embed"], ["vec", "how to use Google Maps for turn-by-turn driving directions"], ["vec", "what features does Google Maps offer for route planning and navigation?"]]} +{"query": "sail smooth", "output": [["hyde", "To sail smoothly, keep the boat balanced by adjusting the mainsheet and jib trim. Ease the sails slightly in gusts to reduce heeling, and steer at an angle that minimizes pitching through waves."], ["lex", "smooth sailing techniques"], ["lex", "sailboat trim wind conditions"], ["lex", "reduce boat heeling pitching"], ["vec", "how do you achieve smooth sailing on a sailboat in varying wind conditions?"], ["vec", "what techniques help reduce choppy motion and maintain a comfortable ride while sailing?"]]} +{"query": "how to create a value proposition", "output": [["hyde", "A strong value proposition clearly states what your product does, who it's for, and why it's better than alternatives. Use this formula: We help [target customer] achieve [desired outcome] by [unique approach], unlike [competitors] who [limitation]."], ["lex", "value proposition canvas template"], ["lex", "unique value proposition statement"], ["lex", "customer value proposition examples"], ["vec", "how do you write a compelling value proposition for a product or service?"], ["vec", "what framework helps define a unique value proposition that resonates with target customers?"]]} +{"query": "where to buy used cars online", "output": [["hyde", "Popular online used car marketplaces include Carvana, CarMax, AutoTrader, and Cars.com. Carvana offers home delivery and a 7-day return policy. CarMax provides no-haggle pricing and certified inspections on all vehicles."], ["lex", "buy used cars online marketplace"], ["lex", "certified pre-owned cars website"], ["lex", "online used car dealers Carvana AutoTrader"], ["vec", "what are the best websites for buying used cars online with delivery?"], ["vec", "which online platforms sell certified pre-owned vehicles with warranties?"]]} +{"query": "what are the main practices in zoroastrianism?", "output": [["hyde", "Zoroastrians pray five times daily (the five Gahs) facing a source of light. The sacred fire is maintained in fire temples as a symbol of Ahura Mazda's truth. Key rituals include the Navjote initiation ceremony, wearing the sudreh and kusti, and maintaining ritual purity."], ["lex", "zoroastrianism practices rituals worship"], ["lex", "zoroastrian fire temple prayer"], ["lex", "zoroastrian navjote purity rituals"], ["vec", "what are the core religious practices and rituals observed in Zoroastrianism?"], ["vec", "how do Zoroastrians worship and what daily rituals do they follow?"]]} +{"query": "how to increase daily physical activity", "output": [["hyde", "Take the stairs instead of the elevator, park farther from entrances, and set a timer to stand and walk every 30 minutes. Aim for 10,000 steps daily by adding short walks after meals. Even 5-minute movement breaks reduce the health risks of prolonged sitting."], ["lex", "increase daily physical activity steps"], ["lex", "exercise habits sedentary lifestyle"], ["lex", "walking more daily movement tips"], ["vec", "what are practical ways to add more physical activity to a sedentary daily routine?"], ["vec", "how can someone gradually increase their daily step count and movement throughout the day?"]]} +{"query": "how does bioethics address cloning", "output": [["hyde", "Bioethicists distinguish between reproductive cloning, which aims to create a new human being, and therapeutic cloning, which produces embryonic stem cells for medical research. Most bioethicists oppose reproductive cloning due to safety risks, concerns about human dignity, and the commodification of life."], ["lex", "bioethics cloning human reproductive therapeutic"], ["lex", "ethical issues cloning debate"], ["lex", "cloning moral arguments bioethics"], ["vec", "what ethical arguments do bioethicists raise for and against human cloning?"], ["vec", "how does the field of bioethics evaluate therapeutic versus reproductive cloning?"]]} +{"query": "what is genetic engineering", "output": [["hyde", "Genetic engineering is the direct manipulation of an organism's DNA using biotechnology. Scientists can insert, delete, or modify genes to alter traits. Key techniques include recombinant DNA technology, which combines DNA from different sources, and CRISPR-Cas9, which allows precise editing at specific locations in the genome."], ["lex", "genetic engineering DNA modification"], ["lex", "gene editing CRISPR recombinant DNA"], ["lex", "genetically modified organisms GMO"], ["vec", "what is genetic engineering and how does it work to modify an organism's DNA?"], ["vec", "what are the main techniques used in genetic engineering such as CRISPR and recombinant DNA?"]]} +{"query": "how to test drive a car?", "output": [["hyde", "During a test drive, check acceleration, braking response, and steering feel. Drive on highways, local roads, and over bumps. Listen for unusual noises. Test the infotainment system, climate control, and visibility from all mirrors. Make sure the seats are comfortable and adjust to your driving position."], ["lex", "test drive car checklist"], ["lex", "car test drive tips what to check"], ["lex", "dealership test drive questions"], ["vec", "what should you look for and evaluate during a car test drive?"], ["vec", "how do you properly test drive a vehicle before buying it?"]]} +{"query": "how do philosophers approach death", "output": [["hyde", "Epicurus argued that death is nothing to fear because when death exists, we do not. Heidegger saw death as central to authentic existence, calling it \"Being-toward-death.\" The Stoics taught that meditating on mortality (memento mori) leads to a more purposeful life."], ["lex", "philosophy of death mortality"], ["lex", "existentialism death Heidegger Epicurus"], ["lex", "philosophical views afterlife mortality"], ["vec", "how have major philosophers throughout history approached the concept of death and mortality?"], ["vec", "what do existentialist and ancient philosophers say about the meaning of death?"]]} +{"query": "what is the capital of japan", "output": [["hyde", "Tokyo is the capital city of Japan. It became the capital in 1868 when Emperor Meiji moved the imperial seat from Kyoto. Tokyo, located on the eastern coast of Honshu, is the most populous metropolitan area in the world with over 37 million residents."], ["lex", "capital Japan Tokyo"], ["lex", "Tokyo capital city Japan"], ["vec", "what city is the capital of Japan?"], ["vec", "when did Tokyo become the capital of Japan?"]]} +{"query": "what is the significance of the afterlife in different faiths?", "output": [["hyde", "In Christianity, the afterlife involves heaven or hell based on faith and deeds. Islam teaches judgment day followed by paradise (Jannah) or hellfire. Hinduism and Buddhism believe in reincarnation, where the soul is reborn based on karma until achieving moksha or nirvana."], ["lex", "afterlife beliefs religions Christianity Islam Buddhism"], ["lex", "heaven hell reincarnation afterlife"], ["lex", "religious views life after death"], ["vec", "how do different world religions view the afterlife and what happens after death?"], ["vec", "what role does belief in the afterlife play in Christianity, Islam, Hinduism, and Buddhism?"]]} +{"query": "what is 3d printing and how does it work", "output": [["hyde", "3D printing, or additive manufacturing, builds objects layer by layer from a digital CAD file. The most common method, FDM (Fused Deposition Modeling), melts plastic filament and extrudes it through a nozzle. SLA (Stereolithography) uses a UV laser to cure liquid resin into solid layers."], ["lex", "3D printing additive manufacturing process"], ["lex", "FDM SLA 3D printer filament resin"], ["lex", "3D printing layer by layer CAD model"], ["vec", "how does 3D printing work to create objects layer by layer from a digital model?"], ["vec", "what are the main types of 3D printing technologies such as FDM and SLA?"]]} +{"query": "how do i contact my congressperson", "output": [["hyde", "Visit house.gov and enter your zip code to find your U.S. Representative. For senators, go to senate.gov. You can call their D.C. or district office, send an email through their website contact form, or mail a letter. Calling the Capitol switchboard at (202) 224-3121 connects you to any member's office."], ["lex", "contact congressperson phone email address"], ["lex", "find elected representative congress"], ["lex", "write letter senator representative"], ["vec", "how can I find and contact my U.S. congressional representative or senator?"], ["vec", "what is the best way to reach out to my congressperson about an issue?"]]} +{"query": "what is stream of consciousness writing?", "output": [["hyde", "Stream of consciousness is a narrative technique that presents a character's continuous flow of thoughts, feelings, and associations without conventional structure. James Joyce's \"Ulysses\" and Virginia Woolf's \"Mrs Dalloway\" are landmark examples, using long unpunctuated passages to mimic the way the mind actually works."], ["lex", "stream of consciousness writing technique"], ["lex", "stream of consciousness literature Joyce Woolf"], ["lex", "interior monologue narrative style"], ["vec", "what is stream of consciousness as a literary writing technique?"], ["vec", "how did authors like James Joyce and Virginia Woolf use stream of consciousness in their novels?"]]} +{"query": "how to use a ring light", "output": [["hyde", "Place the ring light directly in front of your face at eye level, with the camera positioned in the center of the ring. Keep the light 12-24 inches from your face for an even, shadow-free glow. Adjust brightness to avoid overexposure. The circular catchlights in the eyes are a signature look."], ["lex", "ring light setup photography video"], ["lex", "ring light placement distance camera"], ["lex", "ring light selfie video lighting"], ["vec", "how do you set up and position a ring light for video recording or photography?"], ["vec", "what are the best settings and distance for using a ring light for selfies and video calls?"]]} +{"query": "how to engage in civic duties", "output": [["hyde", "Civic duties include voting in elections, serving on a jury when called, staying informed about local issues, attending town hall meetings, volunteering for community organizations, and contacting elected officials about policy concerns. Voting in local elections has the most direct impact on your daily life."], ["lex", "civic duties voting jury duty community"], ["lex", "civic engagement participation democracy"], ["lex", "citizen responsibilities voting volunteering"], ["vec", "what are the main civic duties citizens should participate in beyond voting?"], ["vec", "how can someone actively engage in civic responsibilities in their local community?"]]} +{"query": "spain life", "output": [["hyde", "Life in Spain revolves around a later schedule than most of Europe. Lunch is the main meal, typically eaten between 2-3 PM, and dinner is served after 9 PM. The cost of living is lower than in northern Europe, with affordable housing outside Madrid and Barcelona. The climate, healthcare system, and social culture attract many expats."], ["lex", "living in Spain expat lifestyle"], ["lex", "Spain cost of living culture daily life"], ["lex", "move to Spain quality of life"], ["vec", "what is daily life like for someone living in Spain as an expat or resident?"], ["vec", "what is the cost of living and quality of life in Spain compared to other European countries?"]]} +{"query": "ai-driven analytics", "output": [["hyde", "AI-driven analytics uses machine learning algorithms to automatically detect patterns, anomalies, and trends in large datasets. Unlike traditional BI tools, AI analytics can generate predictive forecasts, perform natural language queries, and surface insights without manual configuration."], ["lex", "AI-driven analytics machine learning data"], ["lex", "artificial intelligence business analytics platform"], ["lex", "AI predictive analytics tools"], ["vec", "how are AI and machine learning used to power data analytics and business intelligence?"], ["vec", "what AI-driven analytics platforms help businesses make data-driven predictions?"]]} +{"query": "where to buy vintage home accessories", "output": [["hyde", "Shop vintage home accessories on Etsy, Chairish, and 1stDibs for curated antique finds. Local estate sales and flea markets often have unique pieces at lower prices. Ruby Lane specializes in antiques, while eBay offers a wide selection of retro decor from various eras."], ["lex", "vintage home accessories shop online"], ["lex", "retro home decor antique store"], ["lex", "vintage furniture accessories Etsy eBay"], ["vec", "where can I buy vintage and antique home decor accessories online?"], ["vec", "what are the best stores and websites for finding retro and vintage home furnishings?"]]} +{"query": "how to join a political party", "output": [["hyde", "To join a political party in the U.S., register with your state's election office by selecting a party affiliation on your voter registration form. You can register online, by mail, or at your local DMV. Some states allow you to change party affiliation at any time, while others have deadlines before primary elections."], ["lex", "join political party registration"], ["lex", "register Democrat Republican party membership"], ["lex", "political party membership sign up"], ["vec", "how do you officially join or register with a political party in the United States?"], ["vec", "what is the process for becoming a member of a political party?"]]} +{"query": "how to quit smoking?", "output": [["hyde", "The most effective approach combines nicotine replacement therapy (patches, gum, or lozenges) with behavioral support. Prescription medications like varenicline (Chantix) and bupropion can double quit rates. Set a quit date, identify triggers, and call 1-800-QUIT-NOW for free coaching."], ["lex", "quit smoking methods nicotine"], ["lex", "stop smoking cessation plan"], ["lex", "nicotine replacement therapy patches gum"], ["vec", "what are the most effective methods and strategies to quit smoking permanently?"], ["vec", "how do nicotine replacement therapies and medications help people stop smoking?"]]} +{"query": "what is phenomenological existentialism", "output": [["hyde", "Phenomenological existentialism applies Husserl's phenomenological method to existential questions about human existence. Heidegger's \"Being and Time\" analyzes Dasein (being-there) through the structures of lived experience. Sartre extended this in \"Being and Nothingness,\" arguing that consciousness is always directed toward objects and that existence precedes essence."], ["lex", "phenomenological existentialism Heidegger Sartre"], ["lex", "phenomenology existentialism lived experience"], ["lex", "existential phenomenology philosophy"], ["vec", "what is phenomenological existentialism and how does it differ from other branches of existentialism?"], ["vec", "how did Heidegger and Sartre combine phenomenology with existentialist philosophy?"]]} +{"query": "how to install car seat covers?", "output": [["hyde", "Pull the seat cover over the top of the headrest and stretch it down over the backrest. Tuck the excess fabric into the gap between the seat and backrest. Hook the elastic straps underneath the seat and clip them together. For bucket seats, align the cover's seams with the seat contours before securing."], ["lex", "install car seat covers DIY"], ["lex", "car seat cover fitting instructions"], ["lex", "universal seat covers installation steps"], ["vec", "what is the step-by-step process for installing car seat covers?"], ["vec", "how do you fit universal car seat covers on front and rear seats?"]]} +{"query": "what is the scientific process for drug development", "output": [["hyde", "Drug development follows a pipeline: discovery and preclinical testing (3-6 years), Phase I trials testing safety in small groups, Phase II trials evaluating efficacy, Phase III large-scale trials confirming effectiveness, and FDA review. The entire process typically takes 10-15 years and costs over $1 billion."], ["lex", "drug development process phases clinical trials"], ["lex", "pharmaceutical drug approval FDA pipeline"], ["lex", "preclinical clinical trial Phase 1 2 3"], ["vec", "what are the stages of the scientific process for developing and approving a new pharmaceutical drug?"], ["vec", "how does a drug go from laboratory discovery through clinical trials to FDA approval?"]]} +{"query": "what is climate change", "output": [["hyde", "Climate change refers to long-term shifts in global temperatures and weather patterns. Since the Industrial Revolution, burning fossil fuels has released CO2 and other greenhouse gases that trap heat in the atmosphere, raising the average global temperature by about 1.1°C. This causes rising sea levels, extreme weather, and ecosystem disruption."], ["lex", "climate change global warming greenhouse gases"], ["lex", "climate change causes effects CO2"], ["lex", "global temperature rise fossil fuels"], ["vec", "what is climate change and what are its primary causes and effects on the planet?"], ["vec", "how do greenhouse gas emissions from fossil fuels contribute to global climate change?"]]} +{"query": "how to sell a car privately?", "output": [["hyde", "To sell a car privately, first determine a fair price using Kelley Blue Book or Edmunds. Gather the title, maintenance records, and smog certificate. List the car on Craigslist, Facebook Marketplace, or AutoTrader. When meeting buyers, accept cashier's checks or cash. Sign the title over and file a release of liability with your DMV."], ["lex", "sell car privately steps title transfer"], ["lex", "private car sale listing price"], ["lex", "sell used car by owner paperwork"], ["vec", "what are the steps to sell a car privately without a dealer?"], ["vec", "what paperwork and documentation do you need to sell a car to a private buyer?"]]} +{"query": "how to analyze a political candidate's stance", "output": [["hyde", "Review the candidate's official website for stated policy positions. Check their voting record on congress.gov or VoteSmart.org. Compare their stances on key issues using tools like ISideWith or BallotReady. Look for consistency between their statements and votes, and check campaign finance records on OpenSecrets."], ["lex", "analyze political candidate stance positions"], ["lex", "candidate policy positions voting record"], ["lex", "compare political candidates issues"], ["vec", "how do you research and analyze a political candidate's policy positions and voting record?"], ["vec", "what tools and resources help voters compare political candidates on key issues?"]]} +{"query": "what is lean startup methodology", "output": [["hyde", "The lean startup methodology, developed by Eric Ries, emphasizes rapid iteration through the Build-Measure-Learn feedback loop. Start by building a Minimum Viable Product (MVP), measure how customers respond using actionable metrics, and learn whether to pivot or persevere. The goal is to reduce waste by validating assumptions before investing heavily."], ["lex", "lean startup methodology MVP"], ["lex", "lean startup build measure learn"], ["lex", "Eric Ries lean startup principles"], ["vec", "what is the lean startup methodology and how does the build-measure-learn cycle work?"], ["vec", "how does the lean startup approach use minimum viable products to validate business ideas?"]]} +{"query": "what is the renaissance", "output": [["hyde", "The Renaissance was a cultural movement spanning roughly the 14th to 17th centuries, originating in Florence, Italy. It marked a revival of classical Greek and Roman learning, emphasizing humanism, individualism, and secular inquiry. Major figures include Leonardo da Vinci, Michelangelo, and Galileo."], ["lex", "Renaissance period history art culture"], ["lex", "Renaissance 14th 15th 16th century Italy Europe"], ["lex", "Renaissance art Leonardo Michelangelo humanism"], ["vec", "what was the Renaissance period and what were its major cultural and artistic achievements?"], ["vec", "how did the Renaissance transform European art, science, and intellectual thought?"]]} +{"query": "faith respect", "output": [["hyde", "Respecting others' faith means listening without judgment, learning about different religious traditions, and recognizing that spiritual beliefs are deeply personal. Interfaith dialogue builds mutual understanding by focusing on shared values like compassion, justice, and community while honoring theological differences."], ["lex", "interfaith respect tolerance"], ["lex", "respecting different faiths religions"], ["lex", "religious tolerance diversity beliefs"], ["vec", "how can people show respect for different religious faiths and beliefs?"], ["vec", "what does interfaith respect and dialogue look like in diverse communities?"]]} +{"query": "where to find heirloom seed suppliers?", "output": [["hyde", "Top heirloom seed suppliers include Baker Creek Heirloom Seeds, Seed Savers Exchange, and Johnny's Selected Seeds. Baker Creek offers over 1,800 open-pollinated varieties with free shipping. Seed Savers Exchange is a nonprofit dedicated to preserving rare heirloom varieties through their seed bank and catalog."], ["lex", "heirloom seed suppliers catalog"], ["lex", "buy heirloom seeds online non-GMO"], ["lex", "heirloom vegetable seed company"], ["vec", "where can I buy heirloom and non-GMO seeds from reputable suppliers?"], ["vec", "what are the best heirloom seed companies that sell open-pollinated vegetable seeds?"]]} +{"query": "how do christians celebrate easter", "output": [["hyde", "Christians celebrate Easter as the resurrection of Jesus Christ on the third day after his crucifixion. Holy Week begins with Palm Sunday, followed by Maundy Thursday communion, Good Friday services, and Easter Sunday worship. Many churches hold sunrise services, and traditions include Easter egg hunts, lilies, and special meals."], ["lex", "Christian Easter celebration traditions"], ["lex", "Easter Sunday church service resurrection"], ["lex", "Holy Week Good Friday Easter customs"], ["vec", "how do Christians celebrate Easter and what are the main traditions of Holy Week?"], ["vec", "what religious services and customs do Christians observe during the Easter season?"]]} +{"query": "what are exchange-traded funds (etfs)", "output": [["hyde", "An exchange-traded fund (ETF) is a basket of securities that trades on a stock exchange like a single stock. ETFs typically track an index like the S&P 500 and offer diversification at a low expense ratio. Unlike mutual funds, ETFs can be bought and sold throughout the trading day at market price."], ["lex", "exchange-traded funds ETFs investing"], ["lex", "ETF index fund stock market"], ["lex", "ETF vs mutual fund comparison"], ["vec", "what are exchange-traded funds (ETFs) and how do they work as an investment?"], ["vec", "how do ETFs differ from mutual funds and what are their advantages for investors?"]]} +{"query": "how to enhance creativity?", "output": [["hyde", "To enhance creativity, practice divergent thinking by generating many ideas without judgment. Keep a daily journal, expose yourself to new experiences, and set aside unstructured time for daydreaming. Research shows that walking, adequate sleep, and constraints can all stimulate creative problem-solving."], ["lex", "enhance creativity techniques exercises"], ["lex", "boost creative thinking brainstorming"], ["lex", "creativity habits daily practice"], ["vec", "what are proven techniques and exercises to enhance creative thinking?"], ["vec", "how can someone develop daily habits that boost creativity and generate new ideas?"]]} +{"query": "what are the key features of taoist philosophy?", "output": [["hyde", "Taoism centers on the Tao (the Way), an ineffable force that underlies all existence. Key concepts include wu wei (non-action or effortless action), living in harmony with nature, and the balance of yin and yang. The Tao Te Ching by Laozi and the Zhuangzi are the foundational texts."], ["lex", "Taoist philosophy Taoism key concepts"], ["lex", "Tao Te Ching wu wei Taoism"], ["lex", "Taoism yin yang natural harmony"], ["vec", "what are the central concepts and key features of Taoist philosophy?"], ["vec", "how does Taoism emphasize living in harmony with the Tao and the concept of wu wei?"]]} +{"query": "how to effectively visualize scientific data", "output": [["hyde", "Choose chart types that match your data: scatter plots for correlations, bar charts for comparisons, line plots for time series, and heatmaps for matrices. Use matplotlib or ggplot2 for publication figures. Minimize chart junk, label axes clearly, and use colorblind-friendly palettes like viridis."], ["lex", "scientific data visualization charts graphs"], ["lex", "data visualization tools matplotlib Python"], ["lex", "scientific figure plotting techniques"], ["vec", "what are effective techniques for visualizing scientific data in charts and graphs?"], ["vec", "which tools and software are best for creating publication-quality scientific data visualizations?"]]} +{"query": "where to watch live nba games?", "output": [["hyde", "Live NBA games air on ESPN, TNT, and ABC during the regular season. NBA League Pass streams all out-of-market games. Streaming options include Sling TV, YouTube TV, and Hulu + Live TV for cable-free access. The NBA app offers free highlights and select live games on mobile."], ["lex", "watch live NBA games streaming"], ["lex", "NBA League Pass live stream TV"], ["lex", "NBA games broadcast ESPN TNT"], ["vec", "where can I watch live NBA basketball games online or on TV?"], ["vec", "what streaming services and TV channels broadcast live NBA games in 2025-2026?"]]} +{"query": "what was the impact of the industrial revolution on society?", "output": [["hyde", "The Industrial Revolution (1760-1840) shifted economies from agrarian to industrial, triggering mass urbanization as workers moved to factory cities. It created a new working class, child labor, and pollution, but also raised living standards over time, enabled mass production, and spurred technological innovation in transportation and communication."], ["lex", "Industrial Revolution impact society economy"], ["lex", "Industrial Revolution social changes urbanization"], ["lex", "Industrial Revolution labor factories 18th 19th century"], ["vec", "how did the Industrial Revolution transform society, economy, and daily life?"], ["vec", "what were the major social and economic impacts of the Industrial Revolution on workers and cities?"]]} +{"query": "wisdom gain", "output": [["hyde", "Wisdom is gained through a combination of diverse life experience, reflective thinking, and learning from mistakes. Psychologist Paul Baltes identified wisdom as expert knowledge about the fundamental pragmatics of life, including understanding uncertainty, managing emotions, and balancing competing interests."], ["lex", "gaining wisdom life experience"], ["lex", "wisdom philosophy personal growth"], ["lex", "how to become wiser decision making"], ["vec", "how does a person gain wisdom through life experience and reflection?"], ["vec", "what do philosophers and psychologists say about how wisdom is acquired?"]]} +{"query": "what is the role of local government", "output": [["hyde", "Local governments provide essential services including public schools, police and fire departments, road maintenance, water and sewer systems, zoning and land use planning, parks, and public transit. City councils and county boards set local taxes, pass ordinances, and approve budgets that directly affect residents' daily lives."], ["lex", "local government role responsibilities"], ["lex", "city county municipal government services"], ["lex", "local government functions zoning schools police"], ["vec", "what are the main roles and responsibilities of local government in a community?"], ["vec", "how does local city and county government provide public services and manage community affairs?"]]} +{"query": "what is metaphysical ethics", "output": [["hyde", "Metaphysical ethics, closely related to metaethics, examines the ontological status of moral values. It asks whether moral facts exist independently of human minds (moral realism) or are human constructions (anti-realism). This branch investigates the metaphysical foundations that underlie ethical claims, such as whether \"goodness\" is a real property in the world."], ["lex", "metaphysical ethics philosophy morality"], ["lex", "metaphysics ethics moral realism"], ["lex", "metaethics ontology moral facts"], ["vec", "what is metaphysical ethics and how does it relate to the nature of moral reality?"], ["vec", "how does metaphysics inform ethical theory and questions about whether moral facts exist?"]]} +{"query": "what is empiricism", "output": [["hyde", "Empiricism is the philosophical theory that all knowledge is derived from sensory experience rather than innate ideas. John Locke argued the mind starts as a \"tabula rasa\" (blank slate), and David Hume extended this by arguing that even causal relationships are known only through observation and habit, not reason alone."], ["lex", "empiricism philosophy knowledge experience"], ["lex", "empiricism Locke Hume sensory evidence"], ["lex", "empiricism vs rationalism epistemology"], ["vec", "what is empiricism in philosophy and how does it claim knowledge is acquired through experience?"], ["vec", "how did philosophers like John Locke and David Hume develop the theory of empiricism?"]]} +{"query": "what is epistemology", "output": [["hyde", "Epistemology is the branch of philosophy concerned with the nature, scope, and limits of knowledge. It examines questions like: What is knowledge? How is it different from mere belief? What counts as justification? The classic definition from Plato is that knowledge is justified true belief, though this was challenged by Gettier in 1963."], ["lex", "epistemology philosophy knowledge"], ["lex", "epistemology theory of knowledge justified belief"], ["lex", "epistemology truth belief justification"], ["vec", "what is epistemology and what questions does it address about knowledge and belief?"], ["vec", "how does epistemology study the nature, sources, and limits of human knowledge?"]]} +{"query": "what is the significance of community in spirituality?", "output": [["hyde", "Spiritual communities provide shared worship, accountability, and mutual support that deepen individual faith. In Christianity, the church body gathers for fellowship; in Buddhism, the sangha is one of the Three Jewels; in Judaism, a minyan of ten is required for communal prayer. Communal practice reinforces commitment and provides belonging."], ["lex", "community spirituality religious fellowship"], ["lex", "spiritual community congregation sangha"], ["lex", "communal worship spiritual practice"], ["vec", "why is community considered important in spiritual and religious practice?"], ["vec", "how does belonging to a spiritual community enhance personal faith and practice?"]]} +{"query": "what is the difference between memoir and autobiography?", "output": [["hyde", "An autobiography covers the author's entire life chronologically, from birth to the present. A memoir focuses on a specific theme, period, or set of experiences from the author's life, emphasizing emotional truth and reflection. Memoirs are often more literary and thematic, while autobiographies are more comprehensive and factual."], ["lex", "memoir vs autobiography difference"], ["lex", "memoir autobiography literary genre"], ["lex", "memoir personal narrative autobiography life story"], ["vec", "what is the difference between a memoir and an autobiography as literary genres?"], ["vec", "how does a memoir's scope and focus differ from a full autobiography?"]]} +{"query": "what is the significance of allegory?", "output": [["hyde", "An allegory is a narrative in which characters, events, and settings symbolically represent abstract ideas or moral concepts. Orwell's \"Animal Farm\" allegorizes the Russian Revolution; Bunyan's \"Pilgrim's Progress\" represents the Christian spiritual journey. Allegory allows writers to critique society, explore complex ideas, and engage readers on multiple levels."], ["lex", "allegory literary device significance"], ["lex", "allegory examples literature symbolism"], ["lex", "allegorical writing Pilgrim's Progress Animal Farm"], ["vec", "what is an allegory in literature and why is it a significant literary device?"], ["vec", "how do authors use allegory to convey deeper moral or political meanings through symbolic narratives?"]]} +{"query": "portrait photography tips", "output": [["hyde", "Use an 85mm or 50mm lens at f/1.8-f/2.8 to create a pleasing background blur. Position your subject near a window for soft natural light, or use a reflector to fill shadows. Focus on the nearest eye, shoot at eye level, and direct your subject to angle their body 45 degrees to the camera."], ["lex", "portrait photography tips lighting posing"], ["lex", "portrait photo camera settings lens"], ["lex", "headshot portrait natural light composition"], ["vec", "what are the best tips for taking professional-quality portrait photographs?"], ["vec", "how should you set up lighting, posing, and camera settings for portrait photography?"]]} +{"query": "how to build passive income", "output": [["hyde", "Common passive income sources include dividend stocks yielding 3-5% annually, rental properties generating monthly cash flow, index fund investments, creating digital products or online courses, and building affiliate marketing websites. Start by investing in a low-cost S&P 500 index fund and reinvesting dividends."], ["lex", "build passive income streams"], ["lex", "passive income ideas investments dividends"], ["lex", "earn passive income rental property online"], ["vec", "what are the most reliable ways to build passive income streams?"], ["vec", "how can someone start generating passive income through investments, rental property, or online businesses?"]]} +{"query": "how to choose the right camera", "output": [["hyde", "Decide what you'll shoot most: landscapes, portraits, video, or street photography. Mirrorless cameras are lighter with faster autofocus, while DSLRs offer longer battery life and more lens options. Key specs to compare: sensor size (full-frame vs APS-C), megapixels, autofocus points, and video capabilities. Budget $500-1000 for a capable starter body."], ["lex", "choose camera DSLR mirrorless beginner"], ["lex", "camera buying guide sensor megapixels"], ["lex", "best camera photography type budget"], ["vec", "how do you choose the right camera for your photography needs and budget?"], ["vec", "what factors should you consider when deciding between DSLR and mirrorless cameras?"]]} +{"query": "what is the significance of the great barrier reef?", "output": [["hyde", "The Great Barrier Reef, stretching over 2,300 km along Australia's northeast coast, is the world's largest coral reef system and is visible from space. It supports over 1,500 fish species, 400 coral species, and countless marine organisms. It's a UNESCO World Heritage Site threatened by coral bleaching from rising ocean temperatures."], ["lex", "Great Barrier Reef significance ecosystem"], ["lex", "Great Barrier Reef coral biodiversity Australia"], ["lex", "Great Barrier Reef marine life conservation"], ["vec", "why is the Great Barrier Reef ecologically significant and important to protect?"], ["vec", "what makes the Great Barrier Reef the world's largest coral reef system and why is it under threat?"]]} +{"query": "how to celebrate holi festival", "output": [["hyde", "Holi is celebrated over two days: Holika Dahan (bonfire night) and Rangwali Holi (color day). On the morning of Holi, people gather outdoors to throw colored powders (gulal) and spray colored water at each other. Traditional foods include gujiya (sweet dumplings), thandai (spiced milk drink), and puran poli."], ["lex", "Holi festival celebration traditions India"], ["lex", "Holi festival of colors powder"], ["lex", "how to celebrate Holi customs food"], ["vec", "how is the Holi festival celebrated and what are its main traditions and customs?"], ["vec", "what are the traditional ways to celebrate Holi with colors, food, and bonfires?"]]} +{"query": "how to negotiate a salary?", "output": [["hyde", "Research the market rate for your role on Glassdoor, Levels.fyi, or Payscale before negotiating. When you receive an offer, express enthusiasm, then say \"I was hoping for something closer to [target].\" Always negotiate based on market data and your value, not personal needs. Aim 10-20% above the initial offer."], ["lex", "negotiate salary offer tips"], ["lex", "salary negotiation techniques counter offer"], ["lex", "job offer salary negotiation script"], ["vec", "what are effective strategies for negotiating a higher salary during a job offer?"], ["vec", "how do you prepare for and conduct a successful salary negotiation?"]]} +{"query": "what is sacred geometry?", "output": [["hyde", "Sacred geometry assigns symbolic and spiritual meaning to geometric shapes and proportions found in nature. Key patterns include the Flower of Life (overlapping circles), Metatron's Cube, the golden ratio (1.618), and the Fibonacci spiral. These patterns appear in sunflower seeds, nautilus shells, and ancient temple architecture."], ["lex", "sacred geometry patterns symbols"], ["lex", "sacred geometry golden ratio Fibonacci"], ["lex", "sacred geometry Flower of Life Metatron"], ["vec", "what is sacred geometry and what mathematical patterns are considered sacred?"], ["vec", "how do sacred geometry concepts like the golden ratio and Flower of Life appear in nature and architecture?"]]} +{"query": "what is political corruption", "output": [["hyde", "Political corruption is the abuse of public office for private gain. Forms include bribery (accepting payments for favorable decisions), embezzlement of public funds, nepotism (appointing relatives to positions), patronage, and vote-buying. Transparency International's Corruption Perceptions Index ranks countries by perceived levels of public sector corruption."], ["lex", "political corruption bribery abuse of power"], ["lex", "government corruption examples types"], ["lex", "political corruption embezzlement nepotism"], ["vec", "what is political corruption and what forms does it take in government?"], ["vec", "how does political corruption such as bribery and embezzlement undermine democratic governance?"]]} +{"query": "what are the rituals of islam", "output": [["hyde", "The Five Pillars of Islam form the core rituals: Shahada (declaration of faith), Salat (five daily prayers facing Mecca), Zakat (annual charitable giving of 2.5% of wealth), Sawm (fasting during Ramadan from dawn to sunset), and Hajj (pilgrimage to Mecca at least once in a lifetime)."], ["lex", "Islam rituals Five Pillars worship"], ["lex", "Islamic prayer salat fasting Ramadan"], ["lex", "Muslim rituals hajj pilgrimage zakat"], ["vec", "what are the main rituals and religious practices in Islam?"], ["vec", "how do Muslims observe the Five Pillars of Islam including prayer, fasting, and pilgrimage?"]]} +{"query": "neural networks", "output": [["hyde", "A neural network consists of layers of interconnected nodes (neurons). Input data passes through hidden layers where each connection has a weight. Each neuron applies an activation function (like ReLU or sigmoid) to the weighted sum of its inputs. During training, backpropagation adjusts weights to minimize the loss function."], ["lex", "neural networks deep learning artificial"], ["lex", "neural network architecture layers neurons"], ["lex", "convolutional recurrent neural network CNN RNN"], ["vec", "how do artificial neural networks work and what are the different types of architectures?"], ["vec", "what are the basic components of a neural network including layers, weights, and activation functions?"]]} +{"query": "what is the trolley problem", "output": [["hyde", "The trolley problem, introduced by Philippa Foot in 1967, asks: a runaway trolley will kill five people unless you pull a lever to divert it onto a track where it will kill one person. Do you pull the lever? Utilitarians say yes (saving more lives), while deontologists argue that actively causing someone's death is morally different from allowing deaths to occur."], ["lex", "trolley problem ethics thought experiment"], ["lex", "trolley problem utilitarianism moral dilemma"], ["lex", "trolley problem Philippa Foot"], ["vec", "what is the trolley problem and why is it important in ethical philosophy?"], ["vec", "how does the trolley problem illustrate the conflict between utilitarian and deontological ethics?"]]} +{"query": "digital transformation in businesses", "output": [["hyde", "Digital transformation involves integrating digital technology into all areas of a business, changing how it operates and delivers value. Key components include migrating to cloud infrastructure, automating manual processes, adopting data analytics for decision-making, and building digital customer experiences. McKinsey reports that 70% of transformation efforts fall short of their goals."], ["lex", "digital transformation business strategy"], ["lex", "digital transformation enterprise technology cloud"], ["lex", "business digitization automation workflows"], ["vec", "how are businesses implementing digital transformation to modernize their operations and strategy?"], ["vec", "what technologies drive digital transformation in enterprises, including cloud computing and automation?"]]} +{"query": "how to protect business data", "output": [["hyde", "Protect business data with layered security: encrypt data at rest and in transit using AES-256, implement role-based access controls, enable multi-factor authentication for all accounts, maintain automated offsite backups with the 3-2-1 rule, and train employees on phishing awareness. Conduct regular security audits and penetration testing."], ["lex", "protect business data security cybersecurity"], ["lex", "data protection encryption backup strategy"], ["lex", "business data security firewall access control"], ["vec", "what are the most important steps to protect sensitive business data from breaches and loss?"], ["vec", "how should a business implement data protection measures including encryption, backups, and access controls?"]]} +{"query": "what is cellular respiration", "output": [["hyde", "Cellular respiration is the metabolic process by which cells break down glucose (C6H12O6) to produce ATP. It occurs in three stages: glycolysis (in the cytoplasm, producing 2 ATP), the Krebs cycle (in the mitochondrial matrix, producing 2 ATP), and the electron transport chain (on the inner mitochondrial membrane, producing 34 ATP)."], ["lex", "cellular respiration ATP glucose"], ["lex", "cellular respiration glycolysis Krebs cycle"], ["lex", "aerobic respiration mitochondria electron transport"], ["vec", "what is cellular respiration and how do cells convert glucose into ATP energy?"], ["vec", "what are the three stages of cellular respiration: glycolysis, the Krebs cycle, and the electron transport chain?"]]} +{"query": "how technology impacts scientific research", "output": [["hyde", "Technology has transformed scientific research through high-throughput sequencing (enabling genomics), electron microscopy (revealing molecular structures), supercomputers (running complex simulations), and machine learning (identifying patterns in massive datasets). AI tools like AlphaFold have predicted protein structures that took decades to solve experimentally."], ["lex", "technology impact scientific research tools"], ["lex", "technology advances science instruments computing"], ["lex", "AI machine learning scientific discovery"], ["vec", "how has modern technology transformed the way scientific research is conducted?"], ["vec", "what role do computing, AI, and advanced instruments play in accelerating scientific discovery?"]]} +{"query": "how wearable technology is evolving", "output": [["hyde", "Wearable technology has evolved from basic step counters to sophisticated health monitors. Modern smartwatches track heart rate, blood oxygen, ECG, sleep stages, and skin temperature. Emerging features include continuous glucose monitoring, blood pressure sensing, and AI-powered health alerts that can detect atrial fibrillation and sleep apnea."], ["lex", "wearable technology evolution smartwatch fitness"], ["lex", "wearable tech health monitoring sensors 2025 2026"], ["lex", "wearable devices Apple Watch Garmin health tracking"], ["vec", "how is wearable technology evolving in terms of health monitoring and smart features?"], ["vec", "what are the latest advances in wearable devices for fitness tracking and medical diagnostics?"]]} +{"query": "what is the significance of compassion in ethics?", "output": [["hyde", "Schopenhauer argued that compassion (Mitleid) is the foundation of all morality, as it allows us to recognize the suffering of others as our own. The ethics of care, developed by Carol Gilligan and Nel Noddings, places compassionate relationships at the center of moral reasoning, contrasting with abstract rule-based approaches like Kantianism."], ["lex", "compassion ethics moral philosophy"], ["lex", "compassion morality empathy ethical theory"], ["lex", "ethics of care compassion Schopenhauer"], ["vec", "why is compassion considered a central virtue in ethical philosophy?"], ["vec", "how do ethical theories incorporate compassion as a foundation for moral behavior?"]]} +{"query": "what is the principle of double effect", "output": [["hyde", "The principle of double effect, originating from Thomas Aquinas, holds that an action with both good and bad effects is morally permissible if: (1) the action itself is not wrong, (2) the bad effect is not intended, (3) the bad effect is not the means to the good effect, and (4) the good effect outweighs the bad. It's commonly applied in medical ethics and just war theory."], ["lex", "principle of double effect ethics"], ["lex", "double effect doctrine Aquinas moral philosophy"], ["lex", "double effect intended foreseen consequences"], ["vec", "what is the principle of double effect and how does it apply in moral philosophy?"], ["vec", "how does the doctrine of double effect distinguish between intended and foreseen consequences of an action?"]]} +{"query": "what are the latest trends in interior design", "output": [["hyde", "Top interior design trends for 2025-2026 include warm earth tones replacing cool grays, curved furniture and organic shapes, bold textured walls, sustainable and natural materials like rattan and stone, statement lighting, and maximalist layering. Warm woods, bouclé fabrics, and vintage-inspired pieces continue to dominate living spaces."], ["lex", "interior design trends 2025 2026"], ["lex", "interior design trends colors materials"], ["lex", "home decor trends furniture styles"], ["vec", "what are the newest interior design trends for homes in 2025 and 2026?"], ["vec", "which colors, materials, and furniture styles are trending in interior design right now?"]]} +{"query": "how to research candidates before voting", "output": [["hyde", "Before voting, check nonpartisan voter guides from Vote411.org (League of Women Voters) or BallotReady. Review candidates' official websites for policy positions, and check voting records on VoteSmart.org. Read local newspaper endorsements, watch candidate debates, and verify claims on fact-checking sites like PolitiFact."], ["lex", "research candidates before voting election"], ["lex", "voter guide candidate positions issues"], ["lex", "candidate research voting record platform"], ["vec", "how can voters research political candidates and their positions before an election?"], ["vec", "what resources help voters compare candidates' platforms and voting records before casting a ballot?"]]} +{"query": "how did the roman empire impact culture?", "output": [["hyde", "The Roman Empire's cultural legacy includes Latin (the root of Romance languages), Roman law (the basis of civil law systems worldwide), architectural innovations like arches, aqueducts, and concrete, republican government concepts, road networks, and the spread of Christianity. Roman art, literature, and engineering influenced Western civilization for centuries."], ["lex", "Roman Empire cultural impact legacy"], ["lex", "Roman Empire influence law language architecture"], ["lex", "Rome culture art Latin Western civilization"], ["vec", "how did the Roman Empire shape Western culture, law, and language?"], ["vec", "what lasting cultural impacts did the Roman Empire have on architecture, government, and society?"]]} +{"query": "explain monotheism", "output": [["hyde", "Monotheism is the belief in a single, all-powerful God. The three major monotheistic religions are Judaism, Christianity, and Islam, all tracing their roots to Abraham. Judaism was among the earliest monotheistic faiths, emerging around 2000 BCE. Monotheism contrasts with polytheism (many gods) and differs from henotheism (one chief god among many)."], ["lex", "monotheism one God religion"], ["lex", "monotheism Christianity Islam Judaism"], ["lex", "monotheism definition history theology"], ["vec", "what is monotheism and which major world religions practice the belief in one God?"], ["vec", "how did monotheism develop historically and what distinguishes it from polytheism?"]]} +{"query": "how to replace windshield wipers?", "output": [["hyde", "Lift the wiper arm away from the windshield. Press the small tab where the blade meets the arm and slide the old blade off the hook. Slide the new blade onto the J-hook until it clicks into place. Lower the arm back gently. Check your owner's manual or an auto parts store's fit guide for the correct blade size."], ["lex", "replace windshield wipers installation"], ["lex", "change wiper blades car DIY"], ["lex", "windshield wiper replacement size"], ["vec", "how do you replace windshield wiper blades on a car step by step?"], ["vec", "what size windshield wipers does my car need and how do I install them?"]]} +{"query": "what are tectonic plates", "output": [["hyde", "Tectonic plates are massive slabs of Earth's lithosphere that float on the semi-fluid asthenosphere. There are 15 major plates that move 1-10 cm per year. At convergent boundaries, plates collide causing mountains and subduction zones; at divergent boundaries, plates separate creating mid-ocean ridges; at transform boundaries, plates slide past each other causing earthquakes."], ["lex", "tectonic plates Earth crust geology"], ["lex", "plate tectonics continental drift boundaries"], ["lex", "tectonic plates earthquake volcano subduction"], ["vec", "what are tectonic plates and how does plate tectonics explain earthquakes and volcanic activity?"], ["vec", "how do tectonic plates move and interact at convergent, divergent, and transform boundaries?"]]} +{"query": "airbnb bookings", "output": [["hyde", "To book on Airbnb, search by destination and dates, filter by price, type, and amenities, and review photos and guest reviews. Request to book or use Instant Book listings for immediate confirmation. Airbnb charges a service fee of 14-16%. Check the cancellation policy (Flexible, Moderate, or Strict) before confirming."], ["lex", "Airbnb bookings reservations how to"], ["lex", "Airbnb book rental property listing"], ["lex", "Airbnb booking tips cancellation policy"], ["vec", "how do you book a rental property on Airbnb and what should you know before reserving?"], ["vec", "what are the Airbnb booking policies including cancellation, fees, and payment?"]]} +{"query": "how do you develop a writing voice?", "output": [["hyde", "Developing a writing voice requires reading widely, writing consistently, and paying attention to what feels natural. Write the way you think and speak. Experiment with sentence length, word choice, and rhythm. Read your work aloud to hear your voice. Imitate writers you admire, then gradually let your own patterns emerge through regular practice."], ["lex", "develop writing voice style"], ["lex", "writing voice tone author style"], ["lex", "find unique writing voice techniques"], ["vec", "how does a writer develop their own unique writing voice and style?"], ["vec", "what exercises and practices help writers find and strengthen their authentic voice?"]]} +{"query": "what is devotion in religious context", "output": [["hyde", "Religious devotion refers to profound love, loyalty, and dedication to God or a divine reality, expressed through prayer, worship, and spiritual practice. In Hinduism, bhakti (devotion) is a path to liberation through loving surrender to a deity. In Christianity, devotion involves daily prayer, scripture reading, and sacramental participation."], ["lex", "devotion religion religious worship"], ["lex", "devotion faith prayer bhakti piety"], ["lex", "religious devotion spiritual practice"], ["vec", "what does devotion mean in a religious context and how is it practiced across faiths?"], ["vec", "how do different religions express devotion through prayer, worship, and spiritual discipline?"]]} +{"query": "what is skepticism in philosophy", "output": [["hyde", "Philosophical skepticism questions whether certain knowledge is possible. Pyrrhonian skepticism (from Pyrrho of Elis) suspends judgment on all claims, arguing that for every argument there is an equally strong counterargument. Descartes used methodological doubt—doubting everything that could be doubted—to arrive at \"cogito ergo sum\" as an indubitable foundation."], ["lex", "skepticism philosophy epistemology doubt"], ["lex", "philosophical skepticism Pyrrhonism Descartes"], ["lex", "skepticism knowledge certainty questioning"], ["vec", "what is philosophical skepticism and how does it question the possibility of knowledge?"], ["vec", "how did Pyrrhonian skepticism and Cartesian doubt influence Western philosophical thought?"]]} +{"query": "fix teeth", "output": [["hyde", "Common dental repairs include bonding (composite resin applied to chipped teeth, $100-400), porcelain veneers (thin shells covering the front surface, $500-2500 per tooth), crowns (caps covering the entire tooth, $800-1500), and dental implants for missing teeth ($3000-5000). Treatment depends on the extent of damage."], ["lex", "fix teeth dental repair options"], ["lex", "broken chipped teeth treatment dentist"], ["lex", "dental restoration crowns veneers bonding"], ["vec", "what are the options for fixing damaged, chipped, or broken teeth?"], ["vec", "how do dentists repair teeth using crowns, veneers, bonding, and other dental treatments?"]]} +{"query": "what are social media photography tips?", "output": [["hyde", "Shoot during golden hour (the hour after sunrise or before sunset) for warm, flattering light. Use the rule of thirds grid on your phone camera. Keep backgrounds clean and uncluttered. Edit consistently using the same preset or filter for a cohesive feed. Shoot in natural light whenever possible and avoid using flash."], ["lex", "social media photography tips Instagram"], ["lex", "phone photography social media lighting composition"], ["lex", "Instagram photo tips editing filters"], ["vec", "what are the best photography tips for creating engaging social media content?"], ["vec", "how do you take better photos for Instagram and other social media platforms using a phone?"]]} +{"query": "what is gerrymandering", "output": [["hyde", "Gerrymandering is the manipulation of electoral district boundaries to favor a particular political party. Two main techniques are \"packing\" (concentrating opposition voters into a few districts) and \"cracking\" (spreading them across many districts to dilute their vote). The term dates to 1812 when Governor Elbridge Gerry approved a district shaped like a salamander."], ["lex", "gerrymandering redistricting electoral districts"], ["lex", "gerrymandering political manipulation voting"], ["lex", "gerrymandering packing cracking congressional"], ["vec", "what is gerrymandering and how does it manipulate electoral district boundaries?"], ["vec", "how does gerrymandering use techniques like packing and cracking to influence election outcomes?"]]} +{"query": "how do the arts contribute to moral understanding?", "output": [["hyde", "Literature, theater, and film place audiences in the shoes of characters facing moral dilemmas, cultivating empathy and ethical reflection. Martha Nussbaum argues that novels develop moral imagination by exposing readers to lives unlike their own. Art invites us to confront injustice, question assumptions, and feel the weight of ethical choices."], ["lex", "arts moral understanding ethics"], ["lex", "art literature ethics empathy"], ["lex", "arts moral education philosophical perspective"], ["vec", "how do the arts such as literature, film, and visual art contribute to moral understanding?"], ["vec", "in what ways do artistic works cultivate empathy and ethical awareness in audiences?"]]} +{"query": "what are the main beliefs of jainism?", "output": [["hyde", "Jainism's core beliefs include ahimsa (non-violence toward all living beings), anekantavada (many-sidedness of truth), and aparigraha (non-attachment). Jains believe the soul (jiva) accumulates karma through actions and must purify itself through ethical living, asceticism, and meditation to achieve moksha (liberation from the cycle of rebirth)."], ["lex", "Jainism beliefs principles religion"], ["lex", "Jainism ahimsa non-violence karma"], ["lex", "Jain philosophy anekantavada moksha"], ["vec", "what are the core beliefs and principles of Jainism as a religion?"], ["vec", "how does Jainism emphasize non-violence (ahimsa) and what are its main philosophical tenets?"]]} +{"query": "how do philosophers define happiness", "output": [["hyde", "Aristotle defined happiness (eudaimonia) as flourishing through virtuous activity over a complete life, not mere pleasure. Epicurus identified happiness with ataraxia (tranquility) and the absence of pain. Utilitarians like Mill equated happiness with pleasure but distinguished higher (intellectual) from lower (bodily) pleasures. Modern positive psychology studies happiness as subjective well-being."], ["lex", "philosophers define happiness philosophy"], ["lex", "happiness eudaimonia Aristotle hedonism"], ["lex", "philosophical theories happiness well-being"], ["vec", "how have major philosophers throughout history defined happiness and well-being?"], ["vec", "what is the difference between Aristotle's eudaimonia and hedonistic views of happiness?"]]} +{"query": "how to train a dog to sit", "output": [["hyde", "Hold a treat close to your dog's nose, then slowly move your hand up so the dog's head follows the treat and their bottom lowers. The moment they sit, say \"sit,\" give the treat, and praise them. Repeat 5-10 times per session, 2-3 sessions daily. Within a week, most dogs learn to sit on verbal command alone."], ["lex", "train dog sit command"], ["lex", "dog training sit positive reinforcement"], ["lex", "teach puppy sit treat method"], ["vec", "what is the step-by-step method for training a dog to sit on command?"], ["vec", "how do you use positive reinforcement to teach a dog or puppy the sit command?"]]} +{"query": "how to choose a family-friendly restaurant?", "output": [["hyde", "Look for restaurants with a dedicated kids' menu, high chairs, and a casual atmosphere that tolerates noise. Check Google or Yelp reviews filtered for \"family-friendly.\" Booth seating, crayons or activity sheets, and an early dinner option are good signs. Fast-casual restaurants often work well since kids don't have to wait long for food."], ["lex", "family-friendly restaurant kids menu"], ["lex", "choose restaurant families children"], ["lex", "kid-friendly dining options reviews"], ["vec", "how do you find and choose a family-friendly restaurant suitable for dining with children?"], ["vec", "what features make a restaurant good for families with young kids?"]]} +{"query": "what is historical context in literature?", "output": [["hyde", "Historical context in literature refers to the social, political, economic, and cultural conditions during the time a work was written. Understanding that \"1984\" was written in 1948 during the rise of totalitarian states deepens its meaning. Historical context helps readers interpret themes, character motivations, and the author's intent within their time period."], ["lex", "historical context literature analysis"], ["lex", "historical context literary criticism period"], ["lex", "literature historical background social conditions"], ["vec", "what does historical context mean when analyzing and interpreting a work of literature?"], ["vec", "how does understanding the historical period and social conditions help interpret literary texts?"]]} +{"query": "where to buy mid-century modern furniture", "output": [["hyde", "Shop mid-century modern furniture at West Elm, Design Within Reach (DWR), and Article for contemporary reproductions. For vintage originals, check Chairish, 1stDibs, and local estate sales. IKEA offers affordable MCM-inspired pieces. Facebook Marketplace and Craigslist often have authentic Eames, Knoll, and Herman Miller pieces at lower prices."], ["lex", "buy mid-century modern furniture store"], ["lex", "mid-century modern furniture online vintage"], ["lex", "MCM furniture West Elm Design Within Reach"], ["vec", "where can I buy authentic or reproduction mid-century modern furniture?"], ["vec", "what are the best stores and websites for purchasing mid-century modern style furniture?"]]} +{"query": "how to transition kids to new schools?", "output": [["hyde", "Visit the new school together before the first day so the building feels familiar. Meet the teacher and tour the classroom. Maintain routines at home for stability. Encourage your child to talk about their feelings and validate their anxiety. Arrange playdates with new classmates early on, and stay in contact with teachers during the first few weeks."], ["lex", "transition kids new school tips"], ["lex", "children changing schools adjustment"], ["lex", "help child new school anxiety transfer"], ["vec", "how can parents help their children transition smoothly to a new school?"], ["vec", "what strategies help kids adjust emotionally and socially when changing schools?"]]} +{"query": "what is graphic design?", "output": [["hyde", "Graphic design is the craft of creating visual content to communicate messages. Designers use typography, color theory, layout, and imagery to create logos, websites, posters, packaging, and more. Key tools include Adobe Photoshop, Illustrator, InDesign, and Figma. The field spans print design, web/UI design, branding, and motion graphics."], ["lex", "graphic design visual communication"], ["lex", "graphic design typography layout color"], ["lex", "graphic design tools Adobe Figma"], ["vec", "what is graphic design and what skills and tools does a graphic designer use?"], ["vec", "how does graphic design combine typography, color, and layout to communicate visually?"]]} +{"query": "what is the latest iphone model", "output": [["hyde", "The iPhone 16 series launched in September 2024 with the A18 chip, a dedicated Camera Control button, and Apple Intelligence features. The iPhone 16 Pro and Pro Max feature a 48MP main camera, titanium design, and improved battery life. The iPhone 17 lineup is expected in September 2025."], ["lex", "latest iPhone model 2025 2026"], ["lex", "newest iPhone Apple release"], ["lex", "iPhone 17 features specs"], ["vec", "what is the latest iPhone model released by Apple and what are its key features?"], ["vec", "what are the specs and improvements in the newest iPhone compared to previous models?"]]} +{"query": "where to find open access research papers", "output": [["hyde", "Access free research papers through PubMed Central (biomedical), arXiv (physics, math, CS), SSRN (social sciences), and DOAJ (Directory of Open Access Journals). Google Scholar often links to free PDF versions. Unpaywall is a browser extension that finds legal free versions of paywalled papers. Many universities also maintain institutional repositories."], ["lex", "open access research papers free"], ["lex", "open access journals articles database"], ["lex", "free academic papers PubMed arXiv"], ["vec", "where can I find free open access research papers and academic articles?"], ["vec", "what databases and websites provide open access to peer-reviewed scientific papers?"]]} +{"query": "how to improve interpersonal skills", "output": [["hyde", "Improve interpersonal skills by practicing active listening: maintain eye contact, avoid interrupting, and paraphrase what you heard. Ask open-ended questions to show genuine interest. Develop empathy by considering others' perspectives before responding. Practice assertive communication—express your needs clearly while respecting others. Seek feedback on how you come across."], ["lex", "improve interpersonal skills communication"], ["lex", "interpersonal skills active listening empathy"], ["lex", "people skills social interaction workplace"], ["vec", "what are effective ways to improve interpersonal and communication skills?"], ["vec", "how can someone develop better listening, empathy, and social skills in personal and professional settings?"]]} +{"query": "math model", "output": [["hyde", "A mathematical model uses equations and formulas to represent the behavior of a real-world system. For example, the SIR model uses differential equations to predict disease spread: dS/dt = -βSI, dI/dt = βSI - γI, dR/dt = γI. Models are validated by comparing predictions to observed data and refined iteratively."], ["lex", "mathematical model equations simulation"], ["lex", "math modeling real-world applications"], ["lex", "mathematical model differential equations optimization"], ["vec", "what is a mathematical model and how is it used to represent real-world systems?"], ["vec", "how do mathematicians build models using equations to simulate and predict outcomes?"]]} +{"query": "what is digital transformation", "output": [["hyde", "Digital transformation is the process of using digital technologies to fundamentally change how an organization operates and delivers value. It goes beyond digitizing existing processes—it involves rethinking business models, customer experiences, and operational workflows using cloud computing, AI, data analytics, and automation."], ["lex", "digital transformation definition strategy"], ["lex", "digital transformation technology business process"], ["lex", "digital transformation cloud automation data-driven"], ["vec", "what is digital transformation and how does it change how organizations operate?"], ["vec", "what are the key components and stages of digital transformation in a business?"]]} +{"query": "how to improve project outcomes", "output": [["hyde", "Improve project outcomes by defining clear objectives and success criteria upfront, engaging stakeholders early and often, breaking work into short iterations with regular checkpoints, and managing risks proactively. Use retrospectives to learn from each phase. Projects with clear scope, executive sponsorship, and empowered teams are 2-3x more likely to succeed."], ["lex", "improve project outcomes management"], ["lex", "project success factors planning execution"], ["lex", "project management methodology agile results"], ["vec", "what strategies and practices improve project outcomes and increase the chance of success?"], ["vec", "how can project managers improve delivery, stakeholder satisfaction, and results?"]]} +{"query": "what is the relationship between ethics and happiness?", "output": [["hyde", "Aristotle argued that happiness (eudaimonia) is achieved through virtuous living—not pleasure alone, but the active exercise of reason and moral virtue over a lifetime. The Stoics similarly held that virtue is sufficient for happiness. Utilitarianism inverts this: moral actions are those that maximize total happiness. The question of whether being moral makes you happy remains debated."], ["lex", "ethics happiness philosophy relationship"], ["lex", "virtue ethics happiness eudaimonia Aristotle"], ["lex", "morality well-being ethical living"], ["vec", "what is the philosophical relationship between living ethically and being happy?"], ["vec", "how does Aristotle argue that virtue and ethics are connected to happiness and human flourishing?"]]} +{"query": "how does philosophy explore the nature of truth?", "output": [["hyde", "Philosophy examines truth through several theories. The correspondence theory holds that truth is agreement between a proposition and reality. The coherence theory says a statement is true if it fits consistently within a system of beliefs. The pragmatic theory (James, Dewey) defines truth as what works in practice. Deflationary theories argue that \"true\" adds nothing beyond the assertion itself."], ["lex", "philosophy truth nature theories"], ["lex", "correspondence coherence pragmatic theory truth"], ["lex", "truth philosophy epistemology logic"], ["vec", "how do philosophical theories explain the nature of truth and what makes a statement true?"], ["vec", "what are the main theories of truth in philosophy such as correspondence, coherence, and pragmatic theories?"]]} +{"query": "rain drop", "output": [["hyde", "Raindrops form when water vapor condenses around tiny particles (condensation nuclei) in clouds. As droplets collide and merge, they grow heavy enough to fall. Contrary to the teardrop image, falling raindrops are actually shaped like hamburger buns—flattened on the bottom by air resistance. Average raindrops are 1-2mm in diameter and fall at about 20 mph."], ["lex", "raindrop formation size shape"], ["lex", "raindrop water cycle precipitation"], ["lex", "rain droplet physics terminal velocity"], ["vec", "how do raindrops form and what determines their size and shape as they fall?"], ["vec", "what is the science behind raindrop formation in the water cycle and precipitation?"]]} +{"query": "what is magical realism?", "output": [["hyde", "Magical realism is a literary genre in which supernatural elements appear in an otherwise realistic setting, treated as ordinary by the characters. Gabriel Garcia Marquez's \"One Hundred Years of Solitude\" is the quintessential example, where events like a character ascending to heaven while hanging laundry are narrated matter-of-factly alongside everyday life in Macondo."], ["lex", "magical realism literary genre"], ["lex", "magical realism Garcia Marquez literature"], ["lex", "magical realism Latin American fiction examples"], ["vec", "what is magical realism as a literary genre and what are its defining characteristics?"], ["vec", "how do authors like Gabriel Garcia Marquez blend the magical and mundane in magical realism?"]]} +{"query": "how to write a film review", "output": [["hyde", "Start with a hook—a striking observation about the film. Provide a brief, spoiler-free plot summary (2-3 sentences). Evaluate the directing, acting, cinematography, screenplay, and score. Support your opinion with specific scenes or examples. Address who would enjoy the film and rate it on your chosen scale. Keep the review between 400-800 words."], ["lex", "write film review movie critique"], ["lex", "film review structure format examples"], ["lex", "movie review writing tips analysis"], ["vec", "how do you write a well-structured and engaging film review?"], ["vec", "what elements should be included in a film review such as plot summary, analysis, and rating?"]]} +{"query": "what is the current inflation rate", "output": [["hyde", "The U.S. Bureau of Labor Statistics measures inflation through the Consumer Price Index (CPI), which tracks the average change in prices paid by consumers for goods and services. The annual inflation rate is calculated by comparing the current CPI to the same month one year prior. Check bls.gov/cpi for the latest monthly release."], ["lex", "current inflation rate CPI 2025 2026"], ["lex", "inflation rate United States economy"], ["lex", "consumer price index inflation percentage"], ["vec", "what is the current U.S. inflation rate and how is it measured by the CPI?"], ["vec", "what is the latest consumer price index data showing the annual inflation rate?"]]} +{"query": "what is the function of dialogue?", "output": [["hyde", "Dialogue serves multiple functions: it conveys information between characters, reveals personality and motivation, advances the plot, and creates tension. In everyday communication, dialogue enables mutual understanding and negotiation of meaning."], ["lex", "dialogue function purpose communication"], ["lex", "dialogue conversation role"], ["vec", "what purpose does dialogue serve in communication and storytelling"], ["vec", "how does dialogue function in literature and everyday interaction"]]} +{"query": "what is the importance of peer review", "output": [["hyde", "Peer review is the cornerstone of scientific publishing. Before a paper is accepted, independent experts evaluate the methodology, data analysis, and conclusions. This process catches errors, prevents fraudulent claims, and maintains the credibility of published research."], ["lex", "peer review importance scientific publishing"], ["lex", "peer review process academic research"], ["vec", "why is peer review important in academic and scientific publishing"], ["vec", "how does the peer review process ensure quality in research papers"]]} +{"query": "what is the impact of the printing press", "output": [["hyde", "Gutenberg's printing press, invented around 1440, revolutionized the production of books. By making texts affordable and widely available, it increased literacy rates, enabled the Protestant Reformation, and accelerated the Scientific Revolution across Europe."], ["lex", "printing press impact history Gutenberg"], ["lex", "printing press effects literacy knowledge"], ["vec", "how did the invention of the printing press change society and the spread of knowledge"], ["vec", "what were the historical consequences of Gutenberg's printing press"]]} +{"query": "what is open science", "output": [["hyde", "Open science is a movement to make scientific research, data, and dissemination accessible to all. It encompasses open access publishing, open data sharing, open-source software, and transparent methodologies, aiming to accelerate discovery through collaboration."], ["lex", "open science definition principles"], ["lex", "open access open data research transparency"], ["vec", "what does open science mean and what are its core principles"], ["vec", "how does open science promote transparency and accessibility in research"]]} +{"query": "swim class", "output": [["hyde", "Our swim classes are available for all ages and skill levels. Beginner classes focus on water safety, floating, and basic strokes. Intermediate classes cover freestyle, backstroke, and treading water. Sessions run 30-45 minutes with certified instructors."], ["lex", "swimming classes lessons beginner"], ["lex", "swim class schedule enrollment"], ["vec", "where can I find swimming classes for beginners or children"], ["vec", "what should I expect from a swimming lesson and how to enroll"]]} +{"query": "what is the bhagavad gita", "output": [["hyde", "The Bhagavad Gita is a 700-verse Hindu scripture that forms part of the Mahabharata epic. It is a dialogue between Prince Arjuna and the god Krishna, addressing duty (dharma), devotion (bhakti), knowledge (jnana), and selfless action (karma yoga)."], ["lex", "Bhagavad Gita Hindu scripture meaning"], ["lex", "Bhagavad Gita Krishna Arjuna teachings"], ["vec", "what is the Bhagavad Gita and what are its central teachings"], ["vec", "what role does the Bhagavad Gita play in Hindu philosophy and practice"]]} +{"query": "how does plant photosynthesis work", "output": [["hyde", "Photosynthesis occurs in chloroplasts. In the light reactions, chlorophyll absorbs sunlight to split water molecules, producing ATP and NADPH. In the Calvin cycle, these molecules drive the fixation of CO2 into glucose, releasing oxygen as a byproduct."], ["lex", "photosynthesis process plants chlorophyll"], ["lex", "light reactions Calvin cycle carbon dioxide"], ["vec", "how do plants convert sunlight into energy through photosynthesis"], ["vec", "what are the steps of photosynthesis in plant cells"]]} +{"query": "what is a black hole", "output": [["hyde", "A black hole is a region in space where gravity is so intense that nothing, not even light, can escape. It forms when a massive star collapses at the end of its life. The boundary is called the event horizon, beyond which lies the singularity."], ["lex", "black hole definition physics space"], ["lex", "black hole event horizon singularity"], ["vec", "what is a black hole and how does it form in space"], ["vec", "how do black holes work according to general relativity"]]} +{"query": "how ecosystems function", "output": [["hyde", "Ecosystems function through interconnected processes: producers capture solar energy via photosynthesis, consumers transfer energy through food webs, and decomposers recycle nutrients back into the soil. Water, carbon, and nitrogen cycle continuously through biotic and abiotic components."], ["lex", "ecosystem function energy flow nutrient cycling"], ["lex", "ecosystems trophic levels food web"], ["vec", "how do ecosystems function through energy flow and nutrient cycling"], ["vec", "what are the key processes that keep ecosystems balanced and healthy"]]} +{"query": "how to increase home resale value", "output": [["hyde", "Kitchen and bathroom remodels offer the highest ROI, typically recovering 60-80% of costs. Other high-value improvements include replacing the front door, adding a deck, and upgrading to energy-efficient windows. Fresh paint and curb appeal landscaping are low-cost, high-impact upgrades."], ["lex", "increase home resale value renovations"], ["lex", "home improvement ROI property value"], ["vec", "what home improvements increase resale value the most"], ["vec", "how can I boost my home's market price before selling"]]} +{"query": "how to design an effective scientific study", "output": [["hyde", "An effective study begins with a clear hypothesis and defined variables. Choose an appropriate design (randomized controlled trial, cohort, etc.), calculate the required sample size for statistical power, establish controls, and pre-register your protocol to reduce bias."], ["lex", "scientific study design methodology"], ["lex", "research design controls variables sample size"], ["vec", "how do you design a rigorous and effective scientific study"], ["vec", "what steps are involved in planning a well-controlled research experiment"]]} +{"query": "how to set up a campfire", "output": [["hyde", "To build a campfire, clear a fire ring down to bare soil. Place a tinder bundle of dry leaves or paper in the center. Stack small kindling sticks in a teepee shape around it. Light the tinder and gradually add larger logs as the fire grows. Keep water nearby to extinguish."], ["lex", "campfire setup build fire outdoors"], ["lex", "campfire fire pit kindling tinder logs"], ["vec", "how do you properly build and start a campfire outdoors"], ["vec", "what materials and steps are needed to set up a safe campfire"]]} +{"query": "where to learn digital marketing", "output": [["hyde", "Google Digital Garage offers a free Fundamentals of Digital Marketing course with certification. HubSpot Academy covers inbound marketing and content strategy. Coursera and Udemy feature paid courses on SEO, PPC, email marketing, and social media advertising."], ["lex", "digital marketing courses online training"], ["lex", "learn digital marketing SEO social media"], ["vec", "where can I take courses to learn digital marketing skills"], ["vec", "what are the best online platforms for learning SEO, social media, and digital advertising"]]} +{"query": "how to remove car dents?", "output": [["hyde", "For small dents, try the boiling water method on plastic bumpers or use a suction cup dent puller. Paintless dent repair (PDR) uses metal rods to push dents out from behind the panel. For deeper dents, apply body filler, sand smooth, and repaint."], ["lex", "car dent removal DIY repair"], ["lex", "paintless dent repair PDR technique"], ["vec", "how can I remove dents from my car at home without repainting"], ["vec", "what are the methods for fixing small dents on a car body"]]} +{"query": "what is a moral code", "output": [["hyde", "A moral code is a set of principles or rules that define right and wrong conduct. It may be derived from religious teachings, cultural traditions, philosophical reasoning, or personal reflection. Examples include the Ten Commandments, Kantian ethics, and utilitarianism."], ["lex", "moral code definition ethics principles"], ["lex", "moral code rules behavior right wrong"], ["vec", "what is a moral code and how does it guide human behavior"], ["vec", "how do societies and individuals develop a set of moral principles"]]} +{"query": "what is cloud computing", "output": [["hyde", "Cloud computing delivers computing resources—servers, storage, databases, networking, and software—over the internet on a pay-as-you-go basis. The three main service models are Infrastructure as a Service (IaaS), Platform as a Service (PaaS), and Software as a Service (SaaS)."], ["lex", "cloud computing definition services"], ["lex", "cloud computing IaaS PaaS SaaS"], ["vec", "what is cloud computing and how do cloud services work"], ["vec", "what are the different types of cloud computing services like IaaS, PaaS, and SaaS"]]} +{"query": "how to practice meditation", "output": [["hyde", "Start with 5-10 minutes daily. Sit comfortably, close your eyes, and focus on your breath. When thoughts arise, notice them without judgment and gently return attention to breathing. Guided meditation apps like Headspace or Insight Timer can help beginners build consistency."], ["lex", "meditation practice techniques beginners"], ["lex", "mindfulness meditation breathing focus"], ["vec", "how do I start a daily meditation practice as a beginner"], ["vec", "what are simple meditation techniques for reducing stress and improving focus"]]} +{"query": "what is xeriscaping?", "output": [["hyde", "Xeriscaping is a landscaping approach that minimizes water use by selecting drought-tolerant native plants, improving soil with compost, using efficient drip irrigation, applying mulch to retain moisture, and reducing lawn area. It originated in arid regions of the western United States."], ["lex", "xeriscaping drought-tolerant landscaping water conservation"], ["lex", "xeriscape garden design dry climate plants"], ["vec", "what is xeriscaping and how does it reduce water usage in landscaping"], ["vec", "how do you design a xeriscape garden with drought-resistant plants"]]} +{"query": "what are the main beliefs of buddhism", "output": [["hyde", "Buddhism is founded on the Four Noble Truths: life involves suffering (dukkha), suffering arises from craving (tanha), suffering can end (nirodha), and the path to its end is the Noble Eightfold Path. Key concepts include karma, rebirth, impermanence (anicca), and non-self (anatta)."], ["lex", "Buddhism beliefs Four Noble Truths Eightfold Path"], ["lex", "Buddhist teachings karma dharma nirvana"], ["vec", "what are the core beliefs and teachings of Buddhism"], ["vec", "what do Buddhists believe about suffering, enlightenment, and the path to nirvana"]]} +{"query": "how to reduce carbon footprint?", "output": [["hyde", "The biggest personal reductions come from driving less or switching to an EV, flying less frequently, eating less red meat, improving home insulation, and switching to renewable energy. A plant-rich diet can cut food-related emissions by up to 50%."], ["lex", "reduce carbon footprint emissions tips"], ["lex", "lower carbon footprint energy transportation diet"], ["vec", "what are effective ways to reduce my personal carbon footprint"], ["vec", "how can individuals lower their greenhouse gas emissions in daily life"]]} +{"query": "how to save for a child's education?", "output": [["hyde", "A 529 plan is one of the most tax-advantaged ways to save for education. Contributions grow tax-free, and withdrawals for qualified expenses (tuition, books, room and board) are also tax-free. Many states offer additional tax deductions for contributions."], ["lex", "save child education fund college"], ["lex", "529 plan education savings account"], ["vec", "how should I save money for my child's college education"], ["vec", "what are the best investment accounts for saving for a child's education"]]} +{"query": "what is the best way to learn python programming?", "output": [["hyde", "Start with an interactive tutorial like Python.org's official tutorial or Codecademy's Python course. Practice daily on sites like LeetCode or HackerRank. Build small projects—a calculator, web scraper, or to-do app—to solidify concepts. Read \"Automate the Boring Stuff with Python\" for practical applications."], ["lex", "learn Python programming beginner tutorial"], ["lex", "Python programming course exercises projects"], ["vec", "what is the most effective way to learn Python programming from scratch"], ["vec", "which Python courses and resources are best for beginners learning to code"]]} +{"query": "how to grow roses from cuttings?", "output": [["hyde", "Take a 6-8 inch cutting from a healthy rose stem just below a leaf node. Remove lower leaves, dip the cut end in rooting hormone, and insert into moist potting mix. Cover with a plastic bag to maintain humidity. Roots typically form in 4-8 weeks. Transplant once established."], ["lex", "grow roses cuttings propagation"], ["lex", "rose cutting rooting hormone planting"], ["vec", "how do you propagate roses from stem cuttings at home"], ["vec", "what is the step-by-step process for rooting rose cuttings"]]} +{"query": "sustainable architecture", "output": [["hyde", "Sustainable architecture minimizes environmental impact through passive solar design, natural ventilation, high-performance insulation, and renewable energy integration. Materials like cross-laminated timber, recycled steel, and low-VOC finishes reduce embodied carbon."], ["lex", "sustainable architecture green building design"], ["lex", "sustainable building materials energy efficient"], ["vec", "what is sustainable architecture and what design principles does it follow"], ["vec", "how do architects design energy-efficient and environmentally friendly buildings"]]} +{"query": "what is the concept of moral luck", "output": [["hyde", "Moral luck, introduced by Thomas Nagel and Bernard Williams in 1976, refers to situations where moral judgment depends on factors beyond a person's control. A drunk driver who arrives home safely is judged differently from one who kills a pedestrian, despite identical recklessness."], ["lex", "moral luck philosophy concept"], ["lex", "moral luck Thomas Nagel Bernard Williams"], ["vec", "what is the philosophical concept of moral luck and why is it controversial"], ["vec", "how does moral luck challenge our ideas about responsibility and blame"]]} +{"query": "task wait", "output": [["hyde", "Use `await task` in async/await patterns to wait for completion. In C#, `Task.Wait()` blocks synchronously while `await` yields control. In Python, `await asyncio.gather(*tasks)` waits for multiple coroutines. Use timeouts to prevent indefinite blocking."], ["lex", "async task wait await"], ["lex", "task wait timeout concurrency"], ["vec", "how to wait for an asynchronous task to complete in programming"], ["vec", "how to use await or task wait for concurrent operations"]]} +{"query": "latest findings in climate science", "output": [["hyde", "Recent studies in 2025 confirm that global average temperatures have exceeded 1.5°C above pre-industrial levels. Ocean heat content reached record highs, and Arctic sea ice extent continued its decline. New research links accelerated ice sheet loss in Greenland and Antarctica to rising sea levels."], ["lex", "climate science research findings 2025 2026"], ["lex", "climate change latest studies temperature emissions"], ["vec", "what are the most recent scientific findings about climate change in 2025-2026"], ["vec", "what do the latest climate science studies reveal about global warming trends"]]} +{"query": "how to lose weight fast?", "output": [["hyde", "Safe weight loss is 1-2 pounds per week through a calorie deficit of 500-1000 calories daily. Combine a protein-rich diet with strength training and cardio. Avoid crash diets—they cause muscle loss and metabolic slowdown. Drink water, sleep 7-9 hours, and track food intake for accountability."], ["lex", "lose weight fast safe methods"], ["lex", "weight loss diet exercise calorie deficit"], ["vec", "what are safe and effective methods to lose weight quickly"], ["vec", "how can I create a calorie deficit to lose weight without harming my health"]]} +{"query": "ukraine", "output": [["hyde", "Ukraine is a country in Eastern Europe with a population of approximately 44 million. Since February 2022, it has been engaged in a full-scale war following Russia's invasion. Kyiv is the capital. Ukraine has deep historical ties to both European and post-Soviet geopolitics."], ["lex", "Ukraine country history conflict"], ["lex", "Ukraine war geopolitics Kyiv"], ["vec", "what is the current situation in Ukraine and the ongoing conflict"], ["vec", "what is the history and geopolitical context of Ukraine"]]} +{"query": "http client", "output": [["hyde", "An HTTP client sends requests to web servers and processes responses. In JavaScript, use `fetch()` or `axios`. In Python, use `requests` or `httpx`. In Go, use `net/http`. Typical methods include GET, POST, PUT, DELETE. Set headers, handle timeouts, and parse JSON responses."], ["lex", "HTTP client library request"], ["lex", "HTTP client fetch API REST"], ["vec", "how to make HTTP requests using an HTTP client library"], ["vec", "which HTTP client libraries are available for making API calls in different languages"]]} +{"query": "how to vlog with a smartphone", "output": [["hyde", "To vlog with a smartphone, use the rear camera for higher quality. Invest in a small tripod or gimbal for stability, a clip-on microphone for clear audio, and a ring light for indoor filming. Shoot in 1080p or 4K, frame at eye level, and edit with apps like CapCut or InShot."], ["lex", "vlog smartphone video recording tips"], ["lex", "smartphone vlogging equipment setup"], ["vec", "how do I start vlogging using only my smartphone"], ["vec", "what equipment and techniques make smartphone vlogs look professional"]]} +{"query": "what are the elements of short stories?", "output": [["hyde", "The essential elements of a short story are plot (the sequence of events), character (the people involved), setting (time and place), conflict (the central struggle), theme (the underlying message), and point of view (the narrative perspective). Short stories typically focus on a single incident."], ["lex", "short story elements plot character setting"], ["lex", "short story structure literary elements"], ["vec", "what are the key literary elements that make up a short story"], ["vec", "how are plot, character, setting, and theme used in short story writing"]]} +{"query": "how to fix car key fob?", "output": [["hyde", "If your key fob stops working, replace the battery first—open the case with a flat screwdriver and swap in a new CR2032 or CR2025 coin cell. If it still fails, reprogram it: consult your owner's manual for the key-turn sequence or visit a dealer for re-pairing."], ["lex", "car key fob fix repair battery replacement"], ["lex", "key fob not working reprogram"], ["vec", "how do I fix a car key fob that stopped working"], ["vec", "how to replace the battery or reprogram a car key fob"]]} +{"query": "how to grow orchids indoors?", "output": [["hyde", "Phalaenopsis orchids thrive indoors with bright indirect light, such as an east-facing window. Water once a week by soaking the roots, then draining completely. Maintain 50-70% humidity with a pebble tray. Fertilize biweekly with diluted orchid fertilizer. Repot every 1-2 years in bark medium."], ["lex", "grow orchids indoors care guide"], ["lex", "orchid indoor growing light water humidity"], ["vec", "how do you care for orchids when growing them indoors"], ["vec", "what light, water, and humidity conditions do indoor orchids need"]]} +{"query": "how to prepare a scientific presentation", "output": [["hyde", "Structure your talk as: introduction with context, methods, key results, and conclusions. Use one main idea per slide. Minimize text—use figures and graphs. Practice timing (typically 12 minutes for a 15-minute slot). Anticipate questions about methodology and limitations."], ["lex", "scientific presentation preparation slides"], ["lex", "research talk conference presentation tips"], ["vec", "how do you prepare and deliver an effective scientific presentation"], ["vec", "what are tips for creating clear slides for a research conference talk"]]} +{"query": "ai", "output": [["hyde", "Artificial intelligence (AI) refers to computer systems that perform tasks typically requiring human intelligence, such as recognizing speech, making decisions, and translating languages. Modern AI relies on machine learning, particularly deep neural networks and large language models (LLMs)."], ["lex", "artificial intelligence AI machine learning"], ["lex", "AI deep learning neural networks LLM"], ["vec", "what is artificial intelligence and how does modern AI technology work"], ["vec", "what are the main branches and applications of artificial intelligence"]]} +{"query": "how to write a research proposal", "output": [["hyde", "A research proposal typically includes: title, abstract, introduction with background and significance, literature review, research questions or hypotheses, methodology, timeline, budget, and references. Clearly state the gap your research will fill and justify the chosen methods."], ["lex", "research proposal writing guide"], ["lex", "research proposal structure sections"], ["vec", "how do you write a strong research proposal for a grant or thesis"], ["vec", "what sections and elements should a research proposal include"]]} +{"query": "how to stop negative self-talk?", "output": [["hyde", "Cognitive behavioral therapy (CBT) teaches you to identify and challenge negative automatic thoughts. When you catch yourself thinking \"I always fail,\" reframe it: \"I struggled this time, but I've succeeded before.\" Keep a thought journal, practice self-compassion, and label thoughts as thoughts, not facts."], ["lex", "stop negative self-talk techniques"], ["lex", "negative self-talk cognitive behavioral therapy"], ["vec", "how can I stop negative self-talk and replace it with positive thinking"], ["vec", "what psychological techniques help overcome critical inner dialogue"]]} +{"query": "how scientific collaboration advances research", "output": [["hyde", "Multi-institutional collaboration allows researchers to share equipment, data, and expertise across disciplines. The Human Genome Project involved 20 institutions across six countries. Studies show that co-authored papers receive more citations and have higher reproducibility than single-author work."], ["lex", "scientific collaboration research advancement"], ["lex", "interdisciplinary research teamwork co-authorship"], ["vec", "how does collaboration between scientists accelerate research progress"], ["vec", "why is interdisciplinary teamwork important in advancing scientific discovery"]]} +{"query": "how to measure business performance", "output": [["hyde", "Key business performance metrics include revenue growth rate, net profit margin, customer acquisition cost (CAC), customer lifetime value (CLV), employee productivity, and return on investment (ROI). Use dashboards and quarterly reviews to track KPIs against targets."], ["lex", "business performance metrics KPIs"], ["lex", "measure business performance revenue profit"], ["vec", "what key performance indicators are used to measure business success"], ["vec", "how do companies track and evaluate their business performance"]]} +{"query": "how to volunteer for a political campaign", "output": [["hyde", "To volunteer, visit the candidate's website and fill out the volunteer form. Common roles include canvassing door-to-door, phone banking, text banking, organizing events, and driving voters to polls on election day. Most campaigns welcome volunteers of all experience levels."], ["lex", "volunteer political campaign election"], ["lex", "campaign volunteering canvassing phone banking"], ["vec", "how can I sign up to volunteer for a political campaign"], ["vec", "what kinds of volunteer work are available on political campaigns"]]} +{"query": "how to bake a chocolate cake?", "output": [["hyde", "Preheat oven to 350°F. Mix 2 cups flour, 2 cups sugar, 3/4 cup cocoa powder, 2 tsp baking soda, and 1 tsp salt. Add 2 eggs, 1 cup buttermilk, 1 cup hot coffee, and 1/2 cup oil. Pour into greased pans and bake 30-35 minutes. Frost with chocolate ganache."], ["lex", "chocolate cake recipe bake from scratch"], ["lex", "baking chocolate cake ingredients instructions"], ["vec", "how do I bake a moist chocolate cake from scratch at home"], ["vec", "what is a simple recipe for homemade chocolate cake"]]} +{"query": "how do mystics approach spirituality?", "output": [["hyde", "Mystics seek direct, personal experience of the divine through contemplation, prayer, and meditation. Christian mystics like Meister Eckhart pursued union with God; Sufi mystics practice dhikr (remembrance of God); and Hindu mystics use yoga and devotion to experience Brahman."], ["lex", "mystics spirituality mystical experience"], ["lex", "mysticism spiritual practice contemplation"], ["vec", "how do mystics across traditions approach spiritual experience and union with the divine"], ["vec", "what practices and beliefs characterize mystical approaches to spirituality"]]} +{"query": "how cultural festivals affect community bonding", "output": [["hyde", "Cultural festivals create shared experiences that reinforce collective identity. Studies show communities with regular festivals report higher levels of social trust and neighborly interaction. Events like Diwali, Carnival, and Lunar New Year bring together diverse groups through food, music, and ritual."], ["lex", "cultural festivals community bonding social cohesion"], ["lex", "festivals community identity traditions"], ["vec", "how do cultural festivals strengthen community bonds and social cohesion"], ["vec", "what role do cultural celebrations play in bringing communities together"]]} +{"query": "how to follow election results", "output": [["hyde", "Follow live election results on the Associated Press (AP) election page, which aggregates official county-level results. Major outlets like CNN, NYT, and BBC offer interactive maps. Sign up for push notifications from news apps. Official state election websites post certified results."], ["lex", "follow election results live tracking"], ["lex", "election night results coverage 2026"], ["vec", "how can I follow live election results on election night"], ["vec", "what websites and apps provide real-time election result tracking"]]} +{"query": "how to sell a car to a dealership?", "output": [["hyde", "Get your car's market value from Kelley Blue Book or Edmunds before visiting a dealer. Clean the car, gather maintenance records, and bring the title. Get quotes from multiple dealers. The dealer will inspect the car, run a vehicle history report, and make an offer based on condition and mileage."], ["lex", "sell car dealership trade-in value"], ["lex", "selling car dealer offer negotiation"], ["vec", "how do I sell my used car to a dealership and get a fair price"], ["vec", "what steps should I follow when trading in or selling a car to a dealer"]]} +{"query": "what is a conductor in physics", "output": [["hyde", "An electrical conductor is a material that allows electric current to flow freely through it. Metals like copper, silver, and aluminum are excellent conductors because they have free electrons in their outer shells that move easily when a voltage is applied. Conductivity depends on temperature and material structure."], ["lex", "conductor physics electrical conductivity"], ["lex", "electrical conductor materials electrons"], ["vec", "what is an electrical conductor and how does it work in physics"], ["vec", "what makes certain materials good conductors of electricity"]]} +{"query": "what is the significance of civil disobedience?", "output": [["hyde", "Civil disobedience—the deliberate, nonviolent refusal to obey unjust laws—has driven major social change. Thoreau coined the term in 1849; Gandhi used it to help end British rule in India; and Martin Luther King Jr. employed it during the American civil rights movement to challenge segregation."], ["lex", "civil disobedience significance history"], ["lex", "civil disobedience Thoreau MLK Gandhi nonviolent protest"], ["vec", "why is civil disobedience significant in political and social movements"], ["vec", "how have acts of civil disobedience changed laws and society throughout history"]]} +{"query": "how to understand research articles", "output": [["hyde", "Start by reading the abstract for the main findings. Then read the introduction for context and the conclusion for takeaways. Next, examine figures and tables. Finally, read methods and results in detail. Look up unfamiliar terms. Read the paper multiple times—comprehension improves with each pass."], ["lex", "understand research articles reading papers"], ["lex", "read scientific journal article structure"], ["vec", "how do I read and understand scientific research articles effectively"], ["vec", "what strategy helps beginners comprehend academic journal papers"]]} +{"query": "how to start a 401(k)", "output": [["hyde", "Enroll through your employer's HR or benefits portal. Choose a contribution percentage—aim for at least enough to get the full employer match (typically 3-6% of salary). Select investment funds based on your retirement timeline. For 2026, the contribution limit is $23,500 ($31,000 if over 50)."], ["lex", "401k start retirement plan employer"], ["lex", "401k enrollment contribution match"], ["vec", "how do I set up and start contributing to a 401(k) retirement plan"], ["vec", "what are the steps to enroll in my employer's 401(k) plan"]]} +{"query": "how to organize a grassroots campaign", "output": [["hyde", "Start by defining your goal and identifying your base—who cares about this issue? Build a leadership team, create a volunteer database, and develop talking points. Use door-to-door canvassing, community meetings, social media, and petitions to grow support. Track commitments and follow up consistently."], ["lex", "grassroots campaign organizing strategy"], ["lex", "grassroots organizing community mobilization"], ["vec", "how do you organize a grassroots political or community campaign from scratch"], ["vec", "what are the key steps in building a grassroots movement for a cause"]]} +{"query": "what are the fundamental teachings of sikhism?", "output": [["hyde", "Sikhism, founded by Guru Nanak in the 15th century Punjab, teaches belief in one God (Ik Onkar), equality of all people, honest living (kirat karni), sharing with others (vand chakko), and remembrance of God (naam japna). The Guru Granth Sahib is the eternal Guru and holy scripture."], ["lex", "Sikhism fundamental teachings beliefs"], ["lex", "Sikh Guru Nanak five articles of faith"], ["vec", "what are the core beliefs and teachings of Sikhism"], ["vec", "what did Guru Nanak and the Sikh Gurus teach about God and living"]]} +{"query": "what are aboriginal dreamtime stories", "output": [["hyde", "Dreamtime (or Dreaming) stories are the foundational narratives of Aboriginal Australian peoples. They describe how ancestral beings shaped the land, created animals and plants, and established laws and customs. These stories are passed down through oral tradition, song, dance, and art, and remain central to Indigenous identity."], ["lex", "Aboriginal Dreamtime stories Australian Indigenous"], ["lex", "Dreamtime creation mythology Aboriginal culture"], ["vec", "what are Aboriginal Australian Dreamtime stories and what do they represent"], ["vec", "how do Dreamtime stories explain creation and law in Aboriginal culture"]]} +{"query": "how do philosophers approach the meaning of life", "output": [["hyde", "Existentialists like Sartre argued life has no inherent meaning—we must create it through our choices. Aristotle proposed eudaimonia (flourishing) as life's purpose. Camus explored the absurd, suggesting we must find meaning despite an indifferent universe. Eastern philosophy often points to liberation from suffering."], ["lex", "meaning of life philosophy existentialism"], ["lex", "philosophers purpose existence meaning"], ["vec", "how have different philosophers addressed the question of life's meaning"], ["vec", "what do existentialist and other philosophical traditions say about the purpose of life"]]} +{"query": "how to make compost at home?", "output": [["hyde", "Layer brown materials (dried leaves, cardboard) and green materials (kitchen scraps, grass clippings) in a 3:1 ratio. Keep the pile moist like a wrung-out sponge. Turn it every 1-2 weeks with a pitchfork. Avoid meat, dairy, and oils. Finished compost is dark, crumbly, and earthy-smelling in 2-6 months."], ["lex", "compost home DIY composting bin"], ["lex", "composting kitchen scraps yard waste"], ["vec", "how do I start composting food scraps and yard waste at home"], ["vec", "what is the step-by-step process for making compost in a backyard bin"]]} +{"query": "how to reduce food waste?", "output": [["hyde", "Plan meals weekly and shop with a list to avoid overbuying. Store produce properly—leafy greens in airtight containers, herbs in water. Use FIFO (first in, first out) in your fridge. Freeze leftovers and overripe fruit. Compost scraps you can't eat. The average household wastes 30% of purchased food."], ["lex", "reduce food waste tips prevention"], ["lex", "food waste reduction meal planning storage"], ["vec", "how can I reduce food waste at home through planning and storage"], ["vec", "what strategies help households throw away less food"]]} +{"query": "how to learn about native american culture", "output": [["hyde", "Visit the National Museum of the American Indian (Smithsonian) or local tribal cultural centers. Read works by Native authors like Joy Harjo, Tommy Orange, and Robin Wall Kimmerer. Attend powwows and cultural events when open to the public. Learn which tribal nations are indigenous to your area."], ["lex", "Native American culture history learn"], ["lex", "Indigenous peoples traditions tribal nations"], ["vec", "how can I respectfully learn about Native American culture and history"], ["vec", "what are good resources for understanding Indigenous peoples' traditions and heritage"]]} +{"query": "how to participate in a town hall meeting", "output": [["hyde", "Check your local government website or social media for upcoming town hall schedules. Arrive early and sign up to speak if required. Prepare a concise statement (usually 2-3 minutes). Stay respectful and on-topic. Bring supporting data or personal stories to strengthen your point."], ["lex", "town hall meeting participate attend"], ["lex", "town hall public meeting local government"], ["vec", "how do I attend and participate in a local town hall meeting"], ["vec", "what should I know before speaking at a town hall meeting"]]} +{"query": "how to choose a photo backdrop", "output": [["hyde", "Choose a backdrop that complements your subject without competing for attention. Solid colors (white, gray, black) are versatile for portraits. Muslin provides a painterly texture. For outdoor shoots, look for uncluttered backgrounds with good depth. Consider the color of your subject's clothing to avoid clashing."], ["lex", "photo backdrop choose background photography"], ["lex", "photography backdrop portrait studio"], ["vec", "how do I choose the right backdrop for portrait or studio photography"], ["vec", "what factors should I consider when selecting a photo backdrop"]]} +{"query": "what is the nature of god in christianity", "output": [["hyde", "Christianity teaches that God is one being existing as three persons: the Father, the Son (Jesus Christ), and the Holy Spirit. This is the doctrine of the Trinity. God is described as omniscient, omnipotent, omnipresent, eternal, and perfectly good. God is both transcendent and personally involved in creation."], ["lex", "nature of God Christianity Trinity"], ["lex", "Christian God attributes Father Son Holy Spirit"], ["vec", "how does Christianity describe the nature and attributes of God"], ["vec", "what is the doctrine of the Trinity in Christian theology"]]} +{"query": "how to scale a business", "output": [["hyde", "Scaling requires repeatable processes, automation, and a strong team. Standardize operations with SOPs, invest in technology to reduce manual work, and hire ahead of demand. Monitor unit economics—ensure customer acquisition cost stays below lifetime value. Secure funding for growth through revenue, debt, or equity."], ["lex", "scale business growth strategies"], ["lex", "business scaling operations revenue expansion"], ["vec", "how do you scale a business effectively while managing growth challenges"], ["vec", "what strategies help companies expand operations and increase revenue"]]} +{"query": "what is yoga and its benefits", "output": [["hyde", "Yoga is an ancient practice combining physical postures (asanas), breathing techniques (pranayama), and meditation. Regular practice improves flexibility, builds strength, reduces stress and anxiety, lowers blood pressure, and enhances sleep quality. Styles range from gentle Hatha to vigorous Vinyasa and Ashtanga."], ["lex", "yoga benefits health practice"], ["lex", "yoga physical mental health flexibility stress"], ["vec", "what is yoga and what physical and mental health benefits does it provide"], ["vec", "how does regular yoga practice improve flexibility, strength, and well-being"]]} +{"query": "how to get rid of self-limiting beliefs?", "output": [["hyde", "Identify limiting beliefs by noticing recurring thoughts like \"I'm not smart enough\" or \"I don't deserve success.\" Challenge each belief: what evidence supports it? What evidence contradicts it? Replace it with a realistic affirmation. Take small actions that disprove the belief to build new neural pathways."], ["lex", "self-limiting beliefs overcome remove"], ["lex", "limiting beliefs mindset change techniques"], ["vec", "how can I identify and overcome self-limiting beliefs that hold me back"], ["vec", "what techniques help replace self-limiting beliefs with empowering ones"]]} +{"query": "how are seasons determined by geography", "output": [["hyde", "Seasons result from Earth's 23.5° axial tilt. As Earth orbits the Sun, the Northern and Southern Hemispheres alternately tilt toward or away from the Sun, varying the angle and duration of sunlight. Near the equator, seasons are minimal; at higher latitudes, seasonal variation is extreme."], ["lex", "seasons geography Earth axial tilt"], ["lex", "seasons latitude hemisphere climate"], ["vec", "how does geography and Earth's axial tilt determine the seasons"], ["vec", "why do different parts of the world experience different seasons at the same time"]]} +{"query": "how to create a scalable business model", "output": [["hyde", "A scalable business model increases revenue without proportional increases in costs. SaaS, marketplace, and platform models are inherently scalable. Key elements: low marginal cost per customer, automation of delivery, network effects, and recurring revenue. Test with a minimum viable product before scaling."], ["lex", "scalable business model design"], ["lex", "business model scalability revenue growth"], ["vec", "how do you design a business model that scales efficiently with growth"], ["vec", "what makes a business model scalable and what are common scalable model types"]]} +{"query": "can pets help reduce kids' anxiety?", "output": [["hyde", "Studies show that children with pets exhibit lower cortisol levels and reduced anxiety. A 2015 study in Preventing Chronic Disease found that children living with dogs had significantly lower rates of childhood anxiety. Petting an animal for 10 minutes reduces cortisol and increases oxytocin levels."], ["lex", "pets children anxiety reduction"], ["lex", "pet therapy kids stress mental health"], ["vec", "can having pets help reduce anxiety and stress in children"], ["vec", "what research shows about the effect of pets on children's mental health"]]} +{"query": "date parse", "output": [["hyde", "In JavaScript, use `new Date('2025-01-15')` or `Date.parse()` for ISO strings. For complex formats, use `date-fns` parse function or `dayjs('12/25/2025', 'MM/DD/YYYY')`. In Python, use `datetime.strptime('2025-01-15', '%Y-%m-%d')` or the `dateutil.parser.parse()` function for flexible parsing."], ["lex", "date parse string format"], ["lex", "date parsing datetime library"], ["vec", "how to parse date strings into date objects in programming"], ["vec", "which libraries handle date parsing and formatting in JavaScript or Python"]]} +{"query": "how do christians observe lent?", "output": [["hyde", "Lent is a 40-day period before Easter beginning on Ash Wednesday. Christians observe it through fasting (abstaining from certain foods or luxuries), increased prayer, and almsgiving (charitable giving). Many give up a habit or take on a spiritual discipline. Catholic tradition requires abstaining from meat on Fridays."], ["lex", "Christians observe Lent fasting prayer"], ["lex", "Lent Christian observance Ash Wednesday Easter"], ["vec", "how do Christians observe the season of Lent before Easter"], ["vec", "what are the traditional Lenten practices of fasting, prayer, and almsgiving"]]} +{"query": "what are literary short stories?", "output": [["hyde", "Literary short stories prioritize character development, thematic depth, and prose style over plot-driven entertainment. They often explore the human condition through interior conflict and ambiguity. Notable practitioners include Anton Chekhov, Alice Munro, Raymond Carver, and Jorge Luis Borges."], ["lex", "literary short stories fiction genre"], ["lex", "short story literary fiction writers"], ["vec", "what defines literary short stories as distinct from other fiction genres"], ["vec", "what are the characteristics of literary short fiction and who are notable writers in the genre"]]} +{"query": "thailand", "output": [["hyde", "Thailand is a Southeast Asian country known for tropical beaches, ornate temples, and rich cuisine. Bangkok is the capital. Popular destinations include Chiang Mai, Phuket, and the islands of Koh Samui and Phi Phi. Thai food staples include pad thai, green curry, and tom yum soup."], ["lex", "Thailand country travel Southeast Asia"], ["lex", "Thailand Bangkok culture tourism"], ["vec", "what should I know about Thailand as a travel destination or country"], ["vec", "what are the key facts about Thailand's culture, geography, and tourist attractions"]]} +{"query": "how to do a flip on a trampoline", "output": [["hyde", "Start by mastering high, controlled bounces. Practice tucking your knees to your chest mid-air. For a backflip, bounce high, throw your arms back, tuck tightly, and spot your landing. Always practice on a trampoline with safety nets and a spotter. Progress from seat drops to back drops before attempting flips."], ["lex", "trampoline flip backflip technique"], ["lex", "trampoline flip tutorial safety"], ["vec", "how do I safely learn to do a backflip on a trampoline"], ["vec", "what is the proper technique for doing flips on a trampoline"]]} +{"query": "how to efficiently use time at work?", "output": [["hyde", "Use time-blocking to schedule focused work in 90-minute intervals. Prioritize with the Eisenhower Matrix: do urgent-important tasks first, schedule important-not-urgent ones, delegate urgent-not-important tasks, and eliminate the rest. Batch similar tasks, limit meetings, and turn off notifications during deep work."], ["lex", "time management work productivity"], ["lex", "efficient time work techniques scheduling"], ["vec", "how can I manage my time more efficiently at work to increase productivity"], ["vec", "what time management techniques help get more done during the workday"]]} +{"query": "what is venture capital funding", "output": [["hyde", "Venture capital is equity financing provided to high-growth startups in exchange for ownership stakes. Funding stages include pre-seed, seed ($500K-$2M), Series A ($2-15M), Series B ($15-50M), and later rounds. VCs evaluate the team, market size, traction, and scalability before investing."], ["lex", "venture capital funding investment startups"], ["lex", "VC funding rounds Series A seed"], ["vec", "what is venture capital and how does VC funding work for startups"], ["vec", "what are the different stages of venture capital funding from seed to Series C"]]} +{"query": "app build", "output": [["hyde", "For mobile apps, use `xcodebuild` (iOS) or `./gradlew assembleRelease` (Android). For web apps, run `npm run build` or `vite build` to bundle and optimize assets. Configure environment variables, set the build target, and use CI/CD pipelines (GitHub Actions, CircleCI) for automated builds."], ["lex", "app build compile deploy"], ["lex", "mobile app build process configuration"], ["vec", "how to build and compile a mobile or web application for deployment"], ["vec", "what are the steps in the app build process and common build tools"]]} +{"query": "how to build strong relationships?", "output": [["hyde", "Strong relationships are built on trust, open communication, and mutual respect. Practice active listening—give full attention without planning your response. Express appreciation regularly. Handle conflicts by addressing issues directly without blame. Invest quality time and show up consistently during both good and hard times."], ["lex", "build strong relationships communication trust"], ["lex", "healthy relationships skills connection"], ["vec", "how do you build and maintain strong personal relationships"], ["vec", "what habits and communication skills help strengthen relationships"]]} +{"query": "when to start prenatal classes?", "output": [["hyde", "Most experts recommend starting prenatal classes during the second trimester, around weeks 20-24, and completing them by week 36. Early classes cover nutrition, exercise, and fetal development. Later classes focus on labor stages, breathing techniques, pain management options, breastfeeding, and newborn care."], ["lex", "prenatal classes start when pregnancy"], ["lex", "childbirth education classes timing"], ["vec", "when during pregnancy should I start taking prenatal classes"], ["vec", "what is the recommended timing for beginning childbirth education classes"]]} +{"query": "how to choose kitchen cabinet hardware", "output": [["hyde", "Match hardware to your kitchen style: brushed nickel or stainless for modern kitchens, oil-rubbed bronze for traditional, brass for transitional. Use pulls (3-4 inches) on drawers and knobs on doors. Test ergonomics before buying in bulk. Standard mounting holes are 3 or 3.75 inches apart."], ["lex", "kitchen cabinet hardware handles knobs"], ["lex", "cabinet hardware style finish selection"], ["vec", "how do I choose the right handles and knobs for kitchen cabinets"], ["vec", "what styles and finishes of kitchen cabinet hardware work with different designs"]]} +{"query": "what is the significance of the torah?", "output": [["hyde", "The Torah comprises the five books of Moses (Genesis, Exodus, Leviticus, Numbers, Deuteronomy) and is the most sacred text in Judaism. It contains the 613 commandments (mitzvot), the creation narrative, and the covenant between God and the Israelites. It is read publicly in synagogue every week."], ["lex", "Torah significance Judaism sacred text"], ["lex", "Torah five books Moses Jewish law"], ["vec", "what is the Torah and why is it significant in Judaism"], ["vec", "what role does the Torah play in Jewish religious life and law"]]} +{"query": "test mock", "output": [["hyde", "Mocks replace real dependencies with controlled objects during testing. In Python, use `unittest.mock.patch()` to replace a function. In JavaScript, use `jest.fn()` or `jest.spyOn()`. Mocks verify that methods were called with expected arguments. Stubs return fixed values; spies track calls without replacing behavior."], ["lex", "test mock unit testing"], ["lex", "mock object stub spy testing"], ["vec", "how to use mocks and stubs in unit testing"], ["vec", "what are mock objects and how do they help isolate components in tests"]]} +{"query": "how does culture influence identity?", "output": [["hyde", "Culture shapes identity through language, traditions, values, and social norms internalized from childhood. Family, community, religion, and media all transmit cultural frameworks. Identity is constructed through negotiation between personal experiences and cultural expectations, creating a sense of belonging and self-understanding."], ["lex", "culture influence identity formation"], ["lex", "cultural identity socialization values"], ["vec", "how does culture shape a person's sense of identity"], ["vec", "in what ways do cultural values and traditions influence who we become"]]} +{"query": "how to be a good listener", "output": [["hyde", "Active listening means giving full attention: maintain eye contact, put away distractions, and don't interrupt. Reflect back what you heard (\"It sounds like you're saying...\"). Ask open-ended questions to show interest. Avoid jumping to advice—sometimes people just need to feel heard. Validate their emotions."], ["lex", "good listener active listening skills"], ["lex", "listening skills empathy communication"], ["vec", "how can I become a better and more active listener in conversations"], ["vec", "what techniques improve listening skills and show empathy"]]} +{"query": "how to improve public speaking skills", "output": [["hyde", "Join Toastmasters for regular practice in a supportive environment. Record yourself speaking and review for filler words and pacing. Structure talks with a clear opening hook, three key points, and a memorable close. Practice in front of friends. Manage nerves through deep breathing and visualization beforehand."], ["lex", "public speaking skills improve presentation"], ["lex", "public speaking confidence practice tips"], ["vec", "how can I improve my public speaking and overcome stage fright"], ["vec", "what techniques help deliver confident and engaging presentations"]]} +{"query": "log debug", "output": [["hyde", "Set the log level to DEBUG to capture detailed diagnostic output. In Python: `logging.basicConfig(level=logging.DEBUG)`. In Node.js with winston: `logger.level = 'debug'`. In Java with SLF4J: configure logback.xml with ``. Use debug logs for variable values, flow tracing, and conditional paths."], ["lex", "log debug logging level"], ["lex", "debug logging output configuration"], ["vec", "how to configure debug-level logging in an application"], ["vec", "how to use log debug statements for troubleshooting code"]]} +{"query": "what is the large hadron collider", "output": [["hyde", "The Large Hadron Collider (LHC) at CERN near Geneva is the world's largest and most powerful particle accelerator. It accelerates protons to near light speed in a 27-kilometer ring and collides them to study fundamental particles. In 2012, it confirmed the existence of the Higgs boson."], ["lex", "Large Hadron Collider LHC CERN"], ["lex", "LHC particle accelerator Higgs boson"], ["vec", "what is the Large Hadron Collider and what has it discovered"], ["vec", "how does the LHC at CERN work to study particle physics"]]} +{"query": "what is the significance of worship practices?", "output": [["hyde", "Worship practices—prayer, ritual, song, and meditation—serve to connect individuals with the divine, reinforce communal identity, and express gratitude and devotion. In Christianity, worship centers on liturgy and sacraments; in Islam, the five daily prayers (salat); in Hinduism, puja and temple ceremonies."], ["lex", "worship practices significance religion"], ["lex", "worship rituals prayer spiritual meaning"], ["vec", "what is the significance of worship practices across different religions"], ["vec", "why do religious communities engage in rituals, prayer, and worship"]]} +{"query": "what are fair trade products?", "output": [["hyde", "Fair trade products are goods certified to meet standards ensuring producers in developing countries receive fair prices, safe working conditions, and sustainable practices. Common fair trade products include coffee, chocolate, tea, bananas, and cotton. Look for the Fairtrade International or Fair Trade USA label."], ["lex", "fair trade products certification"], ["lex", "fair trade coffee chocolate ethical"], ["vec", "what are fair trade products and how does fair trade certification work"], ["vec", "what does the fair trade label mean for farmers and consumers"]]} +{"query": "what is the significance of community in ethics", "output": [["hyde", "Communitarian ethics argues that moral reasoning is rooted in community values and shared traditions, not just individual rights. Philosophers like Alasdair MacIntyre and Charles Taylor emphasize that virtues and moral identity are shaped by the communities in which we participate."], ["lex", "community ethics significance moral philosophy"], ["lex", "communitarian ethics social responsibility"], ["vec", "what role does community play in ethical theory and moral life"], ["vec", "how does communitarian philosophy view the relationship between community and ethics"]]} +{"query": "what are index funds", "output": [["hyde", "An index fund is a type of mutual fund or ETF that tracks a market index like the S&P 500. It holds all (or a representative sample of) the stocks in that index. Index funds offer broad diversification, low expense ratios (typically 0.03-0.20%), and historically outperform most actively managed funds."], ["lex", "index funds investing passive"], ["lex", "index fund S&P 500 ETF low cost"], ["vec", "what are index funds and why are they popular for investing"], ["vec", "how do index funds work and what are their advantages over actively managed funds"]]} +{"query": "what is hinduism", "output": [["hyde", "Hinduism is one of the world's oldest religions, originating in the Indian subcontinent. It encompasses diverse beliefs but key concepts include dharma (duty), karma (action and consequence), samsara (cycle of rebirth), and moksha (liberation). Sacred texts include the Vedas, Upanishads, and Bhagavad Gita."], ["lex", "Hinduism religion beliefs practices"], ["lex", "Hindu dharma gods Vedas karma reincarnation"], ["vec", "what is Hinduism and what are its main beliefs and practices"], ["vec", "what do Hindus believe about God, karma, and the cycle of rebirth"]]} +{"query": "what is sufism?", "output": [["hyde", "Sufism is the mystical dimension of Islam, emphasizing the inward search for God and the purification of the soul. Sufis practice dhikr (repetitive remembrance of God), meditation, and poetry to achieve closeness to the divine. Rumi and Al-Ghazali are among the most famous Sufi masters."], ["lex", "Sufism Islamic mysticism spiritual"], ["lex", "Sufi practices dhikr whirling dervishes"], ["vec", "what is Sufism and how does it relate to Islam"], ["vec", "what are the spiritual practices and beliefs of Sufi mystics"]]} +{"query": "how to outline a novel", "output": [["hyde", "Start with a one-sentence premise, then expand to a paragraph summary. Use the three-act structure: setup, confrontation, resolution. Create character profiles with goals and arcs. Write a chapter-by-chapter outline with scene goals. Methods include the Snowflake Method, Save the Cat beat sheet, or index cards on a corkboard."], ["lex", "outline novel plot structure"], ["lex", "novel outline writing planning chapters"], ["vec", "how do I create an outline for writing a novel"], ["vec", "what methods do authors use to plan and structure a novel before writing"]]} +{"query": "what is the role of the who in pandemics", "output": [["hyde", "The World Health Organization (WHO) coordinates international pandemic response by issuing health guidelines, declaring Public Health Emergencies of International Concern (PHEIC), distributing vaccines through COVAX, providing technical assistance to countries, and monitoring disease surveillance data from member states."], ["lex", "WHO World Health Organization pandemic role"], ["lex", "WHO pandemic response disease outbreak"], ["vec", "what role does the World Health Organization play during pandemics"], ["vec", "how does the WHO coordinate international responses to disease outbreaks"]]} +{"query": "how are glaciers formed", "output": [["hyde", "Glaciers form when annual snowfall exceeds snowmelt over many years. The accumulated snow compresses into firn (granular ice) and eventually into dense glacial ice. When the ice mass becomes thick enough, gravity causes it to flow slowly downhill. This process takes decades to centuries."], ["lex", "glacier formation process ice"], ["lex", "glaciers formed snow compaction accumulation"], ["vec", "how do glaciers form from accumulated snow and ice over time"], ["vec", "what is the process of glacier formation and movement"]]} +{"query": "how to ensure research reproducibility", "output": [["hyde", "Ensure reproducibility by pre-registering your study, sharing raw data and analysis code in public repositories (e.g., GitHub, Zenodo), documenting every methodological step, using version control, and providing computational environments (Docker containers). Report all results, including null findings."], ["lex", "research reproducibility replication methods"], ["lex", "reproducible research data sharing protocols"], ["vec", "how do researchers ensure their studies are reproducible by others"], ["vec", "what practices improve the reproducibility and replication of scientific research"]]} +{"query": "how do different religions view angels?", "output": [["hyde", "In Christianity, angels are messengers of God (e.g., Gabriel, Michael) who serve as protectors and intermediaries. Islam teaches that angels (mala'ika) are created from light and include Jibril (Gabriel) who delivered the Quran. Judaism describes angels as divine agents carrying out God's will in the Hebrew Bible."], ["lex", "angels religions Christianity Islam Judaism"], ["lex", "angels religious beliefs spiritual beings"], ["vec", "how do different religions like Christianity, Islam, and Judaism view angels"], ["vec", "what roles do angels play across major world religions"]]} +{"query": "how does the social contract theory explain governance", "output": [["hyde", "Social contract theory holds that governments derive legitimacy from the consent of the governed. Hobbes argued people surrender freedoms to a sovereign for security. Locke emphasized natural rights to life, liberty, and property, with government protecting them. Rousseau proposed the general will as the basis for collective governance."], ["lex", "social contract theory governance political philosophy"], ["lex", "social contract Hobbes Locke Rousseau"], ["vec", "how does social contract theory explain the legitimacy of government"], ["vec", "what did Hobbes, Locke, and Rousseau argue about the social contract and governance"]]} +{"query": "how to use trekking poles", "output": [["hyde", "Adjust pole length so your elbow is at 90° on flat ground. Shorten poles for uphill, lengthen for downhill. Plant the pole opposite your stepping foot. Use wrist straps for support—push down through the strap, not the grip. On steep descents, poles reduce knee impact by up to 25%."], ["lex", "trekking poles hiking technique"], ["lex", "trekking poles adjustment grip walking"], ["vec", "how do you properly use trekking poles while hiking"], ["vec", "what is the correct technique for adjusting and using trekking poles on trails"]]} +{"query": "how does blockchain technology work", "output": [["hyde", "A blockchain is a distributed ledger where transactions are grouped into blocks. Each block contains a cryptographic hash of the previous block, creating an immutable chain. Nodes validate transactions through consensus mechanisms like Proof of Work or Proof of Stake. No central authority controls the network."], ["lex", "blockchain technology distributed ledger"], ["lex", "blockchain cryptography decentralized consensus"], ["vec", "how does blockchain technology work at a technical level"], ["vec", "what are the key components of blockchain like blocks, hashing, and consensus mechanisms"]]} +{"query": "how to plant a wildflower meadow?", "output": [["hyde", "Clear existing vegetation by mowing low and raking away debris. Loosen the top inch of soil. Mix wildflower seeds with sand for even distribution and scatter in fall or early spring. Press seeds into soil but don't cover them—most need light to germinate. Water gently until established. Avoid fertilizer, which favors grasses."], ["lex", "wildflower meadow planting seeds"], ["lex", "plant wildflower meadow soil preparation native"], ["vec", "how do I plant and establish a wildflower meadow in my yard"], ["vec", "what steps are needed to create a wildflower meadow from seed"]]} +{"query": "how to engage in civil political discussions", "output": [["hyde", "Start by listening to understand, not to rebut. Ask questions like \"What experiences led you to that view?\" Avoid personal attacks and generalizations. Find common ground before addressing differences. Use \"I\" statements instead of \"you always\" accusations. Accept that changing minds takes time and repeated respectful engagement."], ["lex", "civil political discussion respectful debate"], ["lex", "political conversation etiquette disagreement"], ["vec", "how can I have respectful and productive political discussions with people who disagree"], ["vec", "what strategies help keep political conversations civil and constructive"]]} +{"query": "where to watch super bowl 2024", "output": [["hyde", "Super Bowl LVIII airs on CBS on February 11, 2024. You can stream it live on Paramount+ or through the CBS Sports app. Kickoff is at 6:30 PM ET from Allegiant Stadium in Las Vegas."], ["lex", "super bowl 2024 streaming channel"], ["lex", "super bowl LVIII broadcast network"], ["lex", "watch super bowl 2024 live"], ["vec", "what channel or streaming service is broadcasting Super Bowl 2024"], ["vec", "where can I watch the 2024 Super Bowl LVIII game live online"]]} +{"query": "what is the mind-body problem", "output": [["hyde", "The mind-body problem asks how mental states like thoughts, feelings, and consciousness relate to physical states of the brain. Descartes proposed substance dualism, arguing mind and body are fundamentally different substances."], ["lex", "mind-body problem philosophy"], ["lex", "dualism consciousness physicalism"], ["lex", "mental states physical brain"], ["vec", "what is the philosophical mind-body problem and why is it difficult to solve"], ["vec", "how do philosophers explain the relationship between consciousness and the physical brain"]]} +{"query": "how to report scientific findings", "output": [["hyde", "When reporting scientific findings, organize your paper into Introduction, Methods, Results, and Discussion (IMRaD). Present results with tables and figures, include statistical analyses, and state findings objectively before interpreting them."], ["lex", "scientific findings report writing"], ["lex", "research results publication format"], ["lex", "academic paper methodology results"], ["vec", "how should scientists structure and report their research findings in a paper"], ["vec", "what is the standard format for reporting results in a scientific publication"]]} +{"query": "code test", "output": [["hyde", "Unit tests verify individual functions in isolation. Use a testing framework like Jest, pytest, or JUnit to write assertions that check expected outputs against actual results. Run tests with `npm test` or `pytest`."], ["lex", "software unit testing framework"], ["lex", "code testing automated tests"], ["lex", "test-driven development TDD"], ["vec", "how to write and run automated tests for software code"], ["vec", "what are the common approaches to testing code including unit tests and integration tests"]]} +{"query": "what is human rights", "output": [["hyde", "Human rights are inherent rights belonging to every person regardless of nationality, sex, ethnicity, or religion. The Universal Declaration of Human Rights (1948) established 30 articles covering civil, political, economic, social, and cultural rights."], ["lex", "human rights definition universal declaration"], ["lex", "fundamental human rights UDHR"], ["lex", "civil political economic social rights"], ["vec", "what are human rights and what does the Universal Declaration of Human Rights guarantee"], ["vec", "what fundamental freedoms and protections are considered universal human rights"]]} +{"query": "what is the function of dna", "output": [["hyde", "DNA stores the genetic instructions needed for the development and functioning of all living organisms. It encodes genes as sequences of nucleotide bases (A, T, G, C) that are transcribed into RNA and translated into proteins."], ["lex", "DNA function genetic information"], ["lex", "deoxyribonucleic acid protein synthesis"], ["lex", "DNA replication transcription translation"], ["vec", "what role does DNA play in storing and transmitting genetic information in cells"], ["vec", "how does DNA encode instructions for building proteins in living organisms"]]} +{"query": "how to advocate for a cause", "output": [["hyde", "Start by clearly defining your cause and goals. Build a coalition of supporters, create a compelling message, and use multiple channels: social media, petitions, letters to legislators, public events, and media outreach to amplify your message."], ["lex", "cause advocacy strategies campaigning"], ["lex", "grassroots advocacy organizing"], ["lex", "political advocacy lobbying petition"], ["vec", "what are effective ways to advocate and campaign for a social or political cause"], ["vec", "how can individuals organize and mobilize support for a cause they care about"]]} +{"query": "how to grow blueberries at home?", "output": [["hyde", "Blueberries thrive in acidic soil with a pH of 4.5-5.5. Plant in full sun with well-drained soil amended with peat moss. Space bushes 4-6 feet apart and mulch with pine needles. Water regularly and prune dead wood in late winter."], ["lex", "grow blueberries home garden"], ["lex", "blueberry bush planting acidic soil"], ["lex", "container blueberry growing care"], ["vec", "how do I plant and care for blueberry bushes in my home garden"], ["vec", "what soil pH and conditions do blueberries need to grow well at home"]]} +{"query": "what causes market volatility", "output": [["hyde", "Market volatility is driven by economic data releases, interest rate changes, geopolitical events, earnings surprises, and investor sentiment. High uncertainty about inflation, central bank policy, or political instability increases price fluctuations across asset classes."], ["lex", "stock market volatility causes"], ["lex", "financial market fluctuations economic factors"], ["lex", "market volatility interest rates inflation"], ["vec", "what economic and geopolitical factors cause stock market volatility"], ["vec", "why do financial markets experience sudden price swings and instability"]]} +{"query": "what is the importance of spiritual leadership?", "output": [["hyde", "Spiritual leadership theory proposes that leaders who foster a sense of calling, meaning, and membership create more engaged and productive organizations. It emphasizes vision, altruistic love, and hope as core values that transcend traditional management."], ["lex", "spiritual leadership organizations values"], ["lex", "spiritual leadership workplace meaning purpose"], ["vec", "how does spiritual leadership influence organizations and their members"], ["vec", "what role does spiritual leadership play in providing meaning and purpose at work"]]} +{"query": "what is the paris agreement", "output": [["hyde", "The Paris Agreement is a legally binding international treaty on climate change adopted in 2015. Its goal is to limit global warming to well below 2°C, preferably 1.5°C, above pre-industrial levels. Countries submit nationally determined contributions (NDCs) outlining emission reduction targets."], ["lex", "Paris Agreement climate change 2015"], ["lex", "Paris climate accord greenhouse gas emissions"], ["lex", "Paris Agreement temperature goals"], ["vec", "what is the Paris Agreement and what are its goals for addressing climate change"], ["vec", "what commitments did countries make under the 2015 Paris climate accord"]]} +{"query": "how to enhance customer engagement", "output": [["hyde", "Personalize communications using customer data and segmentation. Implement loyalty programs, respond promptly on social media, send targeted email campaigns, and gather feedback through surveys. Omnichannel engagement ensures consistent experience across touchpoints."], ["lex", "customer engagement strategies retention"], ["lex", "increase customer interaction loyalty"], ["lex", "customer engagement marketing personalization"], ["vec", "what strategies can businesses use to improve customer engagement and loyalty"], ["vec", "how can companies create more meaningful interactions with their customers"]]} +{"query": "how to encourage children to read?", "output": [["hyde", "Read aloud to children daily from an early age. Let them choose their own books based on interests. Create a cozy reading nook, visit the library regularly, and set a family reading time. Avoid using reading as punishment; make it enjoyable."], ["lex", "encourage children reading habits"], ["lex", "kids reading motivation tips"], ["lex", "children literacy books engagement"], ["vec", "what strategies help encourage children to develop a love of reading"], ["vec", "how can parents motivate reluctant children to read more books"]]} +{"query": "what is base jumping?", "output": [["hyde", "BASE jumping involves parachuting from fixed objects: Buildings, Antennas, Spans (bridges), and Earth (cliffs). Unlike skydiving from aircraft, BASE jumps occur at much lower altitudes, giving jumpers only seconds to deploy their parachute."], ["lex", "base jumping extreme sport parachute"], ["lex", "BASE jump fixed object skydiving"], ["lex", "base jumping wingsuit cliff"], ["vec", "what is BASE jumping and how does it differ from skydiving"], ["vec", "what does BASE stand for and what are the risks of base jumping"]]} +{"query": "how to clean car engine bay?", "output": [["hyde", "Cover sensitive electrical components with plastic bags. Apply engine degreaser to the entire bay, let it sit 5-10 minutes, then agitate with a brush. Rinse with low-pressure water, avoiding direct spray on the alternator, fuse box, and air intake."], ["lex", "clean car engine bay degreaser"], ["lex", "engine bay detailing wash"], ["lex", "engine compartment cleaning steps"], ["vec", "what is the safest way to clean and degrease a car engine bay"], ["vec", "step by step process to clean under the hood of a car"]]} +{"query": "how to manage sibling rivalry?", "output": [["hyde", "Avoid comparing siblings to each other. Give each child individual attention and acknowledge their unique strengths. Teach conflict resolution skills rather than always intervening. Set clear family rules about respectful behavior and let children solve minor disputes themselves."], ["lex", "sibling rivalry management parenting"], ["lex", "brothers sisters fighting conflict"], ["lex", "sibling jealousy fairness strategies"], ["vec", "how can parents effectively manage fighting and rivalry between siblings"], ["vec", "what are proven strategies to reduce sibling conflict and jealousy"]]} +{"query": "how to build a raised garden bed?", "output": [["hyde", "Cut four boards of untreated cedar or redwood to size: two at 4 feet and two at 8 feet for a standard 4x8 bed. Screw corners together with deck screws. Place on level ground, line the bottom with cardboard, and fill with a mix of topsoil, compost, and peat moss."], ["lex", "build raised garden bed DIY"], ["lex", "raised bed construction lumber soil"], ["lex", "raised garden bed plans dimensions"], ["vec", "how do I build a raised garden bed from wood step by step"], ["vec", "what materials and dimensions work best for a DIY raised garden bed"]]} +{"query": "what is the g7", "output": [["hyde", "The G7 (Group of Seven) is an intergovernmental forum of seven major advanced economies: Canada, France, Germany, Italy, Japan, the United Kingdom, and the United States. The EU also participates. Members meet annually to discuss global economic policy, security, and trade."], ["lex", "G7 group of seven nations"], ["lex", "G7 summit member countries"], ["lex", "G7 economic political alliance"], ["vec", "what is the G7 and which countries are members of this international group"], ["vec", "what role does the Group of Seven play in global economic and political governance"]]} +{"query": "what is the role of choice in ethics?", "output": [["hyde", "Choice is central to ethics because moral responsibility presupposes the ability to choose freely. Aristotle argued that virtuous action requires deliberate choice (prohairesis). Without genuine alternatives, praise and blame lose their foundation."], ["lex", "choice ethics moral philosophy"], ["lex", "free will moral responsibility"], ["lex", "ethical decision-making autonomy"], ["vec", "what role does personal choice play in moral philosophy and ethical responsibility"], ["vec", "how do ethicists view free will and autonomous choice in determining moral accountability"]]} +{"query": "home fix", "output": [["hyde", "Common DIY home repairs include fixing leaky faucets, patching drywall holes, unclogging drains, replacing light switches, re-caulking bathrooms, and fixing squeaky doors. Most require only basic tools: screwdriver, pliers, wrench, and putty knife."], ["lex", "home repair DIY fix"], ["lex", "house maintenance common repairs"], ["lex", "home improvement handyman tasks"], ["vec", "how to do common home repairs and fixes yourself"], ["vec", "what are typical household problems and how to fix them without a professional"]]} +{"query": "what should i wear hiking?", "output": [["hyde", "Dress in moisture-wicking layers: a synthetic or merino wool base layer, an insulating mid layer like fleece, and a waterproof shell. Wear sturdy hiking boots or trail shoes with wool socks. Avoid cotton, which retains moisture and causes chafing."], ["lex", "hiking clothing layers gear"], ["lex", "hiking outfit shoes weather"], ["lex", "what to wear hiking trail"], ["vec", "what is the best clothing to wear for a day hike in different weather conditions"], ["vec", "how should I layer my clothes for hiking to stay comfortable"]]} +{"query": "what are the main tenets of jainism?", "output": [["hyde", "Jainism centers on three jewels: right faith, right knowledge, and right conduct. Its five vows are ahimsa (non-violence), satya (truth), asteya (non-stealing), brahmacharya (chastity), and aparigraha (non-attachment). Jains believe in karma and the soul's liberation through self-discipline."], ["lex", "Jainism main tenets principles"], ["lex", "Jain beliefs ahimsa non-violence"], ["lex", "Jainism five vows anekantavada"], ["vec", "what are the core beliefs and principles of the Jain religion"], ["vec", "what are the five main vows and philosophical tenets of Jainism"]]} +{"query": "what is universal healthcare", "output": [["hyde", "Universal healthcare ensures all residents have access to medical services without financial hardship. Models vary: single-payer systems (Canada), national health services (UK's NHS), and mandatory insurance systems (Germany). Funding comes through taxes or mandatory premiums."], ["lex", "universal healthcare single payer system"], ["lex", "universal health coverage public insurance"], ["lex", "universal healthcare countries policy"], ["vec", "what is universal healthcare and how do different countries implement it"], ["vec", "how does a universal healthcare system provide coverage to all citizens"]]} +{"query": "where to buy rare plant seeds?", "output": [["hyde", "Specialty seed suppliers for rare plants include Baker Creek Heirloom Seeds, Chiltern Seeds, Plant World Seeds, and Rare Seeds. Online marketplaces like Etsy also have independent growers selling unusual varieties. Check import regulations for international orders."], ["lex", "buy rare plant seeds online"], ["lex", "rare exotic seed suppliers shop"], ["lex", "unusual heirloom seeds catalog"], ["vec", "where can I purchase rare and exotic plant seeds online"], ["vec", "what are reputable suppliers for hard-to-find and unusual plant seeds"]]} +{"query": "how to kayak for the first time", "output": [["hyde", "For your first kayak outing, choose calm, flat water like a lake or slow river. Adjust the foot pegs so your knees are slightly bent. Hold the paddle with hands shoulder-width apart, knuckles aligned with the blade edge. Use torso rotation, not just arms, for each stroke."], ["lex", "beginner kayaking first time tips"], ["lex", "kayak basics paddling technique"], ["lex", "learn kayaking beginner guide"], ["vec", "what should a beginner know before going kayaking for the first time"], ["vec", "how do I paddle and balance a kayak as a first-time kayaker"]]} +{"query": "what are the major teachings in rumi's poetry?", "output": [["hyde", "Rumi's poetry centers on divine love as the path to spiritual union with God. His Masnavi explores themes of longing, surrender, and the dissolution of the ego. He uses metaphors of wine, the beloved, and the reed flute to express the soul's yearning for its source."], ["lex", "Rumi poetry teachings themes"], ["lex", "Rumi Sufi mysticism divine love"], ["lex", "Rumi Masnavi spiritual wisdom"], ["vec", "what are the central spiritual and philosophical themes in Rumi's poems"], ["vec", "what does Rumi teach about love, the soul, and union with the divine"]]} +{"query": "what is the purpose of a pilgrimage", "output": [["hyde", "A pilgrimage is a sacred journey to a holy site undertaken for spiritual renewal, penance, or devotion. In Islam, Hajj to Mecca is obligatory. Christians walk the Camino de Santiago. Hindus visit Varanasi. The journey itself is seen as transformative, not just the destination."], ["lex", "pilgrimage purpose religious spiritual"], ["lex", "pilgrimage meaning journey sacred site"], ["vec", "what is the spiritual purpose of making a pilgrimage to a sacred site"], ["vec", "why do people of different religions undertake pilgrimages"]]} +{"query": "craigslist ads", "output": [["hyde", "To post a Craigslist ad, go to craigslist.org, select your city, and click \"create a posting.\" Choose a category (for sale, housing, jobs, services), write a clear title and description, add photos, and set your price. Most postings are free for individuals."], ["lex", "Craigslist ads posting classified"], ["lex", "Craigslist listings buy sell"], ["lex", "Craigslist marketplace local ads"], ["vec", "how to post and browse classified ads on Craigslist"], ["vec", "how does Craigslist work for buying, selling, and listing items locally"]]} +{"query": "what is a primary election", "output": [["hyde", "A primary election is a vote held by a political party to choose its candidates for the general election. In a closed primary, only registered party members can vote. In an open primary, any registered voter may participate regardless of party affiliation."], ["lex", "primary election definition process"], ["lex", "primary election presidential nomination"], ["lex", "open closed primary voting"], ["vec", "what is a primary election and how does it determine party nominees"], ["vec", "how do primary elections work in the United States political system"]]} +{"query": "what was the role of the catholic church in the middle ages?", "output": [["hyde", "The Catholic Church was the dominant institution in medieval Europe. It controlled vast lands, collected tithes, and wielded political power through the papacy. The Church ran schools and universities, preserved classical texts in monasteries, and regulated moral life through canon law and sacraments."], ["lex", "Catholic Church Middle Ages role"], ["lex", "medieval church political power papacy"], ["lex", "Catholic Church feudalism education medieval"], ["vec", "what political, social, and cultural role did the Catholic Church play during the Middle Ages"], ["vec", "how did the Catholic Church influence governance, education, and daily life in medieval Europe"]]} +{"query": "what to pack in a hospital bag for labor?", "output": [["hyde", "Hospital bag essentials for labor: ID and insurance card, birth plan, comfortable robe or gown, slippers, toiletries, phone charger, going-home outfit for you and baby, car seat, nursing bra, newborn diapers, snacks, and a pillow from home."], ["lex", "hospital bag labor delivery packing list"], ["lex", "what to bring hospital birth bag"], ["lex", "labor bag essentials mother baby"], ["vec", "what items should I pack in my hospital bag before going into labor"], ["vec", "what is a complete packing checklist for the hospital for giving birth"]]} +{"query": "how international trade agreements affect local economies", "output": [["hyde", "Trade agreements lower tariffs and open markets, which can reduce consumer prices and expand exports. However, local industries that cannot compete with cheaper imports may shrink, leading to job losses in manufacturing regions. The net effect depends on the economy's structure and adjustment policies."], ["lex", "international trade agreements local economy impact"], ["lex", "trade deal tariff local jobs wages"], ["lex", "free trade agreement economic effects"], ["vec", "how do international trade agreements impact jobs and economies at the local level"], ["vec", "what are the positive and negative effects of free trade agreements on local industries"]]} +{"query": "what is the ring of fire", "output": [["hyde", "The Ring of Fire is a 40,000 km horseshoe-shaped zone around the Pacific Ocean where about 75% of the world's volcanoes and 90% of earthquakes occur. It follows boundaries of tectonic plates including the Pacific, Nazca, and Philippine Sea plates."], ["lex", "Ring of Fire Pacific Ocean volcanoes"], ["lex", "Pacific Ring of Fire earthquakes tectonic"], ["lex", "ring of fire map plate boundaries"], ["vec", "what is the Pacific Ring of Fire and why does it have so many earthquakes and volcanoes"], ["vec", "which tectonic plates form the Ring of Fire around the Pacific Ocean"]]} +{"query": "how does relativism differ from absolutism", "output": [["hyde", "Moral absolutism holds that certain actions are universally right or wrong regardless of context or culture. Moral relativism argues that moral judgments are not universal but depend on cultural, social, or personal frameworks. Absolutists point to human rights; relativists emphasize cultural diversity."], ["lex", "moral relativism absolutism difference"], ["lex", "ethical relativism vs moral absolutism"], ["lex", "relativism absolutism philosophy comparison"], ["vec", "what is the philosophical difference between moral relativism and moral absolutism"], ["vec", "how do relativists and absolutists disagree about the nature of moral truth"]]} +{"query": "how to harvest rainwater for gardening?", "output": [["hyde", "Install a rain barrel or cistern under a downspout to collect roof runoff. Use a first-flush diverter to discard initial dirty water. A screen keeps debris and mosquitoes out. Connect a spigot or hose at the bottom for gravity-fed garden irrigation. A 1,000 sq ft roof yields ~600 gallons per inch of rain."], ["lex", "rainwater harvesting garden setup"], ["lex", "rain barrel collection irrigation"], ["lex", "harvest rainwater system DIY"], ["vec", "how can I set up a rainwater collection system to water my garden"], ["vec", "what equipment do I need to harvest rainwater for garden irrigation"]]} +{"query": "what is the significance of the sacred tree in various faiths?", "output": [["hyde", "Sacred trees appear across religions: the Bodhi tree where Buddha attained enlightenment, the Tree of Life in Genesis, Yggdrasil in Norse mythology connecting the nine worlds, and the banyan in Hinduism symbolizing eternal life. Trees represent growth, connection between earth and heaven, and renewal."], ["lex", "sacred tree symbolism religion"], ["lex", "tree of life world tree spiritual traditions"], ["lex", "sacred trees Buddhism Hinduism Christianity Norse"], ["vec", "what role do sacred trees play in the religious symbolism of different faiths"], ["vec", "how are trees like the Bodhi tree and Yggdrasil significant in world religions"]]} +{"query": "code dep", "output": [["hyde", "Dependency management tools track and install external libraries your code relies on. Package managers like npm (JavaScript), pip (Python), and cargo (Rust) resolve version conflicts, maintain lock files, and ensure reproducible builds across environments."], ["lex", "code dependency management"], ["lex", "software dependency package manager"], ["lex", "dependency resolution version conflicts"], ["vec", "how to manage code dependencies and packages in a software project"], ["vec", "what tools help resolve and manage dependencies in programming"]]} +{"query": "what is the concept of rebirth in buddhism?", "output": [["hyde", "In Buddhism, rebirth is not the transmigration of a fixed soul but the continuation of a stream of consciousness shaped by karma. Beings cycle through samsara—the realms of existence—until achieving nirvana. Unlike Hindu reincarnation, Buddhism denies a permanent self (anatta) that transfers between lives."], ["lex", "rebirth Buddhism reincarnation concept"], ["lex", "Buddhist rebirth samsara karma cycle"], ["lex", "rebirth reincarnation Buddhism difference"], ["vec", "how does Buddhism explain the concept of rebirth and the cycle of samsara"], ["vec", "what is the difference between rebirth in Buddhism and reincarnation in Hinduism"]]} +{"query": "cultural iconography", "output": [["hyde", "Cultural iconography studies the identification and interpretation of visual symbols in art and media. Icons like the Christian cross, Buddhist lotus, or American bald eagle carry layered meanings shaped by history, religion, and politics. Erwin Panofsky formalized iconographic analysis in three levels."], ["lex", "cultural iconography symbols art"], ["lex", "iconographic symbols meaning culture"], ["lex", "visual symbolism iconography history"], ["vec", "what is cultural iconography and how are visual symbols used to convey meaning across cultures"], ["vec", "how do art historians study and interpret iconographic symbols in different cultural traditions"]]} +{"query": "current trends in ai research", "output": [["hyde", "Key AI research trends in 2025-2026 include scaling reasoning models, multimodal foundation models combining text, image, and video, AI agents that use tools autonomously, efficient fine-tuning methods like LoRA, and alignment research on safety and interpretability."], ["lex", "AI research trends 2025 2026"], ["lex", "artificial intelligence latest developments"], ["lex", "machine learning LLM multimodal research"], ["vec", "what are the most important current trends and breakthroughs in AI research in 2025-2026"], ["vec", "what directions is artificial intelligence research heading in areas like large language models and multimodal AI"]]} +{"query": "how artificial intelligence is used in healthcare", "output": [["hyde", "AI in healthcare is used for medical image analysis (detecting tumors in radiology scans), drug discovery (predicting molecular interactions), clinical decision support, electronic health record analysis, robotic surgery assistance, and predicting patient outcomes in intensive care."], ["lex", "AI healthcare applications medical"], ["lex", "artificial intelligence diagnosis treatment"], ["lex", "machine learning medical imaging drug discovery"], ["vec", "how is artificial intelligence being applied in healthcare for diagnosis and treatment"], ["vec", "what are the main uses of AI and machine learning in the medical field"]]} +{"query": "what is gothic literature?", "output": [["hyde", "Gothic literature is a genre that combines horror, romance, and mystery, originating with Horace Walpole's The Castle of Otranto (1764). Characteristics include gloomy settings (castles, ruins), supernatural elements, heightened emotion, and themes of decay, madness, and the sublime."], ["lex", "gothic literature definition genre"], ["lex", "gothic fiction horror romance 18th century"], ["lex", "gothic novel characteristics examples"], ["vec", "what defines gothic literature as a genre and what are its key characteristics"], ["vec", "what are the origins and major works of gothic fiction"]]} +{"query": "how to foster inclusivity in interactions?", "output": [["hyde", "Use people's correct names and pronouns. Practice active listening without interrupting. Avoid assumptions based on appearance. Invite quieter voices into conversations. Be aware of cultural differences in communication styles. Acknowledge and address microaggressions when they occur."], ["lex", "foster inclusivity interactions communication"], ["lex", "inclusive language behavior workplace"], ["lex", "diversity inclusion interpersonal skills"], ["vec", "how can I be more inclusive in my daily interactions with diverse people"], ["vec", "what communication strategies foster inclusivity and make everyone feel welcome"]]} +{"query": "how to prune hydrangeas?", "output": [["hyde", "Pruning depends on the hydrangea type. Bigleaf (H. macrophylla) and oakleaf hydrangeas bloom on old wood—prune just after flowering in summer. Panicle (H. paniculata) and smooth (H. arborescens) bloom on new wood—prune in late winter. Remove dead stems to the base and cut back to a pair of healthy buds."], ["lex", "prune hydrangeas when how"], ["lex", "hydrangea pruning guide timing"], ["lex", "cut back hydrangea old new wood"], ["vec", "when and how should I prune different types of hydrangeas"], ["vec", "what is the correct pruning technique for hydrangeas that bloom on old versus new wood"]]} +{"query": "how do philosophers address moral ambiguity", "output": [["hyde", "Philosophers address moral ambiguity through competing frameworks. Utilitarians weigh outcomes, deontologists look to duties and rules, and virtue ethicists ask what a person of good character would do. Moral particularists argue each situation is unique and cannot be reduced to universal principles."], ["lex", "moral ambiguity philosophy ethics"], ["lex", "ethical dilemma moral uncertainty philosophers"], ["lex", "moral gray area philosophical perspectives"], ["vec", "how do different philosophical traditions deal with situations of moral ambiguity"], ["vec", "what do philosophers say about making ethical decisions when right and wrong are unclear"]]} +{"query": "what is a bildungsroman", "output": [["hyde", "A bildungsroman is a novel that follows the psychological and moral growth of a protagonist from youth to adulthood. The genre originated in German literature with Goethe's Wilhelm Meister's Apprenticeship. Classic examples include Jane Eyre, David Copperfield, and The Catcher in the Rye."], ["lex", "bildungsroman definition coming-of-age novel"], ["lex", "bildungsroman literary genre examples"], ["lex", "bildungsroman character development growth"], ["vec", "what is a bildungsroman and what are the defining features of this literary genre"], ["vec", "what are famous examples of bildungsroman or coming-of-age novels in literature"]]} +{"query": "thai cooking classes online", "output": [["hyde", "Online Thai cooking classes teach dishes like pad thai, green curry, tom yum soup, and mango sticky rice. Platforms include Udemy, Skillshare, and dedicated sites like Hot Thai Kitchen. Live Zoom classes with Thai chefs offer real-time guidance on techniques and ingredient sourcing."], ["lex", "Thai cooking class online course"], ["lex", "learn Thai cuisine virtual cooking"], ["lex", "Thai food cooking lesson video"], ["vec", "where can I take online Thai cooking classes to learn authentic Thai cuisine"], ["vec", "what are the best virtual courses for learning to cook Thai food at home"]]} +{"query": "how automation affects employment", "output": [["hyde", "Automation displaces routine manual and cognitive tasks but creates new roles in technology maintenance, programming, and oversight. Studies estimate 14% of jobs are highly automatable. Workers in manufacturing, data entry, and transportation face the highest displacement risk, while creative and interpersonal roles are less affected."], ["lex", "automation employment impact jobs"], ["lex", "automation job displacement workforce"], ["lex", "robots AI replacing workers labor market"], ["vec", "how does increasing automation and robotics affect employment and job availability"], ["vec", "what impact does workplace automation have on different types of jobs and wages"]]} +{"query": "what is a moral compass", "output": [["hyde", "A moral compass is a person's internal sense of right and wrong that guides their decisions and behavior. It is shaped by upbringing, culture, religious beliefs, education, and personal experience. It acts as an ethical guide when facing difficult choices without clear external rules."], ["lex", "moral compass definition ethics"], ["lex", "moral compass inner sense right wrong"], ["lex", "personal values moral guidance"], ["vec", "what does it mean to have a moral compass and how does it guide ethical behavior"], ["vec", "how do people develop an internal sense of right and wrong known as a moral compass"]]} +{"query": "how to set financial goals", "output": [["hyde", "Set SMART financial goals: Specific (save $10,000), Measurable (track monthly), Achievable (based on income), Relevant (emergency fund), Time-bound (within 12 months). Categorize into short-term (under 1 year), medium-term (1-5 years), and long-term (5+ years) goals. Automate savings to stay on track."], ["lex", "set financial goals planning budget"], ["lex", "financial goal setting SMART savings"], ["lex", "personal finance goals short long term"], ["vec", "how do I set effective short-term and long-term financial goals"], ["vec", "what is a step-by-step process for creating and achieving personal financial goals"]]} +{"query": "how to improve car gas mileage?", "output": [["hyde", "Keep tires inflated to the recommended PSI—underinflation increases rolling resistance. Drive at steady speeds using cruise control, avoid rapid acceleration, and reduce idling. Remove excess weight and roof racks. Replace air filters and spark plugs on schedule. Properly inflated tires alone can improve MPG by 3%."], ["lex", "improve car gas mileage fuel economy"], ["lex", "better fuel efficiency driving tips"], ["lex", "increase MPG car maintenance"], ["vec", "what are the best ways to improve a car's gas mileage and fuel efficiency"], ["vec", "what driving habits and car maintenance steps help reduce fuel consumption"]]} +{"query": "how to embrace change positively?", "output": [["hyde", "Reframe change as an opportunity for growth rather than a threat. Practice mindfulness to stay present instead of worrying about the unknown. Set small, manageable goals during transitions. Build a support network and reflect on past changes you navigated successfully to build confidence."], ["lex", "embrace change positive mindset"], ["lex", "adapting change personal growth resilience"], ["lex", "coping with change acceptance"], ["vec", "how can I learn to embrace change in life with a positive attitude"], ["vec", "what psychological strategies help people adapt to change instead of resisting it"]]} +{"query": "how to develop patience?", "output": [["hyde", "Practice the pause: when you feel impatient, take three deep breaths before responding. Mindfulness meditation trains present-moment awareness and reduces reactivity. Reframe waiting as an opportunity. Set realistic expectations and practice delaying gratification with small exercises."], ["lex", "develop patience self-control techniques"], ["lex", "building patience mindfulness practice"], ["lex", "patience skills emotional regulation"], ["vec", "what techniques can help a person develop more patience in daily life"], ["vec", "how do you train yourself to be more patient and less reactive"]]} +{"query": "how to design surveys for scientific research", "output": [["hyde", "Design surveys by first defining clear research questions. Use validated scales where available. Write neutral, unambiguous items avoiding leading questions. Include a mix of Likert-scale and open-ended questions. Pilot test with a small sample, assess reliability (Cronbach's alpha), and use random sampling for generalizability."], ["lex", "design survey scientific research methodology"], ["lex", "research questionnaire design validity"], ["lex", "survey instrument Likert scale sampling"], ["vec", "how should researchers design valid and reliable surveys for scientific studies"], ["vec", "what are the principles of good questionnaire design in scientific research"]]} +{"query": "how to get rid of garden pests naturally?", "output": [["hyde", "Introduce beneficial insects like ladybugs and lacewings to eat aphids. Plant marigolds and basil as companion plants to repel pests. Spray diluted neem oil or insecticidal soap on affected leaves. Use diatomaceous earth around plant bases. Hand-pick slugs and caterpillars in the evening."], ["lex", "natural garden pest control organic"], ["lex", "garden pests organic remedies"], ["lex", "beneficial insects companion planting pest"], ["vec", "what are natural and organic methods to get rid of garden pests without chemicals"], ["vec", "how can I control insects and pests in my garden using companion planting and beneficial insects"]]} +{"query": "how to build a green roof", "output": [["hyde", "A green roof consists of layers: waterproof membrane, root barrier, drainage layer (gravel or drainage mat), filter fabric, lightweight growing substrate (4-6 inches for extensive, 6-24 for intensive), and drought-tolerant plants like sedums. The roof must support 15-30 lbs/sqft when saturated."], ["lex", "green roof construction installation"], ["lex", "build living roof layers materials"], ["lex", "green roof waterproof membrane substrate plants"], ["vec", "how do you build a green roof on a residential or commercial building"], ["vec", "what are the structural layers and materials needed for a green roof installation"]]} +{"query": "what are the sacred texts of judaism", "output": [["hyde", "The primary sacred text of Judaism is the Torah (Five Books of Moses), part of the Tanakh (Hebrew Bible), which also includes Nevi'im (Prophets) and Ketuvim (Writings). The Talmud, comprising the Mishnah and Gemara, contains rabbinic commentary and Jewish law (halakha)."], ["lex", "sacred texts Judaism Torah Talmud"], ["lex", "Jewish scripture Hebrew Bible Tanakh"], ["lex", "Judaism holy books Mishnah"], ["vec", "what are the main sacred texts and scriptures in the Jewish religious tradition"], ["vec", "what is the Torah and what other texts are considered holy in Judaism"]]} +{"query": "how technology has impacted communication", "output": [["hyde", "Technology has transformed communication from letters and landlines to instant messaging, video calls, and social media. Email replaced postal mail for business. Smartphones made communication continuous. Social media platforms enabled global, public conversations but also raised concerns about misinformation and reduced face-to-face interaction."], ["lex", "technology impact communication changes"], ["lex", "digital communication evolution internet social media"], ["lex", "technology transformed how people communicate"], ["vec", "how has technology changed the way people communicate over the last few decades"], ["vec", "what are the major effects of digital technology and the internet on human communication"]]} +{"query": "what are the voting rights", "output": [["hyde", "Voting rights in the US expanded through constitutional amendments: the 15th (race, 1870), 19th (women, 1920), and 26th (age 18, 1971). The Voting Rights Act of 1965 prohibited racial discrimination in voting, including literacy tests and poll taxes, and required federal oversight of elections in certain jurisdictions."], ["lex", "voting rights law history"], ["lex", "Voting Rights Act suffrage amendments"], ["lex", "voter rights eligibility protection"], ["vec", "what are voting rights in the United States and how have they evolved over time"], ["vec", "what laws protect citizens' right to vote and prevent voter discrimination"]]} +{"query": "wedding photography package", "output": [["hyde", "Our wedding photography packages start at $2,500 for 6 hours of coverage with one photographer, 300+ edited digital images, and an online gallery. Premium packages include a second shooter, engagement session, 10x10 album, and 8-10 hours of coverage for $4,500."], ["lex", "wedding overview photography package pricing"], ["lex", "wedding photographer booking services"], ["lex", "wedding photo package hours albums"], ["vec", "what is typically included in a wedding photography package and how much does it cost"], ["vec", "how to choose the right wedding photographer and package for your budget"]]} +{"query": "how to address political division in communities", "output": [["hyde", "Host structured community dialogues where participants follow ground rules: listen without interrupting, speak from personal experience, and seek understanding over agreement. Focus on shared local issues—schools, infrastructure, safety—rather than national partisan topics. Train facilitators in conflict mediation techniques."], ["lex", "political division community healing"], ["lex", "political polarization bridging divides dialogue"], ["lex", "community political disagreement civil discourse"], ["vec", "how can communities address political divisions and find common ground"], ["vec", "what strategies help reduce political polarization and promote civil dialogue at the local level"]]} +{"query": "how to clean car headlights?", "output": [["hyde", "Sand the headlight lens with wet sandpaper, starting at 800 grit and progressing to 2000 and 3000 grit. Polish with a rubbing compound or plastic polish. Apply a UV-resistant clear coat to prevent future yellowing. Toothpaste works as a mild abrasive for light haze."], ["lex", "clean car headlights restore foggy"], ["lex", "headlight restoration oxidation yellowing"], ["lex", "headlight lens cleaning toothpaste sanding"], ["vec", "how do I clean and restore foggy or yellowed car headlights"], ["vec", "what is the best method for removing oxidation from plastic headlight lenses"]]} +{"query": "what defines gothic literature", "output": [["hyde", "Gothic literature is defined by dark, atmospheric settings (ruined castles, monasteries), supernatural or uncanny events, psychological terror, and themes of isolation, decay, and transgression. Protagonists often face hidden secrets and tyrannical figures. Key works include Frankenstein, Dracula, and The Turn of the Screw."], ["lex", "gothic literature characteristics define"], ["lex", "gothic fiction genre elements tropes"], ["lex", "gothic novel dark romantic supernatural"], ["vec", "what are the defining features and conventions of gothic literature as a literary genre"], ["vec", "what themes, settings, and narrative techniques characterize gothic fiction"]]} +{"query": "what is the importance of cultural heritage in photography?", "output": [["hyde", "Photography plays a vital role in documenting cultural heritage—recording endangered architectural sites, traditional crafts, ceremonies, and oral traditions before they disappear. Organizations like UNESCO use photographic archives to catalog World Heritage Sites and support restoration efforts."], ["lex", "cultural heritage photography documentation"], ["lex", "photography preserving culture traditions"], ["lex", "cultural heritage visual documentation ethnographic"], ["vec", "why is photography important for preserving and documenting cultural heritage"], ["vec", "how has photography been used to record and protect cultural traditions and historical sites"]]} +{"query": "what is logical positivism", "output": [["hyde", "Logical positivism, developed by the Vienna Circle in the 1920s-30s, holds that only statements verifiable through empirical observation or logical proof are meaningful. Metaphysical, ethical, and aesthetic claims are considered cognitively meaningless. Key figures include Carnap, Schlick, and Ayer."], ["lex", "logical positivism Vienna Circle philosophy"], ["lex", "logical positivism verification principle"], ["lex", "logical empiricism analytic philosophy"], ["vec", "what is logical positivism and what did the Vienna Circle philosophers argue"], ["vec", "how does the verification principle define meaningful statements in logical positivism"]]} +{"query": "how to create a self-improvement plan?", "output": [["hyde", "Start by assessing your current strengths and weaknesses across life areas: health, career, relationships, finances, and personal growth. Set 2-3 SMART goals per area. Break each goal into weekly habits and milestones. Track progress in a journal and review monthly. Adjust the plan based on what's working."], ["lex", "self-improvement plan personal development"], ["lex", "personal growth plan goals habits"], ["lex", "self-improvement roadmap steps"], ["vec", "how do I create an effective self-improvement plan with clear goals and actionable steps"], ["vec", "what steps should I follow to build a personal development plan that I can stick to"]]} +{"query": "how robotics is transforming industries", "output": [["hyde", "Robotics is transforming manufacturing with collaborative robots (cobots) that work alongside humans on assembly lines. In logistics, warehouse robots from companies like Amazon Robotics sort and move packages. Surgical robots like da Vinci enable minimally invasive procedures. Agricultural robots handle harvesting and weeding autonomously."], ["lex", "robotics industry transformation manufacturing"], ["lex", "industrial robots automation sectors"], ["lex", "robotics applications logistics healthcare agriculture"], ["vec", "how is robotics transforming industries like manufacturing, healthcare, and logistics"], ["vec", "what impact are advanced robots and automation having on different industrial sectors"]]} +{"query": "famous photographers", "output": [["hyde", "Ansel Adams is known for dramatic black-and-white landscapes of the American West. Henri Cartier-Bresson pioneered street photography and the decisive moment. Dorothea Lange documented the Great Depression. Annie Leibovitz is renowned for celebrity portraiture. Sebastião Salgado captures powerful social documentary images."], ["lex", "famous photographers history notable"], ["lex", "iconic photographers Ansel Adams Cartier-Bresson"], ["lex", "renowned photographers influential works"], ["vec", "who are the most famous and influential photographers in history"], ["vec", "which photographers are known for iconic images that shaped the art of photography"]]} +{"query": "how does climate change affect global politics", "output": [["hyde", "Climate change reshapes global politics through resource competition (water, arable land), climate-driven migration, and diplomatic tensions over emissions targets. Arctic ice melt opens new shipping routes and territorial disputes. Island nations face existential threats, driving climate justice advocacy at the UN."], ["lex", "climate change global politics geopolitics"], ["lex", "climate change international relations policy"], ["lex", "climate politics diplomacy conflict resources"], ["vec", "how does climate change influence international relations and global political dynamics"], ["vec", "what are the geopolitical consequences of climate change including resource conflicts and migration"]]} +{"query": "how to organize a scientific conference", "output": [["hyde", "Start 12-18 months ahead. Form a program committee, select a venue, set dates, and issue a call for papers. Use a submission system like EasyChair. Arrange keynote speakers, peer review, and session scheduling. Handle registration, catering, AV equipment, and proceedings publication."], ["lex", "organize scientific conference planning"], ["lex", "academic conference logistics program committee"], ["lex", "scientific meeting venue call for papers"], ["vec", "what are the steps to organizing a successful scientific conference"], ["vec", "how do you plan an academic conference including call for papers, venue, and scheduling"]]} +{"query": "how to fix a leaking faucet", "output": [["hyde", "Turn off the water supply valves under the sink. Remove the faucet handle by unscrewing the decorative cap and handle screw. Pull out the cartridge or stem and inspect the rubber washer or O-ring. Replace worn parts, reassemble, and turn the water back on. Most leaks are caused by a degraded washer."], ["lex", "fix leaking faucet repair dripping"], ["lex", "faucet leak washer cartridge replacement"], ["lex", "kitchen bathroom faucet drip fix"], ["vec", "how do I fix a dripping faucet in my kitchen or bathroom"], ["vec", "what are the steps to repair a leaking faucet by replacing the washer or cartridge"]]} +{"query": "how social media influences behavior", "output": [["hyde", "Social media influences behavior through social comparison, echo chambers, and dopamine-driven feedback loops. Users curate idealized self-presentations, leading to anxiety and low self-esteem in viewers. Algorithmic content feeds reinforce existing beliefs and can radicalize opinions through filter bubbles."], ["lex", "social media influence behavior psychology"], ["lex", "social media impact mental health habits"], ["lex", "social media behavioral effects users"], ["vec", "how does social media use influence people's behavior, opinions, and mental health"], ["vec", "what psychological effects does regular social media use have on user behavior"]]} +{"query": "how does intertextuality work?", "output": [["hyde", "Intertextuality, coined by Julia Kristeva, describes how every text is shaped by and references other texts. Meaning is not contained in a single work but emerges from its relationships with prior texts through allusion, quotation, parody, and genre conventions. Roland Barthes argued the reader constructs meaning from these textual connections."], ["lex", "intertextuality literary theory texts"], ["lex", "intertextuality allusion reference literature"], ["lex", "Kristeva Barthes intertextuality meaning"], ["vec", "how does intertextuality work as a concept in literary theory and criticism"], ["vec", "what does intertextuality mean and how do texts reference and build on other texts"]]} +{"query": "how does stoicism inspire inner peace", "output": [["hyde", "Stoicism teaches inner peace through the dichotomy of control: focus only on what you can influence (your thoughts and actions) and accept what you cannot (external events). Marcus Aurelius wrote in Meditations that disturbance comes not from things themselves but from our judgments about them."], ["lex", "Stoicism inner peace philosophy"], ["lex", "Stoic philosophy tranquility Marcus Aurelius Epictetus"], ["lex", "Stoic practices equanimity calm"], ["vec", "how do Stoic philosophical principles help achieve inner peace and tranquility"], ["vec", "what Stoic practices and teachings from Marcus Aurelius and Epictetus promote emotional calm"]]} +{"query": "how to install a car stereo?", "output": [["hyde", "Disconnect the battery. Remove the factory stereo using DIN removal tools or dash panel screws. Connect the aftermarket wiring harness adapter to the car's plug—match wire colors (red=accessory, yellow=battery, black=ground). Mount the new head unit in a dash kit, slide it in, and reconnect the battery."], ["lex", "install car stereo aftermarket head unit"], ["lex", "car stereo replacement wiring harness"], ["lex", "car radio installation dash kit"], ["vec", "how do I install an aftermarket car stereo and connect the wiring"], ["vec", "what tools and adapters do I need to replace a factory car radio with a new head unit"]]} +{"query": "art class", "output": [["hyde", "Beginner art classes cover fundamentals like drawing, color theory, and composition. Options include community college courses, local studio workshops, and online platforms like Skillshare and Domestika. Classes range from watercolor and acrylic painting to charcoal drawing and digital illustration."], ["lex", "art class painting drawing course"], ["lex", "art classes beginners local online"], ["lex", "learn art lessons studio workshop"], ["vec", "where can I find art classes for beginners to learn painting or drawing"], ["vec", "what types of art classes are available online and in person for adults"]]} +{"query": "what is the concept of ahimsa", "output": [["hyde", "Ahimsa means non-violence or non-harm and is a central principle in Hinduism, Jainism, and Buddhism. In Jainism, ahimsa extends to all living beings, including insects. Gandhi adopted ahimsa as the foundation of his political resistance, using nonviolent civil disobedience against British colonial rule."], ["lex", "ahimsa non-violence concept Hinduism Jainism Buddhism"], ["lex", "ahimsa meaning Indian philosophy"], ["lex", "ahimsa Gandhi non-harm"], ["vec", "what is the concept of ahimsa and how is non-violence practiced in Indian religions"], ["vec", "how did Gandhi apply the principle of ahimsa in his philosophy and political movement"]]} +{"query": "what was the byzantine empire", "output": [["hyde", "The Byzantine Empire was the continuation of the Eastern Roman Empire, centered on Constantinople (modern Istanbul). It lasted from 330 CE to 1453 CE when it fell to the Ottoman Turks. It preserved Greek and Roman culture, developed Eastern Orthodox Christianity, and Justinian's legal code influenced European law."], ["lex", "Byzantine Empire history Eastern Roman"], ["lex", "Byzantine Empire Constantinople medieval"], ["lex", "Byzantine Empire culture government fall 1453"], ["vec", "what was the Byzantine Empire and how did it continue from the Roman Empire"], ["vec", "what were the major achievements and eventual fall of the Byzantine Empire"]]} +{"query": "how to run for public office", "output": [["hyde", "To run for public office, first research eligibility requirements (age, residency, citizenship) for your target seat. File candidacy paperwork with the local election office by the deadline. Build a campaign team, set a budget, raise funds, and collect any required petition signatures. Develop a platform and begin voter outreach."], ["lex", "run for public office campaign steps"], ["lex", "running for election candidate requirements"], ["lex", "political campaign filing candidacy"], ["vec", "what are the steps to running for public office in the United States"], ["vec", "how do I start a political campaign and file as a candidate for local or state office"]]} +{"query": "how to contact local government officials", "output": [["hyde", "Find your local officials through your city or county website's \"elected officials\" page or use usa.gov's elected officials lookup tool. Contact methods include email, phone calls to their office, attending public town hall meetings, and submitting comments during city council sessions."], ["lex", "contact local government officials representatives"], ["lex", "reach city council county officials email phone"], ["lex", "local elected officials contact information"], ["vec", "how can I find contact information for and reach out to my local government representatives"], ["vec", "what is the best way to contact city council members or county officials about local issues"]]} +{"query": "what is the metaphysics of morality", "output": [["hyde", "The metaphysics of morality examines whether moral facts exist independently of human minds (moral realism) or are constructed by societies and individuals (anti-realism). Moral realists argue that \"murder is wrong\" is objectively true. Constructivists and expressivists argue moral claims express attitudes or social agreements, not metaphysical truths."], ["lex", "metaphysics of morality moral philosophy"], ["lex", "metaethics moral realism anti-realism"], ["lex", "metaphysical foundations ethics moral facts"], ["vec", "what is the metaphysics of morality and how does it address the nature of moral facts"], ["vec", "how do metaethicists debate whether moral truths exist objectively or are constructed"]]} +{"query": "latest research on climate change", "output": [["hyde", "Recent research in 2025 shows global temperatures exceeded 1.5°C above pre-industrial levels for a full calendar year. Studies in Nature Climate Change report accelerating ice sheet loss in Greenland and West Antarctica. New modeling suggests tipping points for the Amazon rainforest may be closer than previously estimated."], ["lex", "latest climate change research 2025 2026"], ["lex", "recent climate science findings studies"], ["lex", "climate change new research global warming"], ["vec", "what are the latest scientific findings and research on climate change in 2025-2026"], ["vec", "what do recent climate studies say about global warming trends and projections"]]} +{"query": "where to find eco-friendly furniture", "output": [["hyde", "Eco-friendly furniture brands include West Elm (FSC-certified wood), Medley (organic fabrics, solid wood), and Sabai (recycled and recyclable materials). Thrift stores and Habitat for Humanity ReStores sell secondhand furniture. Look for FSC certification, non-toxic finishes, and reclaimed or recycled materials."], ["lex", "eco-friendly furniture sustainable shop"], ["lex", "sustainable furniture store green materials"], ["lex", "eco furniture reclaimed wood organic"], ["vec", "where can I buy eco-friendly and sustainably made furniture"], ["vec", "what brands and stores sell furniture made from sustainable or recycled materials"]]} +{"query": "how to stay informed about politics", "output": [["hyde", "Read multiple news sources across the political spectrum: AP News and Reuters for wire reporting, then compare coverage from different outlets. Subscribe to newsletters like The Morning (NYT) or Axios AM. Follow legislative trackers like Congress.gov. Attend local government meetings and candidate forums."], ["lex", "stay informed politics news sources"], ["lex", "follow political news reliable media"], ["lex", "political awareness current events tracking"], ["vec", "how can I stay well-informed about politics and current political events"], ["vec", "what are reliable sources and strategies for keeping up with political news"]]} +{"query": "what is the tao te ching", "output": [["hyde", "The Tao Te Ching, attributed to Laozi (6th century BCE), is the foundational text of Taoism. Its 81 short chapters describe the Dao (the Way)—an ineffable cosmic principle—and De (virtue/power). It advocates wu wei (effortless action), simplicity, humility, and living in harmony with nature."], ["lex", "Tao Te Ching Laozi Taoism text"], ["lex", "Tao Te Ching Daodejing philosophy"], ["lex", "Tao Te Ching teachings Dao virtue"], ["vec", "what is the Tao Te Ching and what does it teach about the Dao and living wisely"], ["vec", "who wrote the Tao Te Ching and what are its main philosophical ideas"]]} +{"query": "what is the ethics of ai", "output": [["hyde", "AI ethics addresses bias in training data that leads to discriminatory outputs, lack of transparency in black-box models, accountability when AI causes harm, privacy concerns from mass data collection, and the alignment problem of ensuring AI systems act according to human values. Frameworks include fairness, accountability, and transparency (FAccT)."], ["lex", "AI ethics artificial intelligence ethical issues"], ["lex", "ethics of AI bias fairness accountability"], ["lex", "AI ethics alignment safety"], ["vec", "what are the major ethical issues and concerns surrounding artificial intelligence"], ["vec", "how do ethicists address bias, fairness, transparency, and safety in AI systems"]]} +{"query": "what is the difference between realism and idealism", "output": [["hyde", "Realism holds that an external world exists independently of our minds and perceptions. Idealism argues that reality is fundamentally mental or mind-dependent. Plato's Forms represent a kind of realism about abstract objects, while Berkeley argued that to exist is to be perceived (esse est percipi)."], ["lex", "realism idealism philosophy difference"], ["lex", "realism vs idealism metaphysics epistemology"], ["lex", "philosophical realism idealism comparison"], ["vec", "what is the philosophical difference between realism and idealism in metaphysics"], ["vec", "how do realists and idealists disagree about the nature of reality and perception"]]} +{"query": "how to prevent garden soil erosion?", "output": [["hyde", "Prevent soil erosion by mulching garden beds with 2-3 inches of wood chips or straw. Plant ground covers like creeping thyme or clover on slopes. Install retaining walls or terraces on steep grades. Use rain gardens to absorb runoff. Avoid leaving soil bare between seasons—plant cover crops like rye or clover."], ["lex", "prevent garden soil erosion methods"], ["lex", "soil erosion control garden mulch ground cover"], ["lex", "garden erosion prevention retaining wall"], ["vec", "how can I prevent soil erosion in my garden or yard"], ["vec", "what methods and ground covers help stop soil from washing away in a garden"]]} +{"query": "how to write a scientific research paper", "output": [["hyde", "A scientific research paper follows the IMRaD structure: Introduction (background, hypothesis, objectives), Methods (detailed procedures for reproducibility), Results (data presented with figures and tables), and Discussion (interpretation, limitations, implications). Include an abstract, references in the journal's required citation style, and acknowledgments."], ["lex", "write scientific research paper structure"], ["lex", "scientific paper writing IMRaD format"], ["lex", "academic research paper methodology results discussion"], ["vec", "how do you write a scientific research paper following the standard academic format"], ["vec", "what is the structure and process for writing a research paper for journal publication"]]} +{"query": "how to diversify investment portfolio", "output": [["hyde", "Diversify across asset classes: stocks, bonds, real estate, and commodities. Within stocks, spread across sectors (tech, healthcare, energy) and geographies (US, international, emerging markets). Use index funds or ETFs for broad exposure. A common allocation is 60% stocks, 30% bonds, 10% alternatives, adjusted by age and risk tolerance."], ["lex", "diversify investment portfolio strategy"], ["lex", "portfolio diversification asset allocation"], ["lex", "investment diversification stocks bonds ETFs"], ["vec", "how should I diversify my investment portfolio across different asset classes"], ["vec", "what is a good strategy for spreading risk through portfolio diversification"]]} +{"query": "how to use social media for business", "output": [["hyde", "Choose platforms where your target audience is active: Instagram for visual products, LinkedIn for B2B, TikTok for younger demographics. Post consistently, mix promotional content with value-added posts (tips, behind-the-scenes). Use analytics to track engagement. Run targeted ads with clear CTAs and A/B test creative assets."], ["lex", "social media business marketing strategy"], ["lex", "social media marketing business growth"], ["lex", "business social media content engagement"], ["vec", "how can small businesses effectively use social media platforms for marketing and growth"], ["vec", "what strategies work best for using social media to promote a business and attract customers"]]} +{"query": "what is zero waste?", "output": [["hyde", "Zero waste is a philosophy and lifestyle aiming to send nothing to landfills by reducing consumption, reusing items, recycling, and composting. Practical steps include using reusable bags, bottles, and containers, buying in bulk, composting food scraps, and choosing products with minimal or recyclable packaging."], ["lex", "zero waste lifestyle definition"], ["lex", "zero waste reduce reuse recycle"], ["lex", "zero waste living tips practices"], ["vec", "what is the zero waste movement and how do people reduce waste in daily life"], ["vec", "what does zero waste mean and what are practical ways to minimize household waste"]]} +{"query": "what is the role of civil society in governance", "output": [["hyde", "Civil society organizations—NGOs, advocacy groups, media, and community organizations—serve as intermediaries between citizens and government. They monitor government transparency, advocate for policy changes, provide public services, and mobilize civic participation. A strong civil society holds government accountable and strengthens democracy."], ["lex", "civil society governance role function"], ["lex", "civil society organizations NGOs democratic governance"], ["lex", "civil society accountability transparency"], ["vec", "what role does civil society play in democratic governance and government accountability"], ["vec", "how do non-governmental organizations and civic groups contribute to governance"]]} +{"query": "what is the meaning of diwali", "output": [["hyde", "Diwali, the festival of lights, is celebrated by Hindus, Jains, and Sikhs over five days in autumn. It symbolizes the victory of light over darkness and good over evil. Hindus celebrate Lord Rama's return to Ayodhya and honor Lakshmi, goddess of prosperity. Traditions include lighting diyas, fireworks, rangoli art, and sharing sweets."], ["lex", "Diwali meaning festival of lights"], ["lex", "Diwali Hindu celebration significance"], ["lex", "Diwali traditions Lakshmi Rama"], ["vec", "what is Diwali and what does the festival of lights celebrate in Hindu tradition"], ["vec", "what is the religious and cultural significance of the Diwali festival"]]} +{"query": "what is a political debate", "output": [["hyde", "A political debate is a structured event where candidates for elected office discuss policy positions and respond to questions from moderators and sometimes the audience. Debates follow agreed-upon formats with time limits for responses and rebuttals. They allow voters to compare candidates' positions on key issues directly."], ["lex", "political debate definition election"], ["lex", "political debate format candidates issues"], ["lex", "political debate presidential election"], ["vec", "what is a political debate and how do candidates discuss issues in structured debates"], ["vec", "how are political debates organized and what role do they play in elections"]]} +{"query": "macro photography", "output": [["hyde", "Macro photography captures subjects at 1:1 magnification or greater, revealing details invisible to the naked eye. Use a dedicated macro lens (100mm is popular) or extension tubes. Shoot at f/8-f/16 for sufficient depth of field. Use a tripod and focus stacking to get the entire subject sharp."], ["lex", "macro photography techniques close-up"], ["lex", "macro photography lens equipment"], ["lex", "macro photography insects flowers detail"], ["vec", "what is macro photography and what equipment and techniques does it require"], ["vec", "how do I take high-quality macro photographs of small subjects like insects and flowers"]]} +{"query": "what was the enlightenment", "output": [["hyde", "The Enlightenment was an 18th-century intellectual movement emphasizing reason, science, individual liberty, and skepticism of authority. Key thinkers include John Locke (natural rights), Voltaire (free speech), Montesquieu (separation of powers), and Kant (\"dare to know\"). It directly influenced the American and French Revolutions."], ["lex", "Enlightenment 18th century intellectual movement"], ["lex", "Age of Enlightenment reason philosophy"], ["lex", "Enlightenment thinkers Voltaire Locke Kant"], ["vec", "what was the Enlightenment and how did it change Western philosophy and politics"], ["vec", "who were the key Enlightenment thinkers and what ideas did they promote"]]} +{"query": "how do philosophers interpret free will", "output": [["hyde", "Three main positions dominate: hard determinism (all events are causally determined, free will is an illusion), libertarianism (genuine free will exists and is incompatible with determinism), and compatibilism (free will and determinism can coexist—you act freely when acting on your own desires without external coercion). Hume and Frankfurt defend compatibilism."], ["lex", "free will philosophy determinism"], ["lex", "philosophers free will debate libertarian compatibilist"], ["lex", "free will hard determinism compatibilism"], ["vec", "how do different philosophers interpret the problem of free will and determinism"], ["vec", "what are the main philosophical positions on whether humans have free will"]]} +{"query": "how to stay engaged in local politics", "output": [["hyde", "Attend city council and school board meetings, which are open to the public. Subscribe to your local government's agenda notifications. Join neighborhood associations or civic groups. Vote in every local election—municipal and school board elections often have low turnout, amplifying each vote's impact."], ["lex", "engaged local politics civic participation"], ["lex", "local politics involvement community"], ["lex", "civic engagement local government attend meetings"], ["vec", "how can I stay actively engaged and involved in local politics and government"], ["vec", "what are practical ways to participate in local political decision-making"]]} +{"query": "how to paint abstract landscapes?", "output": [["hyde", "Start with a loose underpainting to block in the horizon and major shapes. Use a palette knife or large brush for expressive marks. Simplify landscape elements—hills, sky, water—into geometric shapes and bold color fields. Layer transparent glazes over opaque areas. Let the painting suggest the landscape rather than depict it literally."], ["lex", "paint abstract landscape technique"], ["lex", "abstract landscape painting acrylic oil"], ["lex", "abstract landscape art color composition"], ["vec", "how do I paint abstract landscape art using acrylic or oil paints"], ["vec", "what techniques and approaches do artists use when painting abstract landscapes"]]} +{"query": "how to decorate a small apartment", "output": [["hyde", "Use mirrors and light colors to make a small apartment feel larger. Choose multi-functional furniture like a storage ottoman or a fold-down desk. Vertical shelving frees up floor space while adding display areas."], ["lex", "small apartment decorating ideas"], ["lex", "tiny apartment interior design"], ["lex", "space-saving furniture small rooms"], ["vec", "what are the best ways to decorate and furnish a small apartment to maximize space?"], ["vec", "interior design tips for making a compact apartment look bigger and more stylish"]]} +{"query": "what is an allegory", "output": [["hyde", "An allegory is a narrative in which characters, events, and settings represent abstract ideas or moral qualities. For example, George Orwell's Animal Farm is an allegory for the Russian Revolution, with farm animals standing in for political figures."], ["lex", "allegory literary device definition"], ["lex", "allegory examples literature"], ["vec", "what does allegory mean as a literary device and how is it used in storytelling?"], ["vec", "how do authors use allegory to convey hidden meanings through characters and events?"]]} +{"query": "what is wildlife photography?", "output": [["hyde", "Wildlife photography involves capturing images of animals in their natural environments. Photographers typically use long telephoto lenses (300mm-600mm) and fast shutter speeds to freeze motion. Patience and knowledge of animal behavior are essential for getting close without disturbing subjects."], ["lex", "wildlife photography techniques"], ["lex", "wildlife photography camera gear"], ["lex", "photographing animals in nature"], ["vec", "what is wildlife photography and what skills and equipment does it require?"], ["vec", "how do photographers capture images of wild animals in their natural habitats?"]]} +{"query": "what is chaos theory", "output": [["hyde", "Chaos theory studies deterministic systems that are highly sensitive to initial conditions. A tiny change in starting values can produce vastly different outcomes over time — the so-called butterfly effect. The Lorenz attractor, discovered in 1963, was one of the first examples of chaotic behavior in weather modeling."], ["lex", "chaos theory mathematics"], ["lex", "butterfly effect deterministic systems"], ["lex", "nonlinear dynamics sensitive dependence"], ["vec", "what is chaos theory and how does it explain unpredictable behavior in deterministic systems?"], ["vec", "how does the butterfly effect relate to chaos theory in mathematics and physics?"]]} +{"query": "what is the role of ethics in scientific research", "output": [["hyde", "Ethics in scientific research ensures the integrity of findings and the protection of human and animal subjects. Researchers must obtain informed consent, avoid fabrication or falsification of data, and disclose conflicts of interest. Institutional Review Boards (IRBs) review proposed studies before they begin."], ["lex", "research ethics scientific integrity"], ["lex", "ethical guidelines human subjects research"], ["lex", "scientific misconduct fraud prevention"], ["vec", "why are ethical standards important in conducting scientific research?"], ["vec", "how do ethics committees and institutional review boards regulate scientific experiments?"]]} +{"query": "how to shoot video in low light", "output": [["hyde", "For low light video, open your aperture to f/1.4–f/2.8 and lower your shutter speed to 1/50 for 24fps footage. Raise ISO gradually — modern cameras handle ISO 3200–6400 with acceptable noise. Use a fast prime lens and add practical lights in the scene when possible."], ["lex", "low light video settings camera"], ["lex", "filming dark environments ISO aperture"], ["lex", "low light videography tips"], ["vec", "what camera settings and techniques produce the best video quality in low light conditions?"], ["vec", "how do filmmakers shoot usable footage in dark or dimly lit environments?"]]} +{"query": "what is compositional balance?", "output": [["hyde", "Compositional balance refers to the distribution of visual weight within an image or artwork. Symmetrical balance places equal elements on both sides of a central axis, while asymmetrical balance uses contrasting elements — such as a large shape offset by a smaller, brighter one — to create dynamic equilibrium."], ["lex", "compositional balance art design"], ["lex", "symmetrical asymmetrical balance visual"], ["lex", "balance principles composition photography"], ["vec", "what does compositional balance mean in art, photography, and graphic design?"], ["vec", "how do artists achieve visual balance through symmetrical and asymmetrical arrangements?"]]} +{"query": "what is the impact of lobbyists on legislation", "output": [["hyde", "Lobbyists meet with lawmakers, draft model legislation, and organize campaign contributions to influence policy outcomes. In the U.S., spending on lobbying exceeded $4 billion annually. Critics argue this gives wealthy interests disproportionate power, while proponents say lobbyists provide expertise legislators need."], ["lex", "lobbyists influence legislation policy"], ["lex", "lobbying congress lawmaking"], ["lex", "corporate lobbying political spending"], ["vec", "how do lobbyists influence the legislative process and shape laws passed by government?"], ["vec", "what impact does corporate and special interest lobbying have on policy outcomes?"]]} +{"query": "how to navigate with a compass", "output": [["hyde", "Hold the compass flat and rotate the bezel until the orienting arrow aligns with the magnetic needle pointing north. Place the compass on your map, align the edge with your start and destination, and rotate the bezel to match the map's grid lines. Adjust for magnetic declination, then follow the bearing."], ["lex", "compass navigation orienteering"], ["lex", "magnetic compass bearing map reading"], ["lex", "compass declination true north"], ["vec", "how do you use a magnetic compass and topographic map to navigate outdoors?"], ["vec", "what are the steps for taking a bearing with a compass and following it in the field?"]]} +{"query": "what is genetic drift", "output": [["hyde", "Genetic drift is a mechanism of evolution where allele frequencies change randomly from one generation to the next due to chance sampling. Its effects are strongest in small populations. The bottleneck effect occurs when a population is drastically reduced, and the founder effect occurs when a small group colonizes a new area."], ["lex", "genetic drift population genetics"], ["lex", "bottleneck effect founder effect allele frequency"], ["vec", "what is genetic drift and how does it cause random changes in allele frequencies in small populations?"], ["vec", "how do the bottleneck effect and founder effect relate to genetic drift in evolution?"]]} +{"query": "what is the significance of the alhambra?", "output": [["hyde", "The Alhambra is a palace and fortress complex in Granada, Spain, built primarily by the Nasrid dynasty in the 13th and 14th centuries. Its intricate stucco work, muqarnas ceilings, and geometric tile patterns represent the pinnacle of Moorish art in Europe. The Court of the Lions features 124 marble columns surrounding a central fountain."], ["lex", "Alhambra palace Granada Spain"], ["lex", "Alhambra Islamic architecture Nasrid"], ["lex", "Alhambra historical significance"], ["vec", "why is the Alhambra in Granada, Spain considered a masterpiece of Islamic architecture?"], ["vec", "what is the cultural and historical significance of the Alhambra palace?"]]} +{"query": "how the human brain functions", "output": [["hyde", "The human brain contains approximately 86 billion neurons that communicate via electrical and chemical signals across synapses. The cerebral cortex handles higher-order functions like reasoning and language. The hippocampus is critical for forming new memories, while the cerebellum coordinates movement and balance."], ["lex", "human brain function neuroscience"], ["lex", "brain regions neurons synapses"], ["lex", "cerebral cortex brain anatomy"], ["vec", "how does the human brain process information through neurons and different brain regions?"], ["vec", "what are the major parts of the brain and their roles in cognition, memory, and movement?"]]} +{"query": "how is love viewed in different religions?", "output": [["hyde", "In Christianity, love (agape) is the highest virtue — \"God is love\" (1 John 4:8). Islam teaches that Allah is Al-Wadud, the Loving, and compassion toward others is a core duty. In Buddhism, metta (loving-kindness) is cultivated through meditation. Hinduism describes divine love (bhakti) as devotion to God."], ["lex", "love religion Christianity Islam Buddhism"], ["lex", "divine love spiritual traditions"], ["lex", "religious teachings about love"], ["vec", "how do different world religions like Christianity, Islam, Hinduism, and Buddhism define and teach about love?"], ["vec", "what role does love play in the spiritual teachings of major religions?"]]} +{"query": "what is literary symbolism?", "output": [["hyde", "Literary symbolism is the use of objects, characters, or events to represent abstract ideas beyond their literal meaning. In The Great Gatsby, the green light symbolizes Gatsby's unattainable dream. The conch shell in Lord of the Flies represents order and democratic authority."], ["lex", "literary symbolism examples"], ["lex", "symbolism in literature meaning"], ["lex", "symbolic imagery fiction poetry"], ["vec", "what is symbolism as a literary device and how do authors use symbols to convey deeper meaning?"], ["vec", "how do readers identify and interpret symbols in novels, poems, and short stories?"]]} +{"query": "what is the relationship between ethics and law?", "output": [["hyde", "Ethics and law overlap but are distinct. Laws are formal rules enforced by the state, while ethics are moral principles guiding individual conduct. Something can be legal yet unethical — such as exploitative pricing — or illegal yet ethically defensible, as in acts of civil disobedience against unjust laws."], ["lex", "ethics versus law differences"], ["lex", "morality legality relationship"], ["lex", "ethical standards legal requirements"], ["vec", "how do ethics and law relate to each other, and where do they diverge?"], ["vec", "can something be legal but unethical, or illegal but morally justified?"]]} +{"query": "json load", "output": [["hyde", "In Python, use json.load(f) to read from a file object and json.loads(s) to parse a string. In JavaScript, use JSON.parse(str) to convert a JSON string into an object, or fetch a file and call response.json() to parse the result."], ["lex", "JSON parse load file"], ["lex", "JSON.parse read file"], ["lex", "json load Python JavaScript"], ["vec", "how do you load and parse a JSON file in Python or JavaScript?"], ["vec", "what functions are used to read JSON data from a file or string?"]]} +{"query": "how to remove oil stains from clothes", "output": [["hyde", "Apply dish soap or liquid detergent directly to the oil stain and gently rub it in. Let it sit for 10-15 minutes, then wash in the hottest water safe for the fabric. For stubborn stains, sprinkle baking soda or cornstarch on the spot to absorb excess oil before treating."], ["lex", "remove oil stains clothing"], ["lex", "grease stain removal fabric"], ["lex", "oil stain laundry treatment"], ["vec", "what is the best method for removing oil and grease stains from clothing fabric?"], ["vec", "how do you get cooking oil or motor oil stains out of clothes at home?"]]} +{"query": "where to buy greenhouse supplies?", "output": [["hyde", "Greenhouse supplies are available at garden centers like Home Depot and Lowe's, as well as specialty retailers like Greenhouse Megastore and Bootstrap Farmer. Online, Amazon carries polycarbonate panels, shade cloth, heating mats, and ventilation fans. For commercial-grade supplies, contact manufacturers like Rimol Greenhouses directly."], ["lex", "greenhouse supplies store online"], ["lex", "buy greenhouse panels heaters shelving"], ["lex", "greenhouse gardening equipment"], ["vec", "where can I purchase greenhouse supplies like panels, heaters, ventilation, and shelving?"], ["vec", "what are the best online and local stores for buying greenhouse building materials and accessories?"]]} +{"query": "how to support climbing roses?", "output": [["hyde", "Install a sturdy trellis, arbor, or wire system at least 3 inches from the wall to allow air circulation. Tie canes horizontally with soft plant ties to encourage lateral growth and more blooms. Prune in late winter, removing dead wood and shortening side shoots to 2-3 buds."], ["lex", "climbing roses trellis support"], ["lex", "train climbing roses wall fence"], ["lex", "rose arbor lattice structure"], ["vec", "what structures and techniques are used to support and train climbing roses?"], ["vec", "how do you attach and guide climbing roses along a trellis, wall, or arbor?"]]} +{"query": "how to manage debt", "output": [["hyde", "List all debts with their balances, interest rates, and minimum payments. With the avalanche method, pay extra toward the highest-interest debt first to save the most money. With the snowball method, pay off the smallest balance first for psychological momentum. Consider consolidation loans if you qualify for a lower rate."], ["lex", "debt management repayment plan"], ["lex", "pay off debt strategies snowball avalanche"], ["lex", "credit card debt consolidation"], ["vec", "what are the most effective strategies for managing and paying off personal debt?"], ["vec", "how does the debt snowball versus debt avalanche method work for debt repayment?"]]} +{"query": "sailing adventures", "output": [["hyde", "Popular sailing adventures include island-hopping in the Greek Cyclades, crossing the Atlantic via the trade winds from the Canary Islands to the Caribbean, and navigating the fjords of Norway. Charter companies offer bareboat and crewed options for all experience levels, from weekend coastal cruises to month-long blue water passages."], ["lex", "sailing adventure trips voyages"], ["lex", "sailing vacation destinations cruises"], ["lex", "ocean sailing expedition"], ["vec", "what are some popular sailing adventure destinations and voyages around the world?"], ["vec", "how do people plan and prepare for multi-day sailing trips and ocean crossings?"]]} +{"query": "paint flow", "output": [["hyde", "Paint flow refers to how freely paint moves and levels on a surface. For acrylic pouring, mix paint with a flow medium like Floetrol at a 2:1 ratio to achieve a honey-like consistency. For spray guns, thin paint to the manufacturer's recommended viscosity using a flow cup to measure."], ["lex", "paint flow viscosity consistency"], ["lex", "acrylic paint flow medium pouring"], ["lex", "paint flow rate spray gun"], ["vec", "how do you control paint flow and viscosity for acrylic pouring or spray application?"], ["vec", "what is a flow medium and how does it affect paint consistency?"]]} +{"query": "how to create a budget plan", "output": [["hyde", "Start by listing your monthly after-tax income. Track all expenses for one month, categorizing them as needs, wants, and savings. Apply the 50/30/20 rule: 50% to necessities, 30% to discretionary spending, and 20% to savings and debt repayment. Use a spreadsheet or app like YNAB to monitor progress."], ["lex", "budget plan personal monthly"], ["lex", "create budget spreadsheet expenses income"], ["lex", "50/30/20 budgeting rule"], ["vec", "how do you create a personal monthly budget plan to track income and expenses?"], ["vec", "what steps are involved in building a budget and sticking to it?"]]} +{"query": "how to apply for research funding", "output": [["hyde", "Identify funding agencies that match your research area — NIH for biomedical, NSF for science and engineering, NEH for humanities. Read the request for proposals (RFP) carefully. Write a clear specific aims page, include preliminary data, and describe your methodology in detail. Submit through the agency's online portal before the deadline."], ["lex", "research funding application grant"], ["lex", "apply grant NIH NSF proposal"], ["lex", "research grant writing tips"], ["vec", "what is the process for applying for academic or scientific research funding grants?"], ["vec", "how do researchers write successful grant proposals for agencies like NIH and NSF?"]]} +{"query": "how to improve credit score", "output": [["hyde", "Pay all bills on time — payment history accounts for 35% of your FICO score. Keep credit utilization below 30% of your total credit limit. Avoid opening too many new accounts at once. Check your credit report for errors and dispute inaccuracies. Keeping old accounts open increases your average account age."], ["lex", "improve credit score FICO"], ["lex", "raise credit score fast tips"], ["lex", "credit score factors payment history"], ["vec", "what are the most effective ways to raise your credit score quickly?"], ["vec", "which factors affect your FICO credit score the most and how can you improve them?"]]} +{"query": "what is literary criticism?", "output": [["hyde", "Literary criticism is the study, evaluation, and interpretation of literature. Major approaches include formalism (focusing on the text itself), structuralism (analyzing underlying structures), feminist criticism (examining gender representation), and post-colonialism (exploring power dynamics). Each lens offers a different way to interpret a work's meaning."], ["lex", "literary criticism theory analysis"], ["lex", "literary criticism schools formalism structuralism"], ["lex", "literary analysis methods approaches"], ["vec", "what is literary criticism and what are its major schools of thought?"], ["vec", "how do literary critics analyze and interpret works of literature using different theoretical frameworks?"]]} +{"query": "how do ethical theories apply to social issues", "output": [["hyde", "Utilitarian ethics evaluates social policies by their overall consequences — a policy is just if it maximizes well-being for the greatest number. Deontological ethics focuses on rights and duties regardless of outcome. Applying these frameworks to issues like healthcare access reveals tensions between collective welfare and individual rights."], ["lex", "ethical theories social issues applied ethics"], ["lex", "utilitarianism deontology social justice"], ["lex", "ethics poverty inequality healthcare"], ["vec", "how are ethical theories like utilitarianism and deontology applied to real-world social issues?"], ["vec", "what ethical frameworks do philosophers use to analyze problems like poverty, inequality, and healthcare?"]]} +{"query": "where to buy affordable art prints", "output": [["hyde", "Affordable art prints are available on Society6, Redbubble, and Etsy, where independent artists sell prints starting at $15–$30. IKEA offers framed prints under $20. For museum-quality reproductions, check Artsy or Saatchi Art's prints section. King & McGaw specializes in licensed fine art reproductions at mid-range prices."], ["lex", "buy affordable art prints online"], ["lex", "cheap art prints posters wall decor"], ["lex", "art print shops Etsy Society6"], ["vec", "where can I buy affordable and high-quality art prints for home decoration?"], ["vec", "what are the best online stores for purchasing inexpensive art prints and posters?"]]} +{"query": "how do you critique a literary work?", "output": [["hyde", "To critique a literary work, start by reading it closely and noting your initial reactions. Identify the theme, narrative structure, character development, and use of literary devices. Evaluate how effectively the author conveys their message. Support your assessment with specific textual evidence and quotations from the work."], ["lex", "critique literary work analysis"], ["lex", "literary critique essay writing"], ["lex", "evaluate novel poem fiction"], ["vec", "what steps do you follow to write a literary critique of a novel or poem?"], ["vec", "how do you analyze and evaluate the strengths and weaknesses of a literary work?"]]} +{"query": "what are the principles of democracy", "output": [["hyde", "The core principles of democracy include popular sovereignty (power derives from the people), free and fair elections, rule of law, separation of powers among branches of government, protection of individual rights and civil liberties, and majority rule with minority rights. An independent judiciary ensures laws are applied equally."], ["lex", "principles democracy government"], ["lex", "democratic principles rule of law elections"], ["lex", "democracy separation of powers rights"], ["vec", "what are the fundamental principles that define a democratic system of government?"], ["vec", "how do free elections, rule of law, and separation of powers form the foundation of democracy?"]]} +{"query": "how to grow tomatoes at home?", "output": [["hyde", "Plant tomato seedlings after the last frost in a spot receiving 6-8 hours of direct sunlight. Use well-draining soil amended with compost. Water deeply at the base 1-2 inches per week. Stake or cage plants for support. Feed with a balanced fertilizer every two weeks once fruit begins to set."], ["lex", "grow tomatoes home garden"], ["lex", "tomato plant care watering sunlight"], ["lex", "container tomatoes growing tips"], ["vec", "how do you grow tomato plants at home in a garden bed or container?"], ["vec", "what soil, sunlight, and watering conditions do tomato plants need to produce fruit?"]]} +{"query": "how to fix a loud exhaust?", "output": [["hyde", "A loud exhaust is usually caused by a hole in the muffler, a cracked exhaust pipe, or a failed gasket at the manifold. For small holes, apply exhaust repair tape or paste as a temporary fix. For larger damage, replace the affected section. A rusted-through muffler should be replaced entirely — bolt-on universal mufflers cost $30–$80."], ["lex", "fix loud exhaust car muffler"], ["lex", "exhaust leak repair pipe"], ["lex", "muffler replacement noisy exhaust"], ["vec", "how do you diagnose and fix a loud or rattling car exhaust system?"], ["vec", "what causes a car exhaust to become loud and how do you repair or replace the muffler?"]]} +{"query": "what is kinetic art?", "output": [["hyde", "Kinetic art is a genre of art that incorporates real or apparent movement. Alexander Calder pioneered the mobile — hanging sculptures that move with air currents. Jean Tinguely built complex mechanical assemblages that rattled and spun. Modern kinetic artists use motors, wind, and magnets to create motion."], ["lex", "kinetic art sculpture movement"], ["lex", "kinetic art artists Calder Tinguely"], ["lex", "moving art installation mechanical"], ["vec", "what is kinetic art and how do artists create sculptures and installations that move?"], ["vec", "who are the most famous kinetic artists and what are their notable works?"]]} +{"query": "async web", "output": [["hyde", "Asynchronous web programming allows a server to handle multiple requests concurrently without blocking. In Python, frameworks like FastAPI and aiohttp use async/await syntax with an event loop. In JavaScript, Express with async handlers or Fastify process requests non-blockingly. This improves throughput for I/O-bound workloads."], ["lex", "async web framework server"], ["lex", "asynchronous HTTP request JavaScript Python"], ["lex", "async await web API"], ["vec", "how do asynchronous programming patterns work in web development and API requests?"], ["vec", "what are the best async web frameworks for building non-blocking HTTP servers?"]]} +{"query": "what is the philosophy of nonviolence", "output": [["hyde", "Nonviolence (ahimsa) as a philosophy holds that physical force is never justified as a means of conflict resolution. Mahatma Gandhi developed satyagraha — truth-force — as a method of nonviolent resistance against British colonial rule. Martin Luther King Jr. adapted these principles to the American civil rights movement."], ["lex", "philosophy nonviolence ahimsa pacifism"], ["lex", "nonviolence Gandhi King civil disobedience"], ["vec", "what is the philosophical basis for nonviolence as practiced by Gandhi and Martin Luther King Jr.?"], ["vec", "how does the concept of ahimsa relate to the broader philosophy of nonviolent resistance?"]]} +{"query": "what are the main sects of islam?", "output": [["hyde", "The two main sects of Islam are Sunni (approximately 85-90% of Muslims) and Shia (10-15%). The split originated from a disagreement over succession after Prophet Muhammad's death in 632 CE. Sunnis accepted Abu Bakr as caliph, while Shia believed leadership belonged to Ali, Muhammad's cousin and son-in-law. Sufism is a mystical tradition found within both branches."], ["lex", "sects of Islam Sunni Shia Sufi"], ["lex", "Islamic denominations branches"], ["lex", "Sunni Shia differences beliefs"], ["vec", "what are the major sects and branches within Islam and how do they differ?"], ["vec", "what caused the split between Sunni and Shia Muslims and what are their key theological differences?"]]} +{"query": "how to use charcoal for drawing?", "output": [["hyde", "Vine charcoal is soft and ideal for light sketching and easy erasing. Compressed charcoal is denser, producing darker, richer marks. Hold the charcoal on its side for broad strokes and use the tip for fine lines. Blend with a tortillon or chamois cloth. Fix finished drawings with spray fixative to prevent smudging."], ["lex", "charcoal drawing techniques"], ["lex", "vine compressed charcoal sketching"], ["lex", "charcoal shading blending paper"], ["vec", "what are the techniques for drawing and shading with charcoal on paper?"], ["vec", "what types of charcoal are used for drawing and how do they differ in effect?"]]} +{"query": "what is mindfulness", "output": [["hyde", "Mindfulness is the practice of paying attention to the present moment without judgment. It involves observing thoughts, feelings, and sensations as they arise and letting them pass. Jon Kabat-Zinn developed Mindfulness-Based Stress Reduction (MBSR), an eight-week program shown to reduce anxiety, depression, and chronic pain."], ["lex", "mindfulness meditation practice"], ["lex", "mindfulness definition awareness present moment"], ["lex", "mindfulness stress reduction MBSR"], ["vec", "what is mindfulness and how is it practiced as a form of meditation?"], ["vec", "what are the psychological and health benefits of practicing mindfulness regularly?"]]} +{"query": "latest updates on the ukraine conflict", "output": [["hyde", "As fighting continues along the eastern front, diplomatic efforts have intensified with multiple rounds of negotiations. Ukraine's forces have focused on defensive operations in the Donetsk region while maintaining pressure on supply lines. International support continues with new aid packages and sanctions enforcement."], ["lex", "Ukraine conflict war 2025 2026 updates"], ["lex", "Ukraine Russia war latest news"], ["lex", "Ukraine ceasefire negotiations frontline"], ["vec", "what are the most recent developments in the Russia-Ukraine war as of 2025-2026?"], ["vec", "what is the current status of the Ukraine conflict including ceasefire talks and territorial changes?"]]} +{"query": "git push", "output": [["hyde", "Use `git push origin main` to push your local main branch to the remote. For a new branch, use `git push -u origin feature-branch` to set the upstream tracking reference. If the push is rejected because the remote has new commits, run `git pull --rebase` first, then push again."], ["lex", "git push remote origin"], ["lex", "git push branch upstream"], ["lex", "git push force rejected"], ["vec", "how do you push commits to a remote repository using git push?"], ["vec", "what do you do when git push is rejected and how do you set upstream tracking branches?"]]} +{"query": "what is hedonism", "output": [["hyde", "Hedonism is the philosophical view that pleasure is the highest good and the proper aim of human life. Epicurus distinguished between kinetic pleasures (active enjoyment) and katastematic pleasures (the absence of pain). He argued that simple pleasures, friendship, and tranquility produce the most lasting happiness — not excess or indulgence."], ["lex", "hedonism philosophy pleasure"], ["lex", "hedonism Epicurus ethical theory"], ["lex", "hedonistic ethics pleasure pain"], ["vec", "what is hedonism as a philosophical doctrine about pleasure and the good life?"], ["vec", "how did Epicurus define hedonism and how does it differ from popular conceptions of pleasure-seeking?"]]} +{"query": "what is a mathematical model", "output": [["hyde", "A mathematical model uses equations and variables to represent a real-world system. For example, the SIR model uses differential equations to predict infectious disease spread: dS/dt = -βSI, dI/dt = βSI - γI, dR/dt = γI. Models are validated by comparing predictions against observed data and refined iteratively."], ["lex", "mathematical model definition"], ["lex", "mathematical modeling equations simulation"], ["lex", "applied mathematics modeling real world"], ["vec", "what is a mathematical model and how is it used to represent real-world systems?"], ["vec", "how do scientists and engineers build mathematical models to simulate and predict phenomena?"]]} +{"query": "how to grow an herb garden", "output": [["hyde", "Start with easy herbs like basil, parsley, mint, rosemary, and thyme. Plant in well-draining soil with 6+ hours of sunlight. Herbs in containers need pots with drainage holes and regular watering when the top inch of soil is dry. Harvest regularly by pinching stems above leaf nodes to encourage bushy growth."], ["lex", "grow herb garden home indoor outdoor"], ["lex", "herb garden planting basil cilantro thyme"], ["lex", "container herb garden windowsill"], ["vec", "how do you start and maintain an herb garden at home, indoors or outdoors?"], ["vec", "which herbs grow best together and what soil and light conditions do they need?"]]} +{"query": "how to evaluate a scientific claim", "output": [["hyde", "Check if the claim is published in a peer-reviewed journal. Look at the sample size, methodology, and whether results have been replicated independently. Consider whether the source has conflicts of interest. Distinguish between correlation and causation. Evaluate the statistical significance and effect size reported in the study."], ["lex", "evaluate scientific claim evidence"], ["lex", "critical thinking scientific evidence peer review"], ["lex", "assess scientific study credibility"], ["vec", "how do you critically evaluate whether a scientific claim is supported by credible evidence?"], ["vec", "what criteria should you use to judge the reliability of a scientific study or finding?"]]} +{"query": "what is virtue signaling?", "output": [["hyde", "Virtue signaling refers to the public expression of moral values or opinions primarily intended to demonstrate one's good character rather than to effect change. The term is often used critically to describe performative displays on social media — such as posting a hashtag or changing a profile picture — without taking meaningful action on the issue."], ["lex", "virtue signaling definition examples"], ["lex", "virtue signaling social media politics"], ["vec", "what does virtue signaling mean and how is the term used in political and social discourse?"], ["vec", "how do people use virtue signaling to publicly express moral values without substantive action?"]]} +{"query": "what is impact investing?", "output": [["hyde", "Impact investing directs capital toward companies and projects that generate measurable social or environmental benefits alongside financial returns. Unlike ESG screening, which excludes harmful sectors, impact investing actively targets positive outcomes — such as affordable housing, renewable energy, or microfinance. The Global Impact Investing Network (GIIN) estimates the market at over $1 trillion."], ["lex", "impact investing ESG social return"], ["lex", "impact investing funds sustainable"], ["lex", "socially responsible investing SRI"], ["vec", "what is impact investing and how does it generate both financial returns and social or environmental benefit?"], ["vec", "how does impact investing differ from traditional investing and ESG strategies?"]]} +{"query": "stellar cartography", "output": [["hyde", "Stellar cartography is the science of mapping the positions, distances, and motions of stars. The ESA's Gaia mission has cataloged over 1.8 billion stars with precise positions and parallax measurements. Stellar maps use right ascension and declination coordinates, with distances measured in parsecs from trigonometric parallax."], ["lex", "stellar cartography star mapping"], ["lex", "star chart celestial mapping catalog"], ["lex", "astronomical survey stellar positions"], ["vec", "what is stellar cartography and how do astronomers map the positions and movements of stars?"], ["vec", "what tools and surveys are used to create detailed maps of stars in the galaxy?"]]} +{"query": "what are hedge funds?", "output": [["hyde", "A hedge fund is a pooled investment fund that employs diverse strategies — including long/short equity, arbitrage, and derivatives trading — to generate returns for accredited investors. Unlike mutual funds, hedge funds face fewer regulatory restrictions and typically charge a 2% management fee plus 20% of profits (the \"2 and 20\" model)."], ["lex", "hedge funds investment strategy"], ["lex", "hedge fund accredited investors returns"], ["lex", "hedge fund management fee structure"], ["vec", "what are hedge funds and how do they differ from mutual funds and other investment vehicles?"], ["vec", "what strategies do hedge funds use to generate returns and manage risk?"]]} +{"query": "github repository", "output": [["hyde", "To create a GitHub repository, click \"New repository\" on github.com, name it, and choose public or private visibility. Clone it locally with `git clone https://github.com/user/repo.git`. Add files, commit changes, and push with `git push origin main`. Collaborate through pull requests and code reviews."], ["lex", "GitHub repository create manage"], ["lex", "GitHub repo clone push pull"], ["lex", "git repository hosting GitHub"], ["vec", "how do you create and manage a repository on GitHub for version control?"], ["vec", "what are the basic operations for working with a GitHub repository including cloning, pushing, and pull requests?"]]} +{"query": "how to enhance positive social impact?", "output": [["hyde", "To enhance social impact, define clear measurable goals aligned with community needs. Use a theory of change to map how activities lead to outcomes. Partner with local organizations for culturally informed approaches. Measure results with both quantitative metrics (people served, outcomes achieved) and qualitative feedback from beneficiaries."], ["lex", "enhance social impact community"], ["lex", "positive social impact strategies nonprofit"], ["lex", "social change community engagement"], ["vec", "what are effective strategies for individuals and organizations to create positive social impact?"], ["vec", "how can nonprofits and businesses measure and increase their social impact in communities?"]]} +{"query": "how to negotiate rent prices", "output": [["hyde", "Research comparable rents in your area on Zillow or Apartments.com before negotiating. Highlight your strengths as a tenant: stable income, good credit, long tenure, or willingness to sign a longer lease. Negotiate during off-peak months (November-February) when demand is lower. Offer to prepay several months or handle minor maintenance in exchange for a reduction."], ["lex", "negotiate rent price landlord"], ["lex", "rent negotiation apartment lease"], ["lex", "lower rent strategies tenant"], ["vec", "how do you negotiate a lower rent price with your landlord when signing or renewing a lease?"], ["vec", "what tactics and arguments can tenants use to get a better deal on apartment rent?"]]} +{"query": "how to propagate succulents from leaves", "output": [["hyde", "Gently twist a healthy leaf from the stem, ensuring a clean break with the base intact. Let it callous over for 2-3 days in indirect light. Place on top of well-draining cactus soil and mist every few days. Roots and a tiny rosette will appear in 2-4 weeks. Avoid direct sunlight until established."], ["lex", "propagate succulents leaves cuttings"], ["lex", "succulent leaf propagation rooting"], ["lex", "grow succulents from leaf"], ["vec", "how do you propagate new succulent plants from individual leaf cuttings?"], ["vec", "what is the step-by-step process for rooting succulent leaves to grow new plants?"]]} +{"query": "what is the role of non-governmental organizations", "output": [["hyde", "Non-governmental organizations (NGOs) operate independently from government to address social, environmental, and humanitarian issues. They deliver aid in crisis zones, advocate for policy changes, monitor human rights, and provide services like healthcare and education. Major NGOs include Médecins Sans Frontières, Amnesty International, and the Red Cross."], ["lex", "NGO non-governmental organization role"], ["lex", "NGOs humanitarian aid development"], ["lex", "nonprofit organizations international advocacy"], ["vec", "what roles do non-governmental organizations (NGOs) play in humanitarian aid, development, and advocacy?"], ["vec", "how do NGOs influence government policy and deliver services in developing countries?"]]} +{"query": "what is pentecost in christian faith", "output": [["hyde", "Pentecost commemorates the descent of the Holy Spirit upon the apostles fifty days after Easter, as described in Acts 2. The apostles began speaking in tongues and Peter preached to a crowd, leading to about 3,000 conversions. It is often called the birthday of the Christian Church and is celebrated as a major feast day."], ["lex", "Pentecost Christian Holy Spirit"], ["lex", "Pentecost Acts apostles church"], ["lex", "Pentecost feast day Christianity"], ["vec", "what is the meaning and significance of Pentecost in the Christian faith?"], ["vec", "what happened on the day of Pentecost according to the Book of Acts in the Bible?"]]} +{"query": "how to pay off student loans faster", "output": [["hyde", "Make payments above the minimum and specify that extra goes toward the principal. Refinance at a lower interest rate if your credit has improved. Use the avalanche method to target the highest-rate loan first. Set up biweekly payments instead of monthly to make one extra payment per year. Allocate windfalls like tax refunds directly to loans."], ["lex", "pay off student loans faster"], ["lex", "student loan repayment strategies"], ["lex", "student loan refinance extra payments"], ["vec", "what are the most effective strategies for paying off student loans ahead of schedule?"], ["vec", "how can refinancing or making extra payments help you pay off student loans faster?"]]} +{"query": "what are the characteristics of gothic literature?", "output": [["hyde", "Gothic literature features dark, brooding settings like castles, ruins, and isolated mansions. Common elements include supernatural events, madness, secrets, and heightened emotion. The atmosphere is oppressive and foreboding. Key works include Horace Walpole's The Castle of Otranto, Mary Shelley's Frankenstein, and Bram Stoker's Dracula."], ["lex", "gothic literature characteristics elements"], ["lex", "gothic fiction dark romantic horror"], ["lex", "gothic novel atmosphere supernatural"], ["vec", "what are the defining characteristics and common elements of gothic literature?"], ["vec", "how do gothic novels use setting, atmosphere, and the supernatural to create suspense and dread?"]]} +{"query": "how to register a political party", "output": [["hyde", "Requirements to register a political party vary by state. Generally, you must file organizational documents with the secretary of state, collect a minimum number of petition signatures (often 1-5% of registered voters), adopt a party platform and bylaws, and hold a founding convention. Some states also require fielding candidates in a certain number of races."], ["lex", "register political party requirements"], ["lex", "form new political party ballot access"], ["lex", "political party registration petition signatures"], ["vec", "what is the legal process for registering a new political party in the United States?"], ["vec", "what requirements must be met to officially form and register a political party for elections?"]]} +{"query": "leather reclining lounge chairs", "output": [["hyde", "The La-Z-Boy Kirkwood leather recliner features top-grain leather upholstery, a power reclining mechanism, and lumbar support. At $1,200, it's a mid-range option with a 10-year warranty. For premium choices, the Ekornes Stressless recliner offers ergonomic design with adjustable headrest and glide function starting at $2,500."], ["lex", "leather reclining lounge chair"], ["lex", "leather recliner chair buy"], ["lex", "reclining lounge chair living room"], ["vec", "what are the best leather reclining lounge chairs for comfort and durability?"], ["vec", "where can I buy a high-quality leather recliner chair for my living room?"]]} +{"query": "how to write a scientific research proposal", "output": [["hyde", "A scientific research proposal typically includes: title, abstract, specific aims, background and significance, preliminary data, research design and methods, timeline, budget and justification, and references. The specific aims page is the most critical — state the problem, your hypothesis, and 2-3 measurable objectives clearly in one page."], ["lex", "write scientific research proposal"], ["lex", "research proposal template structure"], ["lex", "grant proposal methodology aims"], ["vec", "how do you write a compelling scientific research proposal with clear aims and methodology?"], ["vec", "what sections and structure should a scientific research proposal include?"]]} +{"query": "how to open a savings account", "output": [["hyde", "To open a savings account, choose a bank or credit union and compare interest rates (high-yield online accounts often offer 4-5% APY). You'll need a government-issued ID, Social Security number, and an initial deposit (often $25-$100). Apply online or in person. Link a checking account for easy transfers and set up automatic deposits."], ["lex", "open savings account bank"], ["lex", "savings account requirements documents"], ["lex", "high yield savings account online"], ["vec", "what is the process for opening a savings account at a bank or online institution?"], ["vec", "what documents and minimum deposit do you need to open a savings account?"]]} +{"query": "what is the role of e-commerce in modern business", "output": [["hyde", "E-commerce enables businesses to sell products globally without physical storefronts. Companies use platforms like Shopify, Amazon Marketplace, and WooCommerce to reach customers online. In 2024, global e-commerce sales exceeded $6 trillion. Direct-to-consumer (DTC) brands cut out middlemen, while marketplaces aggregate sellers for one-stop shopping."], ["lex", "e-commerce business online retail"], ["lex", "e-commerce sales growth digital"], ["lex", "online shopping platform business model"], ["vec", "how has e-commerce transformed the way businesses sell products and reach customers?"], ["vec", "what role does e-commerce play in business strategy including direct-to-consumer and marketplace models?"]]} +{"query": "tree climb", "output": [["hyde", "Recreational tree climbing uses a doubled-rope technique (DRT) with a throw line to set the rope over a branch. Climbers wear a saddle harness and ascend using mechanical ascenders or friction hitches like the Blake's hitch. Arborists use single-rope technique (SRT) for efficiency and may use climbing spurs for removals only."], ["lex", "tree climbing techniques equipment"], ["lex", "recreational tree climbing arborist"], ["lex", "tree climbing harness rope"], ["vec", "what techniques and equipment are used for recreational or professional tree climbing?"], ["vec", "how do arborists safely climb trees using ropes, harnesses, and climbing spurs?"]]} +{"query": "how to upgrade car headlights?", "output": [["hyde", "To upgrade from halogen to LED headlights, find your bulb size in the owner's manual (e.g., H11, 9005). Purchase a quality LED kit from brands like Hikari or Fahren. Remove the old bulb by twisting the retaining ring, insert the LED bulb, and connect the driver/ballast. Aim the headlights after installation to avoid blinding oncoming traffic."], ["lex", "upgrade car headlights LED HID"], ["lex", "replace headlight bulbs brighter"], ["lex", "headlight upgrade installation"], ["vec", "how do you upgrade your car's headlights to brighter LED or HID bulbs?"], ["vec", "what are the steps for replacing stock halogen headlights with aftermarket LED headlights?"]]} +{"query": "what are the themes of to kill a mockingbird?", "output": [["hyde", "The central themes of To Kill a Mockingbird include racial injustice in the American South, as shown through Tom Robinson's trial. Moral courage is embodied by Atticus Finch, who defends Robinson despite social pressure. The loss of innocence is traced through Scout's growing awareness of prejudice and cruelty in Maycomb, Alabama."], ["lex", "To Kill a Mockingbird themes"], ["lex", "To Kill a Mockingbird racial injustice innocence"], ["lex", "Harper Lee themes moral courage"], ["vec", "what are the major themes explored in Harper Lee's To Kill a Mockingbird?"], ["vec", "how does To Kill a Mockingbird address racial injustice, moral courage, and the loss of innocence?"]]} +{"query": "how to install a car roof rack?", "output": [["hyde", "For cars with factory side rails, slide the crossbar feet onto the rails and tighten the clamps at your desired spacing. For bare roofs, use a fit kit with clips that hook into the door frame. Torque the mounting hardware to the manufacturer's specification (usually 6-8 Nm). Test by pushing firmly on the bars to confirm they don't shift."], ["lex", "install car roof rack"], ["lex", "roof rack mounting crossbars"], ["lex", "car roof rack installation guide"], ["vec", "how do you install a roof rack on a car with or without factory roof rails?"], ["vec", "what are the steps for mounting crossbars and a roof rack system on a vehicle?"]]} +{"query": "why is deforestation a concern?", "output": [["hyde", "Deforestation removes trees that absorb CO2, releasing stored carbon and accelerating climate change. Tropical forests hold over 50% of Earth's species — clearing them drives mass extinction. Deforested land loses topsoil to erosion, reducing agricultural productivity. The Amazon alone lost 10,000 square kilometers of forest in a single year."], ["lex", "deforestation environmental impact"], ["lex", "deforestation climate change biodiversity loss"], ["lex", "tropical rainforest destruction causes"], ["vec", "why is deforestation considered a serious environmental problem and what are its consequences?"], ["vec", "how does deforestation contribute to climate change, biodiversity loss, and soil erosion?"]]} +{"query": "how do philosophers explore the nature of reality", "output": [["hyde", "Metaphysics, the branch of philosophy concerned with the nature of reality, asks questions like: What exists? Is the physical world all there is? Plato argued that true reality consists of abstract Forms. Descartes proposed mind-body dualism. Materialists hold that only physical matter exists, while idealists like Berkeley argued that reality is fundamentally mental."], ["lex", "philosophy nature of reality metaphysics"], ["lex", "metaphysics ontology existence"], ["lex", "philosophical realism idealism"], ["vec", "how have philosophers historically explored and debated the nature of reality and existence?"], ["vec", "what are the main metaphysical positions on whether reality is fundamentally material, mental, or something else?"]]} +{"query": "how to build a writing routine", "output": [["hyde", "Set a specific time each day for writing — morning works best for many writers because willpower is highest. Start with a modest goal of 300-500 words and increase gradually. Write in the same place to create environmental cues. Track your word count daily. Don't edit while drafting — the first draft's only job is to exist."], ["lex", "writing routine daily habit"], ["lex", "build writing practice discipline"], ["lex", "writing schedule productivity"], ["vec", "how do you establish a consistent daily writing routine and maintain discipline?"], ["vec", "what strategies do professional writers use to build and sustain a writing habit?"]]} +{"query": "what are public sentiments on immigration", "output": [["hyde", "A 2025 Gallup poll found that 28% of Americans wanted immigration increased, 36% wanted it decreased, and 33% wanted it kept at current levels. Views split sharply along party lines: 55% of Democrats favored more immigration versus 11% of Republicans. In Europe, surveys showed rising concern about integration alongside recognition of labor market needs."], ["lex", "public opinion immigration polls"], ["lex", "immigration attitudes survey sentiment"], ["lex", "immigration policy public views 2025 2026"], ["vec", "what do recent polls and surveys reveal about public sentiment on immigration policy?"], ["vec", "how do public attitudes toward immigration vary by country, political affiliation, and demographics?"]]} +{"query": "how do people practice meditation in buddhism", "output": [["hyde", "Buddhist meditation includes two main types: samatha (calm abiding) and vipassana (insight). In Vipassana, practitioners observe bodily sensations and mental events with equanimity. Zen meditation (zazen) involves sitting with awareness of breath, often facing a wall. Tibetan Buddhism adds visualization practices and mantra recitation. All traditions emphasize mindful awareness."], ["lex", "Buddhist meditation practice techniques"], ["lex", "Vipassana Zen meditation Buddhism"], ["lex", "mindfulness meditation Buddhist traditions"], ["vec", "what are the main forms of meditation practiced in Buddhism and how are they performed?"], ["vec", "how do Vipassana, Zen, and Tibetan Buddhist meditation techniques differ from each other?"]]} +{"query": "how to edit in lightroom", "output": [["hyde", "In Lightroom's Develop module, start with the Basic panel: adjust Exposure for overall brightness, then Highlights and Shadows to recover detail. Set White Balance using the eyedropper or Temperature/Tint sliders. Increase Clarity for midtone contrast and Vibrance for subtle color boost. Use the HSL panel to fine-tune individual colors."], ["lex", "edit photos Adobe Lightroom"], ["lex", "Lightroom editing tutorial sliders"], ["lex", "Lightroom develop module adjustments"], ["vec", "how do you edit and enhance photos using Adobe Lightroom's develop module?"], ["vec", "what are the essential Lightroom editing steps for exposure, color, and tone adjustments?"]]} +{"query": "how does the philosophy of education explore learning", "output": [["hyde", "John Dewey's pragmatism views learning as experiential — students learn by doing and reflecting. Montessori emphasizes self-directed activity and hands-on learning in prepared environments. Constructivism holds that learners build knowledge actively rather than passively receiving it. Each philosophy leads to different classroom structures and teaching practices."], ["lex", "philosophy of education learning theory"], ["lex", "educational philosophy Dewey Montessori"], ["lex", "epistemology education pedagogy"], ["vec", "how do educational philosophers like Dewey and Montessori theorize about the nature of learning?"], ["vec", "what are the major philosophical approaches to education and how do they shape teaching methods?"]]} +{"query": "how to make a family budget?", "output": [["hyde", "List all family income sources including salaries, freelance work, and benefits. Categorize expenses into fixed (mortgage, insurance, utilities), variable (groceries, gas, clothing), and discretionary (dining out, entertainment). Allocate funds using the envelope method or a budgeting app like Mint or YNAB. Review spending together monthly."], ["lex", "family budget plan household"], ["lex", "family budget spreadsheet expenses"], ["lex", "household budgeting categories"], ["vec", "how do you create a family budget that accounts for all household income and expenses?"], ["vec", "what categories and tools should you use when building a family budget?"]]} +{"query": "what is the significance of the ten commandments", "output": [["hyde", "The Ten Commandments (Decalogue) were given by God to Moses on Mount Sinai, as recorded in Exodus 20 and Deuteronomy 5. They form the foundational moral code of Judaism and Christianity, covering duties to God (no other gods, no idols, keep the Sabbath) and duties to others (honor parents, do not murder, steal, or lie)."], ["lex", "Ten Commandments significance Bible"], ["lex", "Ten Commandments Moses Judaism Christianity"], ["lex", "Decalogue moral law religious"], ["vec", "what is the religious and historical significance of the Ten Commandments in Judaism and Christianity?"], ["vec", "how have the Ten Commandments influenced Western law, ethics, and moral codes?"]]} +{"query": "what is creative non-fiction?", "output": [["hyde", "Creative non-fiction uses literary techniques — narrative arc, scene-setting, dialogue, and vivid description — to tell true stories. Subgenres include memoir, personal essay, literary journalism, and nature writing. Unlike standard reporting, the writer's voice and perspective are central. Examples include Truman Capote's In Cold Blood and Joan Didion's essays."], ["lex", "creative non-fiction genre writing"], ["lex", "creative nonfiction memoir essay narrative"], ["lex", "literary nonfiction storytelling"], ["vec", "what is creative non-fiction and how does it differ from traditional journalism or academic writing?"], ["vec", "what techniques do creative non-fiction writers use to tell true stories in a literary way?"]]} +{"query": "air filter", "output": [["hyde", "Replace your car's engine air filter every 15,000-30,000 miles depending on driving conditions. Home HVAC filters should be changed every 1-3 months. HEPA filters capture 99.97% of particles 0.3 microns or larger. MERV ratings from 1-16 indicate filtration efficiency — MERV 13+ is recommended for allergy sufferers."], ["lex", "air filter replacement HVAC"], ["lex", "car engine air filter"], ["lex", "home air purifier HEPA filter"], ["vec", "how often should you replace an air filter in your car engine or home HVAC system?"], ["vec", "what types of air filters are available for home air purifiers and what do HEPA ratings mean?"]]} +{"query": "what is the periodic table", "output": [["hyde", "The periodic table organizes all known chemical elements by increasing atomic number into rows (periods) and columns (groups). Elements in the same group share similar chemical properties because they have the same number of valence electrons. Dmitri Mendeleev published the first widely recognized periodic table in 1869, predicting undiscovered elements."], ["lex", "periodic table elements chemistry"], ["lex", "periodic table groups periods atomic number"], ["lex", "Mendeleev periodic table organization"], ["vec", "what is the periodic table and how are chemical elements organized within it?"], ["vec", "how did Mendeleev create the periodic table and what patterns does it reveal about element properties?"]]} +{"query": "how to use green screen", "output": [["hyde", "Set up an evenly lit green screen with no wrinkles or shadows. Place the subject at least 6 feet in front of the screen to avoid green spill. Use two softbox lights at 45-degree angles on the screen and separate lights for the subject. In post-production, apply chroma key in software like DaVinci Resolve or After Effects to replace the green background."], ["lex", "green screen chroma key setup"], ["lex", "green screen video editing background"], ["lex", "green screen lighting technique"], ["vec", "how do you set up and use a green screen for video production and chroma key compositing?"], ["vec", "what lighting and camera settings are needed for clean green screen footage?"]]} +{"query": "what are the latest fashion trends 2023?", "output": [["hyde", "Key fashion trends in 2023 included quiet luxury with understated neutral tones and premium fabrics, oversized blazers and tailored wide-leg trousers, sheer fabrics, ballet flats, and the revival of denim-on-denim. Barbiecore pink carried over from 2022, while earth tones and burgundy gained momentum heading into 2024."], ["lex", "fashion trends 2023 2024 2025"], ["lex", "latest fashion trends clothing style"], ["lex", "2023 fashion runway trends"], ["vec", "what were the top fashion trends in 2023 and how have they evolved into 2024-2025?"], ["vec", "what clothing styles, colors, and silhouettes defined fashion trends in recent years?"]]} +{"query": "how to conduct field research", "output": [["hyde", "Field research involves collecting data in natural settings through observation, interviews, and surveys. Begin with a clear research question and ethical approval. Use participant observation to immerse yourself in the environment. Take detailed field notes immediately after each session. Triangulate data from multiple sources to strengthen validity."], ["lex", "field research methods data collection"], ["lex", "conduct field study observation interview"], ["lex", "ethnographic fieldwork techniques"], ["vec", "how do researchers plan and conduct field research including observation and interviews?"], ["vec", "what are the methods and ethical considerations involved in conducting ethnographic field research?"]]} +{"query": "digital currencies", "output": [["hyde", "Digital currencies exist only in electronic form and include cryptocurrencies like Bitcoin and Ethereum, which use decentralized blockchain networks, and central bank digital currencies (CBDCs) issued by governments. Bitcoin uses proof-of-work consensus while Ethereum moved to proof-of-stake. Over 130 countries are exploring or piloting CBDCs as of 2025."], ["lex", "digital currency cryptocurrency Bitcoin"], ["lex", "digital currency CBDC blockchain"], ["lex", "cryptocurrency exchange trading"], ["vec", "what are digital currencies including cryptocurrencies and central bank digital currencies (CBDCs)?"], ["vec", "how do digital currencies like Bitcoin and Ethereum work using blockchain technology?"]]} +{"query": "tree grow", "output": [["hyde", "Tree growth rates vary widely by species. Fast-growing trees like hybrid poplar and willow can add 3-5 feet per year, while oaks grow 1-2 feet annually. For healthy growth, plant in appropriate soil with adequate drainage, water deeply during the first two years, mulch around the base (not touching the trunk), and prune to establish strong structure."], ["lex", "tree growth rate species"], ["lex", "grow trees planting care"], ["lex", "tree growth stages seedling mature"], ["vec", "how fast do different tree species grow and what conditions promote healthy tree growth?"], ["vec", "what are the stages of tree growth from seedling to mature tree and how do you care for young trees?"]]} +{"query": "sail set", "output": [["hyde", "To set the mainsail, head into the wind and raise the halyard while feeding the luff into the mast track. Tension the outhaul and cunningham based on wind strength. When sailing upwind, trim the mainsheet until the telltales flow evenly. Ease the sheet when reaching or running. Adjust the jib sheet so the luff telltales break evenly."], ["lex", "sail set trim sailing"], ["lex", "setting sails rigging sailboat"], ["lex", "sail trim wind angle"], ["vec", "how do you properly set and trim sails on a sailboat for different wind conditions?"], ["vec", "what is the correct technique for setting a mainsail and jib when sailing upwind or downwind?"]]} +{"query": "how to apply the scientific method", "output": [["hyde", "The scientific method follows these steps: (1) Observe a phenomenon, (2) Ask a question, (3) Form a testable hypothesis, (4) Design and conduct an experiment with controlled variables, (5) Collect and analyze data, (6) Draw conclusions — does the evidence support or refute the hypothesis? (7) Communicate results and invite replication."], ["lex", "scientific method steps process"], ["lex", "apply scientific method experiment hypothesis"], ["lex", "scientific method observation data analysis"], ["vec", "what are the steps of the scientific method and how do you apply them to an experiment?"], ["vec", "how do scientists use the scientific method to test hypotheses and draw conclusions?"]]} +{"query": "what is the role of the holy spirit in christianity?", "output": [["hyde", "In Christian theology, the Holy Spirit is the third person of the Trinity — coequal with the Father and the Son. The Spirit convicts of sin, regenerates believers at conversion, indwells Christians as a guide and comforter, and empowers them with spiritual gifts (1 Corinthians 12). At Pentecost, the Spirit descended on the apostles, enabling them to preach."], ["lex", "Holy Spirit Christianity role"], ["lex", "Holy Spirit Trinity Christian theology"], ["lex", "Holy Spirit gifts fruits Bible"], ["vec", "what role does the Holy Spirit play in Christian theology and the life of believers?"], ["vec", "how is the Holy Spirit understood within the doctrine of the Trinity in Christianity?"]]} +{"query": "code review", "output": [["hyde", "During a code review, check for correctness, readability, and maintainability. Look for edge cases, error handling, and potential security issues. Verify that naming conventions are clear and tests cover the new code. Provide constructive feedback with specific suggestions rather than vague criticism. Approve only when the code is production-ready."], ["lex", "code review pull request"], ["lex", "code review checklist guidelines"], ["lex", "peer code review feedback"], ["vec", "what are the best practices for conducting an effective code review on a pull request?"], ["vec", "what should reviewers look for during a code review including bugs, readability, and architecture?"]]} +{"query": "how to manage personal finances", "output": [["hyde", "Start with a budget tracking all income and expenses. Build an emergency fund covering 3-6 months of expenses. Pay off high-interest debt aggressively. Contribute enough to your 401(k) to get the employer match, then fund a Roth IRA. Automate savings and investments. Review your financial plan quarterly and adjust as income or goals change."], ["lex", "personal finance management"], ["lex", "manage money budgeting saving investing"], ["lex", "personal financial planning"], ["vec", "what are the key steps for managing your personal finances including budgeting, saving, and investing?"], ["vec", "how should you organize your personal finances to build wealth and avoid debt?"]]} +{"query": "how to understand legislative documents", "output": [["hyde", "Legislative documents follow a standard structure: the title, enacting clause, definitions section, substantive provisions, and effective date. Start with the definitions section — legal terms often have specific meanings different from everyday use. Read the \"findings\" or \"purpose\" section for context. Track cross-references to other statutes. Legislative summaries from CRS or CBO can provide plain-language explanations."], ["lex", "read legislative documents bills statutes"], ["lex", "understand legislation legal language"], ["lex", "interpreting bills acts laws"], ["vec", "how do you read and interpret legislative documents such as bills, statutes, and regulations?"], ["vec", "what techniques help non-lawyers understand the language and structure of legislative texts?"]]} +{"query": "how to participate in public policy discussions", "output": [["hyde", "Attend town hall meetings and public comment sessions held by local and state government bodies. Submit written comments during rulemaking periods — federal agencies post proposed rules on regulations.gov. Contact your elected representatives by phone or email. Join advocacy organizations that align with your policy priorities and participate in their campaigns."], ["lex", "participate public policy discussion civic"], ["lex", "public policy engagement town hall"], ["lex", "citizen participation policy advocacy"], ["vec", "how can citizens effectively participate in public policy discussions and influence government decisions?"], ["vec", "what are the ways individuals can engage in public policy debates at the local, state, and federal level?"]]} +{"query": "what is the role of philosophy in religion?", "output": [["hyde", "Philosophy of religion examines fundamental questions that religions address: Does God exist? What is the nature of the soul? How can evil exist if God is omnipotent? Philosophers evaluate arguments for God's existence (cosmological, teleological, ontological) and critique them. The field also explores the relationship between faith and reason, asking whether religious belief can be rationally justified."], ["lex", "philosophy of religion theology"], ["lex", "philosophical arguments God existence"], ["lex", "religion philosophy relationship faith reason"], ["vec", "what role does philosophy play in examining and understanding religious beliefs and concepts?"], ["vec", "how do philosophers analyze religious claims about God, the soul, and the meaning of existence?"]]} +{"query": "what is outdoor survival training?", "output": [["hyde", "Outdoor survival training teaches skills needed to stay alive in wilderness emergencies. Core topics include building emergency shelters from natural materials, finding and purifying water, starting fire without matches using a ferro rod or bow drill, signaling for rescue, and basic navigation without GPS. Courses range from weekend workshops to multi-week immersive programs."], ["lex", "outdoor survival training wilderness"], ["lex", "survival skills shelter fire water"], ["lex", "wilderness survival course"], ["vec", "what does outdoor survival training involve and what skills does it teach?"], ["vec", "how do wilderness survival courses teach people to find shelter, water, fire, and food in the wild?"]]} +{"query": "what is the history of the jazz age", "output": [["hyde", "The Jazz Age, spanning roughly 1920-1929, was a cultural movement defined by the rise of jazz music, loosened social mores, and economic prosperity. Jazz originated in New Orleans and spread to Chicago and New York. The Harlem Renaissance saw Black artists, musicians, and writers flourish. Louis Armstrong, Duke Ellington, and Bessie Smith became icons. The era ended with the stock market crash of 1929."], ["lex", "Jazz Age history 1920s"], ["lex", "Jazz Age Harlem Renaissance Roaring Twenties"], ["lex", "jazz music history Louis Armstrong"], ["vec", "what was the Jazz Age and how did jazz music shape American culture in the 1920s?"], ["vec", "how did the Jazz Age connect to the Harlem Renaissance and the social changes of the Roaring Twenties?"]]} +{"query": "how to analyze government budgets", "output": [["hyde", "To analyze a government budget, start with the summary tables showing total revenue, total expenditure, and the deficit or surplus. Compare allocations across categories: defense, healthcare, education, infrastructure. Track year-over-year changes to identify spending trends. Examine revenue sources (income tax, sales tax, borrowing) and assess whether projected growth assumptions are realistic."], ["lex", "analyze government budget fiscal"], ["lex", "government budget analysis revenue expenditure"], ["lex", "federal state budget breakdown"], ["vec", "how do you read and analyze a government budget to understand spending priorities and fiscal health?"], ["vec", "what tools and frameworks are used to evaluate government budget allocations and deficits?"]]} +{"query": "how to learn python programming?", "output": [["hyde", "Start with Python's official tutorial at docs.python.org. Learn the basics: variables, data types, loops, conditionals, and functions. Practice on sites like LeetCode or HackerRank. Build small projects — a calculator, a to-do list, or a web scraper using requests and BeautifulSoup. Automate the Boring Stuff with Python is a popular free book for beginners."], ["lex", "learn Python programming beginner"], ["lex", "Python tutorial course exercises"], ["lex", "Python programming fundamentals syntax"], ["vec", "what is the best way for a beginner to learn Python programming from scratch?"], ["vec", "what resources, courses, and projects should someone use to learn Python programming?"]]} +{"query": "what is the gospel of wealth", "output": [["hyde", "The Gospel of Wealth is an 1889 essay by Andrew Carnegie arguing that the wealthy have a moral obligation to distribute their surplus wealth for the public good. Carnegie believed that rich individuals were better suited than government to direct resources toward education, libraries, and civic institutions. He practiced this philosophy by funding over 2,500 public libraries."], ["lex", "Gospel of Wealth Andrew Carnegie"], ["lex", "Gospel of Wealth philanthropy gilded age"], ["vec", "what is the Gospel of Wealth written by Andrew Carnegie and what does it argue about the duty of the rich?"], ["vec", "how did Andrew Carnegie's Gospel of Wealth influence philanthropy and attitudes toward wealth in America?"]]} +{"query": "how do various religions interpret the concept of god?", "output": [["hyde", "Christianity, Islam, and Judaism are monotheistic — they worship one God, though Christianity distinguishes three persons in the Trinity. Hinduism includes both monotheistic and polytheistic traditions: Brahman is the ultimate reality, while deities like Vishnu and Shiva represent aspects of it. Buddhism is non-theistic, focusing on awakening rather than worship of a creator God."], ["lex", "concept of God religions monotheism polytheism"], ["lex", "God Christianity Islam Hinduism Judaism"], ["lex", "religious interpretations divine nature"], ["vec", "how do different world religions like Christianity, Islam, Hinduism, and Buddhism understand the concept of God?"], ["vec", "what are the key differences between monotheistic, polytheistic, and non-theistic religious views of God?"]]} +{"query": "what is satire", "output": [["hyde", "Satire uses irony, exaggeration, and ridicule to expose and criticize foolishness or corruption. Jonathan Swift's A Modest Proposal satirized British policy toward Ireland by suggesting the poor sell their children as food. George Orwell's Animal Farm satirized Soviet totalitarianism. Modern satire appears in shows like The Daily Show and publications like The Onion."], ["lex", "satire literary device definition"], ["lex", "satire examples humor criticism"], ["lex", "satirical writing Swift Orwell"], ["vec", "what is satire as a literary form and how does it use humor to criticize people, institutions, or society?"], ["vec", "what are famous examples of satire in literature, television, and political commentary?"]]} +{"query": "json serial", "output": [["hyde", "JSON serialization converts an object into a JSON string for storage or transmission. In JavaScript, JSON.stringify(obj) serializes and JSON.parse(str) deserializes. In Python, json.dumps(obj) converts to a string and json.loads(str) parses back. Custom serialization for dates or complex types requires encoder/decoder overrides."], ["lex", "JSON serialization deserialization"], ["lex", "JSON serialize object string"], ["lex", "JSON stringify parse encoding"], ["vec", "how do you serialize objects to JSON and deserialize JSON strings back to objects in programming?"], ["vec", "what functions are used for JSON serialization in Python, JavaScript, and other languages?"]]} +{"query": "how to fix car air conditioning?", "output": [["hyde", "If your car AC blows warm air, check the refrigerant level first — low refrigerant is the most common cause. Use a recharge kit with R-134a (or R-1234yf for newer cars) and a pressure gauge. If the compressor clutch doesn't engage, check the fuse and relay. A leak requires UV dye detection and repair before recharging. Cabin filter clogs can also reduce airflow."], ["lex", "fix car air conditioning AC repair"], ["lex", "car AC not blowing cold recharge"], ["lex", "automotive AC compressor refrigerant"], ["vec", "how do you diagnose and fix a car air conditioning system that is not blowing cold air?"], ["vec", "what are the common causes of car AC failure and how do you recharge the refrigerant?"]]} +{"query": "what is moral absolutism", "output": [["hyde", "Moral absolutism holds that certain actions are intrinsically right or wrong regardless of context, culture, or consequences. For example, an absolutist would say lying is always wrong, even to protect someone. This view aligns with Kantian deontology and natural law theory. Critics argue it fails to account for moral dilemmas where absolute rules conflict."], ["lex", "moral absolutism ethics definition"], ["lex", "moral absolutism versus relativism"], ["lex", "absolute moral principles deontology"], ["vec", "what is moral absolutism and how does it differ from moral relativism in ethical philosophy?"], ["vec", "what are the arguments for and against the view that some moral rules are universally true?"]]} +{"query": "world capitals quiz", "output": [["hyde", "Capitals quiz: Paris (France), Tokyo (Japan), Canberra (Australia), Brasília (Brazil), Ottawa (Canada). Quiz includes 50+ capitals."], ["lex", "world overview capitals quiz tutorial"], ["lex", "world overview capitals quiz guide"], ["lex", "world overview capitals quiz examples"], ["vec", "guide for world capitals quiz"], ["vec", "how to world capitals quiz"]]} +{"query": "trivia facts about space", "output": [["hyde", "Trivia: The universe is 13.8 billion years old. There are an estimated 100 billion galaxies. The Milky Way is about 100,000 light-years wide."], ["lex", "trivia overview facts about space examples"], ["lex", "trivia facts about space best practices"], ["lex", "trivia overview facts about space guide"], ["vec", "understanding trivia facts about space"], ["vec", "guide for trivia facts about space"]]} +{"query": "did you know history", "output": [["hyde", "Did you know? The Great Wall of China is over 13,000 miles long. Cleopatra lived closer to the moon landing than the building of the pyramids."], ["lex", "did overview you know history examples"], ["lex", "did overview you know history guide"], ["lex", "did you know history best practices"], ["vec", "complete did you know history reference"], ["vec", "learn about did you know history"]]} +{"query": "random science facts", "output": [["hyde", "Science fact: Water can boil and freeze at the same time at 0.01°C. This phenomenon is called the triple point of water."], ["lex", "random overview science facts tutorial"], ["lex", "random overview science facts guide"], ["lex", "random science facts best practices"], ["vec", "how to random science facts"], ["vec", "guide for random science facts"]]} +{"query": "famous inventions timeline", "output": [["hyde", "Famous inventions timeline: 1440 - Printing Press by Gutenberg, 1876 - Telephone by Bell, 1903 - Airplane by Wright Brothers, 1971 - Microprocessor."], ["lex", "famous inventions timeline best practices"], ["lex", "famous inventions timeline documentation"], ["lex", "famous overview inventions timeline tutorial"], ["vec", "how to famous inventions timeline"], ["vec", "complete famous inventions timeline reference"]]} +{"query": "world records list", "output": [["hyde", "World records: Longest human tunnel traveled through by a skateboarding dog: 30.1 m (98 ft). Fastest 100m sprint: Usain Bolt, 9.58 seconds."], ["lex", "world overview records list guide"], ["lex", "world overview records list tutorial"], ["lex", "world records list best practices"], ["vec", "how to world records list"], ["vec", "understanding world records list"]]} +{"query": "fun geography facts", "output": [["hyde", "Geography fact: Russia is the largest country at 17.1 million km². Canada follows at 9.98 million km². There are 195 countries worldwide."], ["lex", "fun geography facts documentation"], ["lex", "fun overview geography facts guide"], ["lex", "fun overview geography facts examples"], ["vec", "guide for fun geography facts"], ["vec", "understanding fun geography facts"]]} +{"query": "historical trivia questions", "output": [["hyde", "Historical trivia: Did you know that the first Olympic Games were held in 776 BC in Olympia, Greece? The games lasted for nearly 12 centuries."], ["lex", "historical trivia questions documentation"], ["lex", "historical overview trivia questions guide"], ["lex", "historical trivia questions best practices"], ["vec", "how to historical trivia questions"], ["vec", "guide for historical trivia questions"]]} +{"query": "animal trivia facts", "output": [["hyde", "Animal trivia: A group of flamingos is called a 'flamboyance.' Octopuses have three hearts and blue blood. Elephants are the largest land mammals."], ["lex", "animal trivia facts best practices"], ["lex", "animal overview trivia facts tutorial"], ["lex", "animal overview trivia facts guide"], ["vec", "complete animal trivia facts reference"], ["vec", "guide for animal trivia facts"]]} +{"query": "sports trivia records", "output": [["hyde", "Sports records: Michael Phelps holds 23 Olympic gold medals in swimming. The fastest recorded serve in tennis was 263 km/h by Sam Groth."], ["lex", "sports overview trivia records examples"], ["lex", "sports trivia records documentation"], ["lex", "sports overview trivia records guide"], ["vec", "learn about sports trivia records"], ["vec", "how to sports trivia records"]]} +{"query": "largest countries by area", "output": [["hyde", "Largest countries by area: Russia (17.1 million km²), Canada (9.98 million km²), China (9.6 million km²), USA (9.83 million km²)."], ["lex", "largest overview countries by area guide"], ["lex", "largest countries by area documentation"], ["lex", "largest countries by area best practices"], ["vec", "understanding largest countries by area"], ["vec", "complete largest countries by area reference"]]} +{"query": "rivers that cross multiple countries", "output": [["hyde", "Rivers crossing countries: The Danube flows through 10 countries, including Germany and Romania. The Nile passes through 11 countries in Africa."], ["lex", "rivers that cross multiple countries documentation"], ["lex", "rivers overview that cross multiple countries tutorial"], ["lex", "rivers overview that cross multiple countries guide"], ["vec", "complete rivers that cross multiple countries reference"], ["vec", "understanding rivers that cross multiple countries"]]} +{"query": "highest mountain peaks", "output": [["hyde", "Highest peaks: Mount Everest (8,848 m) in Nepal, K2 (8,611 m) in Pakistan, Kangchenjunga (8,586 m) on the India-Nepal border."], ["lex", "highest mountain peaks documentation"], ["lex", "highest overview mountain peaks examples"], ["lex", "highest overview mountain peaks guide"], ["vec", "understanding highest mountain peaks"], ["vec", "guide for highest mountain peaks"]]} +{"query": "desert climate zones", "output": [["hyde", "Desert climate zones: Hot deserts like the Sahara average 40°C in summer. Cold deserts like Antarctica can drop to -60°C in winter."], ["lex", "desert overview climate zones examples"], ["lex", "desert climate zones documentation"], ["lex", "desert overview climate zones tutorial"], ["vec", "guide for desert climate zones"], ["vec", "how to desert climate zones"]]} +{"query": "island nations list", "output": [["hyde", "Island nations list: Japan, Madagascar, Iceland, the Philippines, and New Zealand are prominent island nations, each with unique ecosystems."], ["lex", "island overview nations list guide"], ["lex", "island nations list best practices"], ["lex", "island nations list documentation"], ["vec", "understanding island nations list"], ["vec", "how to island nations list"]]} +{"query": "capital cities europe", "output": [["hyde", "European capitals: Berlin (Germany), Madrid (Spain), Rome (Italy), Vienna (Austria), and Budapest (Hungary) are key capitals in Europe."], ["lex", "capital cities europe best practices"], ["lex", "capital cities europe documentation"], ["lex", "capital overview cities europe tutorial"], ["vec", "guide for capital cities europe"], ["vec", "learn about capital cities europe"]]} +{"query": "population by continent", "output": [["hyde", "Population by continent: Asia (4.7 billion), Africa (1.3 billion), Europe (748 million), North America (579 million), South America (430 million)."], ["lex", "population overview by continent guide"], ["lex", "population overview by continent examples"], ["lex", "population by continent best practices"], ["vec", "learn about population by continent"], ["vec", "understanding population by continent"]]} +{"query": "time zones map", "output": [["hyde", "Time zones: The Earth has 24 time zones. UTC+0 is Greenwich Mean Time; UTC+14 includes parts of Kiribati, the earliest timezone."], ["lex", "time overview zones map tutorial"], ["lex", "time overview zones map guide"], ["lex", "time zones map documentation"], ["vec", "how to time zones map"], ["vec", "complete time zones map reference"]]} +{"query": "latitude longitude coordinates", "output": [["hyde", "Latitude/Longitude: The coordinates for the Eiffel Tower are 48.8584° N, 2.2945° E. The exact point can pinpoint any location globally."], ["lex", "latitude longitude coordinates best practices"], ["lex", "latitude longitude coordinates documentation"], ["lex", "latitude overview longitude coordinates tutorial"], ["vec", "complete latitude longitude coordinates reference"], ["vec", "how to latitude longitude coordinates"]]} +{"query": "borders between countries", "output": [["hyde", "Country borders: The longest border is between the USA and Canada (8,891 km). The shortest is between Spain and Portugal (1,214 km)."], ["lex", "borders overview between countries tutorial"], ["lex", "borders between countries documentation"], ["lex", "borders between countries best practices"], ["vec", "learn about borders between countries"], ["vec", "complete borders between countries reference"]]} +{"query": "ocean currents patterns", "output": [["hyde", "Ocean currents: The Gulf Stream carries warm water from the Gulf of Mexico to the North Atlantic. The Antarctic Circumpolar Current is the largest."], ["lex", "ocean overview currents patterns tutorial"], ["lex", "ocean overview currents patterns examples"], ["lex", "ocean currents patterns documentation"], ["vec", "understanding ocean currents patterns"], ["vec", "how to ocean currents patterns"]]} +{"query": "tectonic plate boundaries", "output": [["hyde", "Tectonic plates: There are seven major plates: Pacific, North American, Eurasian, African, South American, Antarctic, and Indo-Australian."], ["lex", "tectonic overview plate boundaries examples"], ["lex", "tectonic plate boundaries documentation"], ["lex", "tectonic plate boundaries best practices"], ["vec", "complete tectonic plate boundaries reference"], ["vec", "learn about tectonic plate boundaries"]]} +{"query": "climate zones earth", "output": [["hyde", "Climate zones: The Earth has five main climate zones: Tropical, Dry, Temperate, Continental, and Polar, each affecting ecosystems differently."], ["lex", "climate overview zones earth tutorial"], ["lex", "climate overview zones earth guide"], ["lex", "climate zones earth documentation"], ["vec", "learn about climate zones earth"], ["vec", "guide for climate zones earth"]]} +{"query": "stoicism daily practice", "output": [["hyde", "Stoicism daily practice: Key practices include negative visualization, focusing on what’s within your control, and maintaining a gratitude journal."], ["lex", "stoicism overview daily practice examples"], ["lex", "stoicism daily practice best practices"], ["lex", "stoicism overview daily practice tutorial"], ["vec", "guide for stoicism daily practice"], ["vec", "learn about stoicism daily practice"]]} +{"query": "existentialism meaning life", "output": [["hyde", "Existentialism: A philosophical theory emphasizing individual existence, freedom, and choice, suggesting meaning in life is self-created."], ["lex", "existentialism overview meaning life examples"], ["lex", "existentialism overview meaning life guide"], ["lex", "existentialism meaning life documentation"], ["vec", "learn about existentialism meaning life"], ["vec", "complete existentialism meaning life reference"]]} +{"query": "utilitarianism ethics explained", "output": [["hyde", "Utilitarianism posits that actions are right if they promote happiness. Jeremy Bentham's principle of utility focuses on maximizing pleasure for the greatest number."], ["lex", "utilitarianism overview ethics explained tutorial"], ["lex", "utilitarianism overview ethics explained guide"], ["lex", "utilitarianism overview ethics explained examples"], ["vec", "guide for utilitarianism ethics explained"], ["vec", "complete utilitarianism ethics explained reference"]]} +{"query": "kant categorical imperative", "output": [["hyde", "Kant's Categorical Imperative asserts that one should act only according to maxims that can be universalized. It emphasizes duty and moral law over consequences."], ["lex", "kant categorical imperative best practices"], ["lex", "kant overview categorical imperative guide"], ["lex", "kant overview categorical imperative tutorial"], ["vec", "complete kant categorical imperative reference"], ["vec", "how to kant categorical imperative"]]} +{"query": "free will determinism debate", "output": [["hyde", "The free will vs determinism debate questions whether human actions are determined by external factors or if individuals possess genuine choice in their decisions."], ["lex", "free will determinism debate documentation"], ["lex", "free overview will determinism debate examples"], ["lex", "free overview will determinism debate tutorial"], ["vec", "complete free will determinism debate reference"], ["vec", "learn about free will determinism debate"]]} +{"query": "nietzsche will to power", "output": [["hyde", "Nietzsche's 'will to power' refers to an intrinsic drive to assert and enhance one's influence and creativity, transcending traditional moral values and societal norms."], ["lex", "nietzsche overview will to power guide"], ["lex", "nietzsche will to power best practices"], ["lex", "nietzsche overview will to power examples"], ["vec", "complete nietzsche will to power reference"], ["vec", "learn about nietzsche will to power"]]} +{"query": "socrates method questioning", "output": [["hyde", "Socrates employed the elenchus method, a form of cooperative argumentative dialogue, to stimulate critical thinking and illuminate ideas through questioning and refutation."], ["lex", "socrates overview method questioning guide"], ["lex", "socrates overview method questioning tutorial"], ["lex", "socrates overview method questioning examples"], ["vec", "understanding socrates method questioning"], ["vec", "complete socrates method questioning reference"]]} +{"query": "plato theory forms", "output": [["hyde", "Plato's Theory of Forms posits that non-material abstract forms, rather than material objects, represent the most accurate reality, influencing his views on knowledge and truth."], ["lex", "plato overview theory forms tutorial"], ["lex", "plato theory forms best practices"], ["lex", "plato overview theory forms guide"], ["vec", "how to plato theory forms"], ["vec", "guide for plato theory forms"]]} +{"query": "aristotle virtue ethics", "output": [["hyde", "Aristotle's virtue ethics emphasizes character and the importance of developing virtuous habits. The 'Golden Mean' represents moderation between extremes of behavior."], ["lex", "aristotle virtue ethics documentation"], ["lex", "aristotle virtue ethics best practices"], ["lex", "aristotle overview virtue ethics tutorial"], ["vec", "complete aristotle virtue ethics reference"], ["vec", "how to aristotle virtue ethics"]]} +{"query": "descartes cogito ergo sum", "output": [["hyde", "Descartes' 'Cogito, ergo sum' ('I think, therefore I am') establishes self-awareness as the foundational element of knowledge and existence, emphasizing rational thought."], ["lex", "descartes overview cogito ergo sum guide"], ["lex", "descartes overview cogito ergo sum examples"], ["lex", "descartes cogito ergo sum best practices"], ["vec", "complete descartes cogito ergo sum reference"], ["vec", "learn about descartes cogito ergo sum"]]} +{"query": "logic propositional calculus", "output": [["hyde", "Propositional calculus studies logical relationships between propositions, using connectives like AND, OR, NOT. It's foundational for modern logic and computation."], ["lex", "logic propositional calculus documentation"], ["lex", "logic overview propositional calculus tutorial"], ["lex", "logic overview propositional calculus guide"], ["vec", "understanding logic propositional calculus"], ["vec", "complete logic propositional calculus reference"]]} +{"query": "epistemology knowledge theory", "output": [["hyde", "Epistemology investigates the nature of knowledge, addressing questions of belief, truth, and justification. Key figures include Plato, Descartes, and Kant."], ["lex", "epistemology overview knowledge theory examples"], ["lex", "epistemology overview knowledge theory tutorial"], ["lex", "epistemology knowledge theory documentation"], ["vec", "learn about epistemology knowledge theory"], ["vec", "complete epistemology knowledge theory reference"]]} +{"query": "metaphysics existence reality", "output": [["hyde", "Metaphysics explores fundamental questions about existence and reality, including the nature of objects, causality, and the relationship between mind and matter."], ["lex", "metaphysics overview existence reality tutorial"], ["lex", "metaphysics existence reality best practices"], ["lex", "metaphysics overview existence reality guide"], ["vec", "understanding metaphysics existence reality"], ["vec", "how to metaphysics existence reality"]]} +{"query": "ancient civilizations timeline", "output": [["hyde", "Ancient civilizations timeline: Sumerians (c. 3500 BCE), Egyptians (c. 3100 BCE), Indus Valley (c. 2500 BCE), Greeks (c. 800 BCE), Romans (c. 500 BCE)."], ["lex", "ancient civilizations timeline documentation"], ["lex", "ancient overview civilizations timeline examples"], ["lex", "ancient civilizations timeline best practices"], ["vec", "complete ancient civilizations timeline reference"], ["vec", "understanding ancient civilizations timeline"]]} +{"query": "roman empire fall reasons", "output": [["hyde", "The fall of the Roman Empire is attributed to economic troubles, military defeats, political corruption, and invasions by barbarian tribes, culminating in 476 CE."], ["lex", "roman overview empire fall reasons guide"], ["lex", "roman empire fall reasons best practices"], ["lex", "roman empire fall reasons documentation"], ["vec", "guide for roman empire fall reasons"], ["vec", "how to roman empire fall reasons"]]} +{"query": "medieval period events", "output": [["hyde", "Key medieval events include the rise of feudalism (9th century), the Crusades (1096-1291), the Black Death (1347-1351), and the Hundred Years' War (1337-1453)."], ["lex", "medieval period events documentation"], ["lex", "medieval period events best practices"], ["lex", "medieval overview period events tutorial"], ["vec", "learn about medieval period events"], ["vec", "how to medieval period events"]]} +{"query": "renaissance art movement", "output": [["hyde", "The Renaissance art movement (14th-17th centuries) emphasized realism, perspective, and humanism, with figures like da Vinci, Michelangelo, and Raphael leading innovations."], ["lex", "renaissance overview art movement examples"], ["lex", "renaissance overview art movement guide"], ["lex", "renaissance art movement documentation"], ["vec", "understanding renaissance art movement"], ["vec", "how to renaissance art movement"]]} +{"query": "industrial revolution inventions", "output": [["hyde", "The Industrial Revolution (1760-1840) introduced inventions such as the steam engine (James Watt), power loom (Edmund Cartwright), and spinning jenny (James Hargreaves)."], ["lex", "industrial overview revolution inventions tutorial"], ["lex", "industrial revolution inventions best practices"], ["lex", "industrial overview revolution inventions examples"], ["vec", "how to industrial revolution inventions"], ["vec", "guide for industrial revolution inventions"]]} +{"query": "world war i causes", "output": [["hyde", "World War I was triggered by the assassination of Archduke Franz Ferdinand in 1914, leading to complex alliances and militarism among European powers."], ["lex", "world overview war i causes tutorial"], ["lex", "world war i causes documentation"], ["lex", "world war i causes best practices"], ["vec", "learn about world war i causes"], ["vec", "how to world war i causes"]]} +{"query": "cold war key events", "output": [["hyde", "Key Cold War events include the Berlin Airlift (1948), Cuban Missile Crisis (1962), Vietnam War (1955-1975), and the fall of the Berlin Wall (1989)."], ["lex", "cold war key events best practices"], ["lex", "cold overview war key events tutorial"], ["lex", "cold overview war key events guide"], ["vec", "understanding cold war key events"], ["vec", "learn about cold war key events"]]} +{"query": "french revolution timeline", "output": [["hyde", "The French Revolution timeline: Estates-General convened (1789), Storming of the Bastille (July 14, 1789), Declaration of the Rights of Man (August 1789), Reign of Terror (1793-1794)."], ["lex", "french overview revolution timeline tutorial"], ["lex", "french revolution timeline documentation"], ["lex", "french overview revolution timeline guide"], ["vec", "understanding french revolution timeline"], ["vec", "guide for french revolution timeline"]]} +{"query": "american civil war battles", "output": [["hyde", "American Civil War battles include Fort Sumter (1861), Gettysburg (1863), and Appomattox Court House (1865), marking pivotal moments in the conflict's progression."], ["lex", "american civil war battles documentation"], ["lex", "american overview civil war battles tutorial"], ["lex", "american overview civil war battles guide"], ["vec", "learn about american civil war battles"], ["vec", "complete american civil war battles reference"]]} +{"query": "egyptian pharaohs dynasty", "output": [["hyde", "Egyptian pharaohs dynasty lasted over 3,000 years, beginning with Narmer (c. 3100 BCE) and ending with Cleopatra VII (30 BCE), showcasing significant cultural achievements."], ["lex", "egyptian overview pharaohs dynasty guide"], ["lex", "egyptian overview pharaohs dynasty examples"], ["lex", "egyptian pharaohs dynasty documentation"], ["vec", "how to egyptian pharaohs dynasty"], ["vec", "understanding egyptian pharaohs dynasty"]]} +{"query": "bronze age collapse", "output": [["hyde", "The Bronze Age collapse (c. 1200 BCE) saw the fall of several civilizations due to factors like climate change, invasions, and trade disruptions, affecting the Eastern Mediterranean."], ["lex", "bronze overview age collapse guide"], ["lex", "bronze overview age collapse tutorial"], ["lex", "bronze age collapse documentation"], ["vec", "guide for bronze age collapse"], ["vec", "understanding bronze age collapse"]]} +{"query": "byzantine empire history", "output": [["hyde", "The Byzantine Empire's history spans from 330 CE with Byzantium's founding to 1453 CE, marked by the preservation of Greek and Roman culture amid Islamic conquests."], ["lex", "byzantine overview empire history tutorial"], ["lex", "byzantine empire history best practices"], ["lex", "byzantine empire history documentation"], ["vec", "learn about byzantine empire history"], ["vec", "how to byzantine empire history"]]} +{"query": "vietnam war timeline", "output": [["hyde", "The Vietnam War timeline includes the Gulf of Tonkin Incident (1964), Tet Offensive (1968), and the fall of Saigon (1975), reflecting U.S. involvement and eventual withdrawal."], ["lex", "vietnam overview war timeline examples"], ["lex", "vietnam war timeline best practices"], ["lex", "vietnam war timeline documentation"], ["vec", "understanding vietnam war timeline"], ["vec", "complete vietnam war timeline reference"]]} +{"query": "quantum mechanics basics", "output": [["hyde", "Quantum mechanics basics include wave-particle duality, Heisenberg's uncertainty principle, and quantum entanglement, fundamentally altering our understanding of physics."], ["lex", "quantum overview mechanics basics guide"], ["lex", "quantum mechanics basics documentation"], ["lex", "quantum overview mechanics basics examples"], ["vec", "complete quantum mechanics basics reference"], ["vec", "learn about quantum mechanics basics"]]} +{"query": "theory of relativity explained", "output": [["hyde", "Einstein's theory posits that space and time are interwoven, with mass influencing curvature. Notably, E=mc² links mass and energy equivalence."], ["lex", "theory of relativity explained documentation"], ["lex", "theory overview of relativity explained examples"], ["lex", "theory overview of relativity explained tutorial"], ["vec", "learn about theory of relativity explained"], ["vec", "guide for theory of relativity explained"]]} +{"query": "dna structure discovery", "output": [["hyde", "James Watson and Francis Crick elucidated DNA's double helix structure in 1953, revealing its base pairing of adenine with thymine, and cytosine with guanine."], ["lex", "dna structure discovery best practices"], ["lex", "dna overview structure discovery tutorial"], ["lex", "dna overview structure discovery guide"], ["vec", "understanding dna structure discovery"], ["vec", "learn about dna structure discovery"]]} +{"query": "photosynthesis process steps", "output": [["hyde", "Photosynthesis occurs in chloroplasts, involving light absorption, water splitting, and CO2 fixation. Key steps: light-dependent reactions and Calvin cycle."], ["lex", "photosynthesis process steps documentation"], ["lex", "photosynthesis overview process steps guide"], ["lex", "photosynthesis overview process steps examples"], ["vec", "guide for photosynthesis process steps"], ["vec", "complete photosynthesis process steps reference"]]} +{"query": "black holes physics", "output": [["hyde", "Black holes form from collapsing stars, exhibiting extreme gravitational pull. The event horizon marks the boundary beyond which nothing escapes."], ["lex", "black overview holes physics tutorial"], ["lex", "black overview holes physics examples"], ["lex", "black holes physics best practices"], ["vec", "understanding black holes physics"], ["vec", "complete black holes physics reference"]]} +{"query": "plate tectonics theory", "output": [["hyde", "Plate tectonics theory explains Earth's lithosphere's movement. It describes continental drift, seafloor spreading, and the creation of mountain ranges."], ["lex", "plate overview tectonics theory examples"], ["lex", "plate overview tectonics theory guide"], ["lex", "plate tectonics theory best practices"], ["vec", "how to plate tectonics theory"], ["vec", "guide for plate tectonics theory"]]} +{"query": "evolution natural selection", "output": [["hyde", "Natural selection, proposed by Charles Darwin, drives evolution. Traits enhancing survival and reproduction become more common in successive generations."], ["lex", "evolution overview natural selection examples"], ["lex", "evolution natural selection best practices"], ["lex", "evolution natural selection documentation"], ["vec", "learn about evolution natural selection"], ["vec", "guide for evolution natural selection"]]} +{"query": "periodic table elements", "output": [["hyde", "The periodic table contains 118 elements, organized by atomic number. Notable groups include alkali metals (Group 1) and noble gases (Group 18)."], ["lex", "periodic overview table elements tutorial"], ["lex", "periodic overview table elements examples"], ["lex", "periodic table elements best practices"], ["vec", "understanding periodic table elements"], ["vec", "complete periodic table elements reference"]]} +{"query": "cell biology fundamentals", "output": [["hyde", "Cell biology studies the structure and function of cells. Key components include the nucleus, mitochondria, and the plasma membrane."], ["lex", "cell overview biology fundamentals tutorial"], ["lex", "cell overview biology fundamentals examples"], ["lex", "cell biology fundamentals best practices"], ["vec", "complete cell biology fundamentals reference"], ["vec", "how to cell biology fundamentals"]]} +{"query": "climate change evidence", "output": [["hyde", "Evidence for climate change includes rising global temperatures, with a 1.2°C increase since the late 19th century, and increased atmospheric CO2 levels."], ["lex", "climate change evidence best practices"], ["lex", "climate overview change evidence examples"], ["lex", "climate change evidence documentation"], ["vec", "learn about climate change evidence"], ["vec", "complete climate change evidence reference"]]} +{"query": "impressionist painters list", "output": [["hyde", "Notable Impressionist painters include Claude Monet, Edgar Degas, and Pierre-Auguste Renoir, who emphasized light and color in their works."], ["lex", "impressionist overview painters list tutorial"], ["lex", "impressionist painters list best practices"], ["lex", "impressionist overview painters list guide"], ["vec", "understanding impressionist painters list"], ["vec", "complete impressionist painters list reference"]]} +{"query": "shakespeare plays summary", "output": [["hyde", "Shakespeare's plays include tragedies like 'Hamlet' and 'Macbeth', comedies such as 'A Midsummer Night's Dream', and historical plays like 'Henry V'."], ["lex", "shakespeare overview plays summary guide"], ["lex", "shakespeare overview plays summary examples"], ["lex", "shakespeare overview plays summary tutorial"], ["vec", "how to shakespeare plays summary"], ["vec", "learn about shakespeare plays summary"]]} +{"query": "classical music composers", "output": [["hyde", "Influential classical music composers include Johann Sebastian Bach, Ludwig van Beethoven, and Wolfgang Amadeus Mozart, each shaping the genre profoundly."], ["lex", "classical overview music composers examples"], ["lex", "classical music composers documentation"], ["lex", "classical music composers best practices"], ["vec", "how to classical music composers"], ["vec", "understanding classical music composers"]]} +{"query": "modern art movements", "output": [["hyde", "Modern art movements include Abstract Expressionism, Surrealism, and Cubism, with key figures like Jackson Pollock, Salvador Dalí, and Pablo Picasso."], ["lex", "modern overview art movements tutorial"], ["lex", "modern overview art movements examples"], ["lex", "modern overview art movements guide"], ["vec", "how to modern art movements"], ["vec", "guide for modern art movements"]]} +{"query": "film noir characteristics", "output": [["hyde", "Film noir is characterized by its moral ambiguity, femme fatales, and stark lighting. Notable films include 'Double Indemnity' and 'The Maltese Falcon'."], ["lex", "film overview noir characteristics examples"], ["lex", "film overview noir characteristics tutorial"], ["lex", "film noir characteristics documentation"], ["vec", "guide for film noir characteristics"], ["vec", "how to film noir characteristics"]]} +{"query": "jazz history origins", "output": [["hyde", "Jazz originated in the early 20th century in New Orleans, blending African rhythms with blues and ragtime, leading to styles like bebop and smooth jazz."], ["lex", "jazz history origins best practices"], ["lex", "jazz history origins documentation"], ["lex", "jazz overview history origins tutorial"], ["vec", "learn about jazz history origins"], ["vec", "understanding jazz history origins"]]} +{"query": "renaissance sculpture techniques", "output": [["hyde", "Renaissance sculpture techniques included contrapposto for dynamic poses and lost-wax casting for bronze works, exemplified by Michelangelo's David."], ["lex", "renaissance sculpture techniques documentation"], ["lex", "renaissance overview sculpture techniques examples"], ["lex", "renaissance sculpture techniques best practices"], ["vec", "how to renaissance sculpture techniques"], ["vec", "guide for renaissance sculpture techniques"]]} +{"query": "photography composition rules", "output": [["hyde", "Photography composition rules include the rule of thirds, leading lines, and framing, which enhance visual storytelling and engagement in images."], ["lex", "photography composition rules best practices"], ["lex", "photography composition rules documentation"], ["lex", "photography overview composition rules guide"], ["vec", "understanding photography composition rules"], ["vec", "complete photography composition rules reference"]]} +{"query": "poetry forms haiku", "output": [["hyde", "Haiku, a traditional Japanese form, consists of three lines with a 5-7-5 syllable structure, capturing nature and emotions in a concise format."], ["lex", "poetry forms haiku documentation"], ["lex", "poetry overview forms haiku examples"], ["lex", "poetry overview forms haiku guide"], ["vec", "learn about poetry forms haiku"], ["vec", "how to poetry forms haiku"]]} +{"query": "baroque art characteristics", "output": [["hyde", "Baroque art features dramatic use of light and shadow (chiaroscuro), emotional intensity, and grandeur, seen in works by Caravaggio and Bernini."], ["lex", "baroque overview art characteristics tutorial"], ["lex", "baroque overview art characteristics guide"], ["lex", "baroque art characteristics best practices"], ["vec", "complete baroque art characteristics reference"], ["vec", "guide for baroque art characteristics"]]} +{"query": "street art graffiti history", "output": [["hyde", "Street art and graffiti emerged in the late 20th century, with artists like Banksy gaining prominence. It often serves as social and political commentary."], ["lex", "street overview art graffiti history guide"], ["lex", "street overview art graffiti history examples"], ["lex", "street art graffiti history documentation"], ["vec", "understanding street art graffiti history"], ["vec", "guide for street art graffiti history"]]} +{"query": "symptoms of vitamin deficiency", "output": [["hyde", "Symptoms of vitamin deficiency vary; for example, Vitamin D deficiency can cause bone pain, while Vitamin C deficiency may lead to scurvy and fatigue."], ["lex", "symptoms overview of vitamin deficiency examples"], ["lex", "symptoms of vitamin deficiency best practices"], ["lex", "symptoms overview of vitamin deficiency guide"], ["vec", "learn about symptoms of vitamin deficiency"], ["vec", "how to symptoms of vitamin deficiency"]]} +{"query": "how vaccines work immune system", "output": [["hyde", "Vaccines stimulate the immune system by introducing antigens. They promote antibody production, enabling the body to recognize and fight pathogens effectively."], ["lex", "how overview vaccines work immune system tutorial"], ["lex", "how overview vaccines work immune system examples"], ["lex", "how vaccines work immune system documentation"], ["vec", "guide for how vaccines work immune system"], ["vec", "how to how vaccines work immune system"]]} +{"query": "blood pressure normal range", "output": [["hyde", "Normal blood pressure ranges from 90/60 mmHg to 120/80 mmHg. Readings above this may indicate hypertension, requiring lifestyle or medical intervention."], ["lex", "blood pressure normal range documentation"], ["lex", "blood overview pressure normal range examples"], ["lex", "blood pressure normal range best practices"], ["vec", "complete blood pressure normal range reference"], ["vec", "learn about blood pressure normal range"]]} +{"query": "sleep hygiene tips", "output": [["hyde", "Sleep hygiene tips include maintaining a consistent sleep schedule, creating a restful environment, and limiting screen time before bed for better quality sleep."], ["lex", "sleep overview hygiene tips examples"], ["lex", "sleep hygiene tips best practices"], ["lex", "sleep overview hygiene tips guide"], ["vec", "learn about sleep hygiene tips"], ["vec", "guide for sleep hygiene tips"]]} +{"query": "intermittent fasting benefits", "output": [["hyde", "Intermittent fasting can enhance metabolic health, promoting weight loss, improved insulin sensitivity, and cellular repair processes through autophagy."], ["lex", "intermittent fasting benefits documentation"], ["lex", "intermittent overview fasting benefits guide"], ["lex", "intermittent fasting benefits best practices"], ["vec", "complete intermittent fasting benefits reference"], ["vec", "learn about intermittent fasting benefits"]]} +{"query": "anxiety coping strategies", "output": [["hyde", "Practice deep breathing for 5-10 minutes to calm the mind. Engage in regular physical activity; aim for 30 minutes most days. Use cognitive-behavioral techniques to challenge anxious thoughts."], ["lex", "anxiety overview coping strategies guide"], ["lex", "anxiety coping strategies best practices"], ["lex", "anxiety coping strategies documentation"], ["vec", "understanding anxiety coping strategies"], ["vec", "complete anxiety coping strategies reference"]]} +{"query": "stretching exercises back pain", "output": [["hyde", "Try the cat-cow stretch for spinal flexibility. Perform child's pose for lower back relief. Incorporate hamstring stretches, holding each for 20-30 seconds, to alleviate tension."], ["lex", "stretching overview exercises back pain guide"], ["lex", "stretching exercises back pain best practices"], ["lex", "stretching overview exercises back pain tutorial"], ["vec", "how to stretching exercises back pain"], ["vec", "understanding stretching exercises back pain"]]} +{"query": "heart disease prevention", "output": [["hyde", "Reduce saturated fats to less than 7% of total calories. Increase fiber intake to 25-30 grams daily. Aim for regular physical activity, targeting at least 150 minutes weekly."], ["lex", "heart overview disease prevention guide"], ["lex", "heart overview disease prevention examples"], ["lex", "heart disease prevention best practices"], ["vec", "guide for heart disease prevention"], ["vec", "complete heart disease prevention reference"]]} +{"query": "diabetes type 2 management", "output": [["hyde", "Monitor blood glucose levels regularly. Adhere to a balanced diet with a focus on whole grains, vegetables, and lean proteins. Aim for 150 minutes of exercise per week."], ["lex", "diabetes type 2 management documentation"], ["lex", "diabetes type 2 management best practices"], ["lex", "diabetes overview type 2 management tutorial"], ["vec", "how to diabetes type 2 management"], ["vec", "guide for diabetes type 2 management"]]} +{"query": "meditation mental health", "output": [["hyde", "Consider practicing mindfulness meditation for 10-20 minutes daily. Research shows it can reduce anxiety and improve emotional well-being. Focus on breath awareness to enhance concentration."], ["lex", "meditation mental health documentation"], ["lex", "meditation overview mental health tutorial"], ["lex", "meditation overview mental health examples"], ["vec", "understanding meditation mental health"], ["vec", "learn about meditation mental health"]]} +{"query": "nutrition macros explained", "output": [["hyde", "Macronutrients include carbohydrates (45-65%), proteins (10-35%), and fats (20-35%). Calculate your daily needs based on total caloric intake to maintain balanced nutrition."], ["lex", "nutrition macros explained documentation"], ["lex", "nutrition macros explained best practices"], ["lex", "nutrition overview macros explained tutorial"], ["vec", "understanding nutrition macros explained"], ["vec", "guide for nutrition macros explained"]]} +{"query": "first aid basics", "output": [["hyde", "Basic first aid includes assessing the scene, calling emergency services if needed, and performing CPR if the person is unresponsive. Apply pressure to stop bleeding effectively."], ["lex", "first aid basics best practices"], ["lex", "first overview aid basics tutorial"], ["lex", "first overview aid basics examples"], ["vec", "understanding first aid basics"], ["vec", "learn about first aid basics"]]} +{"query": "compound interest calculator", "output": [["hyde", "Use the formula A = P(1 + r/n)^(nt) to calculate compound interest. For example, investing $1,000 at 5% for 10 years yields approximately $1,628.89."], ["lex", "compound overview interest calculator examples"], ["lex", "compound overview interest calculator guide"], ["lex", "compound interest calculator best practices"], ["vec", "understanding compound interest calculator"], ["vec", "how to compound interest calculator"]]} +{"query": "stock market basics beginners", "output": [["hyde", "Begin by understanding stocks, bonds, and mutual funds. The S&P 500 is a common index; track it to gauge market performance. Diversification is key to reducing risk."], ["lex", "stock overview market basics beginners guide"], ["lex", "stock market basics beginners documentation"], ["lex", "stock overview market basics beginners examples"], ["vec", "guide for stock market basics beginners"], ["vec", "learn about stock market basics beginners"]]} +{"query": "startup funding stages", "output": [["hyde", "Startup funding stages include seed funding, Series A, Series B, and Series C. Each stage focuses on scaling growth, requiring increasing amounts of capital, often starting with $500,000."], ["lex", "startup overview funding stages tutorial"], ["lex", "startup funding stages best practices"], ["lex", "startup funding stages documentation"], ["vec", "complete startup funding stages reference"], ["vec", "guide for startup funding stages"]]} +{"query": "tax deductions small business", "output": [["hyde", "Eligible tax deductions for small businesses include home office expenses, vehicle use, and business travel costs. Keep detailed receipts to substantiate claims during audits."], ["lex", "tax deductions small business best practices"], ["lex", "tax deductions small business documentation"], ["lex", "tax overview deductions small business examples"], ["vec", "learn about tax deductions small business"], ["vec", "complete tax deductions small business reference"]]} +{"query": "budgeting methods 50 30 20", "output": [["hyde", "The 50/30/20 budgeting method allocates 50% of income to needs, 30% to wants, and 20% to savings. Adjust percentages based on personal financial goals and obligations."], ["lex", "budgeting overview methods 50 30 20 guide"], ["lex", "budgeting methods 50 30 20 best practices"], ["lex", "budgeting methods 50 30 20 documentation"], ["vec", "complete budgeting methods 50 30 20 reference"], ["vec", "how to budgeting methods 50 30 20"]]} +{"query": "cryptocurrency explained simply", "output": [["hyde", "Cryptocurrency is a digital currency secured by cryptography. Bitcoin, the first, launched in 2009. Transactions are recorded on decentralized ledgers called blockchains."], ["lex", "cryptocurrency explained simply documentation"], ["lex", "cryptocurrency overview explained simply examples"], ["lex", "cryptocurrency overview explained simply guide"], ["vec", "how to cryptocurrency explained simply"], ["vec", "learn about cryptocurrency explained simply"]]} +{"query": "inflation effects on savings", "output": [["hyde", "Inflation erodes purchasing power; a 3% inflation rate means $1,000 today will only buy $970 next year. Diversifying investments can help mitigate these effects on savings."], ["lex", "inflation effects on savings documentation"], ["lex", "inflation overview effects on savings tutorial"], ["lex", "inflation overview effects on savings guide"], ["vec", "guide for inflation effects on savings"], ["vec", "complete inflation effects on savings reference"]]} +{"query": "retirement planning strategies", "output": [["hyde", "Effective retirement planning includes contributing to a 401(k) or IRA. Aim to save at least 15% of your income annually; consider increasing contributions as income rises."], ["lex", "retirement overview planning strategies guide"], ["lex", "retirement planning strategies documentation"], ["lex", "retirement overview planning strategies examples"], ["vec", "understanding retirement planning strategies"], ["vec", "how to retirement planning strategies"]]} +{"query": "passive income ideas", "output": [["hyde", "Passive income ideas include rental properties, dividend stocks, and creating online courses. Each can generate revenue with minimal ongoing effort once established."], ["lex", "passive income ideas documentation"], ["lex", "passive overview income ideas guide"], ["lex", "passive overview income ideas tutorial"], ["vec", "how to passive income ideas"], ["vec", "guide for passive income ideas"]]} +{"query": "venture capital vs angel investors", "output": [["hyde", "Venture capitalists typically invest larger sums and seek high-growth startups, while angel investors often provide smaller amounts and focus on early-stage companies."], ["lex", "venture overview capital vs angel investors tutorial"], ["lex", "venture capital vs angel investors best practices"], ["lex", "venture overview capital vs angel investors guide"], ["vec", "learn about venture capital vs angel investors"], ["vec", "guide for venture capital vs angel investors"]]} +{"query": "balance sheet basics", "output": [["hyde", "A balance sheet consists of assets, liabilities, and equity. Total assets must equal total liabilities plus equity, providing a snapshot of financial health at a specific date."], ["lex", "balance overview sheet basics guide"], ["lex", "balance overview sheet basics tutorial"], ["lex", "balance overview sheet basics examples"], ["vec", "complete balance sheet basics reference"], ["vec", "how to balance sheet basics"]]} +{"query": "supply chain management", "output": [["hyde", "Supply chain management involves overseeing the flow of goods from suppliers to customers. Key components include procurement, production, inventory management, and logistics."], ["lex", "supply overview chain management tutorial"], ["lex", "supply overview chain management guide"], ["lex", "supply chain management best practices"], ["vec", "learn about supply chain management"], ["vec", "guide for supply chain management"]]} +{"query": "marathon training schedule", "output": [["hyde", "A marathon training schedule generally spans 16-20 weeks. Long runs increase weekly, peaking at 20 miles, with tapering in the last few weeks before race day."], ["lex", "marathon overview training schedule guide"], ["lex", "marathon overview training schedule tutorial"], ["lex", "marathon training schedule best practices"], ["vec", "learn about marathon training schedule"], ["vec", "guide for marathon training schedule"]]} +{"query": "weightlifting proper form", "output": [["hyde", "Maintain a neutral spine during weightlifting. Use a grip that is shoulder-width apart for bench presses, and ensure knees do not extend beyond toes during squats."], ["lex", "weightlifting overview proper form guide"], ["lex", "weightlifting proper form documentation"], ["lex", "weightlifting overview proper form examples"], ["vec", "guide for weightlifting proper form"], ["vec", "how to weightlifting proper form"]]} +{"query": "swimming stroke techniques", "output": [["hyde", "Focus on a streamlined body position and proper arm pull in freestyle swimming. Practice the catch phase with an extended hand and a high elbow to maximize propulsion."], ["lex", "swimming overview stroke techniques tutorial"], ["lex", "swimming stroke techniques best practices"], ["lex", "swimming overview stroke techniques guide"], ["vec", "how to swimming stroke techniques"], ["vec", "complete swimming stroke techniques reference"]]} +{"query": "tennis serve mechanics", "output": [["hyde", "For a proper tennis serve, start with a continental grip. Toss the ball slightly in front and above your head to enable a powerful upward swing and follow-through."], ["lex", "tennis serve mechanics documentation"], ["lex", "tennis overview serve mechanics tutorial"], ["lex", "tennis overview serve mechanics examples"], ["vec", "understanding tennis serve mechanics"], ["vec", "how to tennis serve mechanics"]]} +{"query": "basketball dribbling drills", "output": [["hyde", "Incorporate drills like zig-zag dribbling and crossover moves. Focus on keeping the ball low and using both hands to enhance ball control and agility."], ["lex", "basketball dribbling drills documentation"], ["lex", "basketball overview dribbling drills tutorial"], ["lex", "basketball dribbling drills best practices"], ["vec", "understanding basketball dribbling drills"], ["vec", "complete basketball dribbling drills reference"]]} +{"query": "soccer formations tactics", "output": [["hyde", "Common soccer formations include 4-4-2 and 4-3-3. The 4-4-2 provides a balanced defense and midfield, while the 4-3-3 enhances attacking options with three forwards."], ["lex", "soccer formations tactics documentation"], ["lex", "soccer overview formations tactics tutorial"], ["lex", "soccer formations tactics best practices"], ["vec", "complete soccer formations tactics reference"], ["vec", "understanding soccer formations tactics"]]} +{"query": "golf swing fundamentals", "output": [["hyde", "Focus on grip, stance, and posture. A proper backswing, downswing, and follow-through can improve accuracy by 30%. Weight transfer is crucial."], ["lex", "golf overview swing fundamentals examples"], ["lex", "golf overview swing fundamentals guide"], ["lex", "golf overview swing fundamentals tutorial"], ["vec", "how to golf swing fundamentals"], ["vec", "learn about golf swing fundamentals"]]} +{"query": "yoga poses beginners", "output": [["hyde", "Begin with Mountain Pose for grounding, then try Downward Dog for stretching. Child's Pose helps beginners relax and focus on breathing."], ["lex", "yoga overview poses beginners guide"], ["lex", "yoga overview poses beginners examples"], ["lex", "yoga poses beginners documentation"], ["vec", "learn about yoga poses beginners"], ["vec", "guide for yoga poses beginners"]]} +{"query": "running injury prevention", "output": [["hyde", "Incorporate strength training, proper warm-ups, and cooldowns. 70% of runners experience injuries; addressing form can reduce risk significantly."], ["lex", "running injury prevention best practices"], ["lex", "running overview injury prevention tutorial"], ["lex", "running overview injury prevention examples"], ["vec", "understanding running injury prevention"], ["vec", "guide for running injury prevention"]]} +{"query": "cycling gear ratios", "output": [["hyde", "Common ratios include 50/34 for compact gearing or 53/39 for road bikes. A 11-28 cassette gives a good balance for climbing and flat terrains."], ["lex", "cycling overview gear ratios guide"], ["lex", "cycling overview gear ratios tutorial"], ["lex", "cycling gear ratios best practices"], ["vec", "complete cycling gear ratios reference"], ["vec", "guide for cycling gear ratios"]]} +{"query": "rock climbing grades", "output": [["hyde", "Climbing grades range from 5.0 (easy) to 5.15 (extremely hard). The Yosemite Decimal System is commonly used in the USA for rock climbing."], ["lex", "rock climbing grades documentation"], ["lex", "rock overview climbing grades tutorial"], ["lex", "rock overview climbing grades examples"], ["vec", "complete rock climbing grades reference"], ["vec", "how to rock climbing grades"]]} +{"query": "surfing wave types", "output": [["hyde", "Types of waves include beach breaks, point breaks, and reef breaks. Each offers different ride characteristics based on wind and tide conditions."], ["lex", "surfing overview wave types tutorial"], ["lex", "surfing overview wave types examples"], ["lex", "surfing wave types documentation"], ["vec", "guide for surfing wave types"], ["vec", "complete surfing wave types reference"]]} +{"query": "best time visit japan", "output": [["hyde", "Best time to visit Japan is during spring (March to May) for cherry blossoms or fall (September to November) for autumn foliage."], ["lex", "best overview time visit japan examples"], ["lex", "best time visit japan documentation"], ["lex", "best time visit japan best practices"], ["vec", "understanding best time visit japan"], ["vec", "guide for best time visit japan"]]} +{"query": "travel packing checklist", "output": [["hyde", "Checklist: Passport, travel insurance, clothing layers, toiletries, chargers, and snacks. Verify weight limits for carry-ons before packing."], ["lex", "travel packing checklist documentation"], ["lex", "travel overview packing checklist tutorial"], ["lex", "travel overview packing checklist guide"], ["vec", "complete travel packing checklist reference"], ["vec", "guide for travel packing checklist"]]} +{"query": "budget backpacking europe", "output": [["hyde", "Budget travelers can consider Eastern Europe; countries like Poland and Hungary offer accommodation from €10/night. Use public transport to save."], ["lex", "budget backpacking europe documentation"], ["lex", "budget overview backpacking europe guide"], ["lex", "budget overview backpacking europe examples"], ["vec", "learn about budget backpacking europe"], ["vec", "how to budget backpacking europe"]]} +{"query": "visa requirements usa", "output": [["hyde", "Visa requirements for the USA vary by nationality. ESTA is needed for visa waiver countries; others must apply for a B1/B2 visa at a consulate."], ["lex", "visa requirements usa best practices"], ["lex", "visa overview requirements usa tutorial"], ["lex", "visa overview requirements usa examples"], ["vec", "guide for visa requirements usa"], ["vec", "learn about visa requirements usa"]]} +{"query": "jet lag remedies", "output": [["hyde", "Jet lag remedies include adjusting sleep schedule before travel, staying hydrated, and exposure to natural light upon arrival."], ["lex", "jet overview lag remedies guide"], ["lex", "jet overview lag remedies examples"], ["lex", "jet lag remedies best practices"], ["vec", "understanding jet lag remedies"], ["vec", "guide for jet lag remedies"]]} +{"query": "road trip planning tips", "output": [["hyde", "Plan routes with apps like Roadtrippers, check for rest stops every 2-3 hours, and keep a first-aid kit for emergencies while driving."], ["lex", "road overview trip planning tips tutorial"], ["lex", "road overview trip planning tips examples"], ["lex", "road overview trip planning tips guide"], ["vec", "learn about road trip planning tips"], ["vec", "complete road trip planning tips reference"]]} +{"query": "solo travel safety", "output": [["hyde", "Research destinations, stay in well-reviewed accommodations, share itineraries with friends, and use apps to stay connected while abroad."], ["lex", "solo overview travel safety tutorial"], ["lex", "solo travel safety best practices"], ["lex", "solo travel safety documentation"], ["vec", "guide for solo travel safety"], ["vec", "learn about solo travel safety"]]} +{"query": "airport security rules", "output": [["hyde", "Security rules include removing shoes, belts, and laptops from bags. Liquids must be in containers of 3.4 oz or less and placed in a quart-sized bag."], ["lex", "airport overview security rules examples"], ["lex", "airport overview security rules guide"], ["lex", "airport overview security rules tutorial"], ["vec", "understanding airport security rules"], ["vec", "learn about airport security rules"]]} +{"query": "travel insurance coverage", "output": [["hyde", "Travel insurance coverage typically includes trip cancellations, medical emergencies, and lost baggage. Check policy limits for medical expenses."], ["lex", "travel overview insurance coverage guide"], ["lex", "travel overview insurance coverage examples"], ["lex", "travel overview insurance coverage tutorial"], ["vec", "understanding travel insurance coverage"], ["vec", "how to travel insurance coverage"]]} +{"query": "language apps learning", "output": [["hyde", "Popular language apps include Duolingo for vocabulary, Babbel for conversation skills, and Memrise for immersive learning experiences."], ["lex", "language overview apps learning tutorial"], ["lex", "language overview apps learning examples"], ["lex", "language overview apps learning guide"], ["vec", "guide for language apps learning"], ["vec", "understanding language apps learning"]]} +{"query": "hostel vs hotel comparison", "output": [["hyde", "Hostels offer shared dorms starting around €15/night, fostering social interactions, while hotels provide privacy but typically cost €70+ per night."], ["lex", "hostel overview vs hotel comparison examples"], ["lex", "hostel vs hotel comparison documentation"], ["lex", "hostel vs hotel comparison best practices"], ["vec", "understanding hostel vs hotel comparison"], ["vec", "learn about hostel vs hotel comparison"]]} +{"query": "travel photography tips", "output": [["hyde", "Utilize natural light for best results, use a tripod for stability, and focus on composition; the golden hour enhances colors and shadows."], ["lex", "travel overview photography tips examples"], ["lex", "travel overview photography tips tutorial"], ["lex", "travel photography tips documentation"], ["vec", "how to travel photography tips"], ["vec", "complete travel photography tips reference"]]} +{"query": "bread baking techniques", "output": [["hyde", "Techniques include using a starter for flavor, kneading dough for gluten development, and monitoring proofing times for optimal rise."], ["lex", "bread baking techniques best practices"], ["lex", "bread overview baking techniques guide"], ["lex", "bread overview baking techniques tutorial"], ["vec", "complete bread baking techniques reference"], ["vec", "guide for bread baking techniques"]]} +{"query": "knife skills basics", "output": [["hyde", "Basic knife skills include the claw grip for safety, rocking motion for chopping, and using a sharp knife to enhance efficiency and precision."], ["lex", "knife overview skills basics guide"], ["lex", "knife overview skills basics examples"], ["lex", "knife skills basics best practices"], ["vec", "how to knife skills basics"], ["vec", "complete knife skills basics reference"]]} +{"query": "fermentation at home", "output": [["hyde", "Ferment vegetables at home by submerging in brine, using weights to keep them submerged, and storing at room temperature for 1-4 weeks."], ["lex", "fermentation overview at home tutorial"], ["lex", "fermentation at home documentation"], ["lex", "fermentation overview at home examples"], ["vec", "complete fermentation at home reference"], ["vec", "guide for fermentation at home"]]} +{"query": "meal prep weekly", "output": [["hyde", "Plan meals around perishable items first, batch cook grains and proteins, and use airtight containers to maintain freshness throughout the week."], ["lex", "meal overview prep weekly guide"], ["lex", "meal overview prep weekly tutorial"], ["lex", "meal prep weekly documentation"], ["vec", "guide for meal prep weekly"], ["vec", "understanding meal prep weekly"]]} +{"query": "spice combinations guide", "output": [["hyde", "Common spice combinations include cumin and coriander for Latin dishes, rosemary and thyme for Mediterranean, and paprika with garlic for BBQ."], ["lex", "spice combinations guide documentation"], ["lex", "spice overview combinations guide tutorial"], ["lex", "spice overview combinations guide examples"], ["vec", "guide for spice combinations guide"], ["vec", "complete spice combinations guide reference"]]} +{"query": "pasta making fresh", "output": [["hyde", "Start with a well-floured surface, mix flour and eggs, knead for 10 minutes, then rest dough for 30 minutes before rolling and cutting."], ["lex", "pasta making fresh best practices"], ["lex", "pasta overview making fresh tutorial"], ["lex", "pasta overview making fresh guide"], ["vec", "guide for pasta making fresh"], ["vec", "complete pasta making fresh reference"]]} +{"query": "coffee brewing methods", "output": [["hyde", "Brewing methods include pour-over for clarity, French press for richness, and espresso for intensity. Adjust grind size for desired extraction."], ["lex", "coffee overview brewing methods examples"], ["lex", "coffee overview brewing methods guide"], ["lex", "coffee brewing methods documentation"], ["vec", "complete coffee brewing methods reference"], ["vec", "learn about coffee brewing methods"]]} +{"query": "wine pairing basics", "output": [["hyde", "Pair light-bodied wines like Sauvignon Blanc with seafood. Pair full-bodied reds like Cabernet Sauvignon with grilled meats for optimal flavor balance."], ["lex", "wine overview pairing basics tutorial"], ["lex", "wine overview pairing basics examples"], ["lex", "wine pairing basics best practices"], ["vec", "guide for wine pairing basics"], ["vec", "learn about wine pairing basics"]]} +{"query": "vegetarian protein sources", "output": [["hyde", "Top vegetarian protein sources include lentils (18g per cup), chickpeas (15g per cup), quinoa (8g per cup), and edamame (17g per cup)."], ["lex", "vegetarian overview protein sources guide"], ["lex", "vegetarian overview protein sources tutorial"], ["lex", "vegetarian overview protein sources examples"], ["vec", "how to vegetarian protein sources"], ["vec", "complete vegetarian protein sources reference"]]} +{"query": "food storage guidelines", "output": [["hyde", "Store raw meat at 28°F (-2°C) to 32°F (0°C). Refrigerate leftovers within 2 hours; consume within 3-4 days. Freeze meats for up to 12 months."], ["lex", "food storage guidelines documentation"], ["lex", "food storage guidelines best practices"], ["lex", "food overview storage guidelines examples"], ["vec", "guide for food storage guidelines"], ["vec", "how to food storage guidelines"]]} +{"query": "sourdough starter maintenance", "output": [["hyde", "Feed your sourdough starter with equal parts flour and water weekly. Maintain at room temperature for active fermentation; refrigerate for slower growth."], ["lex", "sourdough overview starter maintenance examples"], ["lex", "sourdough overview starter maintenance tutorial"], ["lex", "sourdough overview starter maintenance guide"], ["vec", "how to sourdough starter maintenance"], ["vec", "learn about sourdough starter maintenance"]]} +{"query": "grilling temperature chart", "output": [["hyde", "For beef, grill at 450°F to 500°F for medium-rare (135°F). Chicken should reach 165°F, grilled at medium heat (350°F to 400°F) for even cooking."], ["lex", "grilling overview temperature chart guide"], ["lex", "grilling temperature chart documentation"], ["lex", "grilling overview temperature chart examples"], ["vec", "guide for grilling temperature chart"], ["vec", "understanding grilling temperature chart"]]} +{"query": "cognitive biases list", "output": [["hyde", "Cognitive biases include confirmation bias, anchoring bias, and availability heuristic. Each influences decision-making and perception of reality."], ["lex", "cognitive overview biases list guide"], ["lex", "cognitive overview biases list tutorial"], ["lex", "cognitive overview biases list examples"], ["vec", "complete cognitive biases list reference"], ["vec", "how to cognitive biases list"]]} +{"query": "attachment theory styles", "output": [["hyde", "Attachment styles: secure (positive relationships), anxious (fear of abandonment), avoidant (emotional distance), and disorganized (fear-driven behavior)."], ["lex", "attachment theory styles best practices"], ["lex", "attachment overview theory styles examples"], ["lex", "attachment theory styles documentation"], ["vec", "learn about attachment theory styles"], ["vec", "understanding attachment theory styles"]]} +{"query": "maslow hierarchy needs", "output": [["hyde", "Maslow's hierarchy of needs: physiological, safety, love/belonging, esteem, and self-actualization, arranged in a pyramid from basic to complex needs."], ["lex", "maslow hierarchy needs best practices"], ["lex", "maslow overview hierarchy needs tutorial"], ["lex", "maslow overview hierarchy needs examples"], ["vec", "understanding maslow hierarchy needs"], ["vec", "learn about maslow hierarchy needs"]]} +{"query": "growth mindset vs fixed", "output": [["hyde", "A growth mindset embraces challenges and sees failure as a learning opportunity, while a fixed mindset views abilities as static and unchangeable."], ["lex", "growth overview mindset vs fixed tutorial"], ["lex", "growth overview mindset vs fixed guide"], ["lex", "growth mindset vs fixed documentation"], ["vec", "complete growth mindset vs fixed reference"], ["vec", "learn about growth mindset vs fixed"]]} +{"query": "emotional intelligence components", "output": [["hyde", "Emotional intelligence components include self-awareness, self-regulation, motivation, empathy, and social skills, crucial for effective interpersonal relations."], ["lex", "emotional overview intelligence components guide"], ["lex", "emotional intelligence components best practices"], ["lex", "emotional overview intelligence components examples"], ["vec", "how to emotional intelligence components"], ["vec", "complete emotional intelligence components reference"]]} +{"query": "memory techniques mnemonics", "output": [["hyde", "Memory techniques include the method of loci, acronyms, and chunking. For instance, use 'HOMES' to remember the Great Lakes: Huron, Ontario, Michigan, Erie, Superior."], ["lex", "memory overview techniques mnemonics guide"], ["lex", "memory techniques mnemonics documentation"], ["lex", "memory techniques mnemonics best practices"], ["vec", "how to memory techniques mnemonics"], ["vec", "learn about memory techniques mnemonics"]]} +{"query": "habit formation science", "output": [["hyde", "Habit formation involves cue, routine, and reward. Research shows it takes an average of 66 days to form a new habit, varying by individual and behavior."], ["lex", "habit overview formation science examples"], ["lex", "habit overview formation science tutorial"], ["lex", "habit formation science documentation"], ["vec", "learn about habit formation science"], ["vec", "guide for habit formation science"]]} +{"query": "stress response fight flight", "output": [["hyde", "The stress response triggers fight or flight: heart rate increases, adrenaline surges, and cortisol levels rise, preparing the body for immediate action."], ["lex", "stress overview response fight flight guide"], ["lex", "stress overview response fight flight examples"], ["lex", "stress response fight flight documentation"], ["vec", "how to stress response fight flight"], ["vec", "understanding stress response fight flight"]]} +{"query": "personality types myers briggs", "output": [["hyde", "Myers-Briggs types include 16 combinations like INTJ (Introverted, Intuitive, Thinking, Judging) and ESFP (Extraverted, Sensing, Feeling, Perceiving)."], ["lex", "personality types myers briggs documentation"], ["lex", "personality overview types myers briggs examples"], ["lex", "personality overview types myers briggs tutorial"], ["vec", "understanding personality types myers briggs"], ["vec", "how to personality types myers briggs"]]} +{"query": "motivation intrinsic extrinsic", "output": [["hyde", "Intrinsic motivation arises from internal rewards (personal growth), while extrinsic motivation is driven by external rewards (money, recognition)."], ["lex", "motivation overview intrinsic extrinsic guide"], ["lex", "motivation overview intrinsic extrinsic examples"], ["lex", "motivation overview intrinsic extrinsic tutorial"], ["vec", "how to motivation intrinsic extrinsic"], ["vec", "guide for motivation intrinsic extrinsic"]]} +{"query": "decision making psychology", "output": [["hyde", "Decision-making psychology explores heuristics, biases, and the dual-process theory: System 1 (fast, intuitive) vs. System 2 (slow, deliberative)."], ["lex", "decision overview making psychology tutorial"], ["lex", "decision making psychology best practices"], ["lex", "decision overview making psychology examples"], ["vec", "learn about decision making psychology"], ["vec", "how to decision making psychology"]]} +{"query": "procrastination causes solutions", "output": [["hyde", "Procrastination can stem from fear of failure, perfectionism, or lack of motivation. Solutions include setting smaller tasks and using time management techniques."], ["lex", "procrastination overview causes solutions guide"], ["lex", "procrastination causes solutions documentation"], ["lex", "procrastination overview causes solutions examples"], ["vec", "complete procrastination causes solutions reference"], ["vec", "how to procrastination causes solutions"]]} +{"query": "renewable energy types", "output": [["hyde", "Renewable energy types include solar, wind, hydroelectric, geothermal, and biomass. Solar energy capacity reached 250 GW globally in 2020."], ["lex", "renewable energy types documentation"], ["lex", "renewable overview energy types tutorial"], ["lex", "renewable energy types best practices"], ["vec", "complete renewable energy types reference"], ["vec", "learn about renewable energy types"]]} +{"query": "carbon footprint reduction", "output": [["hyde", "To reduce carbon footprint: use public transport, reduce meat consumption (beef has the highest emissions), and increase energy efficiency in homes."], ["lex", "carbon footprint reduction documentation"], ["lex", "carbon footprint reduction best practices"], ["lex", "carbon overview footprint reduction tutorial"], ["vec", "guide for carbon footprint reduction"], ["vec", "learn about carbon footprint reduction"]]} +{"query": "composting basics home", "output": [["hyde", "Composting basics: use a mix of green materials (nitrogen-rich) and brown materials (carbon-rich). Maintain moisture and aeration for decomposition."], ["lex", "composting overview basics home examples"], ["lex", "composting overview basics home guide"], ["lex", "composting overview basics home tutorial"], ["vec", "how to composting basics home"], ["vec", "complete composting basics home reference"]]} +{"query": "endangered species list", "output": [["hyde", "Endangered species include the Amur leopard, Javan rhinoceros, and Sumatra orangutan, all facing threats from habitat loss and poaching."], ["lex", "endangered species list best practices"], ["lex", "endangered overview species list examples"], ["lex", "endangered overview species list guide"], ["vec", "learn about endangered species list"], ["vec", "guide for endangered species list"]]} +{"query": "recycling symbols meaning", "output": [["hyde", "Recycling symbols: 1 (PETE), 2 (HDPE), 3 (PVC), 4 (LDPE), 5 (PP), 6 (PS), 7 (other). Each indicates the type of plastic for appropriate recycling."], ["lex", "recycling symbols meaning documentation"], ["lex", "recycling overview symbols meaning examples"], ["lex", "recycling symbols meaning best practices"], ["vec", "complete recycling symbols meaning reference"], ["vec", "how to recycling symbols meaning"]]} +{"query": "ocean plastic pollution", "output": [["hyde", "Ocean plastic pollution exceeded 150 million tons in 2020, harming marine life. Microplastics are particularly concerning, affecting food chains."], ["lex", "ocean overview plastic pollution examples"], ["lex", "ocean overview plastic pollution guide"], ["lex", "ocean plastic pollution documentation"], ["vec", "learn about ocean plastic pollution"], ["vec", "guide for ocean plastic pollution"]]} +{"query": "deforestation effects", "output": [["hyde", "Deforestation effects include loss of biodiversity, increased carbon emissions, and disruption of water cycles, threatening ecosystems and human livelihoods."], ["lex", "deforestation effects best practices"], ["lex", "deforestation overview effects tutorial"], ["lex", "deforestation overview effects guide"], ["vec", "understanding deforestation effects"], ["vec", "guide for deforestation effects"]]} +{"query": "sustainable living tips", "output": [["hyde", "Sustainable living tips: reduce single-use plastics, support local agriculture, conserve water, and choose energy-efficient appliances to lessen your impact."], ["lex", "sustainable living tips best practices"], ["lex", "sustainable living tips documentation"], ["lex", "sustainable overview living tips guide"], ["vec", "learn about sustainable living tips"], ["vec", "complete sustainable living tips reference"]]} +{"query": "wildlife conservation efforts", "output": [["hyde", "In 2021, the WWF reported a 68% decline in wildlife populations since 1970, emphasizing the need for habitat protection and anti-poaching laws."], ["lex", "wildlife overview conservation efforts guide"], ["lex", "wildlife overview conservation efforts examples"], ["lex", "wildlife conservation efforts documentation"], ["vec", "how to wildlife conservation efforts"], ["vec", "complete wildlife conservation efforts reference"]]} +{"query": "solar panel installation", "output": [["hyde", "The average cost of solar panel installation in the U.S. is around $3 per watt, with a typical system size of 5 kW costing approximately $15,000 before incentives."], ["lex", "solar overview panel installation examples"], ["lex", "solar overview panel installation guide"], ["lex", "solar panel installation documentation"], ["vec", "complete solar panel installation reference"], ["vec", "how to solar panel installation"]]} +{"query": "water conservation methods", "output": [["hyde", "Implementing drip irrigation can reduce water usage by up to 60% compared to traditional methods, significantly conserving water in agricultural practices."], ["lex", "water overview conservation methods examples"], ["lex", "water overview conservation methods guide"], ["lex", "water conservation methods documentation"], ["vec", "guide for water conservation methods"], ["vec", "learn about water conservation methods"]]} +{"query": "biodiversity importance", "output": [["hyde", "Biodiversity boosts ecosystem productivity, resilience, and stability. Healthy ecosystems with diverse species can provide humans with food, clean air, and water."], ["lex", "biodiversity importance best practices"], ["lex", "biodiversity importance documentation"], ["lex", "biodiversity overview importance examples"], ["vec", "complete biodiversity importance reference"], ["vec", "understanding biodiversity importance"]]} +{"query": "calculus derivatives explained", "output": [["hyde", "The derivative of a function f(x) at a point x=a is defined as the limit of the difference quotient as h approaches 0: f'(a) = lim(h->0) [f(a+h) - f(a)]/h."], ["lex", "calculus derivatives explained best practices"], ["lex", "calculus overview derivatives explained examples"], ["lex", "calculus derivatives explained documentation"], ["vec", "learn about calculus derivatives explained"], ["vec", "how to calculus derivatives explained"]]} +{"query": "probability basics statistics", "output": [["hyde", "Probability basics include the concept that the probability of an event A is P(A) = Number of favorable outcomes / Total number of outcomes."], ["lex", "probability overview basics statistics tutorial"], ["lex", "probability basics statistics documentation"], ["lex", "probability basics statistics best practices"], ["vec", "guide for probability basics statistics"], ["vec", "how to probability basics statistics"]]} +{"query": "linear algebra matrices", "output": [["hyde", "In linear algebra, a matrix can represent a system of equations. The product of matrices A (m x n) and B (n x p) results in a new matrix C (m x p)."], ["lex", "linear overview algebra matrices guide"], ["lex", "linear algebra matrices documentation"], ["lex", "linear overview algebra matrices tutorial"], ["vec", "how to linear algebra matrices"], ["vec", "complete linear algebra matrices reference"]]} +{"query": "geometry proofs theorems", "output": [["hyde", "A common geometry proof is the Pythagorean theorem: For a right triangle with legs a and b, and hypotenuse c, a² + b² = c² holds true."], ["lex", "geometry proofs theorems documentation"], ["lex", "geometry proofs theorems best practices"], ["lex", "geometry overview proofs theorems examples"], ["vec", "how to geometry proofs theorems"], ["vec", "complete geometry proofs theorems reference"]]} +{"query": "logarithms rules properties", "output": [["hyde", "Logarithm properties include: log_b(m * n) = log_b(m) + log_b(n) and log_b(m/n) = log_b(m) - log_b(n). Base changes are done via log_b(m) = log_k(m)/log_k(b)."], ["lex", "logarithms overview rules properties examples"], ["lex", "logarithms rules properties best practices"], ["lex", "logarithms rules properties documentation"], ["vec", "how to logarithms rules properties"], ["vec", "understanding logarithms rules properties"]]} +{"query": "trigonometry identities", "output": [["hyde", "Key trigonometric identities include sin²(x) + cos²(x) = 1 and tan(x) = sin(x)/cos(x), essential for solving various trigonometric equations."], ["lex", "trigonometry overview identities guide"], ["lex", "trigonometry identities documentation"], ["lex", "trigonometry identities best practices"], ["vec", "learn about trigonometry identities"], ["vec", "how to trigonometry identities"]]} +{"query": "set theory basics", "output": [["hyde", "Set theory basics include operations like union (A ∪ B), intersection (A ∩ B), and difference (A - B), defining relationships between sets."], ["lex", "set theory basics documentation"], ["lex", "set overview theory basics guide"], ["lex", "set overview theory basics tutorial"], ["vec", "understanding set theory basics"], ["vec", "complete set theory basics reference"]]} +{"query": "prime numbers properties", "output": [["hyde", "Prime numbers are defined as having only two distinct positive divisors: 1 and itself. The first five primes are 2, 3, 5, 7, and 11."], ["lex", "prime numbers properties best practices"], ["lex", "prime overview numbers properties guide"], ["lex", "prime numbers properties documentation"], ["vec", "complete prime numbers properties reference"], ["vec", "guide for prime numbers properties"]]} +{"query": "fractions decimals conversion", "output": [["hyde", "To convert fractions to decimals, divide the numerator by the denominator. For example, 1/4 equals 0.25, while 3/8 equals 0.375."], ["lex", "fractions overview decimals conversion guide"], ["lex", "fractions overview decimals conversion tutorial"], ["lex", "fractions decimals conversion best practices"], ["vec", "guide for fractions decimals conversion"], ["vec", "complete fractions decimals conversion reference"]]} +{"query": "algebra equations solving", "output": [["hyde", "To solve equations like 2x + 3 = 7, isolate x by subtracting 3 from both sides, then divide by 2, yielding x = 2."], ["lex", "algebra overview equations solving tutorial"], ["lex", "algebra overview equations solving guide"], ["lex", "algebra equations solving best practices"], ["vec", "understanding algebra equations solving"], ["vec", "learn about algebra equations solving"]]} +{"query": "graph theory fundamentals", "output": [["hyde", "Graph theory fundamentals include vertices (nodes) and edges (connections). A simple graph contains no loops or multiple edges between vertices."], ["lex", "graph overview theory fundamentals tutorial"], ["lex", "graph theory fundamentals documentation"], ["lex", "graph overview theory fundamentals examples"], ["vec", "complete graph theory fundamentals reference"], ["vec", "understanding graph theory fundamentals"]]} +{"query": "combinatorics permutations", "output": [["hyde", "In combinatorics, the formula for permutations is P(n, r) = n! / (n-r)!, representing the number of ways to arrange r objects from n."], ["lex", "combinatorics permutations best practices"], ["lex", "combinatorics overview permutations tutorial"], ["lex", "combinatorics permutations documentation"], ["vec", "understanding combinatorics permutations"], ["vec", "how to combinatorics permutations"]]} +{"query": "spanish verb conjugation", "output": [["hyde", "In Spanish, regular -ar verbs conjugate by dropping the -ar and adding endings: -o, -as, -a, -amos, -áis, -an for present tense."], ["lex", "spanish verb conjugation documentation"], ["lex", "spanish overview verb conjugation guide"], ["lex", "spanish overview verb conjugation examples"], ["vec", "how to spanish verb conjugation"], ["vec", "learn about spanish verb conjugation"]]} +{"query": "japanese hiragana katakana", "output": [["hyde", "Japanese hiragana consists of 46 characters representing syllables, while katakana also has 46 characters used mainly for foreign words."], ["lex", "japanese hiragana katakana best practices"], ["lex", "japanese overview hiragana katakana guide"], ["lex", "japanese hiragana katakana documentation"], ["vec", "complete japanese hiragana katakana reference"], ["vec", "guide for japanese hiragana katakana"]]} +{"query": "french pronunciation rules", "output": [["hyde", "French pronunciation rules include nasal sounds in words like 'pain' and liaisons where final consonants are pronounced if followed by a vowel."], ["lex", "french overview pronunciation rules guide"], ["lex", "french pronunciation rules documentation"], ["lex", "french overview pronunciation rules examples"], ["vec", "learn about french pronunciation rules"], ["vec", "how to french pronunciation rules"]]} +{"query": "german cases grammar", "output": [["hyde", "German grammar includes four cases: nominative (subject), accusative (direct object), dative (indirect object), and genitive (possession)."], ["lex", "german overview cases grammar examples"], ["lex", "german overview cases grammar guide"], ["lex", "german overview cases grammar tutorial"], ["vec", "understanding german cases grammar"], ["vec", "how to german cases grammar"]]} +{"query": "mandarin tones guide", "output": [["hyde", "Mandarin tones are crucial for meaning; there are four tones: first (high), second (rising), third (dipping), and fourth (falling)."], ["lex", "mandarin overview tones guide guide"], ["lex", "mandarin tones guide best practices"], ["lex", "mandarin overview tones guide examples"], ["vec", "guide for mandarin tones guide"], ["vec", "understanding mandarin tones guide"]]} +{"query": "latin phrases common", "output": [["hyde", "Common Latin phrases include 'Carpe Diem' (Seize the day) and 'Et cetera' (And the rest), often used in modern contexts."], ["lex", "latin phrases common documentation"], ["lex", "latin overview phrases common tutorial"], ["lex", "latin overview phrases common examples"], ["vec", "learn about latin phrases common"], ["vec", "guide for latin phrases common"]]} +{"query": "arabic alphabet basics", "output": [["hyde", "The Arabic alphabet consists of 28 letters, written from right to left, with letters changing shape depending on their position in a word."], ["lex", "arabic overview alphabet basics guide"], ["lex", "arabic overview alphabet basics examples"], ["lex", "arabic alphabet basics best practices"], ["vec", "complete arabic alphabet basics reference"], ["vec", "understanding arabic alphabet basics"]]} +{"query": "english idioms meanings", "output": [["hyde", "Common English idioms include 'Break the ice' (to initiate conversation) and 'Bite the bullet' (to face a difficult situation)."], ["lex", "english overview idioms meanings guide"], ["lex", "english overview idioms meanings examples"], ["lex", "english idioms meanings documentation"], ["vec", "how to english idioms meanings"], ["vec", "understanding english idioms meanings"]]} +{"query": "sign language basics", "output": [["hyde", "Basics of sign language include the manual alphabet, commonly fingerspelling names, and essential signs like 'thank you' and 'please'."], ["lex", "sign language basics documentation"], ["lex", "sign language basics best practices"], ["lex", "sign overview language basics examples"], ["vec", "guide for sign language basics"], ["vec", "understanding sign language basics"]]} +{"query": "etymology word origins", "output": [["hyde", "The word 'etymology' derives from the Greek 'etymon' meaning 'true sense'. It dates back to the 14th century, reflecting the study of word origins."], ["lex", "etymology overview word origins tutorial"], ["lex", "etymology overview word origins examples"], ["lex", "etymology word origins documentation"], ["vec", "how to etymology word origins"], ["vec", "guide for etymology word origins"]]} +{"query": "grammar punctuation rules", "output": [["hyde", "Use a comma to separate items in a list. An apostrophe indicates possession, e.g., 'the dog's leash'. A semicolon links closely related independent clauses."], ["lex", "grammar punctuation rules best practices"], ["lex", "grammar punctuation rules documentation"], ["lex", "grammar overview punctuation rules tutorial"], ["vec", "guide for grammar punctuation rules"], ["vec", "understanding grammar punctuation rules"]]} +{"query": "writing style guides", "output": [["hyde", "The Chicago Manual of Style recommends using the Oxford comma for clarity. APA style prefers in-text citations with author-date format: (Smith, 2020)."], ["lex", "writing overview style guides guide"], ["lex", "writing overview style guides examples"], ["lex", "writing overview style guides tutorial"], ["vec", "complete writing style guides reference"], ["vec", "learn about writing style guides"]]} +{"query": "woodworking joints types", "output": [["hyde", "Common woodworking joints include butt joints, miter joints, dovetail joints, and mortise and tenon. Each has distinct strength and aesthetic characteristics."], ["lex", "woodworking joints types documentation"], ["lex", "woodworking overview joints types guide"], ["lex", "woodworking overview joints types tutorial"], ["vec", "how to woodworking joints types"], ["vec", "learn about woodworking joints types"]]} +{"query": "knitting patterns beginners", "output": [["hyde", "Beginner knitting patterns often include simple projects like scarves or dishcloths. Look for patterns that use basic stitches like knit and purl."], ["lex", "knitting patterns beginners documentation"], ["lex", "knitting overview patterns beginners examples"], ["lex", "knitting overview patterns beginners tutorial"], ["vec", "guide for knitting patterns beginners"], ["vec", "learn about knitting patterns beginners"]]} +{"query": "home repair basics", "output": [["hyde", "Basic home repair skills include fixing leaky faucets, patching drywall, and unclogging drains. Essential tools include a hammer, screwdriver, and pliers."], ["lex", "home overview repair basics guide"], ["lex", "home overview repair basics tutorial"], ["lex", "home repair basics documentation"], ["vec", "how to home repair basics"], ["vec", "complete home repair basics reference"]]} +{"query": "sewing machine threading", "output": [["hyde", "To thread a sewing machine, first raise the presser foot, then follow the threading diagram. Ensure the needle is correctly inserted and facing down."], ["lex", "sewing overview machine threading tutorial"], ["lex", "sewing overview machine threading examples"], ["lex", "sewing machine threading documentation"], ["vec", "complete sewing machine threading reference"], ["vec", "learn about sewing machine threading"]]} +{"query": "painting techniques acrylic", "output": [["hyde", "Acrylic painting techniques include layering, glazing, and dry brushing. Use a palette knife for texture and experiment with water for different effects."], ["lex", "painting overview techniques acrylic guide"], ["lex", "painting overview techniques acrylic examples"], ["lex", "painting techniques acrylic best practices"], ["vec", "learn about painting techniques acrylic"], ["vec", "how to painting techniques acrylic"]]} +{"query": "pottery wheel basics", "output": [["hyde", "On a pottery wheel, start with centered clay. Press down and pull up to shape your piece. Keep hands wet for smoother results and avoid excessive pressure."], ["lex", "pottery overview wheel basics guide"], ["lex", "pottery overview wheel basics tutorial"], ["lex", "pottery overview wheel basics examples"], ["vec", "learn about pottery wheel basics"], ["vec", "complete pottery wheel basics reference"]]} +{"query": "electronics soldering guide", "output": [["hyde", "For soldering electronics, use a soldering iron at 350°C. Clean surfaces with flux, apply solder evenly, and ensure joints are solid and shiny."], ["lex", "electronics overview soldering guide guide"], ["lex", "electronics overview soldering guide examples"], ["lex", "electronics soldering guide documentation"], ["vec", "learn about electronics soldering guide"], ["vec", "guide for electronics soldering guide"]]} +{"query": "gardening soil preparation", "output": [["hyde", "Prepare garden soil by testing pH levels; ideally, it should be between 6.0 and 7.0. Amend with compost and organic matter to enhance fertility."], ["lex", "gardening soil preparation best practices"], ["lex", "gardening overview soil preparation guide"], ["lex", "gardening soil preparation documentation"], ["vec", "learn about gardening soil preparation"], ["vec", "complete gardening soil preparation reference"]]} +{"query": "candle making supplies", "output": [["hyde", "Essential candle making supplies include wax (soy or paraffin), wicks, fragrance oils, and a double boiler. Safety gear is also recommended."], ["lex", "candle making supplies best practices"], ["lex", "candle making supplies documentation"], ["lex", "candle overview making supplies examples"], ["vec", "understanding candle making supplies"], ["vec", "guide for candle making supplies"]]} +{"query": "leather crafting tools", "output": [["hyde", "Basic leather crafting tools include a rotary cutter, edge tools, and a stitching awl. A cutting mat protects surfaces while working on projects."], ["lex", "leather overview crafting tools tutorial"], ["lex", "leather overview crafting tools guide"], ["lex", "leather crafting tools documentation"], ["vec", "guide for leather crafting tools"], ["vec", "complete leather crafting tools reference"]]} +{"query": "origami folding instructions", "output": [["hyde", "Origami folding instructions often start with a square piece of paper. Common folds include valley folds, mountain folds, and reverse folds for structure."], ["lex", "origami overview folding instructions tutorial"], ["lex", "origami folding instructions best practices"], ["lex", "origami folding instructions documentation"], ["vec", "complete origami folding instructions reference"], ["vec", "understanding origami folding instructions"]]} +{"query": "furniture restoration tips", "output": [["hyde", "For furniture restoration, clean surfaces with a gentle solvent, repair joints with wood glue, and finish with varnish or oil for protection."], ["lex", "furniture overview restoration tips guide"], ["lex", "furniture overview restoration tips tutorial"], ["lex", "furniture overview restoration tips examples"], ["vec", "understanding furniture restoration tips"], ["vec", "learn about furniture restoration tips"]]} +{"query": "recent GitHub changes 2026", "output": [["hyde", "As of 2026, GitHub introduced features like 'Code Suggestions' using AI, and enhanced security measures for repository management."], ["lex", "recent overview GitHub changes 2026 tutorial"], ["lex", "recent overview GitHub changes 2026 examples"], ["lex", "recent overview GitHub changes 2026 guide"], ["vec", "complete recent GitHub changes 2026 reference"], ["vec", "understanding recent GitHub changes 2026"]]} +{"query": "recent Kubernetes changes 2025", "output": [["hyde", "In 2025, Kubernetes added 'Ephemeral Containers' for debugging, and 'Volume Snapshot' support for persistent storage management improvements."], ["lex", "recent overview Kubernetes changes 2025 guide"], ["lex", "recent overview Kubernetes changes 2025 tutorial"], ["lex", "recent Kubernetes changes 2025 documentation"], ["vec", "learn about recent Kubernetes changes 2025"], ["vec", "understanding recent Kubernetes changes 2025"]]} +{"query": "climate tech recent news November", "output": [["hyde", "November 2023 saw an increase in climate tech investments, with $1.2 billion in funding directed toward renewable energy startups and carbon capture technologies."], ["lex", "climate overview tech recent news November tutorial"], ["lex", "climate tech recent news November documentation"], ["lex", "climate overview tech recent news November guide"], ["vec", "complete climate tech recent news November reference"], ["vec", "learn about climate tech recent news November"]]} +{"query": "React latest version release", "output": [["hyde", "The latest release of React, version 18.2.0, features automatic batching and improved SSR support, enhancing performance and user experience."], ["lex", "React overview latest version release tutorial"], ["lex", "React overview latest version release examples"], ["lex", "React latest version release best practices"], ["vec", "how to React latest version release"], ["vec", "complete React latest version release reference"]]} +{"query": "AI recent news October", "output": [["hyde", "In October 2023, AI advancements included OpenAI's GPT-4.5 release, focusing on multimodal capabilities and improved contextual understanding."], ["lex", "AI recent news October documentation"], ["lex", "AI overview recent news October tutorial"], ["lex", "AI overview recent news October examples"], ["vec", "how to AI recent news October"], ["vec", "complete AI recent news October reference"]]} +{"query": "recent Kubernetes changes 2026", "output": [["hyde", "Kubernetes 2026 introduced 'Kubelet Configuration' for better node management and 'API Aggregation Layer' enhancements for custom resource handling."], ["lex", "recent overview Kubernetes changes 2026 examples"], ["lex", "recent overview Kubernetes changes 2026 guide"], ["lex", "recent Kubernetes changes 2026 documentation"], ["vec", "complete recent Kubernetes changes 2026 reference"], ["vec", "guide for recent Kubernetes changes 2026"]]} +{"query": "GitHub latest version release", "output": [["hyde", "GitHub's latest version, released December 2023, includes streamlined pull request reviews and enhanced project management tools."], ["lex", "GitHub latest version release best practices"], ["lex", "GitHub overview latest version release tutorial"], ["lex", "GitHub overview latest version release guide"], ["vec", "guide for GitHub latest version release"], ["vec", "complete GitHub latest version release reference"]]} +{"query": "latest Python updates", "output": [["hyde", "Latest Python updates (3.11) emphasize performance improvements, with a 10-60% speed increase in major libraries and syntax enhancements."], ["lex", "latest overview Python updates guide"], ["lex", "latest Python updates documentation"], ["lex", "latest Python updates best practices"], ["vec", "how to latest Python updates"], ["vec", "complete latest Python updates reference"]]} +{"query": "Shopify recent news December", "output": [["hyde", "Shopify's December 2023 updates included new payment processing options and enhanced analytics tools for better sales tracking and inventory management."], ["lex", "Shopify overview recent news December guide"], ["lex", "Shopify overview recent news December tutorial"], ["lex", "Shopify overview recent news December examples"], ["vec", "guide for Shopify recent news December"], ["vec", "complete Shopify recent news December reference"]]} +{"query": "Vue recent news November", "output": [["hyde", "November 2023 saw Vue.js release version 3.2.0, introducing the Composition API and improved TypeScript support for developers."], ["lex", "Vue overview recent news November examples"], ["lex", "Vue recent news November best practices"], ["lex", "Vue recent news November documentation"], ["vec", "how to Vue recent news November"], ["vec", "learn about Vue recent news November"]]} +{"query": "Next.js changelog 2025", "output": [["hyde", "Next.js 2025 changelog highlights include improved SSR, enhanced image optimization, and the addition of middleware support for better routing."], ["lex", "Next.js overview changelog 2025 guide"], ["lex", "Next.js overview changelog 2025 examples"], ["lex", "Next.js changelog 2025 documentation"], ["vec", "learn about Next.js changelog 2025"], ["vec", "understanding Next.js changelog 2025"]]} +{"query": "Docker latest version release", "output": [["hyde", "Docker's latest version, 24.0, released in March 2025, introduces support for multi-platform images and enhanced security features with new scanning tools."], ["lex", "Docker latest version release best practices"], ["lex", "Docker overview latest version release tutorial"], ["lex", "Docker latest version release documentation"], ["vec", "how to Docker latest version release"], ["vec", "understanding Docker latest version release"]]} +{"query": "Kubernetes changelog 2025", "output": [["hyde", "Kubernetes 2025 changelog reveals v1.27 introduced PodSecurity admission, enhanced scheduler performance, and new API for custom resource metrics."], ["lex", "Kubernetes changelog 2025 best practices"], ["lex", "Kubernetes changelog 2025 documentation"], ["lex", "Kubernetes overview changelog 2025 examples"], ["vec", "how to Kubernetes changelog 2025"], ["vec", "learn about Kubernetes changelog 2025"]]} +{"query": "Docker new features 2025", "output": [["hyde", "New features in Docker 2025 include BuildKit improvements, automatic layer caching, and integration of container logging with external services."], ["lex", "Docker overview new features 2025 guide"], ["lex", "Docker new features 2025 best practices"], ["lex", "Docker overview new features 2025 tutorial"], ["vec", "understanding Docker new features 2025"], ["vec", "learn about Docker new features 2025"]]} +{"query": "what changed in Vue 2025", "output": [["hyde", "Vue 2025 changes include Composition API enhancements, Vue Router v5 with improved lazy loading, and better TypeScript support for seamless development."], ["lex", "what changed in Vue 2025 best practices"], ["lex", "what overview changed in Vue 2025 guide"], ["lex", "what changed in Vue 2025 documentation"], ["vec", "how to what changed in Vue 2025"], ["vec", "learn about what changed in Vue 2025"]]} +{"query": "AI new features 2025", "output": [["hyde", "AI advancements in 2025 feature GPT-5 release with 10 trillion parameters, improved multimodal capabilities, and enhanced ethical guidelines for AI usage."], ["lex", "AI new features 2025 documentation"], ["lex", "AI new features 2025 best practices"], ["lex", "AI overview new features 2025 tutorial"], ["vec", "how to AI new features 2025"], ["vec", "learn about AI new features 2025"]]} +{"query": "what changed in Vue 2026", "output": [["hyde", "Vue 2026 updates focus on better performance optimizations, new CLI features for easier project scaffolding, and support for Suspense in SSR."], ["lex", "what overview changed in Vue 2026 tutorial"], ["lex", "what overview changed in Vue 2026 examples"], ["lex", "what overview changed in Vue 2026 guide"], ["vec", "learn about what changed in Vue 2026"], ["vec", "understanding what changed in Vue 2026"]]} +{"query": "recent AI changes 2025", "output": [["hyde", "Recent AI changes in 2025 involve the development of explainable AI frameworks and regulations for AI-generated content to ensure consumer protection."], ["lex", "recent overview AI changes 2025 tutorial"], ["lex", "recent overview AI changes 2025 guide"], ["lex", "recent AI changes 2025 best practices"], ["vec", "understanding recent AI changes 2025"], ["vec", "complete recent AI changes 2025 reference"]]} +{"query": "Vue recent news October", "output": [["hyde", "October 2025 Vue news includes the announcement of Vue 3.3 with improved reactivity performance and community initiatives for better documentation."], ["lex", "Vue recent news October documentation"], ["lex", "Vue overview recent news October guide"], ["lex", "Vue overview recent news October tutorial"], ["vec", "guide for Vue recent news October"], ["vec", "learn about Vue recent news October"]]} +{"query": "what changed in Next.js 2026", "output": [["hyde", "Next.js 2026 introduces React Server Components, native ES modules support, and enhanced analytics for performance tracking and optimization."], ["lex", "what overview changed in Next.js 2026 examples"], ["lex", "what changed in Next.js 2026 documentation"], ["lex", "what changed in Next.js 2026 best practices"], ["vec", "complete what changed in Next.js 2026 reference"], ["vec", "how to what changed in Next.js 2026"]]} +{"query": "Docker changelog 2026", "output": [["hyde", "Docker changelog 2026 highlights include introduction of Docker Compose v2.5, improved networking features, and optimizations for resource usage."], ["lex", "Docker changelog 2026 best practices"], ["lex", "Docker changelog 2026 documentation"], ["lex", "Docker overview changelog 2026 examples"], ["vec", "understanding Docker changelog 2026"], ["vec", "complete Docker changelog 2026 reference"]]} +{"query": "Python recent news November", "output": [["hyde", "November 2025 Python news features the release of Python 3.12 with performance improvements and new syntax for type hinting for enhanced readability."], ["lex", "Python recent news November documentation"], ["lex", "Python overview recent news November tutorial"], ["lex", "Python recent news November best practices"], ["vec", "understanding Python recent news November"], ["vec", "how to Python recent news November"]]} +{"query": "recent Python changes 2026", "output": [["hyde", "Recent Python changes in 2026 include async improvements, new pattern matching capabilities, and the deprecation of older libraries like urllib."], ["lex", "recent Python changes 2026 best practices"], ["lex", "recent Python changes 2026 documentation"], ["lex", "recent overview Python changes 2026 guide"], ["vec", "complete recent Python changes 2026 reference"], ["vec", "guide for recent Python changes 2026"]]} +{"query": "climate tech changelog 2026", "output": [["hyde", "Climate tech changelog 2026 highlights include advancements in carbon capture technologies, renewable energy innovations, and new funding initiatives."], ["lex", "climate tech changelog 2026 documentation"], ["lex", "climate overview tech changelog 2026 examples"], ["lex", "climate tech changelog 2026 best practices"], ["vec", "guide for climate tech changelog 2026"], ["vec", "learn about climate tech changelog 2026"]]} +{"query": "GitHub changelog 2026", "output": [["hyde", "GitHub changelog 2026 reveals new features such as enhanced code review tools, automatic security updates, and improved CI/CD integrations."], ["lex", "GitHub changelog 2026 documentation"], ["lex", "GitHub overview changelog 2026 examples"], ["lex", "GitHub overview changelog 2026 guide"], ["vec", "guide for GitHub changelog 2026"], ["vec", "complete GitHub changelog 2026 reference"]]} +{"query": "Shopify latest version release", "output": [["hyde", "Shopify's latest version, 2.5, released in April 2025, introduced improved payment processing features and new tools for inventory management."], ["lex", "Shopify overview latest version release guide"], ["lex", "Shopify overview latest version release examples"], ["lex", "Shopify overview latest version release tutorial"], ["vec", "how to Shopify latest version release"], ["vec", "guide for Shopify latest version release"]]} +{"query": "recent Python changes 2025", "output": [["hyde", "Recent Python changes in 2025 include the introduction of f-string debugging, better performance with PEP 572, and new async IO utilities."], ["lex", "recent Python changes 2025 best practices"], ["lex", "recent overview Python changes 2025 examples"], ["lex", "recent overview Python changes 2025 tutorial"], ["vec", "understanding recent Python changes 2025"], ["vec", "guide for recent Python changes 2025"]]} +{"query": "recent AWS changes 2025", "output": [["hyde", "AWS changes in 2025 include the launch of Graviton3 processors, enhanced AI/ML services with SageMaker updates, and new serverless offerings."], ["lex", "recent overview AWS changes 2025 guide"], ["lex", "recent AWS changes 2025 best practices"], ["lex", "recent overview AWS changes 2025 examples"], ["vec", "complete recent AWS changes 2025 reference"], ["vec", "guide for recent AWS changes 2025"]]} +{"query": "climate tech recent news October", "output": [["hyde", "October 2025 climate tech news showcases the launch of three new solar projects, advancements in battery storage technology, and funding announcements."], ["lex", "climate tech recent news October documentation"], ["lex", "climate tech recent news October best practices"], ["lex", "climate overview tech recent news October guide"], ["vec", "guide for climate tech recent news October"], ["vec", "understanding climate tech recent news October"]]} +{"query": "Python changelog 2025", "output": [["hyde", "Python changelog 2025 details the release of Python 3.11 with performance boosts, new error messages, and enhanced typing features for developers."], ["lex", "Python overview changelog 2025 tutorial"], ["lex", "Python overview changelog 2025 examples"], ["lex", "Python changelog 2025 best practices"], ["vec", "how to Python changelog 2025"], ["vec", "complete Python changelog 2025 reference"]]} +{"query": "latest AI updates", "output": [["hyde", "Latest AI updates include breakthroughs in natural language understanding, advancements in reinforcement learning, and expanded ethical AI frameworks."], ["lex", "latest AI updates best practices"], ["lex", "latest overview AI updates guide"], ["lex", "latest overview AI updates tutorial"], ["vec", "understanding latest AI updates"], ["vec", "learn about latest AI updates"]]} +{"query": "Vue recent news December", "output": [["hyde", "Vue recent news December 2025 covers the upcoming Vue 3.4 release, new plugins for state management, and community-driven enhancements."], ["lex", "Vue overview recent news December examples"], ["lex", "Vue overview recent news December tutorial"], ["lex", "Vue recent news December best practices"], ["vec", "understanding Vue recent news December"], ["vec", "learn about Vue recent news December"]]} +{"query": "React recent news October", "output": [["hyde", "React news in October 2025 highlights the release of React 18.2 with improved hydration techniques and updates to the new Concurrent features."], ["lex", "React recent news October documentation"], ["lex", "React recent news October best practices"], ["lex", "React overview recent news October examples"], ["vec", "how to React recent news October"], ["vec", "guide for React recent news October"]]} +{"query": "recent space exploration changes 2025", "output": [["hyde", "Recent space exploration changes in 2025 include Artemis II crew selection, Mars Sample Return mission prep, and advancements in satellite technology."], ["lex", "recent overview space exploration changes 2025 guide"], ["lex", "recent space exploration changes 2025 best practices"], ["lex", "recent overview space exploration changes 2025 examples"], ["vec", "guide for recent space exploration changes 2025"], ["vec", "understanding recent space exploration changes 2025"]]} +{"query": "space exploration latest version release", "output": [["hyde", "Latest space exploration release includes NASA’s Artemis III mission scheduled for 2026, featuring new lunar lander designs and crew training updates."], ["lex", "space overview exploration latest version release tutorial"], ["lex", "space overview exploration latest version release guide"], ["lex", "space exploration latest version release documentation"], ["vec", "understanding space exploration latest version release"], ["vec", "complete space exploration latest version release reference"]]} +{"query": "recent machine learning changes 2026", "output": [["hyde", "In 2026, ML frameworks like TensorFlow 3.0 and PyTorch 2.2 introduced enhanced support for large language models and improved GPU utilization."], ["lex", "recent overview machine learning changes 2026 examples"], ["lex", "recent overview machine learning changes 2026 guide"], ["lex", "recent machine learning changes 2026 best practices"], ["vec", "understanding recent machine learning changes 2026"], ["vec", "how to recent machine learning changes 2026"]]} +{"query": "machine learning recent news December", "output": [["hyde", "December 2025 saw the launch of OpenAI's Codex 2.0, significantly improving code generation and debugging capabilities for developers."], ["lex", "machine learning recent news December documentation"], ["lex", "machine overview learning recent news December guide"], ["lex", "machine learning recent news December best practices"], ["vec", "understanding machine learning recent news December"], ["vec", "learn about machine learning recent news December"]]} +{"query": "latest GitHub updates", "output": [["hyde", "GitHub unveiled a new AI-powered code review feature in 2026, enhancing pull request suggestions using machine learning algorithms."], ["lex", "latest overview GitHub updates guide"], ["lex", "latest GitHub updates documentation"], ["lex", "latest GitHub updates best practices"], ["vec", "understanding latest GitHub updates"], ["vec", "how to latest GitHub updates"]]} +{"query": "Vue changelog 2026", "output": [["hyde", "Vue 3.3 released in 2026, introducing Composition API enhancements and new directives for improved reactivity and component organization."], ["lex", "Vue overview changelog 2026 examples"], ["lex", "Vue changelog 2026 documentation"], ["lex", "Vue changelog 2026 best practices"], ["vec", "learn about Vue changelog 2026"], ["vec", "how to Vue changelog 2026"]]} +{"query": "recent Docker changes 2025", "output": [["hyde", "Docker 20.10.14 in 2025 added support for multi-architecture images and improved performance for build caching and layer management."], ["lex", "recent Docker changes 2025 documentation"], ["lex", "recent Docker changes 2025 best practices"], ["lex", "recent overview Docker changes 2025 guide"], ["vec", "complete recent Docker changes 2025 reference"], ["vec", "how to recent Docker changes 2025"]]} +{"query": "what changed in GitHub 2026", "output": [["hyde", "In 2026, GitHub launched Copilot Labs, introducing experimental features for collaborative coding and enhanced documentation generation."], ["lex", "what overview changed in GitHub 2026 tutorial"], ["lex", "what overview changed in GitHub 2026 guide"], ["lex", "what changed in GitHub 2026 documentation"], ["vec", "understanding what changed in GitHub 2026"], ["vec", "guide for what changed in GitHub 2026"]]} +{"query": "Shopify recent news October", "output": [["hyde", "Shopify reported a 25% increase in Q3 2026 revenue, driven by enhanced AI tools for personalized shopping experiences and inventory management."], ["lex", "Shopify overview recent news October guide"], ["lex", "Shopify recent news October documentation"], ["lex", "Shopify overview recent news October tutorial"], ["vec", "learn about Shopify recent news October"], ["vec", "complete Shopify recent news October reference"]]} +{"query": "recent GitHub changes 2025", "output": [["hyde", "GitHub's 2025 updates included improved issue tracking and the rollout of Discussions, allowing teams to communicate more effectively."], ["lex", "recent overview GitHub changes 2025 guide"], ["lex", "recent GitHub changes 2025 best practices"], ["lex", "recent overview GitHub changes 2025 tutorial"], ["vec", "guide for recent GitHub changes 2025"], ["vec", "learn about recent GitHub changes 2025"]]} +{"query": "Next.js changelog 2026", "output": [["hyde", "Next.js 13 released in 2026 with new features like middleware support and improved image optimization, enhancing performance on server-side rendering."], ["lex", "Next.js overview changelog 2026 tutorial"], ["lex", "Next.js changelog 2026 documentation"], ["lex", "Next.js changelog 2026 best practices"], ["vec", "guide for Next.js changelog 2026"], ["vec", "complete Next.js changelog 2026 reference"]]} +{"query": "what changed in TypeScript 2026", "output": [["hyde", "TypeScript 5.0 in 2026 introduced new syntax for type aliases and improved inference, increasing developer productivity and code clarity."], ["lex", "what overview changed in TypeScript 2026 examples"], ["lex", "what changed in TypeScript 2026 best practices"], ["lex", "what changed in TypeScript 2026 documentation"], ["vec", "complete what changed in TypeScript 2026 reference"], ["vec", "guide for what changed in TypeScript 2026"]]} +{"query": "Python new features 2026", "output": [["hyde", "Python 3.11 added structural pattern matching and performance improvements, with benchmarks showing up to 30% faster execution in certain cases."], ["lex", "Python new features 2026 best practices"], ["lex", "Python overview new features 2026 examples"], ["lex", "Python overview new features 2026 guide"], ["vec", "guide for Python new features 2026"], ["vec", "complete Python new features 2026 reference"]]} +{"query": "climate tech changelog 2025", "output": [["hyde", "Climate tech updates in 2025 included breakthroughs in carbon capture technology, with several startups reporting efficiencies over 90% in CO2 removal."], ["lex", "climate overview tech changelog 2025 tutorial"], ["lex", "climate tech changelog 2025 documentation"], ["lex", "climate overview tech changelog 2025 examples"], ["vec", "guide for climate tech changelog 2025"], ["vec", "how to climate tech changelog 2025"]]} +{"query": "GitHub recent news December", "output": [["hyde", "In December 2025, GitHub reported reaching 100 million repositories, highlighting a 15% increase in open-source contributions year-over-year."], ["lex", "GitHub recent news December best practices"], ["lex", "GitHub overview recent news December guide"], ["lex", "GitHub overview recent news December examples"], ["vec", "learn about GitHub recent news December"], ["vec", "how to GitHub recent news December"]]} +{"query": "Kubernetes new features 2026", "output": [["hyde", "Kubernetes 1.27 launched in 2026, featuring enhanced security with PodSecurity admission and improved scheduling algorithms for resource optimization."], ["lex", "Kubernetes new features 2026 documentation"], ["lex", "Kubernetes overview new features 2026 tutorial"], ["lex", "Kubernetes overview new features 2026 guide"], ["vec", "understanding Kubernetes new features 2026"], ["vec", "guide for Kubernetes new features 2026"]]} +{"query": "Kubernetes recent news October", "output": [["hyde", "October 2025 saw Kubernetes releasing its new multi-cluster management capabilities, simplifying operations across various environments."], ["lex", "Kubernetes recent news October best practices"], ["lex", "Kubernetes overview recent news October guide"], ["lex", "Kubernetes recent news October documentation"], ["vec", "how to Kubernetes recent news October"], ["vec", "complete Kubernetes recent news October reference"]]} +{"query": "TypeScript recent news October", "output": [["hyde", "TypeScript's October 2025 updates included support for decorators and a new compiler API, aimed at improving the development experience."], ["lex", "TypeScript recent news October best practices"], ["lex", "TypeScript overview recent news October guide"], ["lex", "TypeScript recent news October documentation"], ["vec", "understanding TypeScript recent news October"], ["vec", "complete TypeScript recent news October reference"]]} +{"query": "Docker recent news October", "output": [["hyde", "Docker's October 2025 news highlighted partnerships with cloud providers to streamline container orchestration and deployment for enterprise solutions."], ["lex", "Docker recent news October documentation"], ["lex", "Docker overview recent news October examples"], ["lex", "Docker overview recent news October tutorial"], ["vec", "complete Docker recent news October reference"], ["vec", "learn about Docker recent news October"]]} +{"query": "space exploration changelog 2025", "output": [["hyde", "In 2025, significant milestones in space exploration included the successful Mars Sample Return mission planning by NASA, targeting launch in 2031."], ["lex", "space overview exploration changelog 2025 guide"], ["lex", "space overview exploration changelog 2025 tutorial"], ["lex", "space exploration changelog 2025 documentation"], ["vec", "complete space exploration changelog 2025 reference"], ["vec", "understanding space exploration changelog 2025"]]} +{"query": "Vue latest version release", "output": [["hyde", "Vue 3.2 was released in 2026, featuring improved TypeScript support and a new plugin system aimed at enhancing modular development."], ["lex", "Vue latest version release documentation"], ["lex", "Vue latest version release best practices"], ["lex", "Vue overview latest version release examples"], ["vec", "complete Vue latest version release reference"], ["vec", "learn about Vue latest version release"]]} +{"query": "Next.js new features 2025", "output": [["hyde", "Next.js 12 introduced in 2025 featured automatic static optimization and a revamped API for handling serverless functions more efficiently."], ["lex", "Next.js new features 2025 best practices"], ["lex", "Next.js overview new features 2025 guide"], ["lex", "Next.js overview new features 2025 tutorial"], ["vec", "learn about Next.js new features 2025"], ["vec", "complete Next.js new features 2025 reference"]]} +{"query": "climate tech new features 2025", "output": [["hyde", "In 2025, climate tech innovations included AI-driven energy management systems, reducing operational costs by up to 40% for large enterprises."], ["lex", "climate overview tech new features 2025 guide"], ["lex", "climate overview tech new features 2025 tutorial"], ["lex", "climate overview tech new features 2025 examples"], ["vec", "learn about climate tech new features 2025"], ["vec", "understanding climate tech new features 2025"]]} +{"query": "what changed in climate tech 2026", "output": [["hyde", "2026 saw climate tech advancements in renewable energy storage, with new battery technologies achieving 20% greater efficiency over previous models."], ["lex", "what overview changed in climate tech 2026 examples"], ["lex", "what changed in climate tech 2026 documentation"], ["lex", "what overview changed in climate tech 2026 tutorial"], ["vec", "how to what changed in climate tech 2026"], ["vec", "complete what changed in climate tech 2026 reference"]]} +{"query": "what changed in space exploration 2026", "output": [["hyde", "Space exploration updates in 2026 included the Artemis II mission's successful crewed flight test, paving the way for lunar landings by 2028."], ["lex", "what changed in space exploration 2026 best practices"], ["lex", "what overview changed in space exploration 2026 tutorial"], ["lex", "what overview changed in space exploration 2026 examples"], ["vec", "how to what changed in space exploration 2026"], ["vec", "understanding what changed in space exploration 2026"]]} +{"query": "Shopify new features 2025", "output": [["hyde", "Shopify's 2025 features included an enhanced AR shopping experience and a new subscription management tool for recurring billing solutions."], ["lex", "Shopify overview new features 2025 guide"], ["lex", "Shopify new features 2025 documentation"], ["lex", "Shopify new features 2025 best practices"], ["vec", "understanding Shopify new features 2025"], ["vec", "complete Shopify new features 2025 reference"]]} +{"query": "climate tech new features 2026", "output": [["hyde", "In 2026, climate tech focused on sustainable agriculture innovations, with vertical farming techniques reducing water usage by 60% compared to traditional methods."], ["lex", "climate overview tech new features 2026 guide"], ["lex", "climate tech new features 2026 best practices"], ["lex", "climate overview tech new features 2026 tutorial"], ["vec", "understanding climate tech new features 2026"], ["vec", "how to climate tech new features 2026"]]} +{"query": "machine learning recent news October", "output": [["hyde", "In October 2023, researchers unveiled a new ML model achieving 95% accuracy in image recognition, leveraging self-supervised learning techniques."], ["lex", "machine overview learning recent news October guide"], ["lex", "machine learning recent news October best practices"], ["lex", "machine overview learning recent news October tutorial"], ["vec", "complete machine learning recent news October reference"], ["vec", "learn about machine learning recent news October"]]} +{"query": "latest React updates", "output": [["hyde", "React 18.3 introduced features like automatic batching, improved SSR support, and new hooks for better state management, enhancing performance and developer experience."], ["lex", "latest React updates documentation"], ["lex", "latest overview React updates examples"], ["lex", "latest React updates best practices"], ["vec", "learn about latest React updates"], ["vec", "understanding latest React updates"]]} +{"query": "TypeScript latest version release", "output": [["hyde", "TypeScript 5.4 released on October 12, 2023, featuring improved inference for `const` assertions and new utility types, boosting type safety and developer productivity."], ["lex", "TypeScript latest version release best practices"], ["lex", "TypeScript overview latest version release examples"], ["lex", "TypeScript overview latest version release tutorial"], ["vec", "guide for TypeScript latest version release"], ["vec", "complete TypeScript latest version release reference"]]} +{"query": "Next.js latest version release", "output": [["hyde", "Next.js 13.5 released on October 15, 2023, includes enhanced image optimization, middleware support, and improved build performance for static exports."], ["lex", "Next.js latest version release best practices"], ["lex", "Next.js overview latest version release guide"], ["lex", "Next.js overview latest version release examples"], ["vec", "how to Next.js latest version release"], ["vec", "guide for Next.js latest version release"]]} +{"query": "what changed in Kubernetes 2026", "output": [["hyde", "Kubernetes 1.28, releasing in August 2026, includes the new PodSecurity admission, enhanced resource quotas, and improved stateful set scaling capabilities."], ["lex", "what overview changed in Kubernetes 2026 tutorial"], ["lex", "what changed in Kubernetes 2026 best practices"], ["lex", "what overview changed in Kubernetes 2026 guide"], ["vec", "understanding what changed in Kubernetes 2026"], ["vec", "complete what changed in Kubernetes 2026 reference"]]} +{"query": "recent React changes 2026", "output": [["hyde", "In 2026, React introduced Concurrent Features by default, improving rendering performance and user experience, along with new SSR capabilities."], ["lex", "recent React changes 2026 documentation"], ["lex", "recent React changes 2026 best practices"], ["lex", "recent overview React changes 2026 examples"], ["vec", "understanding recent React changes 2026"], ["vec", "learn about recent React changes 2026"]]} +{"query": "recent climate tech changes 2025", "output": [["hyde", "2025 saw the launch of a $500 million fund for climate tech startups, focusing on carbon capture and renewable energy innovations to mitigate climate change."], ["lex", "recent climate tech changes 2025 best practices"], ["lex", "recent overview climate tech changes 2025 guide"], ["lex", "recent overview climate tech changes 2025 tutorial"], ["vec", "complete recent climate tech changes 2025 reference"], ["vec", "guide for recent climate tech changes 2025"]]} +{"query": "what changed in Shopify 2026", "output": [["hyde", "Shopify 2026 introduced AI-driven product recommendations and one-click checkout, significantly increasing conversion rates for merchants by 30% on average."], ["lex", "what changed in Shopify 2026 best practices"], ["lex", "what changed in Shopify 2026 documentation"], ["lex", "what overview changed in Shopify 2026 guide"], ["vec", "complete what changed in Shopify 2026 reference"], ["vec", "learn about what changed in Shopify 2026"]]} +{"query": "Kubernetes changelog 2026", "output": [["hyde", "Kubernetes 2026 changelog highlights include enhancements to the Container Storage Interface and more robust support for multi-cluster management tools."], ["lex", "Kubernetes changelog 2026 documentation"], ["lex", "Kubernetes overview changelog 2026 examples"], ["lex", "Kubernetes overview changelog 2026 tutorial"], ["vec", "guide for Kubernetes changelog 2026"], ["vec", "understanding Kubernetes changelog 2026"]]} +{"query": "Shopify recent news November", "output": [["hyde", "In November 2025, Shopify reported a 25% increase in merchant sales, attributed to new analytics tools and improved integration with social media platforms."], ["lex", "Shopify overview recent news November tutorial"], ["lex", "Shopify overview recent news November examples"], ["lex", "Shopify recent news November best practices"], ["vec", "learn about Shopify recent news November"], ["vec", "guide for Shopify recent news November"]]} +{"query": "GitHub recent news October", "output": [["hyde", "GitHub announced a new Copilot feature in October 2023 that generates code snippets in multiple programming languages, streamlining the development process."], ["lex", "GitHub overview recent news October tutorial"], ["lex", "GitHub recent news October best practices"], ["lex", "GitHub overview recent news October guide"], ["vec", "guide for GitHub recent news October"], ["vec", "learn about GitHub recent news October"]]} +{"query": "Kubernetes recent news December", "output": [["hyde", "Kubernetes news in December 2023 highlights the upcoming 1.29 release, featuring better support for ephemeral containers and improved security policies."], ["lex", "Kubernetes overview recent news December examples"], ["lex", "Kubernetes overview recent news December guide"], ["lex", "Kubernetes recent news December documentation"], ["vec", "how to Kubernetes recent news December"], ["vec", "complete Kubernetes recent news December reference"]]} +{"query": "what changed in Docker 2025", "output": [["hyde", "Docker 2025 introduced BuildKit enhancements, reducing build times by 40%, and added native support for multi-platform builds in the Docker CLI."], ["lex", "what changed in Docker 2025 best practices"], ["lex", "what overview changed in Docker 2025 guide"], ["lex", "what overview changed in Docker 2025 examples"], ["vec", "understanding what changed in Docker 2025"], ["vec", "learn about what changed in Docker 2025"]]} +{"query": "recent React changes 2025", "output": [["hyde", "React 2025 updates focused on performance optimizations, including tree-shaking improvements and better integration with TypeScript for type safety."], ["lex", "recent overview React changes 2025 guide"], ["lex", "recent React changes 2025 best practices"], ["lex", "recent overview React changes 2025 examples"], ["vec", "how to recent React changes 2025"], ["vec", "complete recent React changes 2025 reference"]]} +{"query": "what changed in Kubernetes 2025", "output": [["hyde", "Kubernetes 2025 changed the default storage class to support volume snapshots, improving data resilience and backup strategies across clusters."], ["lex", "what changed in Kubernetes 2025 best practices"], ["lex", "what overview changed in Kubernetes 2025 guide"], ["lex", "what overview changed in Kubernetes 2025 tutorial"], ["vec", "guide for what changed in Kubernetes 2025"], ["vec", "understanding what changed in Kubernetes 2025"]]} +{"query": "recent TypeScript changes 2026", "output": [["hyde", "TypeScript 2026 introduced the `satisfies` operator for better type inference, streamlining the process of ensuring types align with expected interfaces."], ["lex", "recent overview TypeScript changes 2026 guide"], ["lex", "recent TypeScript changes 2026 documentation"], ["lex", "recent TypeScript changes 2026 best practices"], ["vec", "learn about recent TypeScript changes 2026"], ["vec", "understanding recent TypeScript changes 2026"]]} +{"query": "Shopify changelog 2025", "output": [["hyde", "Shopify's 2025 changelog includes the introduction of Shopify Fulfillment Network, enabling faster shipping options for merchants across North America."], ["lex", "Shopify overview changelog 2025 examples"], ["lex", "Shopify overview changelog 2025 guide"], ["lex", "Shopify changelog 2025 best practices"], ["vec", "learn about Shopify changelog 2025"], ["vec", "understanding Shopify changelog 2025"]]} +{"query": "latest Docker updates", "output": [["hyde", "Docker's latest updates in October 2023 include enhanced security scanning features and improved integration with Kubernetes for streamlined deployments."], ["lex", "latest overview Docker updates guide"], ["lex", "latest overview Docker updates examples"], ["lex", "latest overview Docker updates tutorial"], ["vec", "understanding latest Docker updates"], ["vec", "learn about latest Docker updates"]]} +{"query": "recent machine learning changes 2025", "output": [["hyde", "In 2025, new ML frameworks emerged, like PyTorch 2.0, emphasizing GPU acceleration and modularity, significantly improving model training times."], ["lex", "recent machine learning changes 2025 documentation"], ["lex", "recent overview machine learning changes 2025 tutorial"], ["lex", "recent overview machine learning changes 2025 examples"], ["vec", "complete recent machine learning changes 2025 reference"], ["vec", "understanding recent machine learning changes 2025"]]} +{"query": "recent AI changes 2026", "output": [["hyde", "2026 AI updates include breakthroughs in natural language processing, with models achieving human-like conversational abilities and context awareness improvements."], ["lex", "recent overview AI changes 2026 examples"], ["lex", "recent overview AI changes 2026 guide"], ["lex", "recent AI changes 2026 best practices"], ["vec", "how to recent AI changes 2026"], ["vec", "guide for recent AI changes 2026"]]} +{"query": "recent Docker changes 2026", "output": [["hyde", "Docker 2026 updates focus on enhanced support for serverless functions, allowing developers to deploy functions directly from the Docker CLI efficiently."], ["lex", "recent overview Docker changes 2026 guide"], ["lex", "recent overview Docker changes 2026 examples"], ["lex", "recent Docker changes 2026 documentation"], ["vec", "guide for recent Docker changes 2026"], ["vec", "learn about recent Docker changes 2026"]]} +{"query": "what changed in AWS 2026", "output": [["hyde", "AWS 2026 introduced new AI services like SageMaker Studio Lab, providing free compute resources for ML model experimentation and training."], ["lex", "what overview changed in AWS 2026 guide"], ["lex", "what changed in AWS 2026 documentation"], ["lex", "what overview changed in AWS 2026 tutorial"], ["vec", "how to what changed in AWS 2026"], ["vec", "understanding what changed in AWS 2026"]]} +{"query": "what changed in Shopify 2025", "output": [["hyde", "Shopify 2025 updated its API to include advanced analytics features, allowing merchants to track user behavior and optimize sales strategies effectively."], ["lex", "what overview changed in Shopify 2025 guide"], ["lex", "what changed in Shopify 2025 documentation"], ["lex", "what overview changed in Shopify 2025 examples"], ["vec", "understanding what changed in Shopify 2025"], ["vec", "how to what changed in Shopify 2025"]]} +{"query": "AI changelog 2026", "output": [["hyde", "AI changelog 2026 highlights include the release of GPT-5, which boasts improved contextual understanding and a 50% reduction in response time."], ["lex", "AI changelog 2026 documentation"], ["lex", "AI overview changelog 2026 examples"], ["lex", "AI changelog 2026 best practices"], ["vec", "learn about AI changelog 2026"], ["vec", "understanding AI changelog 2026"]]} +{"query": "latest Kubernetes updates", "output": [["hyde", "Kubernetes 2023 updates include improved scheduling algorithms and enhanced observability features, enabling better monitoring of cluster performance."], ["lex", "latest Kubernetes updates best practices"], ["lex", "latest Kubernetes updates documentation"], ["lex", "latest overview Kubernetes updates guide"], ["vec", "guide for latest Kubernetes updates"], ["vec", "learn about latest Kubernetes updates"]]} +{"query": "what changed in climate tech 2025", "output": [["hyde", "In 2025, climate tech saw a 30% increase in solar panel efficiency, with new perovskite materials. Carbon capture technology also advanced, reducing costs by 40%."], ["lex", "what overview changed in climate tech 2025 guide"], ["lex", "what changed in climate tech 2025 best practices"], ["lex", "what overview changed in climate tech 2025 examples"], ["vec", "learn about what changed in climate tech 2025"], ["vec", "understanding what changed in climate tech 2025"]]} +{"query": "latest machine learning updates", "output": [["hyde", "Latest updates in machine learning include the introduction of GPT-5, boasting 175 billion parameters, and advancements in self-supervised learning techniques."], ["lex", "latest machine learning updates documentation"], ["lex", "latest machine learning updates best practices"], ["lex", "latest overview machine learning updates examples"], ["vec", "learn about latest machine learning updates"], ["vec", "understanding latest machine learning updates"]]} +{"query": "what changed in Next.js 2025", "output": [["hyde", "Next.js 2025 introduced middleware support, enabling server-side logic without API routes, and improved image optimization with the new 'next/image' component."], ["lex", "what changed in Next.js 2025 best practices"], ["lex", "what changed in Next.js 2025 documentation"], ["lex", "what overview changed in Next.js 2025 guide"], ["vec", "understanding what changed in Next.js 2025"], ["vec", "learn about what changed in Next.js 2025"]]} +{"query": "TypeScript changelog 2025", "output": [["hyde", "TypeScript 2025 added support for 'override' and 'override declaration' keywords, improved type inference, and introduced the 'satisfies' operator for type-checking."], ["lex", "TypeScript changelog 2025 documentation"], ["lex", "TypeScript overview changelog 2025 examples"], ["lex", "TypeScript overview changelog 2025 guide"], ["vec", "understanding TypeScript changelog 2025"], ["vec", "guide for TypeScript changelog 2025"]]} +{"query": "recent AWS changes 2026", "output": [["hyde", "In 2026, AWS announced the launch of Graviton3 instances, offering 25% better price-performance, and the introduction of SageMaker Canvas for no-code ML."], ["lex", "recent overview AWS changes 2026 guide"], ["lex", "recent overview AWS changes 2026 tutorial"], ["lex", "recent overview AWS changes 2026 examples"], ["vec", "how to recent AWS changes 2026"], ["vec", "understanding recent AWS changes 2026"]]} +{"query": "Vue changelog 2025", "output": [["hyde", "Vue 2025 added the Composition API enhancements, improved reactivity model, and introduced a new CLI tool for project scaffolding and dependency management."], ["lex", "Vue changelog 2025 best practices"], ["lex", "Vue changelog 2025 documentation"], ["lex", "Vue overview changelog 2025 examples"], ["vec", "guide for Vue changelog 2025"], ["vec", "understanding Vue changelog 2025"]]} +{"query": "TypeScript new features 2025", "output": [["hyde", "New features in TypeScript 2025 include 'template literal types', 'const assertions', and improved support for 'readonly' and 'writeonce' modifier types."], ["lex", "TypeScript new features 2025 best practices"], ["lex", "TypeScript overview new features 2025 guide"], ["lex", "TypeScript overview new features 2025 tutorial"], ["vec", "complete TypeScript new features 2025 reference"], ["vec", "how to TypeScript new features 2025"]]} +{"query": "React recent news December", "output": [["hyde", "React's December news highlights the release of React 18.2, focusing on performance optimizations and the introduction of the 'useId' hook for unique IDs."], ["lex", "React recent news December best practices"], ["lex", "React overview recent news December tutorial"], ["lex", "React overview recent news December examples"], ["vec", "complete React recent news December reference"], ["vec", "guide for React recent news December"]]} +{"query": "AWS changelog 2026", "output": [["hyde", "AWS changelog 2026 features the introduction of Amazon RDS Proxy for serverless applications and enhanced security with IAM roles for service accounts."], ["lex", "AWS changelog 2026 best practices"], ["lex", "AWS changelog 2026 documentation"], ["lex", "AWS overview changelog 2026 guide"], ["vec", "guide for AWS changelog 2026"], ["vec", "learn about AWS changelog 2026"]]} +{"query": "AI recent news December", "output": [["hyde", "AI recent news in December includes the unveiling of ChatGPT 4.5, which features enhanced reasoning capabilities and real-time web browsing integration."], ["lex", "AI recent news December documentation"], ["lex", "AI overview recent news December guide"], ["lex", "AI recent news December best practices"], ["vec", "complete AI recent news December reference"], ["vec", "how to AI recent news December"]]} +{"query": "TypeScript recent news December", "output": [["hyde", "TypeScript's December updates include a new compiler option for 'useDefineForClassFields' and improvements in performance for large project builds."], ["lex", "TypeScript recent news December documentation"], ["lex", "TypeScript recent news December best practices"], ["lex", "TypeScript overview recent news December examples"], ["vec", "understanding TypeScript recent news December"], ["vec", "how to TypeScript recent news December"]]} +{"query": "climate tech recent news December", "output": [["hyde", "In December, climate tech reports highlighted a 50% rise in investments in renewable energy projects, with significant advancements in battery storage technologies."], ["lex", "climate tech recent news December best practices"], ["lex", "climate overview tech recent news December guide"], ["lex", "climate tech recent news December documentation"], ["vec", "how to climate tech recent news December"], ["vec", "guide for climate tech recent news December"]]} +{"query": "Next.js recent news October", "output": [["hyde", "Next.js recent news in October covered the beta release of the new 'next/future' experimental features, focusing on improved developer experience and performance."], ["lex", "Next.js overview recent news October guide"], ["lex", "Next.js recent news October documentation"], ["lex", "Next.js recent news October best practices"], ["vec", "complete Next.js recent news October reference"], ["vec", "guide for Next.js recent news October"]]} +{"query": "AI latest version release", "output": [["hyde", "The latest AI version release is GPT-5, launched in December 2025, featuring multi-modal capabilities and an expanded knowledge base up to 2026."], ["lex", "AI overview latest version release guide"], ["lex", "AI overview latest version release examples"], ["lex", "AI latest version release documentation"], ["vec", "understanding AI latest version release"], ["vec", "how to AI latest version release"]]} +{"query": "latest Next.js updates", "output": [["hyde", "Latest Next.js updates include automatic static optimization improvements and new support for React Server Components, enhancing SSR capabilities."], ["lex", "latest Next.js updates documentation"], ["lex", "latest overview Next.js updates tutorial"], ["lex", "latest overview Next.js updates guide"], ["vec", "understanding latest Next.js updates"], ["vec", "learn about latest Next.js updates"]]} +{"query": "Vue new features 2026", "output": [["hyde", "Vue's new features in 2026 include improved TypeScript integration, enhanced routing capabilities, and a new state management library for simplified state handling."], ["lex", "Vue overview new features 2026 examples"], ["lex", "Vue overview new features 2026 guide"], ["lex", "Vue new features 2026 documentation"], ["vec", "guide for Vue new features 2026"], ["vec", "understanding Vue new features 2026"]]} +{"query": "space exploration new features 2026", "output": [["hyde", "Space exploration updates in 2026 include the Artemis III mission planned for 2027, aiming to establish a sustainable lunar presence by 2030."], ["lex", "space overview exploration new features 2026 tutorial"], ["lex", "space exploration new features 2026 best practices"], ["lex", "space overview exploration new features 2026 guide"], ["vec", "understanding space exploration new features 2026"], ["vec", "learn about space exploration new features 2026"]]} +{"query": "recent Shopify changes 2026", "output": [["hyde", "Recent Shopify changes in 2026 include the release of Shopify Plus 3.0 with improved analytics tools and AI-driven product recommendations for merchants."], ["lex", "recent overview Shopify changes 2026 examples"], ["lex", "recent Shopify changes 2026 best practices"], ["lex", "recent overview Shopify changes 2026 tutorial"], ["vec", "how to recent Shopify changes 2026"], ["vec", "understanding recent Shopify changes 2026"]]} +{"query": "machine learning latest version release", "output": [["hyde", "The latest version release in machine learning is TensorFlow 3.0, which emphasizes modularity and performance improvements for distributed training."], ["lex", "machine learning latest version release documentation"], ["lex", "machine overview learning latest version release tutorial"], ["lex", "machine overview learning latest version release examples"], ["vec", "complete machine learning latest version release reference"], ["vec", "understanding machine learning latest version release"]]} +{"query": "Docker new features 2026", "output": [["hyde", "Docker's new features in 2026 include support for multi-platform builds and enhanced security features with built-in vulnerability scanning for images."], ["lex", "Docker overview new features 2026 tutorial"], ["lex", "Docker overview new features 2026 guide"], ["lex", "Docker new features 2026 best practices"], ["vec", "how to Docker new features 2026"], ["vec", "complete Docker new features 2026 reference"]]} +{"query": "Python recent news December", "output": [["hyde", "Python's recent news in December includes the release of Python 3.12, featuring performance enhancements and pattern matching for cleaner syntax."], ["lex", "Python overview recent news December guide"], ["lex", "Python recent news December best practices"], ["lex", "Python overview recent news December tutorial"], ["vec", "complete Python recent news December reference"], ["vec", "understanding Python recent news December"]]} +{"query": "what changed in React 2026", "output": [["hyde", "React 2026 changes include the introduction of concurrent rendering improvements and the new 'useDeferredValue' hook for managing rendering priorities."], ["lex", "what changed in React 2026 documentation"], ["lex", "what overview changed in React 2026 examples"], ["lex", "what overview changed in React 2026 guide"], ["vec", "learn about what changed in React 2026"], ["vec", "understanding what changed in React 2026"]]} +{"query": "Docker changelog 2025", "output": [["hyde", "Docker changelog 2025 highlighted the addition of BuildKit enhancements and support for Docker Compose v2, improving multi-container orchestration."], ["lex", "Docker overview changelog 2025 examples"], ["lex", "Docker changelog 2025 best practices"], ["lex", "Docker overview changelog 2025 tutorial"], ["vec", "understanding Docker changelog 2025"], ["vec", "complete Docker changelog 2025 reference"]]} +{"query": "what changed in Docker 2026", "output": [["hyde", "Changes in Docker 2026 include the introduction of containerd support for enhanced runtime performance and a new integrated CLI for easier management."], ["lex", "what changed in Docker 2026 best practices"], ["lex", "what changed in Docker 2026 documentation"], ["lex", "what overview changed in Docker 2026 examples"], ["vec", "complete what changed in Docker 2026 reference"], ["vec", "understanding what changed in Docker 2026"]]} +{"query": "recent Next.js changes 2026", "output": [["hyde", "Recent Next.js changes in 2026 include a new plugin system for easier customization and improved static site generation capabilities."], ["lex", "recent Next.js changes 2026 best practices"], ["lex", "recent overview Next.js changes 2026 guide"], ["lex", "recent Next.js changes 2026 documentation"], ["vec", "understanding recent Next.js changes 2026"], ["vec", "learn about recent Next.js changes 2026"]]} +{"query": "latest climate tech updates", "output": [["hyde", "In 2023, breakthroughs in carbon capture tech have emerged, with companies like Climeworks achieving over 1,000 tons of CO2 captured monthly."], ["lex", "latest overview climate tech updates examples"], ["lex", "latest overview climate tech updates tutorial"], ["lex", "latest climate tech updates best practices"], ["vec", "understanding latest climate tech updates"], ["vec", "complete latest climate tech updates reference"]]} +{"query": "machine learning changelog 2026", "output": [["hyde", "The 2026 ML changelog highlights the introduction of TensorFlow 3.0, which features enhanced model optimization and expanded support for quantum computing."], ["lex", "machine learning changelog 2026 documentation"], ["lex", "machine overview learning changelog 2026 guide"], ["lex", "machine overview learning changelog 2026 examples"], ["vec", "guide for machine learning changelog 2026"], ["vec", "learn about machine learning changelog 2026"]]} +{"query": "what changed in AWS 2025", "output": [["hyde", "AWS 2025 updates include the launch of new Graviton3 processors, promising up to 25% better performance for EC2 instances compared to Graviton2."], ["lex", "what overview changed in AWS 2025 examples"], ["lex", "what overview changed in AWS 2025 guide"], ["lex", "what changed in AWS 2025 best practices"], ["vec", "complete what changed in AWS 2025 reference"], ["vec", "learn about what changed in AWS 2025"]]} +{"query": "Kubernetes recent news November", "output": [["hyde", "November 2023 saw Kubernetes 1.27 release, introducing improved support for Windows workloads and enhanced security features with PodSecurity admission."], ["lex", "Kubernetes overview recent news November guide"], ["lex", "Kubernetes overview recent news November tutorial"], ["lex", "Kubernetes recent news November best practices"], ["vec", "how to Kubernetes recent news November"], ["vec", "guide for Kubernetes recent news November"]]} +{"query": "AI changelog 2025", "output": [["hyde", "In 2025, AI advancements included OpenAI's release of GPT-5, boasting capabilities for multi-modal inputs and improved context understanding."], ["lex", "AI overview changelog 2025 examples"], ["lex", "AI changelog 2025 best practices"], ["lex", "AI overview changelog 2025 tutorial"], ["vec", "guide for AI changelog 2025"], ["vec", "learn about AI changelog 2025"]]} +{"query": "recent Next.js changes 2025", "output": [["hyde", "Next.js 2025 introduced support for React Server Components and a new image optimization API, enhancing performance for dynamic websites."], ["lex", "recent Next.js changes 2025 documentation"], ["lex", "recent overview Next.js changes 2025 examples"], ["lex", "recent Next.js changes 2025 best practices"], ["vec", "how to recent Next.js changes 2025"], ["vec", "complete recent Next.js changes 2025 reference"]]} +{"query": "Python recent news October", "output": [["hyde", "October 2023 saw Python 3.12 release, which includes type parameters in collections and performance improvements, with benchmarks showing 5-10% speedup."], ["lex", "Python overview recent news October examples"], ["lex", "Python recent news October documentation"], ["lex", "Python recent news October best practices"], ["vec", "complete Python recent news October reference"], ["vec", "guide for Python recent news October"]]} +{"query": "recent Vue changes 2025", "output": [["hyde", "Vue 3.3 released in early 2025, offering improved TypeScript support and the new 'Teleport' feature for efficient DOM manipulation."], ["lex", "recent overview Vue changes 2025 tutorial"], ["lex", "recent Vue changes 2025 best practices"], ["lex", "recent overview Vue changes 2025 guide"], ["vec", "guide for recent Vue changes 2025"], ["vec", "complete recent Vue changes 2025 reference"]]} +{"query": "AI new features 2026", "output": [["hyde", "AI features in 2026 include real-time language translation by Google AI and enhanced ethical guidelines for AI deployment across industries."], ["lex", "AI new features 2026 documentation"], ["lex", "AI overview new features 2026 guide"], ["lex", "AI overview new features 2026 tutorial"], ["vec", "how to AI new features 2026"], ["vec", "complete AI new features 2026 reference"]]} +{"query": "React new features 2026", "output": [["hyde", "React 18 introduced a new concurrent rendering feature, allowing developers to create smoother user experiences by prioritizing updates in 2026."], ["lex", "React new features 2026 documentation"], ["lex", "React overview new features 2026 tutorial"], ["lex", "React overview new features 2026 examples"], ["vec", "learn about React new features 2026"], ["vec", "complete React new features 2026 reference"]]} +{"query": "Vue new features 2025", "output": [["hyde", "Vue 3.2 released in 2025, featuring Composition API enhancements and better reactivity performance, with an emphasis on developer experience."], ["lex", "Vue new features 2025 documentation"], ["lex", "Vue new features 2025 best practices"], ["lex", "Vue overview new features 2025 guide"], ["vec", "guide for Vue new features 2025"], ["vec", "understanding Vue new features 2025"]]} +{"query": "climate tech latest version release", "output": [["hyde", "The latest climate tech version, ClimateTech 2.1, released in November 2023, includes updates to renewable energy tracking and emissions reporting tools."], ["lex", "climate overview tech latest version release examples"], ["lex", "climate overview tech latest version release tutorial"], ["lex", "climate tech latest version release best practices"], ["vec", "complete climate tech latest version release reference"], ["vec", "guide for climate tech latest version release"]]} +{"query": "Python latest version release", "output": [["hyde", "Python 3.12 was released in October 2023, bringing new features like the 'match' statement enhancements and more robust error messages."], ["lex", "Python overview latest version release tutorial"], ["lex", "Python overview latest version release guide"], ["lex", "Python latest version release best practices"], ["vec", "understanding Python latest version release"], ["vec", "learn about Python latest version release"]]} +{"query": "AWS recent news December", "output": [["hyde", "AWS December 2023 news includes the introduction of new SageMaker features for automated machine learning workflows and model tuning capabilities."], ["lex", "AWS overview recent news December guide"], ["lex", "AWS overview recent news December examples"], ["lex", "AWS overview recent news December tutorial"], ["vec", "complete AWS recent news December reference"], ["vec", "how to AWS recent news December"]]} +{"query": "GitHub changelog 2025", "output": [["hyde", "GitHub's 2025 changelog highlights the introduction of 'Projects v3', enabling enhanced project management with Kanban boards and automation."], ["lex", "GitHub overview changelog 2025 tutorial"], ["lex", "GitHub overview changelog 2025 guide"], ["lex", "GitHub changelog 2025 documentation"], ["vec", "understanding GitHub changelog 2025"], ["vec", "complete GitHub changelog 2025 reference"]]} +{"query": "what changed in machine learning 2026", "output": [["hyde", "Machine learning in 2026 will see the rise of self-supervised learning techniques, reducing the need for labeled data and improving model accuracy."], ["lex", "what overview changed in machine learning 2026 tutorial"], ["lex", "what overview changed in machine learning 2026 examples"], ["lex", "what overview changed in machine learning 2026 guide"], ["vec", "learn about what changed in machine learning 2026"], ["vec", "how to what changed in machine learning 2026"]]} +{"query": "space exploration recent news October", "output": [["hyde", "Recent space exploration news from October 2023 includes NASA's Artemis II mission, set to launch in 2024, aiming to return humans to the Moon."], ["lex", "space exploration recent news October documentation"], ["lex", "space overview exploration recent news October guide"], ["lex", "space overview exploration recent news October examples"], ["vec", "learn about space exploration recent news October"], ["vec", "understanding space exploration recent news October"]]} +{"query": "React changelog 2026", "output": [["hyde", "React 2026 changelog features the introduction of 'Suspense for Data Fetching', optimizing loading states in applications, enhancing user experience."], ["lex", "React overview changelog 2026 tutorial"], ["lex", "React overview changelog 2026 examples"], ["lex", "React changelog 2026 documentation"], ["vec", "how to React changelog 2026"], ["vec", "understanding React changelog 2026"]]} +{"query": "React changelog 2025", "output": [["hyde", "The React 2025 changelog highlights the introduction of server-side rendering improvements and automatic static optimization features."], ["lex", "React overview changelog 2025 tutorial"], ["lex", "React overview changelog 2025 guide"], ["lex", "React changelog 2025 best practices"], ["vec", "complete React changelog 2025 reference"], ["vec", "how to React changelog 2025"]]} +{"query": "machine learning recent news November", "output": [["hyde", "Machine learning updates in November 2023 include new frameworks that simplify deep learning model training, reducing setup time by 30%."], ["lex", "machine overview learning recent news November tutorial"], ["lex", "machine overview learning recent news November guide"], ["lex", "machine overview learning recent news November examples"], ["vec", "how to machine learning recent news November"], ["vec", "understanding machine learning recent news November"]]} +{"query": "GitHub new features 2025", "output": [["hyde", "GitHub new features in 2025 include enhanced code review tools and the introduction of 'Discussions', fostering community engagement on projects."], ["lex", "GitHub overview new features 2025 guide"], ["lex", "GitHub overview new features 2025 tutorial"], ["lex", "GitHub overview new features 2025 examples"], ["vec", "learn about GitHub new features 2025"], ["vec", "how to GitHub new features 2025"]]} +{"query": "machine learning new features 2025", "output": [["hyde", "New features in machine learning for 2025 include automated feature engineering tools and improved support for federated learning frameworks."], ["lex", "machine overview learning new features 2025 tutorial"], ["lex", "machine learning new features 2025 documentation"], ["lex", "machine learning new features 2025 best practices"], ["vec", "how to machine learning new features 2025"], ["vec", "learn about machine learning new features 2025"]]} +{"query": "AI recent news November", "output": [["hyde", "In November 2023, AI news reported a breakthrough in explainable AI, with researchers developing models that can articulate decision-making processes."], ["lex", "AI recent news November documentation"], ["lex", "AI overview recent news November guide"], ["lex", "AI overview recent news November examples"], ["vec", "learn about AI recent news November"], ["vec", "understanding AI recent news November"]]} +{"query": "Python new features 2025", "output": [["hyde", "Python 3.11 introduced in 2025 brings 'frozen' dataclasses and performance optimizations, with benchmarks showing up to 20% faster execution."], ["lex", "Python overview new features 2025 tutorial"], ["lex", "Python new features 2025 documentation"], ["lex", "Python overview new features 2025 examples"], ["vec", "understanding Python new features 2025"], ["vec", "complete Python new features 2025 reference"]]} +{"query": "latest Shopify updates", "output": [["hyde", "Latest Shopify updates include the launch of Shopify Markets for global selling and enhanced analytics features for better sales insights."], ["lex", "latest Shopify updates best practices"], ["lex", "latest Shopify updates documentation"], ["lex", "latest overview Shopify updates guide"], ["vec", "complete latest Shopify updates reference"], ["vec", "guide for latest Shopify updates"]]} +{"query": "Kubernetes new features 2025", "output": [["hyde", "Kubernetes 1.26 introduces 'PodSecurity Admission' for better security policies, 'Immutable Secrets' for configuration stability, and improved 'HPA' scaling capabilities."], ["lex", "Kubernetes overview new features 2025 examples"], ["lex", "Kubernetes new features 2025 documentation"], ["lex", "Kubernetes new features 2025 best practices"], ["vec", "guide for Kubernetes new features 2025"], ["vec", "complete Kubernetes new features 2025 reference"]]} +{"query": "what changed in AI 2026", "output": [["hyde", "In 2026, AI advancements include GPT-4's release, improved multimodal capabilities, and new ethical frameworks for AI deployment in industries like healthcare."], ["lex", "what overview changed in AI 2026 guide"], ["lex", "what changed in AI 2026 documentation"], ["lex", "what overview changed in AI 2026 tutorial"], ["vec", "guide for what changed in AI 2026"], ["vec", "understanding what changed in AI 2026"]]} +{"query": "machine learning new features 2026", "output": [["hyde", "Machine learning in 2026 sees the introduction of 'AutoML 2.0', enhanced model interpretability tools, and breakthroughs in federated learning for privacy-preserving AI."], ["lex", "machine learning new features 2026 best practices"], ["lex", "machine overview learning new features 2026 guide"], ["lex", "machine overview learning new features 2026 examples"], ["vec", "understanding machine learning new features 2026"], ["vec", "how to machine learning new features 2026"]]} +{"query": "recent Shopify changes 2025", "output": [["hyde", "Shopify's 2025 updates include 'Shopify Markets' for global selling, 'Shopify Flow' for automated workflows, and a revamped 'Shopify POS' for retail integration."], ["lex", "recent overview Shopify changes 2025 examples"], ["lex", "recent overview Shopify changes 2025 tutorial"], ["lex", "recent Shopify changes 2025 best practices"], ["vec", "complete recent Shopify changes 2025 reference"], ["vec", "how to recent Shopify changes 2025"]]} +{"query": "what changed in machine learning 2025", "output": [["hyde", "In 2025, machine learning focuses on 'explainable AI' with frameworks like LIME, and the integration of 'reinforcement learning' in real-time applications."], ["lex", "what overview changed in machine learning 2025 guide"], ["lex", "what changed in machine learning 2025 best practices"], ["lex", "what changed in machine learning 2025 documentation"], ["vec", "learn about what changed in machine learning 2025"], ["vec", "complete what changed in machine learning 2025 reference"]]} +{"query": "Shopify new features 2026", "output": [["hyde", "Shopify's 2026 features include 'AI-driven product recommendations', 'Augmented Reality' for product previews, and enhanced 'in-app messaging' for customer support."], ["lex", "Shopify new features 2026 best practices"], ["lex", "Shopify overview new features 2026 examples"], ["lex", "Shopify overview new features 2026 guide"], ["vec", "understanding Shopify new features 2026"], ["vec", "complete Shopify new features 2026 reference"]]} +{"query": "Docker recent news November", "output": [["hyde", "In November, Docker released version 24.0 with improved build performance, support for multi-platform images, and enhanced security features with 'Docker Bench'."], ["lex", "Docker overview recent news November examples"], ["lex", "Docker recent news November best practices"], ["lex", "Docker overview recent news November tutorial"], ["vec", "understanding Docker recent news November"], ["vec", "guide for Docker recent news November"]]} +{"query": "latest Vue updates", "output": [["hyde", "Latest Vue updates include Vue 3.2's Composition API enhancements, improved TypeScript support, and the introduction of 'Suspense' for better async component handling."], ["lex", "latest Vue updates documentation"], ["lex", "latest overview Vue updates tutorial"], ["lex", "latest Vue updates best practices"], ["vec", "understanding latest Vue updates"], ["vec", "learn about latest Vue updates"]]} +{"query": "Next.js new features 2026", "output": [["hyde", "Next.js 13.0 introduces 'app directory' for routing, 'React Server Components' for improved performance, and 'image optimization' using the new 'next/image' component."], ["lex", "Next.js overview new features 2026 examples"], ["lex", "Next.js overview new features 2026 guide"], ["lex", "Next.js new features 2026 best practices"], ["vec", "learn about Next.js new features 2026"], ["vec", "how to Next.js new features 2026"]]} +{"query": "GitHub new features 2026", "output": [["hyde", "GitHub's 2026 updates include 'GitHub Codespaces' enhancements, 'Advanced Security' with secret scanning, and 'Discussion' features for better community engagement."], ["lex", "GitHub overview new features 2026 examples"], ["lex", "GitHub overview new features 2026 tutorial"], ["lex", "GitHub new features 2026 documentation"], ["vec", "how to GitHub new features 2026"], ["vec", "understanding GitHub new features 2026"]]} +{"query": "AWS new features 2025", "output": [["hyde", "AWS 2025 introduces 'Graviton3' instances for better performance, 'AWS CloudFormation' for simplified resource management, and 'SageMaker Canvas' for no-code ML."], ["lex", "AWS new features 2025 best practices"], ["lex", "AWS overview new features 2025 guide"], ["lex", "AWS overview new features 2025 tutorial"], ["vec", "how to AWS new features 2025"], ["vec", "understanding AWS new features 2025"]]} +{"query": "what changed in Python 2026", "output": [["hyde", "Python 3.11, released in 2026, introduces 'match' statements for structural pattern matching and significant performance improvements with benchmarks showing 30% faster execution."], ["lex", "what overview changed in Python 2026 tutorial"], ["lex", "what changed in Python 2026 best practices"], ["lex", "what overview changed in Python 2026 guide"], ["vec", "guide for what changed in Python 2026"], ["vec", "learn about what changed in Python 2026"]]} +{"query": "what changed in TypeScript 2025", "output": [["hyde", "TypeScript 4.7 (2025) includes 'template literal types', 'key remapping' in mapped types, and improved type inference for better developer experience."], ["lex", "what changed in TypeScript 2025 best practices"], ["lex", "what overview changed in TypeScript 2025 tutorial"], ["lex", "what changed in TypeScript 2025 documentation"], ["vec", "complete what changed in TypeScript 2025 reference"], ["vec", "understanding what changed in TypeScript 2025"]]} +{"query": "recent space exploration changes 2026", "output": [["hyde", "2026 milestones in space exploration include Artemis II's crewed lunar flyby, Mars Sample Return mission planning, and the launch of the James Webb Space Telescope's successor."], ["lex", "recent space exploration changes 2026 best practices"], ["lex", "recent space exploration changes 2026 documentation"], ["lex", "recent overview space exploration changes 2026 tutorial"], ["vec", "understanding recent space exploration changes 2026"], ["vec", "learn about recent space exploration changes 2026"]]} +{"query": "AWS new features 2026", "output": [["hyde", "AWS 2026 unveils 'Lambda SnapStart' for quicker cold start times, 'App Runner' for simplified app deployments, and expanded 'S3 Object Lambda' capabilities."], ["lex", "AWS new features 2026 documentation"], ["lex", "AWS overview new features 2026 tutorial"], ["lex", "AWS overview new features 2026 examples"], ["vec", "complete AWS new features 2026 reference"], ["vec", "understanding AWS new features 2026"]]} +{"query": "recent TypeScript changes 2025", "output": [["hyde", "TypeScript 4.6 (2025) brings 'ESM support' improvements, 'exact optional property types', and 'control flow analysis' enhancements for better type checking."], ["lex", "recent overview TypeScript changes 2025 examples"], ["lex", "recent TypeScript changes 2025 documentation"], ["lex", "recent overview TypeScript changes 2025 guide"], ["vec", "learn about recent TypeScript changes 2025"], ["vec", "guide for recent TypeScript changes 2025"]]} +{"query": "latest TypeScript updates", "output": [["hyde", "Latest TypeScript updates include improved type-checking speed, support for 'type-only imports', and 'declaration emit' optimizations in version 4.9."], ["lex", "latest overview TypeScript updates examples"], ["lex", "latest overview TypeScript updates guide"], ["lex", "latest TypeScript updates best practices"], ["vec", "complete latest TypeScript updates reference"], ["vec", "learn about latest TypeScript updates"]]} +{"query": "what changed in React 2025", "output": [["hyde", "React 18 introduces 'Concurrent Mode' for better rendering capabilities, 'automatic batching' of updates, and the new 'Suspense' feature for data fetching."], ["lex", "what changed in React 2025 documentation"], ["lex", "what overview changed in React 2025 tutorial"], ["lex", "what changed in React 2025 best practices"], ["vec", "learn about what changed in React 2025"], ["vec", "understanding what changed in React 2025"]]} +{"query": "AWS changelog 2025", "output": [["hyde", "AWS changelog 2025 highlights include 'EC2 Auto Scaling' enhancements, introduction of 'AWS CDK v2', and new 'RDS' features for better database management."], ["lex", "AWS overview changelog 2025 examples"], ["lex", "AWS overview changelog 2025 tutorial"], ["lex", "AWS changelog 2025 documentation"], ["vec", "how to AWS changelog 2025"], ["vec", "complete AWS changelog 2025 reference"]]} +{"query": "space exploration changelog 2026", "output": [["hyde", "Space exploration changelog 2026 highlights include the successful Mars Sample Return mission planning, the launch of the Lunar Gateway, and ongoing updates from the Artemis program."], ["lex", "space exploration changelog 2026 documentation"], ["lex", "space exploration changelog 2026 best practices"], ["lex", "space overview exploration changelog 2026 guide"], ["vec", "learn about space exploration changelog 2026"], ["vec", "how to space exploration changelog 2026"]]} +{"query": "React new features 2025", "output": [["hyde", "React 2025 features include 'automatic hydration', new hooks for performance optimization, and enhancements to the 'React DevTools' for better debugging."], ["lex", "React new features 2025 best practices"], ["lex", "React overview new features 2025 guide"], ["lex", "React overview new features 2025 tutorial"], ["vec", "complete React new features 2025 reference"], ["vec", "how to React new features 2025"]]} +{"query": "AWS latest version release", "output": [["hyde", "AWS latest version release includes 'Amazon RDS' with Multi-AZ deployments for SQL databases, enhanced 'EKS' features for Kubernetes management, and 'S3' lifecycle policies."], ["lex", "AWS overview latest version release guide"], ["lex", "AWS latest version release documentation"], ["lex", "AWS latest version release best practices"], ["vec", "complete AWS latest version release reference"], ["vec", "understanding AWS latest version release"]]} +{"query": "latest space exploration updates", "output": [["hyde", "Latest space exploration updates highlight the Perseverance rover's ongoing Mars exploration, successful ISS missions, and developments in lunar base planning."], ["lex", "latest space exploration updates documentation"], ["lex", "latest overview space exploration updates guide"], ["lex", "latest overview space exploration updates examples"], ["vec", "understanding latest space exploration updates"], ["vec", "complete latest space exploration updates reference"]]} +{"query": "Kubernetes latest version release", "output": [["hyde", "Kubernetes latest version release 1.27 includes 'Kubelet Configuration' improvements, 'enhanced metrics server', and 'custom metrics' for better workload management."], ["lex", "Kubernetes latest version release best practices"], ["lex", "Kubernetes latest version release documentation"], ["lex", "Kubernetes overview latest version release guide"], ["vec", "understanding Kubernetes latest version release"], ["vec", "how to Kubernetes latest version release"]]} +{"query": "React recent news November", "output": [["hyde", "React recent news in November 2025 includes the release of 'React 18.1', improved server-side rendering capabilities, and community updates from the React Conf."], ["lex", "React recent news November best practices"], ["lex", "React overview recent news November examples"], ["lex", "React overview recent news November guide"], ["vec", "guide for React recent news November"], ["vec", "how to React recent news November"]]} +{"query": "TypeScript recent news November", "output": [["hyde", "TypeScript 5.2 was released on November 15, 2023, introducing new decorators and improved type inference for JSX. Enhancements focus on performance and developer experience."], ["lex", "TypeScript recent news November documentation"], ["lex", "TypeScript overview recent news November examples"], ["lex", "TypeScript overview recent news November guide"], ["vec", "guide for TypeScript recent news November"], ["vec", "understanding TypeScript recent news November"]]} +{"query": "what changed in AI 2025", "output": [["hyde", "By 2025, AI has integrated into everyday applications with a focus on explainability. Notable advancements include GPT-4's contextual awareness and real-time language translation."], ["lex", "what overview changed in AI 2025 guide"], ["lex", "what overview changed in AI 2025 examples"], ["lex", "what overview changed in AI 2025 tutorial"], ["vec", "how to what changed in AI 2025"], ["vec", "understanding what changed in AI 2025"]]} +{"query": "Docker recent news December", "output": [["hyde", "In December 2023, Docker announced version 24.0, featuring improved security in container images and support for multi-architecture builds, enhancing deployment flexibility."], ["lex", "Docker overview recent news December guide"], ["lex", "Docker recent news December documentation"], ["lex", "Docker overview recent news December tutorial"], ["vec", "guide for Docker recent news December"], ["vec", "understanding Docker recent news December"]]} +{"query": "TypeScript changelog 2026", "output": [["hyde", "The TypeScript changelog for 2026 notes the introduction of type-only imports and exports, improving module performance and clarity, set for release in Q2 2026."], ["lex", "TypeScript overview changelog 2026 guide"], ["lex", "TypeScript overview changelog 2026 tutorial"], ["lex", "TypeScript overview changelog 2026 examples"], ["vec", "understanding TypeScript changelog 2026"], ["vec", "how to TypeScript changelog 2026"]]} +{"query": "space exploration new features 2025", "output": [["hyde", "Space exploration in 2025 includes the Artemis III mission aiming for a lunar landing in late 2025, alongside advancements in Mars sample return missions and asteroid mining."], ["lex", "space overview exploration new features 2025 examples"], ["lex", "space exploration new features 2025 documentation"], ["lex", "space overview exploration new features 2025 tutorial"], ["vec", "how to space exploration new features 2025"], ["vec", "understanding space exploration new features 2025"]]} +{"query": "space exploration recent news December", "output": [["hyde", "Recent news in December 2023 highlights NASA's successful test of the Space Launch System, paving the way for upcoming lunar missions and interplanetary exploration."], ["lex", "space overview exploration recent news December examples"], ["lex", "space overview exploration recent news December guide"], ["lex", "space overview exploration recent news December tutorial"], ["vec", "guide for space exploration recent news December"], ["vec", "learn about space exploration recent news December"]]} +{"query": "Shopify changelog 2026", "output": [["hyde", "Shopify's 2026 changelog includes new features like augmented reality product displays, a revamped checkout process, and enhanced integration with social media platforms."], ["lex", "Shopify overview changelog 2026 tutorial"], ["lex", "Shopify overview changelog 2026 examples"], ["lex", "Shopify changelog 2026 documentation"], ["vec", "understanding Shopify changelog 2026"], ["vec", "complete Shopify changelog 2026 reference"]]} +{"query": "AWS recent news November", "output": [["hyde", "AWS announced significant updates in November 2023, including the launch of Amazon SageMaker Canvas for no-code ML and enhanced security features for AWS Lambda."], ["lex", "AWS recent news November documentation"], ["lex", "AWS overview recent news November guide"], ["lex", "AWS overview recent news November examples"], ["vec", "understanding AWS recent news November"], ["vec", "complete AWS recent news November reference"]]} +{"query": "AWS recent news October", "output": [["hyde", "October 2023 saw AWS release new capabilities for Amazon RDS, including cross-region read replicas and automated backups for PostgreSQL, enhancing database resilience."], ["lex", "AWS overview recent news October tutorial"], ["lex", "AWS overview recent news October examples"], ["lex", "AWS recent news October documentation"], ["vec", "learn about AWS recent news October"], ["vec", "guide for AWS recent news October"]]} +{"query": "Next.js recent news December", "output": [["hyde", "Next.js 14 was released in December 2023, introducing native support for React Server Components and improved data fetching methods for optimized performance."], ["lex", "Next.js overview recent news December guide"], ["lex", "Next.js recent news December documentation"], ["lex", "Next.js recent news December best practices"], ["vec", "guide for Next.js recent news December"], ["vec", "how to Next.js recent news December"]]} +{"query": "space exploration recent news November", "output": [["hyde", "November 2023 features news on the James Webb Telescope's first exoplanet imaging results, marking a milestone in astronomical research and deep space exploration."], ["lex", "space overview exploration recent news November guide"], ["lex", "space overview exploration recent news November examples"], ["lex", "space overview exploration recent news November tutorial"], ["vec", "guide for space exploration recent news November"], ["vec", "learn about space exploration recent news November"]]} +{"query": "what changed in Python 2025", "output": [["hyde", "Python 3.12, set for release in 2025, will include structural pattern matching enhancements and performance improvements for integer operations, increasing execution speed."], ["lex", "what overview changed in Python 2025 guide"], ["lex", "what overview changed in Python 2025 tutorial"], ["lex", "what changed in Python 2025 documentation"], ["vec", "learn about what changed in Python 2025"], ["vec", "guide for what changed in Python 2025"]]} +{"query": "GitHub recent news November", "output": [["hyde", "GitHub's November 2023 updates include new project management features, enhanced dependency graphs, and the introduction of AI-powered code review suggestions."], ["lex", "GitHub recent news November documentation"], ["lex", "GitHub overview recent news November tutorial"], ["lex", "GitHub overview recent news November examples"], ["vec", "complete GitHub recent news November reference"], ["vec", "learn about GitHub recent news November"]]} +{"query": "machine learning changelog 2025", "output": [["hyde", "Machine learning changelog for 2025 highlights the mainstream adoption of federated learning frameworks and enhanced model interpretability tools in major ML libraries."], ["lex", "machine overview learning changelog 2025 examples"], ["lex", "machine overview learning changelog 2025 guide"], ["lex", "machine learning changelog 2025 best practices"], ["vec", "how to machine learning changelog 2025"], ["vec", "learn about machine learning changelog 2025"]]} +{"query": "Next.js recent news November", "output": [["hyde", "Next.js updates for November 2023 include improved static generation features and the introduction of a new image optimization API for faster load times."], ["lex", "Next.js overview recent news November guide"], ["lex", "Next.js overview recent news November tutorial"], ["lex", "Next.js overview recent news November examples"], ["vec", "complete Next.js recent news November reference"], ["vec", "learn about Next.js recent news November"]]} +{"query": "latest AWS updates", "output": [["hyde", "Latest AWS updates include the introduction of Amazon Bedrock for generative AI, expanded capabilities of AWS Lambda, and enhancements to AWS CloudFormation."], ["lex", "latest AWS updates best practices"], ["lex", "latest AWS updates documentation"], ["lex", "latest overview AWS updates examples"], ["vec", "guide for latest AWS updates"], ["vec", "complete latest AWS updates reference"]]} +{"query": "recent Vue changes 2026", "output": [["hyde", "Vue 3.3 changes in 2026 focus on improved reactivity APIs, TypeScript support enhancements, and integration with Vite for faster build times and improved performance."], ["lex", "recent overview Vue changes 2026 examples"], ["lex", "recent overview Vue changes 2026 guide"], ["lex", "recent Vue changes 2026 best practices"], ["vec", "how to recent Vue changes 2026"], ["vec", "complete recent Vue changes 2026 reference"]]} +{"query": "what changed in space exploration 2025", "output": [["hyde", "2025's space exploration changes include successful Mars colonization simulations, advancements in reusable rockets, and increased international collaboration in lunar missions."], ["lex", "what changed in space exploration 2025 documentation"], ["lex", "what overview changed in space exploration 2025 examples"], ["lex", "what changed in space exploration 2025 best practices"], ["vec", "understanding what changed in space exploration 2025"], ["vec", "learn about what changed in space exploration 2025"]]} +{"query": "TypeScript new features 2026", "output": [["hyde", "TypeScript 2026 introduces new features like `satisfies` operator for type assertions and improved support for ECMAScript modules, enhancing code maintainability."], ["lex", "TypeScript new features 2026 best practices"], ["lex", "TypeScript overview new features 2026 tutorial"], ["lex", "TypeScript overview new features 2026 guide"], ["vec", "learn about TypeScript new features 2026"], ["vec", "complete TypeScript new features 2026 reference"]]} +{"query": "what changed in GitHub 2025", "output": [["hyde", "GitHub's 2025 updates include revamped project boards, enhanced repository insights, and the introduction of built-in code review automation using AI tools."], ["lex", "what overview changed in GitHub 2025 guide"], ["lex", "what changed in GitHub 2025 documentation"], ["lex", "what changed in GitHub 2025 best practices"], ["vec", "learn about what changed in GitHub 2025"], ["vec", "complete what changed in GitHub 2025 reference"]]} +{"query": "recent climate tech changes 2026", "output": [["hyde", "Recent climate tech changes in 2026 focus on carbon capture innovations, widespread adoption of renewable energy technologies, and regulatory frameworks for green tech."], ["lex", "recent climate tech changes 2026 best practices"], ["lex", "recent overview climate tech changes 2026 guide"], ["lex", "recent overview climate tech changes 2026 tutorial"], ["vec", "how to recent climate tech changes 2026"], ["vec", "learn about recent climate tech changes 2026"]]} +{"query": "Python changelog 2026", "output": [["hyde", "Python 2026 changelog includes introduction of new syntax for data classes, performance enhancements, and expanded support for asynchronous programming paradigms."], ["lex", "Python changelog 2026 documentation"], ["lex", "Python overview changelog 2026 guide"], ["lex", "Python changelog 2026 best practices"], ["vec", "how to Python changelog 2026"], ["vec", "understanding Python changelog 2026"]]} +{"query": "who is TDS motorsports", "output": [["hyde", "TDS Motorsports specializes in high-performance motorsport vehicles, focusing on customization and engineering excellence for racing applications and automotive enthusiasts."], ["lex", "who overview is TDS motorsports tutorial"], ["lex", "who overview is TDS motorsports guide"], ["lex", "who is TDS motorsports documentation"], ["vec", "learn about who is TDS motorsports"], ["vec", "guide for who is TDS motorsports"]]} +{"query": "React hooks tutorial", "output": [["hyde", "React Hooks tutorial covers useState and useEffect hooks, guiding users through state management and side effects in functional components for optimal performance."], ["lex", "React overview hooks tutorial examples"], ["lex", "React hooks tutorial documentation"], ["lex", "React overview hooks tutorial tutorial"], ["vec", "understanding React hooks tutorial"], ["vec", "how to React hooks tutorial"]]} +{"query": "Docker container networking", "output": [["hyde", "Docker container networking now supports IPv6 and improved service mesh integration, allowing seamless communication between services in multi-container applications."], ["lex", "Docker overview container networking tutorial"], ["lex", "Docker overview container networking examples"], ["lex", "Docker container networking best practices"], ["vec", "complete Docker container networking reference"], ["vec", "understanding Docker container networking"]]} +{"query": "Kubernetes pod deployment", "output": [["hyde", "Use 'kubectl apply -f deployment.yaml' to deploy a pod. Specify replicas, selectors, and container specs in the YAML file. Monitor with 'kubectl get pods'."], ["lex", "Kubernetes pod deployment best practices"], ["lex", "Kubernetes pod deployment documentation"], ["lex", "Kubernetes overview pod deployment examples"], ["vec", "how to Kubernetes pod deployment"], ["vec", "complete Kubernetes pod deployment reference"]]} +{"query": "AWS Lambda functions setup", "output": [["hyde", "Set up AWS Lambda via the console or CLI. Choose a runtime (e.g., Node.js 14.x), configure triggers, and set the execution role for permissions."], ["lex", "AWS Lambda functions setup documentation"], ["lex", "AWS overview Lambda functions setup examples"], ["lex", "AWS overview Lambda functions setup tutorial"], ["vec", "learn about AWS Lambda functions setup"], ["vec", "how to AWS Lambda functions setup"]]} +{"query": "Stripe payment integration", "output": [["hyde", "Integrate Stripe by installing the Stripe SDK. Use 'stripe.charges.create' to process payments. Ensure to set up webhooks for asynchronous events."], ["lex", "Stripe overview payment integration examples"], ["lex", "Stripe overview payment integration tutorial"], ["lex", "Stripe payment integration documentation"], ["vec", "learn about Stripe payment integration"], ["vec", "understanding Stripe payment integration"]]} +{"query": "GitHub Actions workflow", "output": [["hyde", "Create a .github/workflows directory. Define a YAML file with triggers, jobs, and steps. Use 'runs-on: ubuntu-latest' for environment setup."], ["lex", "GitHub overview Actions workflow guide"], ["lex", "GitHub overview Actions workflow examples"], ["lex", "GitHub Actions workflow documentation"], ["vec", "understanding GitHub Actions workflow"], ["vec", "guide for GitHub Actions workflow"]]} +{"query": "Vercel deployment guide", "output": [["hyde", "Deploy to Vercel by connecting your GitHub repo. Configure build settings in 'vercel.json'. Run 'vercel' in the terminal for CLI deployment."], ["lex", "Vercel overview deployment guide examples"], ["lex", "Vercel deployment guide documentation"], ["lex", "Vercel overview deployment guide tutorial"], ["vec", "learn about Vercel deployment guide"], ["vec", "understanding Vercel deployment guide"]]} +{"query": "Supabase auth configuration", "output": [["hyde", "Configure Supabase Auth by enabling providers in the dashboard. Use 'supabase.auth.signIn()' for user login and 'supabase.auth.onAuthStateChange()' for state tracking."], ["lex", "Supabase auth configuration documentation"], ["lex", "Supabase overview auth configuration tutorial"], ["lex", "Supabase auth configuration best practices"], ["vec", "understanding Supabase auth configuration"], ["vec", "learn about Supabase auth configuration"]]} +{"query": "Twilio SMS API", "output": [["hyde", "Utilize Twilio SMS API with 'twilio.messages.create()' method. Set 'from' and 'to' numbers. Ensure to handle responses for successful delivery status."], ["lex", "Twilio overview SMS API guide"], ["lex", "Twilio overview SMS API examples"], ["lex", "Twilio SMS API documentation"], ["vec", "how to Twilio SMS API"], ["vec", "complete Twilio SMS API reference"]]} +{"query": "Datadog monitoring setup", "output": [["hyde", "Set up Datadog monitoring by installing the agent on your servers. Configure integrations for AWS, Kubernetes, or any services you want to monitor."], ["lex", "Datadog overview monitoring setup guide"], ["lex", "Datadog monitoring setup best practices"], ["lex", "Datadog overview monitoring setup examples"], ["vec", "complete Datadog monitoring setup reference"], ["vec", "understanding Datadog monitoring setup"]]} +{"query": "Sentry error tracking", "output": [["hyde", "Integrate Sentry by adding the SDK to your application. Use 'Sentry.init()' with your DSN. Capture errors with 'Sentry.captureException()' in your code."], ["lex", "Sentry error tracking best practices"], ["lex", "Sentry overview error tracking guide"], ["lex", "Sentry error tracking documentation"], ["vec", "understanding Sentry error tracking"], ["vec", "learn about Sentry error tracking"]]} +{"query": "Terraform AWS provider", "output": [["hyde", "Configure the Terraform AWS provider using 'provider \"aws\" { region = \"us-east-1\" }'. Use 'terraform init' and 'terraform apply' for deployment."], ["lex", "Terraform overview AWS provider tutorial"], ["lex", "Terraform overview AWS provider guide"], ["lex", "Terraform AWS provider best practices"], ["vec", "how to Terraform AWS provider"], ["vec", "understanding Terraform AWS provider"]]} +{"query": "Ansible playbook examples", "output": [["hyde", "Example playbook: - name: Install nginx tasks: - name: Install nginx apt: pkg=nginx state=present. Use 'ansible-playbook playbook.yml' to execute."], ["lex", "Ansible playbook examples best practices"], ["lex", "Ansible overview playbook examples examples"], ["lex", "Ansible overview playbook examples tutorial"], ["vec", "understanding Ansible playbook examples"], ["vec", "how to Ansible playbook examples"]]} +{"query": "ssh key authentication", "output": [["hyde", "Generate an SSH key pair with ssh-keygen -t ed25519. Copy the public key to ~/.ssh/authorized_keys on the remote server using ssh-copy-id. Ensure permissions are 700 for .ssh and 600 for authorized_keys."], ["lex", "ssh key auth setup"], ["lex", "ssh public private key pair"], ["lex", "passwordless ssh login"], ["vec", "how to set up ssh key-based authentication instead of passwords"], ["vec", "step-by-step guide to generating and configuring ssh keys for secure server access"]]} +{"query": "Python virtual environments", "output": [["hyde", "Create a virtual environment with python -m venv myenv, then activate it with source myenv/bin/activate on Unix or myenv\\Scripts\\activate on Windows. Install packages with pip and they stay isolated from your system Python."], ["lex", "python venv virtualenv"], ["lex", "pip virtual environment setup"], ["lex", "python isolated dependencies"], ["vec", "how to create and activate a python virtual environment for project isolation"], ["vec", "what is the difference between venv, virtualenv, and conda for managing python dependencies"]]} +{"query": "git merge conflicts", "output": [["hyde", "Git marks conflicts with <<<<<<< HEAD, =======, and >>>>>>> branch-name. Edit the file to keep the code you want, remove the markers, then git add the file and commit. Use git mergetool for a visual diff interface."], ["lex", "git merge conflict resolve"], ["lex", "git conflict markers HEAD"], ["lex", "resolving merge conflicts"], ["vec", "how to resolve merge conflicts in git when two branches modify the same lines"], ["vec", "what do the conflict markers mean and how do you manually edit conflicted files"]]} +{"query": "TCP vs UDP", "output": [["hyde", "TCP provides reliable, ordered delivery with acknowledgments and retransmission. UDP is faster but unreliable—packets may arrive out of order or not at all. Use TCP for web, email, file transfer. Use UDP for video streaming, gaming, DNS where speed matters more than reliability."], ["lex", "tcp udp protocol difference"], ["lex", "tcp reliable udp fast"], ["lex", "connection-oriented vs connectionless"], ["vec", "what are the key differences between TCP and UDP network protocols"], ["vec", "when should you use TCP versus UDP for application networking"]]} +{"query": "Docker compose volumes", "output": [["hyde", "In docker-compose.yml, define volumes under the top-level volumes key and reference them in services. Named volumes persist data in Docker's storage. Bind mounts map host directories directly: volumes: - ./data:/app/data for development, - myvolume:/app/data for production."], ["lex", "docker compose volume mount"], ["lex", "docker persistent storage volumes"], ["lex", "compose yaml volumes section"], ["vec", "how to configure persistent volumes in docker compose for data that survives container restarts"], ["vec", "what is the difference between bind mounts and named volumes in docker compose"]]} +{"query": "regex lookahead lookbehind", "output": [["hyde", "Lookahead (?=pattern) matches a position followed by pattern without consuming it. Negative lookahead (?!pattern) matches where pattern doesn't follow. Lookbehind (?<=pattern) matches a position preceded by pattern. Example: \\d+(?= dollars) matches numbers followed by 'dollars'."], ["lex", "regex lookahead assertion"], ["lex", "regex lookbehind positive negative"], ["lex", "zero-width assertions regex"], ["vec", "how do lookahead and lookbehind assertions work in regular expressions"], ["vec", "what is the syntax for positive and negative lookahead and lookbehind in regex"]]} +{"query": "Kubernetes secrets management", "output": [["hyde", "Create secrets with kubectl create secret generic mysecret --from-literal=password=abc123. Reference in pods via env valueFrom secretKeyRef or volume mounts. Secrets are base64 encoded, not encrypted—use sealed-secrets or external secret managers like Vault for production."], ["lex", "kubernetes secrets k8s"], ["lex", "k8s secret yaml base64"], ["lex", "kubectl create secret"], ["vec", "how to create and use secrets in kubernetes for sensitive configuration data"], ["vec", "what are best practices for managing secrets in kubernetes clusters"]]} +{"query": "CORS errors fix", "output": [["hyde", "CORS errors occur when a browser blocks requests to a different origin. Fix by adding Access-Control-Allow-Origin headers on the server. For Express: app.use(cors()). For preflight requests, handle OPTIONS and return Access-Control-Allow-Methods and Access-Control-Allow-Headers."], ["lex", "cors error fix browser"], ["lex", "access-control-allow-origin header"], ["lex", "cors preflight request"], ["vec", "how to fix CORS errors when making API requests from a web browser"], ["vec", "what causes cross-origin resource sharing errors and how do you configure the server to allow them"]]} +{"query": "PostgreSQL indexes explain", "output": [["hyde", "Run EXPLAIN ANALYZE SELECT... to see the query plan and actual execution time. Look for Seq Scan on large tables—add an index with CREATE INDEX idx_name ON table(column). B-tree indexes work for equality and range queries, GIN for full-text search and arrays, GiST for geometric data."], ["lex", "postgresql index explain analyze"], ["lex", "postgres btree index performance"], ["lex", "create index postgresql"], ["vec", "how to use EXPLAIN ANALYZE to understand query performance and index usage in postgresql"], ["vec", "what types of indexes does postgresql support and when should you use each"]]} +{"query": "JWT token refresh", "output": [["hyde", "Access tokens are short-lived (15 min) and sent with each request. Refresh tokens are long-lived (days/weeks) and stored securely. When the access token expires, send the refresh token to /auth/refresh to get a new access token without re-authenticating."], ["lex", "jwt refresh token flow"], ["lex", "access token refresh token"], ["lex", "jwt token expiration renewal"], ["vec", "how does the jwt refresh token flow work for maintaining user sessions"], ["vec", "what is the difference between access tokens and refresh tokens in jwt authentication"]]} +{"query": "React useEffect cleanup", "output": [["hyde", "Return a cleanup function from useEffect to run before the component unmounts or before the effect re-runs. Use it to cancel subscriptions, clear timers, and abort fetch requests. Example: useEffect(() => { const id = setInterval(fn, 1000); return () => clearInterval(id); }, []);"], ["lex", "react overview useeffect cleanup function"], ["lex", "useeffect return cleanup"], ["lex", "react unmount cleanup"], ["vec", "how to properly clean up side effects in react useeffect to prevent memory leaks"], ["vec", "when does the useeffect cleanup function run and what should you clean up"]]} +{"query": "nginx reverse proxy", "output": [["hyde", "In nginx.conf, use proxy_pass inside a location block: location /api { proxy_pass http://localhost:3000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; }. Add upstream blocks for load balancing across multiple backend servers."], ["lex", "nginx overview reverse proxy config"], ["lex", "nginx proxy_pass upstream"], ["lex", "nginx load balancer setup"], ["vec", "how to configure nginx as a reverse proxy to forward requests to backend servers"], ["vec", "what nginx directives do you need for a basic reverse proxy configuration"]]} +{"query": "systemd service file", "output": [["hyde", "Create /etc/systemd/system/myapp.service with [Unit] Description, [Service] ExecStart=/path/to/app, Restart=always, User=appuser, and [Install] WantedBy=multi-user.target. Run systemctl daemon-reload, then systemctl enable --now myapp."], ["lex", "systemd service unit file"], ["lex", "systemctl enable start service"], ["lex", "systemd service configuration"], ["vec", "how to create a systemd service file to run an application as a linux daemon"], ["vec", "what are the essential sections and directives in a systemd unit file"]]} +{"query": "websocket vs http", "output": [["hyde", "HTTP is request-response: client asks, server answers, connection closes. WebSocket upgrades HTTP to a persistent bidirectional connection. Use WebSocket for chat, live updates, gaming. Use SSE for server-to-client only streaming. HTTP polling wastes bandwidth with repeated requests."], ["lex", "websocket http difference"], ["lex", "websocket persistent connection"], ["lex", "http polling vs websocket"], ["vec", "what are the differences between websockets and http for real-time communication"], ["vec", "when should you use websockets instead of http long polling or server-sent events"]]} +{"query": "SQL injection prevention", "output": [["hyde", "Never concatenate user input into SQL strings. Use parameterized queries: cursor.execute('SELECT * FROM users WHERE id = ?', (user_id,)). ORMs like SQLAlchemy handle this automatically. Validate and sanitize input, but parameterization is the primary defense."], ["lex", "sql injection prevent parameterized"], ["lex", "prepared statements sql injection"], ["lex", "sql injection sanitize input"], ["vec", "how to prevent sql injection attacks in web applications"], ["vec", "why are parameterized queries and prepared statements important for database security"]]} +{"query": "TypeScript generics", "output": [["hyde", "Generics let you write flexible, reusable code while maintaining type safety. Declare with angle brackets: function identity(arg: T): T { return arg; }. Add constraints with extends: function getLength(item: T): number { return item.length; }."], ["lex", "typescript generics type parameter"], ["lex", "typescript generic function interface"], ["lex", "ts generics constraints extends"], ["vec", "how to use generics in typescript to write reusable type-safe functions and classes"], ["vec", "what is the syntax for generic type parameters and constraints in typescript"]]} +{"query": "OAuth 2.0 authorization code flow", "output": [["hyde", "User clicks login, redirected to auth server with client_id and redirect_uri. User authenticates, gets authorization code. App exchanges code for tokens at token endpoint. PKCE adds code_verifier/code_challenge to prevent interception attacks—required for public clients."], ["lex", "oauth2 authorization code flow"], ["lex", "oauth authorization code grant"], ["lex", "oauth2 pkce code verifier"], ["vec", "how does the oauth 2.0 authorization code flow work for secure third-party authentication"], ["vec", "what are the steps in the oauth authorization code grant and why is pkce recommended"]]} +{"query": "Redis caching strategies", "output": [["hyde", "Cache-aside: app checks Redis first, fetches from DB on miss, writes to cache. Write-through: writes go to cache and DB together. Write-behind: writes to cache, async sync to DB. Set TTL with EXPIRE to prevent stale data. Use SETEX for atomic set-with-expiry."], ["lex", "redis cache strategy pattern"], ["lex", "redis cache aside through"], ["lex", "redis ttl expiration caching"], ["vec", "what are the common caching strategies when using redis for application performance"], ["vec", "how do you implement cache-aside, write-through, and write-behind patterns with redis"]]} +{"query": "GraphQL vs REST", "output": [["hyde", "REST uses fixed endpoints returning predefined data shapes. GraphQL uses one endpoint where clients specify exactly what fields they need, reducing over-fetching. REST is simpler, better cached. GraphQL excels for mobile apps, complex data requirements, and avoiding multiple round trips."], ["lex", "graphql rest api comparison"], ["lex", "graphql query flexibility"], ["lex", "rest vs graphql tradeoffs"], ["vec", "what are the main differences between graphql and rest api design approaches"], ["vec", "when should you choose graphql over rest for your api architecture"]]} +{"query": "linux file permissions chmod", "output": [["hyde", "Permissions are rwx for read, write, execute. Three groups: owner, group, others. chmod 755 means rwxr-xr-x (owner full, others read+execute). chmod 644 means rw-r--r-- (owner read+write, others read only). Use chmod +x to add execute permission."], ["lex", "linux chmod file permissions"], ["lex", "unix rwx permission bits"], ["lex", "chmod 755 644 meaning"], ["vec", "how do linux file permissions work and how do you change them with chmod"], ["vec", "what do the rwx permission bits mean for owner, group, and others"]]} +{"query": "async await error handling", "output": [["hyde", "Wrap await calls in try-catch blocks: try { const data = await fetchData(); } catch (err) { console.error(err); }. Unhandled rejections in async functions become unhandled promise rejections. For multiple awaits, catch individually or use Promise.allSettled to handle partial failures."], ["lex", "async await try catch"], ["lex", "javascript promise error handling"], ["lex", "async function exception handling"], ["vec", "how to properly handle errors in javascript async await functions"], ["vec", "what happens when an async function throws and how do you catch those errors"]]} +{"query": "Elasticsearch query DSL", "output": [["hyde", "Elasticsearch Query DSL uses JSON. Match query for full-text: {match: {title: 'search'}}. Term for exact: {term: {status: 'published'}}. Bool combines queries: {bool: {must: [...], should: [...], filter: [...], must_not: [...]}}. Filter context skips scoring for faster filtering."], ["lex", "elasticsearch overview query dsl"], ["lex", "elasticsearch bool must should"], ["lex", "es full text search query"], ["vec", "how to write search queries using elasticsearch query dsl syntax"], ["vec", "what are the common query types in elasticsearch like match, term, and bool queries"]]} +{"query": "terraform state management", "output": [["hyde", "Store state remotely in S3, GCS, or Terraform Cloud—never commit tfstate to git. Configure backend in terraform { backend \"s3\" { bucket = \"my-state\", key = \"prod.tfstate\", region = \"us-east-1\", dynamodb_table = \"tf-locks\" } }. DynamoDB provides state locking to prevent concurrent modifications."], ["lex", "terraform state file backend"], ["lex", "terraform remote state s3"], ["lex", "tfstate locking management"], ["vec", "how to manage terraform state files and what are the best practices for team collaboration"], ["vec", "why should you use remote state backends in terraform and how do you configure them"]]} +{"query": "monorepo vs polyrepo", "output": [["hyde", "Monorepos keep all code in one repository—easier atomic changes across packages, shared tooling, consistent versioning. Polyrepos give teams autonomy, simpler CI, clearer ownership. Use monorepos for tightly coupled code. Tools: Nx, Turborepo, Lerna, Bazel for build orchestration."], ["lex", "monorepo polyrepo comparison"], ["lex", "monorepo benefits drawbacks"], ["lex", "single repo multiple repos"], ["vec", "what are the tradeoffs between using a monorepo versus multiple repositories"], ["vec", "when does a monorepo make sense and what tools help manage large monorepos"]]} +{"query": "prometheus alerting rules", "output": [["hyde", "Define rules in YAML: groups: - name: example rules: - alert: HighErrorRate expr: rate(http_errors_total[5m]) > 0.1 for: 5m labels: severity: critical annotations: summary: High error rate. Prometheus evaluates rules periodically and sends firing alerts to Alertmanager for routing and deduplication."], ["lex", "prometheus overview alerting rules config"], ["lex", "prometheus alertmanager rules"], ["lex", "promql alert expressions"], ["vec", "how to write prometheus alerting rules to notify on metric thresholds"], ["vec", "what is the syntax for prometheus alert rules and how do they integrate with alertmanager"]]} +{"query": "CSS flexbox centering", "output": [["hyde", "On the container, set display: flex; justify-content: center; align-items: center;. justify-content handles the main axis (horizontal by default), align-items handles the cross axis. Add height: 100vh to center within the viewport. For a single item, margin: auto also works inside flex containers."], ["lex", "css flexbox center align"], ["lex", "flexbox justify-content align-items"], ["lex", "css center div flexbox"], ["vec", "how to center elements horizontally and vertically using css flexbox"], ["vec", "what flexbox properties do you use to center content in a container"]]} +{"query": "database connection pooling", "output": [["hyde", "Opening database connections is expensive. Connection pools maintain reusable connections. Set pool size based on: pool_size = (core_count * 2) + effective_spindle_count. Too small starves the app, too large overwhelms the database. Popular libraries: HikariCP for Java, pgbouncer for PostgreSQL."], ["lex", "database connection pool"], ["lex", "connection pooling performance"], ["lex", "db pool size configuration"], ["vec", "what is database connection pooling and why does it improve application performance"], ["vec", "how do you configure connection pool size for optimal database throughput"]]} +{"query": "kafka consumer groups", "output": [["hyde", "Consumers with the same group.id share partitions—each partition is consumed by only one consumer in the group. Adding consumers triggers rebalancing. If consumers > partitions, some idle. Offsets track progress per partition. Use enable.auto.commit=false for exactly-once semantics with manual commits."], ["lex", "kafka consumer group offset"], ["lex", "kafka partition consumer rebalance"], ["lex", "kafka consumer group id"], ["vec", "how do kafka consumer groups work for parallel message processing"], ["vec", "what happens during consumer group rebalancing and how are partitions assigned"]]} +{"query": "vim search replace", "output": [["hyde", "Use :%s/old/new/g to replace all occurrences in the file. % means all lines, g means global (all matches per line). Add c for confirmation: :%s/old/new/gc. Use \\< and \\> for word boundaries. & in replacement refers to the matched text. Use :s for current line only."], ["lex", "vim search replace substitute"], ["lex", "vim sed command :%s"], ["lex", "vim find replace regex"], ["vec", "how to search and replace text in vim using the substitute command"], ["vec", "what is the syntax for vim search and replace with regular expressions and flags"]]} +{"query": "http status codes meaning", "output": [["hyde", "200 OK success, 201 Created for POST, 204 No Content for DELETE. 400 Bad Request for invalid input, 401 Unauthorized for auth required, 403 Forbidden for insufficient permissions, 404 Not Found. 500 Internal Server Error for unexpected failures, 503 Service Unavailable for temporary issues."], ["lex", "http status codes list"], ["lex", "http 200 400 500 codes"], ["lex", "rest api status codes"], ["vec", "what do the common http status codes mean and when should you use each"], ["vec", "how do you choose the right http status code for api responses"]]} +{"query": "binary search algorithm", "output": [["hyde", "Binary search halves the search space each iteration. Compare target with middle element: if smaller, search left half; if larger, search right. O(log n) time complexity. Requires sorted input. Watch for integer overflow in mid calculation: use low + (high - low) / 2 instead of (low + high) / 2."], ["lex", "binary overview search algorithm"], ["lex", "binary search sorted array"], ["lex", "binary search time complexity"], ["vec", "how does the binary search algorithm work and what is its time complexity"], ["vec", "how do you implement binary search to find an element in a sorted array"]]} +{"query": "git rebase interactive", "output": [["hyde", "Run git rebase -i HEAD~5 to edit the last 5 commits. In the editor, change 'pick' to: squash (s) to combine with previous, reword (r) to edit message, edit (e) to amend, drop (d) to remove. Save and follow prompts. Never rebase commits already pushed to shared branches."], ["lex", "git overview rebase interactive squash"], ["lex", "git rebase -i edit commits"], ["lex", "git squash commits rebase"], ["vec", "how to use git interactive rebase to edit, squash, and reorder commits"], ["vec", "what are the commands available in git rebase interactive mode"]]} +{"query": "environment variables docker", "output": [["hyde", "Use -e flag: docker run -e DB_HOST=localhost myapp. In docker-compose.yml: environment: - DB_HOST=localhost or env_file: - .env. For secrets, prefer docker secrets or mount files. Variables in Dockerfile with ENV persist in the image; runtime -e overrides them."], ["lex", "docker environment variables"], ["lex", "docker env file compose"], ["lex", "docker run -e env vars"], ["vec", "how to pass environment variables to docker containers"], ["vec", "what are the different ways to set environment variables in docker and docker compose"]]} +{"query": "rate limiting algorithms", "output": [["hyde", "Token bucket: bucket fills at fixed rate, requests consume tokens, rejected when empty—allows bursts. Leaky bucket: requests queue, processed at fixed rate—smooths traffic. Sliding window: count requests in rolling time window. Fixed window has boundary issues; sliding window log is precise but memory-heavy."], ["lex", "rate limiting algorithm api"], ["lex", "token bucket leaky bucket"], ["lex", "rate limit sliding window"], ["vec", "what algorithms are used for api rate limiting and how do they differ"], ["vec", "how do token bucket and sliding window rate limiting algorithms work"]]} +{"query": "blue green deployment", "output": [["hyde", "Blue-green runs two identical environments. Blue is live, green has the new version. Test green thoroughly, then switch the load balancer. Instant rollback by switching back to blue. In Kubernetes, use two deployments with a service selector update, or Argo Rollouts for automated blue-green."], ["lex", "blue overview green deployment strategy"], ["lex", "zero downtime deployment"], ["lex", "blue green kubernetes rollout"], ["vec", "what is blue green deployment and how does it enable zero downtime releases"], ["vec", "how do you implement blue green deployments in kubernetes or cloud environments"]]} +{"query": "memory leak debugging", "output": [["hyde", "Use heap profilers: Chrome DevTools for JavaScript, VisualVM or MAT for Java, Valgrind for C/C++, tracemalloc for Python. Take heap snapshots before and after operations, compare retained objects. Common causes: forgotten event listeners, closures holding references, unbounded caches, circular references."], ["lex", "memory leak debug profiler"], ["lex", "memory leak detection tools"], ["lex", "heap dump memory analysis"], ["vec", "how to find and fix memory leaks in applications"], ["vec", "what tools and techniques help identify memory leaks in different programming languages"]]} +{"query": "Stripe webhook verification", "output": [["hyde", "Stripe signs webhooks with your endpoint secret. Verify using stripe.webhooks.constructEvent(body, sig, endpointSecret). Use the raw request body, not parsed JSON. Return 200 quickly, process async. Handle event types like checkout.session.completed. Store endpoint secret securely, rotate if compromised."], ["lex", "stripe webhook signature verify"], ["lex", "stripe webhook endpoint secret"], ["lex", "stripe event verification"], ["vec", "how to verify stripe webhook signatures to ensure events are authentic"], ["vec", "what is the correct way to handle and validate incoming stripe webhook events"]]} +{"query": "React context vs Redux", "output": [["hyde", "Context is built-in, simple for low-frequency updates like themes and auth. Redux adds boilerplate but provides devtools, middleware, time-travel debugging, predictable updates. Context re-renders all consumers on any change; Redux allows granular subscriptions. Use Context for simple cases, Redux for complex state logic."], ["lex", "react context redux comparison"], ["lex", "useContext vs redux state"], ["lex", "react state management choice"], ["vec", "when should you use react context versus redux for state management"], ["vec", "what are the tradeoffs between react context api and redux for global state"]]} +{"query": "DNS records explained", "output": [["hyde", "A record maps domain to IPv4 address. AAAA for IPv6. CNAME aliases one domain to another (can't be on root domain). MX for mail servers with priority. TXT for verification and SPF/DKIM. NS delegates to nameservers. TTL controls caching duration. Changes propagate based on previous TTL."], ["lex", "dns records types a cname mx"], ["lex", "dns configuration records"], ["lex", "domain name system records"], ["vec", "what are the different types of dns records and what does each one do"], ["vec", "how do you configure dns records for a domain including a, cname, mx, and txt records"]]} +{"query": "tmux session management", "output": [["hyde", "Start session: tmux new -s name. Detach: Ctrl-b d. Reattach: tmux attach -t name. New window: Ctrl-b c. Split pane: Ctrl-b % (vertical), Ctrl-b \" (horizontal). Navigate panes: Ctrl-b arrow. List sessions: tmux ls. Kill session: tmux kill-session -t name. Sessions persist after disconnect."], ["lex", "tmux session window pane"], ["lex", "tmux attach detach session"], ["lex", "tmux commands shortcuts"], ["vec", "how to create and manage tmux sessions for persistent terminal workflows"], ["vec", "what are the essential tmux commands for session, window, and pane management"]]} +{"query": "utf-8 encoding explained", "output": [["hyde", "UTF-8 encodes Unicode code points as 1-4 bytes. ASCII characters (0-127) use 1 byte, compatible with ASCII. Higher code points use more bytes with leading bits indicating length. UTF-8 is self-synchronizing and space-efficient for Latin text. Always specify encoding explicitly when reading/writing files."], ["lex", "utf-8 unicode encoding"], ["lex", "utf8 character encoding bytes"], ["lex", "unicode utf-8 ascii difference"], ["vec", "how does utf-8 encoding work and why is it the standard for text"], ["vec", "what is the relationship between unicode and utf-8 and how are characters encoded as bytes"]]} +{"query": "microservices communication patterns", "output": [["hyde", "Sync (REST/gRPC): simple, immediate response, but creates coupling and cascade failures. Async (message queues, events): decoupled, resilient, eventual consistency. Use sync for queries needing immediate response. Use async for commands, notifications, cross-service workflows. Event sourcing and CQRS for complex domains."], ["lex", "microservices overview communication patterns"], ["lex", "sync async microservice calls"], ["lex", "event driven microservices"], ["vec", "what are the common communication patterns between microservices"], ["vec", "when should microservices use synchronous rest calls versus asynchronous messaging"]]} +{"query": "shell script best practices", "output": [["hyde", "Start with #!/usr/bin/env bash and set -euo pipefail. Use shellcheck for linting. Quote variables: \"$var\". Use [[ ]] for tests. Handle errors with trap. Use functions for reusability. Avoid parsing ls output—use globs. Prefer printf over echo. Use local variables in functions. Add -- before filenames from user input."], ["lex", "bash script best practices"], ["lex", "shell script error handling"], ["lex", "bash scripting guidelines"], ["vec", "what are the best practices for writing reliable and maintainable shell scripts"], ["vec", "how do you handle errors and edge cases properly in bash scripts"]]} +{"query": "load balancer health checks", "output": [["hyde", "Load balancers probe backend instances to route traffic only to healthy ones. Health endpoint should check critical dependencies (database, cache) and return 200 if healthy, 503 if not. Configure interval (10-30s), timeout (5s), and threshold (2-3 failures). Include /health and /ready endpoints for Kubernetes liveness and readiness."], ["lex", "load balancer health check"], ["lex", "health check endpoint liveness"], ["lex", "lb health probe configuration"], ["vec", "how do load balancer health checks work and why are they important"], ["vec", "what should a health check endpoint return and how do you configure health check intervals"]]} +{"query": "certificate ssl tls renewal", "output": [["hyde", "Let's Encrypt certificates expire in 90 days. Certbot auto-renews via cron or systemd timer: certbot renew runs twice daily, renews within 30 days of expiry. Test with --dry-run. For other CAs, set calendar reminders. Check expiration: openssl s_client -connect domain:443 | openssl x509 -noout -dates."], ["lex", "ssl tls certificate renewal"], ["lex", "lets encrypt certbot renew"], ["lex", "https certificate expiration"], ["vec", "how to renew ssl tls certificates before they expire"], ["vec", "what is the process for automated certificate renewal with lets encrypt and certbot"]]} +{"query": "python decorators explained", "output": [["hyde", "Decorators wrap functions to extend behavior. @decorator before def is syntactic sugar for func = decorator(func). A decorator is a function taking a function and returning a new function. Use functools.wraps to preserve metadata. Common uses: @lru_cache for memoization, @login_required for auth, timing/logging wrappers."], ["lex", "python decorator function"], ["lex", "python @ decorator syntax"], ["lex", "python wrapper decorator"], ["vec", "how do python decorators work and what is the syntax for creating them"], ["vec", "what are common use cases for decorators in python like logging, caching, and authentication"]]} +{"query": "cap theorem database", "output": [["hyde", "CAP theorem: distributed systems can guarantee only 2 of 3—Consistency (all nodes see same data), Availability (requests get responses), Partition tolerance (survives network splits). During partitions, choose CP (reject requests for consistency, like MongoDB) or AP (serve potentially stale data, like Cassandra). PACELC extends CAP for normal operation tradeoffs."], ["lex", "cap theorem distributed database"], ["lex", "consistency availability partition tolerance"], ["lex", "cap theorem tradeoffs"], ["vec", "what is the cap theorem and how does it apply to distributed database design"], ["vec", "how do different databases choose between consistency and availability during network partitions"]]} +{"query": "garbage collection tuning", "output": [["hyde", "For JVM, G1GC is default, good balance of throughput and pause times. ZGC and Shenandoah offer sub-millisecond pauses for low-latency needs. Tune heap size: -Xms and -Xmx same to avoid resizing. Monitor with gc logs: -Xlog:gc*. Reduce allocation rate by reusing objects and avoiding unnecessary autoboxing."], ["lex", "garbage collection gc tuning"], ["lex", "jvm gc heap memory"], ["lex", "gc pause time optimization"], ["vec", "how to tune garbage collection for better application performance"], ["vec", "what gc algorithms are available and how do you choose gc settings for low latency"]]} +{"query": "feature flags implementation", "output": [["hyde", "Feature flags decouple deployment from release. Simple: if (featureEnabled('new-checkout')) { ... }. Store flags in config, database, or services like LaunchDarkly. Use for gradual rollout (1% -> 10% -> 100%), A/B tests, kill switches. Clean up old flags to prevent technical debt. Log flag evaluations for debugging."], ["lex", "feature flags toggles"], ["lex", "feature flag implementation"], ["lex", "gradual rollout feature flags"], ["vec", "how to implement feature flags for gradual rollouts and a/b testing"], ["vec", "what are the best practices for managing feature flags in production"]]} +{"query": "apache kafka partitions", "output": [["hyde", "Partitions enable parallelism—each partition is consumed by one consumer in a group. Messages with same key go to same partition, preserving order per key. More partitions = more throughput but more overhead. Start with partitions = max(expected throughput / partition throughput, consumer count). Can't reduce partitions, only increase."], ["lex", "kafka partitions topics"], ["lex", "kafka partition key ordering"], ["lex", "kafka partition count scaling"], ["vec", "how do kafka partitions work and how do they affect scalability and message ordering"], ["vec", "how do you choose the right number of partitions for a kafka topic"]]} +{"query": "cron job syntax", "output": [["hyde", "Cron format: minute hour day-of-month month day-of-week command. */5 * * * * runs every 5 minutes. 0 2 * * * runs daily at 2 AM. 0 0 * * 0 runs weekly on Sunday. Use crontab -e to edit. Tools like crontab.guru help build expressions. Consider timezone—cron uses system time."], ["lex", "cron overview job syntax schedule"], ["lex", "crontab expression format"], ["lex", "cron schedule examples"], ["vec", "how to write cron expressions to schedule jobs at specific times"], ["vec", "what does each field in a crontab entry mean and what are common scheduling patterns"]]} +{"query": "GPG key signing", "output": [["hyde", "Generate key: gpg --full-generate-key. List keys: gpg --list-keys. Sign file: gpg --sign file.txt. Verify: gpg --verify file.txt.gpg. For git: git config --global user.signingkey KEYID, git config --global commit.gpgsign true. Export public key for GitHub: gpg --armor --export KEYID."], ["lex", "gpg key sign verify"], ["lex", "gpg signature git commits"], ["lex", "pgp key signing encryption"], ["vec", "how to use gpg keys for signing and verifying files and git commits"], ["vec", "what is the process for creating gpg keys and configuring git to sign commits"]]} +{"query": "api versioning strategies", "output": [["hyde", "URL versioning (/v1/users) is explicit, easy to route. Header versioning (Accept: application/vnd.api+json;version=1) keeps URLs clean. Query param (?version=1) is simple but pollutes URLs. Prefer additive changes—new fields don't break clients. Deprecate gracefully with sunset headers and migration guides."], ["lex", "api versioning strategy"], ["lex", "rest api version url header"], ["lex", "api backward compatibility"], ["vec", "what are the different strategies for versioning rest apis"], ["vec", "how do you maintain backward compatibility when evolving an api"]]} +{"query": "mutex vs semaphore", "output": [["hyde", "Mutex is a binary lock owned by one thread—used for mutual exclusion protecting shared resources. Semaphore is a counter allowing N concurrent accesses—used for limiting concurrency (connection pools, rate limiting). Mutex has ownership (same thread must unlock), semaphore doesn't. Use mutex for critical sections, semaphore for resource counting."], ["lex", "mutex semaphore difference"], ["lex", "mutex lock synchronization"], ["lex", "semaphore counting binary"], ["vec", "what is the difference between a mutex and a semaphore in concurrent programming"], ["vec", "when should you use a mutex versus a semaphore for thread synchronization"]]} +{"query": "json schema validation", "output": [["hyde", "JSON Schema defines expected structure. Key properties: type (string, number, object, array), properties for object fields, required array for mandatory fields, items for array elements. Validators: ajv (JS), jsonschema (Python). Use for API request validation, config file validation, documentation generation."], ["lex", "json overview schema validation"], ["lex", "jsonschema validator python"], ["lex", "json schema types required"], ["vec", "how to use json schema to validate the structure of json data"], ["vec", "what are the common json schema keywords for defining types, required fields, and constraints"]]} +{"query": "CI CD pipeline stages", "output": [["hyde", "Typical stages: 1) Source—trigger on commit, 2) Build—compile, bundle, create artifacts, 3) Test—unit, integration, e2e tests, 4) Security scan—SAST, dependency audit, 5) Deploy to staging, 6) Acceptance tests, 7) Deploy to production. Use parallelization for speed. Gate deployments on test pass. Implement rollback mechanisms."], ["lex", "ci overview cd pipeline stages"], ["lex", "continuous integration deployment"], ["lex", "build test deploy pipeline"], ["vec", "what are the typical stages in a ci cd pipeline"], ["vec", "how do you design a continuous integration and deployment pipeline for reliable releases"]]} +{"query": "event sourcing pattern", "output": [["hyde", "Event sourcing stores state changes as immutable events rather than current state. Account balance is sum of all Deposit and Withdrawal events. Benefits: full audit trail, time travel, replay for debugging. Challenges: eventual consistency, event schema evolution, increased complexity. Often paired with CQRS—separate read models built from event stream."], ["lex", "event overview sourcing pattern"], ["lex", "event store append only log"], ["lex", "cqrs event sourcing"], ["vec", "what is event sourcing and how does it differ from traditional crud data storage"], ["vec", "how do you implement event sourcing and what are its benefits and challenges"]]} +{"query": "IPv4 vs IPv6", "output": [["hyde", "IPv4 uses 32-bit addresses (4 billion), exhausted in 2011. IPv6 uses 128-bit addresses (340 undecillion), formatted as eight hex groups: 2001:0db8::1. IPv6 eliminates NAT need, has built-in IPsec. Transition via dual-stack (both protocols) or tunneling. Check IPv6 support: curl -6 ipv6.google.com."], ["lex", "ipv4 ipv6 difference"], ["lex", "ipv6 address format"], ["lex", "ipv4 exhaustion ipv6 transition"], ["vec", "what are the key differences between ipv4 and ipv6 addressing"], ["vec", "why is ipv6 necessary and how does the transition from ipv4 work"]]} +{"query": "dependency injection benefits", "output": [["hyde", "Dependency injection provides dependencies from outside rather than creating them internally. Class receives DatabaseService via constructor instead of instantiating it. Benefits: loose coupling, easy testing with mocks, flexible configuration. Instead of new EmailService(), inject interface IEmailService—swap implementations without changing consumer code."], ["lex", "dependency injection di pattern"], ["lex", "di inversion of control ioc"], ["lex", "dependency injection testing"], ["vec", "what is dependency injection and why does it improve code maintainability"], ["vec", "how does dependency injection make unit testing easier"]]} +{"query": "S3 bucket policy", "output": [["hyde", "S3 bucket policies are resource-based JSON policies attached to buckets. Grant public read: {\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":\"*\",\"Action\":\"s3:GetObject\",\"Resource\":\"arn:aws:s3:::bucket/*\"}]}. IAM policies attach to users/roles. Use bucket policies for cross-account access, IAM for user-specific permissions. Block public access settings override policies."], ["lex", "s3 bucket policy permissions"], ["lex", "aws s3 iam policy json"], ["lex", "s3 bucket access control"], ["vec", "how to write an s3 bucket policy to control access permissions"], ["vec", "what is the difference between s3 bucket policies and iam policies for access control"]]} +{"query": "idempotency api design", "output": [["hyde", "Idempotent operations produce the same result regardless of how many times called. GET, PUT, DELETE are naturally idempotent. POST needs idempotency keys: client sends unique key, server stores result, returns cached result on retry. Store keys with TTL (24h). Critical for payment APIs—prevents double charges on network retry."], ["lex", "idempotency overview api design"], ["lex", "idempotent request key"], ["lex", "api retry safety idempotency"], ["vec", "what is idempotency in api design and why is it important for reliability"], ["vec", "how do you implement idempotent endpoints to handle duplicate requests safely"]]} +{"query": "awk command examples", "output": [["hyde", "awk processes text line by line, splitting into fields. Print second column: awk '{print $2}' file. Custom delimiter: awk -F',' '{print $1}'. Pattern match: awk '/error/ {print}'. Sum column: awk '{sum+=$3} END {print sum}'. Variables: awk -v threshold=100 '$3 > threshold'. Built-in vars: NF (fields), NR (line number)."], ["lex", "awk overview command examples"], ["lex", "awk print column field"], ["lex", "awk text processing"], ["vec", "how to use awk for text processing and extracting columns from files"], ["vec", "what are common awk patterns and commands for parsing structured text"]]} +{"query": "database sharding strategies", "output": [["hyde", "Sharding distributes data across multiple databases. Strategies: range-based (user IDs 1-1M on shard 1), hash-based (consistent hashing), directory-based (lookup table). Choose shard key with high cardinality, even distribution, query locality. Avoid hot spots—don't shard by timestamp. Cross-shard queries are expensive. Consider sharding only after vertical scaling exhausted."], ["lex", "database sharding horizontal"], ["lex", "shard key partition strategy"], ["lex", "database horizontal scaling"], ["vec", "what is database sharding and what strategies exist for partitioning data"], ["vec", "how do you choose a shard key and what are the tradeoffs of different sharding approaches"]]} +{"query": "jq json parsing", "output": [["hyde", "jq is a command-line JSON processor. Extract field: jq '.name' file.json. Array element: jq '.[0]'. Nested: jq '.users[].email'. Filter: jq '.items[] | select(.price > 100)'. Transform: jq '{name: .title, count: .items | length}'. Raw output: jq -r. Pipe curl output: curl api | jq '.data'."], ["lex", "jq overview json parsing command"], ["lex", "jq filter select query"], ["lex", "jq command line json"], ["vec", "how to use jq to parse and transform json data from the command line"], ["vec", "what are the common jq filters for extracting and manipulating json fields"]]} +{"query": "compile time vs runtime errors", "output": [["hyde", "Compile time errors occur during compilation before code runs—syntax errors, type mismatches in statically typed languages. Runtime errors occur during execution—null pointer, division by zero, file not found. Compile time errors are caught early, cheaper to fix. Static typing and linters catch more at compile time. TypeScript catches errors that JavaScript defers to runtime."], ["lex", "compile time runtime error difference"], ["lex", "static dynamic type checking"], ["lex", "compilation errors vs exceptions"], ["vec", "what is the difference between compile time and runtime errors in programming"], ["vec", "why are compile time errors generally preferable to runtime errors for code reliability"]]} +{"query": "content delivery network cdn", "output": [["hyde", "CDN caches content at edge servers geographically close to users, reducing latency. Serve static assets (images, CSS, JS) through CDN. Set Cache-Control headers: max-age=31536000 for versioned assets, shorter for dynamic content. Configure origin pulls, purge cache on deploys. Popular CDNs: Cloudflare, CloudFront, Fastly, Akamai."], ["lex", "cdn content delivery network"], ["lex", "cdn caching edge servers"], ["lex", "cloudflare cdn setup"], ["vec", "how does a content delivery network cdn improve website performance"], ["vec", "what content should you serve through a cdn and how do you configure cache headers"]]} +{"query": "circuit breaker pattern", "output": [["hyde", "Circuit breaker prevents repeated calls to failing services. States: Closed (normal), Open (failing, reject calls immediately), Half-Open (test recovery). After N failures, opens circuit. After timeout, allows test request. If succeeds, closes. Prevents cascade failures, provides fallbacks. Libraries: resilience4j (Java), polly (.NET), opossum (Node.js)."], ["lex", "circuit overview breaker pattern"], ["lex", "circuit breaker resilience"], ["lex", "hystrix resilience4j circuit"], ["vec", "what is the circuit breaker pattern and how does it improve system resilience"], ["vec", "how do you implement circuit breakers to prevent cascade failures in distributed systems"]]} +{"query": "mac address vs ip address", "output": [["hyde", "MAC address is hardware identifier burned into NIC, 48 bits (AA:BB:CC:DD:EE:FF), used in Layer 2 (local network). IP address is logical, assigned by network, used in Layer 3 (routing). ARP maps IP to MAC on local network. IP gets packets between networks, MAC delivers within a network segment. MAC is permanent, IP changes with network."], ["lex", "mac address ip address difference"], ["lex", "mac address layer 2 hardware"], ["lex", "ip vs mac network address"], ["vec", "what is the difference between a mac address and an ip address in networking"], ["vec", "how do mac addresses and ip addresses work together for network communication"]]} +{"query": "unit test vs integration test", "output": [["hyde", "Unit tests verify single functions or classes in isolation using mocks for dependencies. Fast, many of them. Integration tests verify components working together with real dependencies. Slower, fewer of them. Testing pyramid: many unit tests at base, fewer integration tests in middle, few e2e tests at top. Unit tests catch logic bugs, integration tests catch interface mismatches."], ["lex", "unit test integration test difference"], ["lex", "testing pyramid unit integration e2e"], ["lex", "unit test isolation mocking"], ["vec", "what is the difference between unit tests and integration tests"], ["vec", "how should you balance unit tests and integration tests in the testing pyramid"]]} +{"query": "base64 encoding decoding", "output": [["hyde", "Base64 encodes binary data as ASCII text using 64 characters (A-Z, a-z, 0-9, +, /). Increases size by ~33%. Use for embedding binary in JSON/XML, data URLs, email attachments. Not encryption—easily decoded. In shell: echo -n 'text' | base64. Decode: echo 'dGV4dA==' | base64 -d. In JS: btoa('text'), atob('dGV4dA==')."], ["lex", "base64 overview encoding decoding"], ["lex", "base64 encode decode string"], ["lex", "base64 binary to text"], ["vec", "what is base64 encoding and when should you use it"], ["vec", "how do you encode and decode base64 strings in different programming languages"]]} +{"query": "tail recursion optimization", "output": [["hyde", "Tail recursion: recursive call is the last operation, no work after it returns. TCO reuses stack frame instead of adding new one—prevents stack overflow. Convert by passing accumulated result as parameter: factorial(n, acc=1) { return n <= 1 ? acc : factorial(n-1, n*acc); }. Not all languages implement TCO—JavaScript in strict mode, Scheme yes, Python no."], ["lex", "tail overview recursion optimization"], ["lex", "tail call optimization tco"], ["lex", "recursive function stack overflow"], ["vec", "what is tail recursion and how does tail call optimization prevent stack overflow"], ["vec", "how do you convert a recursive function to tail recursive form"]]} +{"query": "nginx location block", "output": [["hyde", "Location matching order: 1) Exact match (= /path), 2) Preferential prefix (^~ /path), 3) Regex in config order (~* case-insensitive, ~ case-sensitive), 4) Longest prefix match. Example: location /api { proxy_pass http://backend; }. Regex: location ~ \\.php$ { fastcgi_pass; }. Use = for exact matches to skip regex evaluation."], ["lex", "nginx overview location block config"], ["lex", "nginx location regex prefix"], ["lex", "nginx location matching order"], ["vec", "how do nginx location blocks work and in what order are they matched"], ["vec", "what is the syntax for nginx location directives including prefix and regex matching"]]} +{"query": "oop encapsulation abstraction", "output": [["hyde", "Encapsulation bundles data and methods, restricting direct access via private fields and public getters/setters. Protects internal state, enables validation. Abstraction hides implementation complexity, exposing only essential interface. Car has accelerate() method—you don't need to know engine internals. Encapsulation is how you hide, abstraction is what you hide."], ["lex", "oop overview encapsulation abstraction"], ["lex", "object oriented principles"], ["lex", "encapsulation data hiding"], ["vec", "what are encapsulation and abstraction in object oriented programming"], ["vec", "how do encapsulation and abstraction differ and why are they important for software design"]]} +{"query": "webhook vs api polling", "output": [["hyde", "Polling: client repeatedly asks server for updates. Simple but wastes bandwidth if nothing changed, may miss events between polls. Webhooks: server pushes updates to client endpoint when events occur. Real-time, efficient, but requires public endpoint and handling failures. Use webhooks when available (Stripe, GitHub), fall back to polling for systems without webhook support."], ["lex", "webhook vs polling api"], ["lex", "push vs pull api pattern"], ["lex", "webhook callback http"], ["vec", "what are the differences between webhooks and api polling for receiving updates"], ["vec", "when should you use webhooks instead of polling an api for changes"]]} +{"query": "database transaction isolation levels", "output": [["hyde", "Isolation levels from weakest to strongest: Read Uncommitted (dirty reads possible), Read Committed (sees only committed data, default in PostgreSQL), Repeatable Read (no non-repeatable reads), Serializable (no phantom reads, full isolation). Higher isolation = more locking = lower concurrency. Choose based on consistency needs vs performance."], ["lex", "database overview transaction isolation levels"], ["lex", "read committed serializable"], ["lex", "sql isolation dirty read phantom"], ["vec", "what are the different database transaction isolation levels and their tradeoffs"], ["vec", "how do isolation levels prevent anomalies like dirty reads and phantom reads"]]} +{"query": "hash table collision resolution", "output": [["hyde", "Chaining: each bucket holds a linked list of entries with same hash. Simple, handles high load well. Open addressing: on collision, probe for next empty slot. Linear probing (check next slot), quadratic probing, double hashing. Better cache locality but degrades at high load factors. Most implementations use chaining (Java HashMap) or open addressing with good probing (Python dict)."], ["lex", "hash overview table collision resolution"], ["lex", "hash map chaining open addressing"], ["lex", "hash collision handling"], ["vec", "how do hash tables handle collisions when multiple keys hash to the same bucket"], ["vec", "what are the differences between chaining and open addressing for collision resolution"]]} +{"query": "yaml vs json config", "output": [["hyde", "JSON: strict syntax, no comments, explicit quotes, universal parsing. YAML: superset of JSON, allows comments, cleaner for humans, indentation-based. Use JSON for data interchange, APIs, when strict parsing needed. Use YAML for configs (Docker Compose, Kubernetes, CI/CD) where human editing is common. YAML gotchas: Norway problem (NO parsed as false), inconsistent indentation."], ["lex", "yaml json config comparison"], ["lex", "yaml vs json syntax"], ["lex", "configuration file format"], ["vec", "what are the differences between yaml and json for configuration files"], ["vec", "when should you choose yaml over json for application configuration"]]} +{"query": "Kubernetes ingress controller", "output": [["hyde", "Ingress controller implements Ingress resources, routing external HTTP/HTTPS to services. Popular controllers: nginx-ingress, Traefik, HAProxy. Ingress resource defines rules: host (foo.com), paths (/api -> api-service, / -> frontend). Annotations configure TLS, rate limiting, auth. Install controller first, then create Ingress resources."], ["lex", "kubernetes overview ingress controller"], ["lex", "k8s ingress nginx traefik"], ["lex", "ingress rules path host"], ["vec", "what is a kubernetes ingress controller and how does it route external traffic to services"], ["vec", "how do you configure ingress rules for path-based and host-based routing in kubernetes"]]} +{"query": "docker layer caching", "output": [["hyde", "Docker caches each instruction as a layer. Cache invalidates when instruction or context changes, invalidating all subsequent layers. Optimization: order from least to most frequently changing. Copy package.json and install deps before copying source code. Use .dockerignore. Multi-stage builds discard intermediate layers. COPY --from for selective extraction."], ["lex", "docker overview layer caching build"], ["lex", "dockerfile cache optimization"], ["lex", "docker build cache layers"], ["vec", "how does docker layer caching work and how do you optimize dockerfiles for faster builds"], ["vec", "what dockerfile practices maximize cache hits when building docker images"]]} +{"query": "ssh tunnel port forwarding", "output": [["hyde", "Local forwarding (-L): access remote service through local port. ssh -L 8080:localhost:3000 server—localhost:8080 reaches server's port 3000. Remote forwarding (-R): expose local service through remote port. ssh -R 8080:localhost:3000 server—server:8080 reaches your port 3000. Use for accessing databases behind firewalls, exposing dev servers temporarily."], ["lex", "ssh overview tunnel port forwarding"], ["lex", "ssh local remote forward"], ["lex", "ssh -L -R tunnel"], ["vec", "how to set up ssh tunnels for local and remote port forwarding"], ["vec", "what is the difference between ssh local port forwarding and remote port forwarding"]]} +{"query": "rest api pagination", "output": [["hyde", "Offset pagination: ?page=2&limit=20 or ?offset=20&limit=20. Simple but slow for deep pages, inconsistent with real-time inserts. Cursor pagination: ?cursor=abc123&limit=20, cursor encodes position. Consistent, efficient, better for infinite scroll. Return next_cursor in response. Use Link headers or response body for pagination URLs."], ["lex", "rest overview api pagination"], ["lex", "api pagination offset cursor"], ["lex", "paginated response next page"], ["vec", "what are the different approaches to implementing pagination in rest apis"], ["vec", "how do offset-based and cursor-based pagination compare for api design"]]} +{"query": "solid principles explained", "output": [["hyde", "SOLID: Single Responsibility (one reason to change), Open/Closed (open for extension, closed for modification), Liskov Substitution (subtypes substitutable for base types), Interface Segregation (many specific interfaces over one general), Dependency Inversion (depend on abstractions not concretions). Following SOLID produces loosely coupled, testable, maintainable code."], ["lex", "solid principles oop"], ["lex", "single responsibility open closed"], ["lex", "solid design principles"], ["vec", "what are the solid principles in object oriented design"], ["vec", "how do the solid principles improve code maintainability and flexibility"]]} +{"query": "protobuf vs json", "output": [["hyde", "JSON: human-readable, self-describing, universal support, larger payload. Protobuf: binary format, 3-10x smaller, faster serialization, requires schema (.proto files), strong typing. Use JSON for public APIs, debugging, human interaction. Use Protobuf for internal microservices, high-throughput systems, gRPC. Schema evolution with field numbers enables backward compatibility."], ["lex", "protobuf json comparison"], ["lex", "protocol buffers serialization"], ["lex", "grpc protobuf format"], ["vec", "what are the differences between protocol buffers and json for data serialization"], ["vec", "when should you use protobuf instead of json for api communication"]]} +{"query": "linux namespaces containers", "output": [["hyde", "Containers use Linux namespaces for isolation: PID (process tree), NET (network stack), MNT (filesystem mounts), UTS (hostname), IPC (inter-process communication), USER (user IDs). Cgroups limit resource usage (CPU, memory). Together they isolate processes without full VM overhead. Containers share host kernel but see isolated views of system resources."], ["lex", "linux overview namespaces containers"], ["lex", "container isolation namespace cgroup"], ["lex", "docker linux namespaces"], ["vec", "how do linux namespaces enable container isolation"], ["vec", "what kernel features do docker and containers use for process isolation"]]} +{"query": "GraphQL subscriptions websocket", "output": [["hyde", "GraphQL subscriptions enable real-time updates via persistent connections. Client subscribes: subscription { messageAdded { text } }. Server pushes when events occur. Typically uses WebSocket with graphql-ws protocol. Server maintains subscription registry, publishes events through PubSub. Apollo Server and Relay support subscriptions natively."], ["lex", "graphql overview subscriptions websocket"], ["lex", "graphql realtime subscriptions"], ["lex", "graphql subscription server"], ["vec", "how do graphql subscriptions work for real-time data updates"], ["vec", "what is the underlying protocol for graphql subscriptions and how do you implement them"]]} +{"query": "stateless vs stateful services", "output": [["hyde", "Stateless services don't store client state between requests—any instance can handle any request. Scale by adding instances, no session affinity needed. Stateful services maintain client state, requiring sticky sessions or shared storage. Make services stateless by storing session in JWT tokens, Redis, or databases. Stateless is preferred for horizontal scaling and resilience."], ["lex", "stateless stateful service"], ["lex", "stateless api design"], ["lex", "session state storage"], ["vec", "what is the difference between stateless and stateful services in application architecture"], ["vec", "why are stateless services easier to scale and how do you handle state when needed"]]} +{"query": "git bisect debugging", "output": [["hyde", "git bisect does binary search through commits to find where bug was introduced. Start: git bisect start, git bisect bad (current has bug), git bisect good v1.0 (known good commit). Git checks out middle commit—test and mark git bisect good or git bisect bad. Repeat until found. Automate with git bisect run ./test.sh. End with git bisect reset."], ["lex", "git bisect bug finding"], ["lex", "git bisect good bad"], ["lex", "binary search git commit"], ["vec", "how to use git bisect to find the commit that introduced a bug"], ["vec", "what is the git bisect workflow for binary search debugging through commit history"]]} +{"query": "dns propagation time", "output": [["hyde", "DNS propagation is time for changes to spread through cached resolvers worldwide. TTL (Time To Live) controls cache duration. High TTL (86400s) means up to 24h wait. Before changes, lower TTL to 300s, wait for old TTL, make change, then restore TTL. Use dig @8.8.8.8 domain.com to check Google's view. Full propagation can take 24-48h for high-TTL records."], ["lex", "dns overview propagation time"], ["lex", "dns ttl propagation delay"], ["lex", "dns changes not working"], ["vec", "why do dns changes take time to propagate and how can you speed it up"], ["vec", "what is dns propagation and how does ttl affect how quickly changes are visible"]]} +{"query": "fall of the Roman Empire", "output": [["hyde", "The Western Roman Empire fell in 476 AD when Odoacer deposed Romulus Augustulus. Contributing factors included economic troubles, military overextension, political instability with rapid emperor turnover, pressure from Germanic tribes, and the division of the empire. The Eastern Roman Empire (Byzantine) survived until 1453."], ["lex", "roman empire fall causes"], ["lex", "decline of rome 476 AD"], ["lex", "western roman empire collapse"], ["vec", "what were the main causes of the fall of the western roman empire"], ["vec", "how did economic, military, and political factors contribute to rome's collapse"]]} +{"query": "causes of World War I", "output": [["hyde", "WWI was caused by MAIN: Militarism, Alliances, Imperialism, Nationalism. The assassination of Archduke Franz Ferdinand on June 28, 1914 in Sarajevo triggered a chain reaction through alliance systems. Austria-Hungary declared war on Serbia, pulling in Russia, Germany, France, and Britain within weeks."], ["lex", "world war 1 causes"], ["lex", "ww1 assassination archduke franz ferdinand"], ["lex", "causes great war 1914"], ["vec", "what were the main causes and triggers of world war one"], ["vec", "how did the assassination of archduke franz ferdinand lead to a global war"]]} +{"query": "ancient Egypt pyramids construction", "output": [["hyde", "The pyramids were built using ramps, levers, and organized labor forces of tens of thousands of workers. Limestone blocks weighing 2.5 tons average were quarried nearby and transported on sledges. Workers were not slaves but paid laborers housed in nearby villages. The Great Pyramid took approximately 20 years to complete around 2560 BC."], ["lex", "egyptian pyramids how built"], ["lex", "pyramid construction ancient egypt"], ["lex", "great pyramid giza building"], ["vec", "how were the ancient egyptian pyramids constructed without modern technology"], ["vec", "what techniques and labor did ancient egyptians use to build the pyramids at giza"]]} +{"query": "French Revolution timeline", "output": [["hyde", "1789: Estates-General convenes, Bastille stormed July 14. 1791: Constitutional monarchy established. 1792: Republic declared, king executed. 1793-94: Reign of Terror under Robespierre, 17,000 guillotined. 1794: Thermidorian Reaction ends Terror. 1799: Napoleon's coup establishes Consulate."], ["lex", "french overview revolution timeline events"], ["lex", "french revolution 1789 bastille"], ["lex", "reign of terror robespierre"], ["vec", "what were the major events of the french revolution in chronological order"], ["vec", "how did the french revolution progress from the storming of the bastille to napoleon"]]} +{"query": "Ottoman Empire history", "output": [["hyde", "Founded by Osman I around 1299, the Ottoman Empire conquered Constantinople in 1453, ending the Byzantine Empire. At its peak under Suleiman the Magnificent (1520-1566), it controlled Southeast Europe, Western Asia, and North Africa. Gradual decline through the 18th-19th centuries culminated in dissolution after WWI in 1922."], ["lex", "ottoman overview empire history"], ["lex", "ottoman sultanate 1299 1922"], ["lex", "turkish ottoman empire rise fall"], ["vec", "what was the history of the ottoman empire from its founding to its dissolution"], ["vec", "how did the ottoman empire rise to become a major world power and eventually decline"]]} +{"query": "American Civil War battles", "output": [["hyde", "Major battles: Fort Sumter (1861, war begins), Bull Run (Confederate victory), Antietam (1862, bloodiest single day, led to Emancipation Proclamation), Gettysburg (1863, Union turning point), Vicksburg (Union controls Mississippi), Sherman's March (1864), Appomattox (1865, Lee surrenders). Total casualties exceeded 600,000."], ["lex", "american overview civil war battles"], ["lex", "civil war gettysburg antietam"], ["lex", "union confederate battles 1861"], ["vec", "what were the major battles of the american civil war"], ["vec", "which battles were turning points in the civil war between union and confederate forces"]]} +{"query": "Ming Dynasty China", "output": [["hyde", "The Ming Dynasty (1368-1644) was founded by Zhu Yuanzhang after overthrowing Mongol Yuan rule. Notable achievements: construction of the Forbidden City, voyages of Zheng He, restoration of the Great Wall, and flourishing arts and porcelain. Fell to the Manchu Qing after peasant rebellions weakened central authority."], ["lex", "ming overview dynasty china history"], ["lex", "ming dynasty 1368 1644"], ["lex", "chinese ming emperors"], ["vec", "what were the major achievements and characteristics of the ming dynasty in china"], ["vec", "how did the ming dynasty rise to power and what led to its eventual fall"]]} +{"query": "Viking Age exploration", "output": [["hyde", "The Viking Age (793-1066 AD) saw Norse expansion across Europe and beyond. Vikings raided British Isles and France, settled Iceland (874), Greenland (985), and reached North America (Vinland, c.1000) under Leif Erikson. They also traveled east through Russia to Constantinople and served as Varangian Guard."], ["lex", "viking overview age exploration"], ["lex", "vikings norse exploration america"], ["lex", "viking raids settlements"], ["vec", "where did the vikings explore and settle during the viking age"], ["vec", "what routes did norse explorers take and what lands did they discover"]]} +{"query": "Industrial Revolution inventions", "output": [["hyde", "Key inventions: Spinning Jenny (1764), Water Frame (1769), Steam Engine improved by James Watt (1769), Power Loom (1785), Cotton Gin (1793), Steam Locomotive (1804). These enabled factory production, mass manufacturing, and transformed society from agricultural to industrial. Britain led the revolution starting around 1760."], ["lex", "industrial overview revolution inventions"], ["lex", "industrial revolution steam engine"], ["lex", "18th century industrial innovations"], ["vec", "what were the key inventions that drove the industrial revolution"], ["vec", "how did the steam engine and textile machinery transform manufacturing in the 18th century"]]} +{"query": "Byzantine Empire Constantinople", "output": [["hyde", "The Byzantine Empire was the continuation of the Eastern Roman Empire, lasting from 330 AD (Constantinople founded) to 1453. At its peak under Justinian I, it reconquered much of the western Mediterranean. Constantinople was the largest and wealthiest European city for centuries until falling to Ottoman Turks under Mehmed II on May 29, 1453."], ["lex", "byzantine overview empire constantinople"], ["lex", "eastern roman empire byzantium"], ["lex", "fall of constantinople 1453"], ["vec", "what was the byzantine empire and how long did it last after rome fell"], ["vec", "how did constantinople serve as the capital of the byzantine empire until 1453"]]} +{"query": "Aztec Empire civilization", "output": [["hyde", "The Aztec Empire (1428-1521) dominated central Mexico from their capital Tenochtitlan, built on an island in Lake Texcoco (modern Mexico City). Population reached 200,000+. Known for pyramids, human sacrifice, chinampas (floating gardens), and tribute system. Conquered by Hernán Cortés in 1521 with help from rival indigenous groups and smallpox."], ["lex", "aztec overview empire civilization"], ["lex", "aztec tenochtitlan mexico"], ["lex", "aztec history mesoamerica"], ["vec", "what was the aztec empire and how did their civilization develop in mesoamerica"], ["vec", "how did the aztecs build tenochtitlan and what led to the fall of their empire"]]} +{"query": "Renaissance Italy Florence", "output": [["hyde", "The Renaissance began in Florence around 1400 due to wealth from banking and trade, political stability, and classical heritage. The Medici family, especially Lorenzo the Magnificent, patronized artists like Leonardo, Michelangelo, and Botticelli. Florence's guilds, humanism from rediscovered Greek texts, and competition among city-states drove cultural innovation."], ["lex", "renaissance overview italy florence"], ["lex", "italian renaissance medici"], ["lex", "florence renaissance art"], ["vec", "why did the renaissance begin in italy particularly in florence"], ["vec", "how did the medici family and florence become the center of the italian renaissance"]]} +{"query": "Cold War Berlin Wall", "output": [["hyde", "The Berlin Wall was built overnight on August 13, 1961 by East Germany to stop emigration to the West—3.5 million had fled since 1945. It divided Berlin for 28 years, symbolizing the Iron Curtain. Fell November 9, 1989 after Hungary opened its border and East German protests grew. Germany reunified October 3, 1990."], ["lex", "cold overview war berlin wall"], ["lex", "berlin wall 1961 1989"], ["lex", "east west germany division"], ["vec", "what was the significance of the berlin wall during the cold war"], ["vec", "why was the berlin wall built and what led to its fall in 1989"]]} +{"query": "Mongol Empire Genghis Khan", "output": [["hyde", "Genghis Khan united Mongol tribes by 1206 and conquered from Korea to Poland by his death in 1227. The empire peaked under his grandsons, spanning 24 million km²—largest contiguous empire ever. Success came from cavalry tactics, meritocracy, religious tolerance, and the Yam relay system. Divided into khanates after 1260."], ["lex", "mongol overview empire genghis khan"], ["lex", "mongol conquests 13th century"], ["lex", "genghis khan mongol history"], ["vec", "how did genghis khan build the mongol empire into the largest contiguous land empire"], ["vec", "what territories did the mongol empire conquer and how did they administer such vast lands"]]} +{"query": "ancient Greece democracy Athens", "output": [["hyde", "Athenian democracy emerged under Cleisthenes (508 BC) and peaked under Pericles (461-429 BC). Citizens (adult male non-slaves) voted directly in the Assembly (Ekklesia) on laws and policy. The Council of 500, chosen by lot, set the agenda. Jury courts had hundreds of jurors. About 30,000 of 300,000 residents were citizens."], ["lex", "ancient overview greece democracy athens"], ["lex", "athenian democracy 5th century bc"], ["lex", "greek democracy origins"], ["vec", "how did democracy develop in ancient athens and how did it function"], ["vec", "what were the key institutions and practices of athenian democracy"]]} +{"query": "Protestant Reformation Martin Luther", "output": [["hyde", "Martin Luther posted his 95 Theses on October 31, 1517 in Wittenberg, criticizing indulgences and papal authority. Key ideas: salvation by faith alone, scripture as sole authority, priesthood of all believers. The printing press spread his ideas rapidly. Luther was excommunicated in 1521. The Reformation split Western Christianity and sparked religious wars across Europe."], ["lex", "protestant reformation luther"], ["lex", "martin luther 95 theses"], ["lex", "reformation 1517 catholic church"], ["vec", "what started the protestant reformation and what were its main ideas"], ["vec", "how did martin luther's 95 theses challenge the catholic church and spread across europe"]]} +{"query": "Silk Road trade routes", "output": [["hyde", "The Silk Road was a network of trade routes connecting China to the Mediterranean from around 130 BC to 1450s AD. Goods traded: silk, spices, porcelain from East; gold, glass, horses from West. Also spread Buddhism, Islam, technologies like paper and gunpowder, and unfortunately, the Black Death. Named by German geographer Ferdinand von Richthofen in 1877."], ["lex", "silk road trade route"], ["lex", "silk road ancient trade china"], ["lex", "silk road history commerce"], ["vec", "what was the silk road and how did it connect east and west"], ["vec", "what goods and ideas were exchanged along the ancient silk road trade routes"]]} +{"query": "Napoleonic Wars Europe", "output": [["hyde", "The Napoleonic Wars (1803-1815) saw France under Napoleon dominate continental Europe through brilliant campaigns at Austerlitz, Jena, and Wagram. His empire stretched from Spain to Poland. The failed 1812 Russian invasion (600,000 troops, 100,000 returned) began his decline. Exiled to Elba 1814, returned for Hundred Days, finally defeated at Waterloo June 18, 1815."], ["lex", "napoleonic overview wars europe"], ["lex", "napoleon bonaparte campaigns"], ["lex", "napoleonic era 1803 1815"], ["vec", "what were the major campaigns and outcomes of the napoleonic wars"], ["vec", "how did napoleon's military conquests reshape europe and lead to his downfall"]]} +{"query": "ancient Mesopotamia civilizations", "output": [["hyde", "Mesopotamia (modern Iraq) between Tigris and Euphrates rivers hosted the world's first civilizations. Sumerians (4500-1900 BC) invented writing (cuneiform), the wheel, sailboat, and plow. Akkadian Empire under Sargon was first empire. Babylon produced Hammurabi's Code. Assyrians and Persians followed. Agriculture surplus enabled cities, specialization, and complex society."], ["lex", "ancient overview mesopotamia civilizations"], ["lex", "mesopotamia sumer babylon"], ["lex", "cradle of civilization tigris euphrates"], ["vec", "what civilizations arose in ancient mesopotamia and what were their achievements"], ["vec", "why is mesopotamia called the cradle of civilization and what did sumerians invent"]]} +{"query": "Meiji Restoration Japan", "output": [["hyde", "The Meiji Restoration (1868) ended 250 years of Tokugawa shogunate rule, restoring imperial power under Emperor Meiji. Japan rapidly industrialized and westernized: abolished feudalism, created national army, built railways, established constitution (1889). Slogan: 'Rich country, strong army.' Japan defeated China (1895) and Russia (1905), becoming a world power within 50 years."], ["lex", "meiji overview restoration japan"], ["lex", "meiji era modernization 1868"], ["lex", "japan meiji emperor reform"], ["vec", "what was the meiji restoration and how did it transform japan"], ["vec", "how did japan modernize so rapidly during the meiji period from 1868 to 1912"]]} +{"query": "Black Death plague Europe", "output": [["hyde", "The Black Death (1347-1351) killed 75-200 million people, 30-60% of Europe's population. Caused by Yersinia pestis bacteria spread by fleas on rats, it arrived via Genoese ships from Crimea. Symptoms: buboes, fever, death within days. Consequences: labor shortages raised wages, weakened feudalism, sparked religious movements and persecution of Jews."], ["lex", "black overview death plague europe"], ["lex", "bubonic plague 1347 medieval"], ["lex", "black death medieval europe"], ["vec", "what was the black death and how did it impact medieval europe"], ["vec", "how did the bubonic plague spread across europe and what were its consequences"]]} +{"query": "Spanish Conquest Americas", "output": [["hyde", "Hernán Cortés conquered the Aztec Empire (1519-1521) with 500 soldiers, allying with Tlaxcalans and exploiting Montezuma's hesitation. Francisco Pizarro conquered the Inca Empire (1532-1533) capturing Atahualpa during civil war. Spanish advantages: steel weapons, horses, gunpowder, and crucially, Old World diseases like smallpox that killed 90% of indigenous populations."], ["lex", "spanish overview conquest americas"], ["lex", "conquistadors cortez pizarro"], ["lex", "spanish colonization new world"], ["vec", "how did spanish conquistadors conquer the aztec and inca empires"], ["vec", "what factors enabled spain to colonize the americas so rapidly in the 16th century"]]} +{"query": "World War II D-Day", "output": [["hyde", "D-Day, June 6, 1944, was the largest amphibious invasion in history. Operation Overlord landed 156,000 Allied troops on five Normandy beaches (Utah, Omaha, Gold, Juno, Sword). Despite 10,000+ casualties, it established a Western Front, leading to Paris liberation (August 1944) and Germany's surrender (May 1945). Supreme Commander: Dwight D. Eisenhower."], ["lex", "world war 2 d-day normandy"], ["lex", "d-day june 6 1944 invasion"], ["lex", "operation overlord ww2"], ["vec", "what happened on d-day and why was the normandy invasion a turning point in world war two"], ["vec", "how was the d-day invasion of normandy planned and executed by allied forces"]]} +{"query": "Han Dynasty China achievements", "output": [["hyde", "The Han Dynasty (206 BC - 220 AD) is considered China's golden age. Achievements: Silk Road trade established, paper invented (105 AD), civil service exams introduced, Confucianism became state ideology. Population reached 60 million. So influential that ethnic Chinese still call themselves 'Han people.' Collapsed due to court intrigue, eunuch power, and Yellow Turban Rebellion."], ["lex", "han overview dynasty china achievements"], ["lex", "han dynasty 206 bc history"], ["lex", "ancient china han empire"], ["vec", "what were the major achievements and contributions of the han dynasty in china"], ["vec", "why is the han dynasty considered a golden age in chinese history"]]} diff --git a/finetune/data/train/dataset_info.json b/finetune/data/train/dataset_info.json index 5034ec5b..34e381b2 100644 --- a/finetune/data/train/dataset_info.json +++ b/finetune/data/train/dataset_info.json @@ -1,11 +1,9 @@ { "dataset_name": "qmd-query-expansion", - "train_samples": 5440, - "val_samples": 605, - "short_query_pct": 11.1, + "train_samples": 2806, + "val_samples": 312, + "short_query_pct": 15.5, "columns": [ - "prompt", - "completion", "text", "messages" ] diff --git a/finetune/dataset/analyze_data.py b/finetune/dataset/analyze_data.py index 652b7823..cdfb5ab9 100644 --- a/finetune/dataset/analyze_data.py +++ b/finetune/dataset/analyze_data.py @@ -1,34 +1,35 @@ #!/usr/bin/env python3 +# /// script +# requires-python = ">=3.10" +# dependencies = ["pydantic>=2.0"] +# /// """ Dataset Analysis and Quality Report Generator -Analyzes the training data for: +Analyzes training data loaded through the strict Pydantic schema for: 1. Query length distribution 2. Category diversity 3. Named entity coverage -4. Temporal query coverage -5. Short query coverage (important for ambiguous queries) -6. Duplicate detection -7. Quality issues (long hyde, missing fields, etc.) +4. Output format coverage +5. Duplicate detection """ -import json -import re +import argparse import sys from pathlib import Path from collections import Counter, defaultdict from dataclasses import dataclass sys.path.insert(0, str(Path(__file__).parent.parent)) -from dataset.schema import normalize_output_items, parse_output_text +from dataset.schema import TrainingExample, OutputType, load_examples @dataclass class DatasetStats: total_examples: int = 0 - short_queries: int = 0 # 1-2 words - medium_queries: int = 0 # 3-5 words - long_queries: int = 0 # 6+ words + short_queries: int = 0 + medium_queries: int = 0 + long_queries: int = 0 has_lex: int = 0 has_vec: int = 0 has_hyde: int = 0 @@ -40,288 +41,164 @@ class DatasetStats: def categorize_query(query: str) -> str: - """Categorize a query by type.""" query_lower = query.lower() words = query_lower.split() word_count = len(words) - # Short keyword queries if word_count <= 2: return "short_keyword" - - # Named entity queries (capitalized words or tech terms) - if any(w[0].isupper() for w in words if w): + if any(w[0].isupper() for w in query.split() if w): return "named_entity" - # Temporal/recency queries temporal_keywords = [ - "latest", - "recent", - "new", - "update", - "changelog", - "changed", - "version", - "release", - "news", - "2024", - "2025", + "latest", "recent", "new", "update", "changelog", + "changed", "version", "release", "news", "2024", "2025", ] if any(kw in query_lower for kw in temporal_keywords): return "temporal" - - # How-to queries if query_lower.startswith("how "): return "how_to" - - # What is queries if query_lower.startswith("what "): return "what_is" - - # Difference/comparison queries if any(kw in query_lower for kw in ["difference", "vs", "versus", "compare"]): return "comparison" - - # Personal/journal style - if any( - kw in query_lower for kw in ["meeting", "notes", "journal", "ideas", "thoughts"] - ): + if any(kw in query_lower for kw in ["meeting", "notes", "journal", "ideas", "thoughts"]): return "personal" return "other" def extract_named_entities(query: str) -> list: - """Extract potential named entities from query.""" entities = [] - words = query.split() - - for word in words: - # Skip stopwords - if word.lower() in { - "the", - "a", - "an", - "is", - "are", - "to", - "for", - "of", - "in", - "and", - "or", - }: + stopwords = {"the", "a", "an", "is", "are", "to", "for", "of", "in", "and", "or"} + for word in query.split(): + if word.lower() in stopwords: continue - - # Capitalized words (potential named entities) if word and word[0].isupper() and len(word) > 1: entities.append(word) - - # Technology terms with version numbers or special chars if any(c in word for c in ".+-0123456789") and len(word) > 1: entities.append(word) - return entities -def analyze_dataset(filepath: Path) -> tuple[DatasetStats, dict, dict]: - """Analyze the dataset and return statistics.""" +def analyze_examples(examples: list[TrainingExample]) -> tuple[DatasetStats, dict, dict]: stats = DatasetStats() - categories = Counter() - seen_queries = set() - duplicate_count = 0 - category_examples = defaultdict(list) - - with open(filepath, "r", encoding="utf-8") as f: - for line_num, line in enumerate(f, 1): - line = line.strip() - if not line: - continue - - try: - example = json.loads(line) - query = example.get("query", "") or example.get("input", "") - output = example.get("output", []) - if isinstance(output, str): - output = parse_output_text(output) - output = normalize_output_items(output) - - stats.total_examples += 1 - - # Check for duplicates - query_lower = query.lower() - if query_lower in seen_queries: - duplicate_count += 1 - else: - seen_queries.add(query_lower) - - # Query length categorization - word_count = len(query.split()) - if word_count <= 2: - stats.short_queries += 1 - elif word_count <= 5: - stats.medium_queries += 1 - else: - stats.long_queries += 1 - - # Category detection - category = categorize_query(query) - categories[category] += 1 - category_examples[category].append(query) - - # Named entity detection - if extract_named_entities(query): - stats.named_entity_queries += 1 - - # Output analysis - has_lex = any(o[0] == "lex" for o in output) - has_vec = any(o[0] == "vec" for o in output) - has_hyde = any(o[0] == "hyde" for o in output) - - if has_lex: - stats.has_lex += 1 - if has_vec: - stats.has_vec += 1 - if has_hyde: - stats.has_hyde += 1 - - # Check hyde length - for kind, text in output: - if kind == "hyde" and len(text) > 200: - stats.long_hyde_count += 1 - - except json.JSONDecodeError: - print(f"Warning: Could not parse line {line_num}") - - stats.duplicate_queries = duplicate_count + categories: Counter = Counter() + seen_queries: set[str] = set() + category_examples: dict[str, list[str]] = defaultdict(list) + + for ex in examples: + stats.total_examples += 1 + + query_lower = ex.query.lower() + if query_lower in seen_queries: + stats.duplicate_queries += 1 + else: + seen_queries.add(query_lower) + + word_count = len(ex.query.split()) + if word_count <= 2: + stats.short_queries += 1 + elif word_count <= 5: + stats.medium_queries += 1 + else: + stats.long_queries += 1 + + category = categorize_query(ex.query) + categories[category] += 1 + category_examples[category].append(ex.query) + + if extract_named_entities(ex.query): + stats.named_entity_queries += 1 + + # Use the typed OutputPair model + types_present = {p.type for p in ex.output} + if OutputType.lex in types_present: + stats.has_lex += 1 + if OutputType.vec in types_present: + stats.has_vec += 1 + if OutputType.hyde in types_present: + stats.has_hyde += 1 + for p in ex.output: + if p.type == OutputType.hyde and len(p.text) > 200: + stats.long_hyde_count += 1 + stats.temporal_queries = categories.get("temporal", 0) stats.short_keyword_queries = categories.get("short_keyword", 0) - return stats, dict(categories), dict(category_examples) def print_report(stats: DatasetStats, categories: dict, category_examples: dict): - """Print a comprehensive analysis report.""" print("=" * 70) print("QMD TRAINING DATA ANALYSIS REPORT") print("=" * 70) print() - # Basic statistics - print("📊 BASIC STATISTICS") + total = stats.total_examples + print("BASIC STATISTICS") print("-" * 40) - print(f"Total examples: {stats.total_examples:>6}") + print(f"Total examples: {total:>6}") print(f"Duplicates found: {stats.duplicate_queries:>6}") print() - # Query length distribution - print("📝 QUERY LENGTH DISTRIBUTION") + print("QUERY LENGTH DISTRIBUTION") print("-" * 40) - total = stats.total_examples - print( - f"Short (1-2 words): {stats.short_queries:>6} ({100 * stats.short_queries / total:5.1f}%)" - ) - print( - f"Medium (3-5 words): {stats.medium_queries:>6} ({100 * stats.medium_queries / total:5.1f}%)" - ) - print( - f"Long (6+ words): {stats.long_queries:>6} ({100 * stats.long_queries / total:5.1f}%)" - ) + print(f"Short (1-2 words): {stats.short_queries:>6} ({100 * stats.short_queries / total:5.1f}%)") + print(f"Medium (3-5 words): {stats.medium_queries:>6} ({100 * stats.medium_queries / total:5.1f}%)") + print(f"Long (6+ words): {stats.long_queries:>6} ({100 * stats.long_queries / total:5.1f}%)") print() - # Category distribution - print("🏷️ CATEGORY DISTRIBUTION") + print("CATEGORY DISTRIBUTION") print("-" * 40) for cat, count in sorted(categories.items(), key=lambda x: -x[1]): pct = 100 * count / total - bar = "█" * int(pct / 2) + bar = "#" * int(pct / 2) print(f"{cat:20} {count:>6} ({pct:5.1f}%) {bar}") print() - # Output format coverage - print("✅ OUTPUT FORMAT COVERAGE") + print("OUTPUT FORMAT COVERAGE") print("-" * 40) - print( - f"Has lex: {stats.has_lex:>6} ({100 * stats.has_lex / total:5.1f}%)" - ) - print( - f"Has vec: {stats.has_vec:>6} ({100 * stats.has_vec / total:5.1f}%)" - ) - print( - f"Has hyde: {stats.has_hyde:>6} ({100 * stats.has_hyde / total:5.1f}%)" - ) + print(f"Has lex: {stats.has_lex:>6} ({100 * stats.has_lex / total:5.1f}%)") + print(f"Has vec: {stats.has_vec:>6} ({100 * stats.has_vec / total:5.1f}%)") + print(f"Has hyde: {stats.has_hyde:>6} ({100 * stats.has_hyde / total:5.1f}%)") print(f"Long hyde (>200ch): {stats.long_hyde_count:>6}") print() - # Critical metrics for evals - print("🎯 EVALUATION ALIGNMENT") + print("EVALUATION ALIGNMENT") print("-" * 40) - print( - f"Named entity queries: {stats.named_entity_queries:>6} ({100 * stats.named_entity_queries / total:5.1f}%)" - ) - print( - f"Temporal/recency: {stats.temporal_queries:>6} ({100 * stats.temporal_queries / total:5.1f}%)" - ) - print( - f"Short keyword queries: {stats.short_keyword_queries:>6} ({100 * stats.short_keyword_queries / total:5.1f}%)" - ) + print(f"Named entity queries: {stats.named_entity_queries:>6} ({100 * stats.named_entity_queries / total:5.1f}%)") + print(f"Temporal/recency: {stats.temporal_queries:>6} ({100 * stats.temporal_queries / total:5.1f}%)") + print(f"Short keyword queries: {stats.short_keyword_queries:>6} ({100 * stats.short_keyword_queries / total:5.1f}%)") print() - # Recommendations - print("💡 RECOMMENDATIONS") + print("RECOMMENDATIONS") print("-" * 40) - recommendations = [] - if stats.short_queries / total < 0.15: - recommendations.append( - "⚠️ Short queries below 15% - add more 1-2 word keyword queries" - ) - + recommendations.append("Short queries below 15% - add more 1-2 word keyword queries") if stats.named_entity_queries / total < 0.10: - recommendations.append( - "⚠️ Named entity queries below 10% - add more capitalized tech term queries" - ) - + recommendations.append("Named entity queries below 10% - add more capitalized tech term queries") if stats.temporal_queries / total < 0.05: - recommendations.append( - "⚠️ Temporal queries below 5% - add more 'latest', 'recent' queries" - ) - + recommendations.append("Temporal queries below 5% - add more 'latest', 'recent' queries") if stats.long_hyde_count > 50: - recommendations.append( - f"⚠️ {stats.long_hyde_count} long hyde sections - consider truncating" - ) - + recommendations.append(f"{stats.long_hyde_count} long hyde sections - consider truncating") if stats.duplicate_queries > 0: - recommendations.append( - f"⚠️ {stats.duplicate_queries} duplicate queries - consider deduplication" - ) - - if categories.get("short_keyword", 0) < 100: - recommendations.append( - "⚠️ Need more short keyword examples for ambiguous query training" - ) - + recommendations.append(f"{stats.duplicate_queries} duplicate queries - consider deduplication") if not recommendations: - print("✅ Dataset looks good! No major issues detected.") + print("Dataset looks good! No major issues detected.") else: for rec in recommendations: - print(rec) - + print(f" - {rec}") print() print("=" * 70) def main(): - """Main entry point.""" - import argparse - parser = argparse.ArgumentParser(description="Analyze QMD training dataset") parser.add_argument( "--input", type=str, - default="data/qmd_expansion_v2.jsonl", + default="data/qmd_expansion_v3_structured.jsonl", help="Path to training data JSONL file", ) parser.add_argument( @@ -333,33 +210,30 @@ def main(): args = parser.parse_args() input_path = Path(args.input) - if not input_path.exists(): - # Try relative to script directory script_dir = Path(__file__).parent.parent input_path = script_dir / args.input if not input_path.exists(): print(f"Error: Could not find dataset at {input_path}") - print("Please run from finetune directory or specify correct path") return 1 print(f"Analyzing: {input_path}") print() - stats, categories, category_examples = analyze_dataset(input_path) + examples = load_examples(input_path) + stats, categories, category_examples = analyze_examples(examples) print_report(stats, categories, category_examples) - # Show examples if requested if args.show_examples > 0: - print("📋 SAMPLE QUERIES BY CATEGORY") + print("SAMPLE QUERIES BY CATEGORY") print("-" * 40) for cat in sorted(categories.keys()): - examples = category_examples.get(cat, []) - if examples: + exs = category_examples.get(cat, []) + if exs: print(f"\n{cat.upper()}:") - for ex in examples[: args.show_examples]: - print(f" • {ex}") + for ex in exs[:args.show_examples]: + print(f" - {ex}") print() return 0 diff --git a/finetune/dataset/clean_data.py b/finetune/dataset/clean_data.py deleted file mode 100644 index 9742a5d7..00000000 --- a/finetune/dataset/clean_data.py +++ /dev/null @@ -1,906 +0,0 @@ -#!/usr/bin/env python3 -""" -Data Quality Reviewer for Query Expansion Training Dataset - -This script identifies and flags/fixes semantic errors where technical terms -are misunderstood. For example: -- "gem find" expanded as "mineral hunt" instead of "ruby gem search" -- "yarn spin" expanded as "wool twist" instead of "yarn package manager" - -The script uses contextual analysis to detect when technical terms -are likely being used in a programming context vs. their everyday meaning. -""" - -import json -import re -from pathlib import Path -from dataclasses import dataclass, field -from typing import Optional -from collections import defaultdict - -from dataset.schema import ( - normalize_output_items, - output_items_to_text, - parse_output_text, -) - - -@dataclass -class TechnicalTerm: - """Definition of a technical term that might be misunderstood.""" - - term: str # The ambiguous term (e.g., "liquid", "gem", "yarn") - context_indicators: list[str] # Words that suggest tech context - wrong_expansions: list[str] # Patterns that indicate wrong interpretation - correct_domain: str # What domain this belongs to when technical - correct_lex: list[str] # Correct lex expansions - correct_vec: list[str] # Correct vec expansions - - -# Known technical terms that are commonly misunderstood -KNOWN_TECHNICAL_TERMS = [ - TechnicalTerm( - term="liquid", - context_indicators=["shopify", "template", "filter", "tag", "theme", "jekyll"], - wrong_expansions=["fluid", "water", "pour", "drink", "beverage", "h2o", "wet"], - correct_domain="Shopify/Jekyll templating language", - correct_lex=["shopify template syntax", "liquid template filter"], - correct_vec=[ - "shopify liquid templating language", - "liquid template engine filters", - ], - ), - TechnicalTerm( - term="gem", - context_indicators=[ - "ruby", - "bundler", - "install", - "gemfile", - "rails", - "require", - ], - wrong_expansions=[ - "mineral", - "crystal", - "jewel", - "stone", - "diamond", - "jewelry", - "precious", - ], - correct_domain="Ruby package manager", - correct_lex=["ruby gem package", "gem install command"], - correct_vec=["ruby gem package manager", "rubygems library installation"], - ), - TechnicalTerm( - term="yarn", - context_indicators=[ - "npm", - "package", - "install", - "node", - "javascript", - "react", - "webpack", - ], - wrong_expansions=[ - "thread", - "wool", - "knit", - "spin", - "textile", - "fabric", - "sew", - "twist", - ], - correct_domain="JavaScript package manager", - correct_lex=["yarn package manager", "yarn install dependencies"], - correct_vec=["yarn javascript package manager", "yarn npm alternative"], - ), - TechnicalTerm( - term="hook", - context_indicators=[ - "react", - "use", - "state", - "effect", - "component", - "callback", - "git", - ], - wrong_expansions=["fish", "fishing", "bait", "catch", "hang", "pirate"], - correct_domain="React hooks or Git hooks", - correct_lex=["react hooks api", "usestate useeffect"], - correct_vec=[ - "react hooks state management", - "react functional component hooks", - ], - ), - TechnicalTerm( - term="container", - context_indicators=[ - "docker", - "kubernetes", - "k8s", - "image", - "orchestration", - "pod", - ], - wrong_expansions=[ - "box", - "storage", - "shipping", - "cargo", - "tupperware", - "jar", - "vessel", - ], - correct_domain="Docker/Kubernetes containers", - correct_lex=["docker container", "container image"], - correct_vec=[ - "docker container virtualization", - "container orchestration platform", - ], - ), - TechnicalTerm( - term="branch", - context_indicators=[ - "git", - "merge", - "checkout", - "commit", - "main", - "master", - "repo", - ], - wrong_expansions=["tree", "limb", "wood", "leaf", "twig", "forest"], - correct_domain="Git version control", - correct_lex=["git branch", "git checkout branch"], - correct_vec=["git branch version control", "git branching workflow"], - ), - TechnicalTerm( - term="decorator", - context_indicators=["python", "@", "function", "wrapper", "class", "def"], - wrong_expansions=[ - "interior", - "design", - "paint", - "furniture", - "decor", - "ornament", - ], - correct_domain="Python decorators", - correct_lex=["python decorator function", "@decorator syntax"], - correct_vec=["python function decorators", "python decorator pattern"], - ), - TechnicalTerm( - term="bean", - context_indicators=[ - "java", - "spring", - "injection", - "dependency", - "servlet", - "ejb", - ], - wrong_expansions=["coffee", "food", "vegetable", "legume", "plant", "soy"], - correct_domain="Java Beans / Spring Beans", - correct_lex=["java bean class", "spring bean injection"], - correct_vec=["java enterprise beans", "spring dependency injection beans"], - ), - TechnicalTerm( - term="shell", - context_indicators=[ - "bash", - "script", - "terminal", - "command", - "linux", - "unix", - "zsh", - ], - wrong_expansions=["seashell", "ocean", "beach", "clam", "oyster", "egg"], - correct_domain="Unix/Linux shell scripting", - correct_lex=["bash shell script", "shell command"], - correct_vec=["unix shell scripting", "bash command line shell"], - ), - TechnicalTerm( - term="rust", - context_indicators=[ - "cargo", - "crate", - "ownership", - "borrow", - "lifetime", - "unsafe", - ], - wrong_expansions=["oxidation", "metal", "corrosion", "decay", "iron", "orange"], - correct_domain="Rust programming language", - correct_lex=["rust programming language", "rust cargo package"], - correct_vec=["rust systems programming", "rust memory safety"], - ), - TechnicalTerm( - term="go", - context_indicators=[ - "golang", - "goroutine", - "channel", - "defer", - "gofmt", - "module", - ], - wrong_expansions=[ - "travel", - "move", - "walk", - "game", - "board game", - "leave", - "depart", - ], - correct_domain="Go programming language", - correct_lex=["golang programming", "go language syntax"], - correct_vec=["go programming language", "golang concurrent programming"], - ), - TechnicalTerm( - term="swift", - context_indicators=["ios", "xcode", "apple", "uikit", "swiftui", "cocoa"], - wrong_expansions=["fast", "quick", "bird", "speed", "rapid", "taylor"], - correct_domain="Swift programming language", - correct_lex=["swift ios development", "swift programming language"], - correct_vec=["swift apple programming language", "swift ios app development"], - ), - TechnicalTerm( - term="pod", - context_indicators=[ - "kubernetes", - "k8s", - "deployment", - "service", - "cluster", - "node", - ], - wrong_expansions=["pea", "seed", "plant", "vegetable", "legume", "whale"], - correct_domain="Kubernetes pods", - correct_lex=["kubernetes pod", "k8s pod deployment"], - correct_vec=["kubernetes pod container group", "k8s pod orchestration"], - ), - TechnicalTerm( - term="redis", - context_indicators=[ - "cache", - "database", - "key-value", - "memory", - "pub/sub", - "queue", - ], - wrong_expansions=[], # "redis" doesn't have common wrong meanings - correct_domain="Redis in-memory database", - correct_lex=["redis cache", "redis database"], - correct_vec=["redis in-memory data store", "redis caching solution"], - ), - TechnicalTerm( - term="kafka", - context_indicators=[ - "message", - "stream", - "queue", - "broker", - "topic", - "producer", - "consumer", - ], - wrong_expansions=[ - "franz", - "author", - "writer", - "novel", - "metamorphosis", - "literature", - ], - correct_domain="Apache Kafka message queue", - correct_lex=["apache kafka", "kafka message broker"], - correct_vec=["apache kafka streaming platform", "kafka message queue"], - ), - TechnicalTerm( - term="elastic", - context_indicators=[ - "elasticsearch", - "search", - "index", - "kibana", - "logstash", - "query", - ], - wrong_expansions=["stretch", "rubber", "flexible", "band", "bouncy"], - correct_domain="Elasticsearch", - correct_lex=["elasticsearch", "elastic search index"], - correct_vec=["elasticsearch full-text search", "elastic stack"], - ), - TechnicalTerm( - term="spark", - context_indicators=["apache", "hadoop", "data", "rdd", "dataframe", "pyspark"], - wrong_expansions=["fire", "ignite", "flame", "plug", "electricity"], - correct_domain="Apache Spark", - correct_lex=["apache spark", "spark data processing"], - correct_vec=["apache spark big data processing", "spark cluster computing"], - ), - TechnicalTerm( - term="flask", - context_indicators=["python", "web", "route", "api", "jinja", "werkzeug"], - wrong_expansions=[ - "bottle", - "container", - "lab", - "chemistry", - "drink", - "thermos", - ], - correct_domain="Flask web framework", - correct_lex=["flask python web framework", "flask api"], - correct_vec=["flask python web development", "flask microframework"], - ), - TechnicalTerm( - term="django", - context_indicators=["python", "web", "orm", "model", "view", "template"], - wrong_expansions=["jazz", "music", "reinhardt", "guitar", "movie", "western"], - correct_domain="Django web framework", - correct_lex=["django python framework", "django web development"], - correct_vec=["django python web framework", "django orm models"], - ), - TechnicalTerm( - term="rails", - context_indicators=[ - "ruby", - "gem", - "activerecord", - "model", - "controller", - "migration", - ], - wrong_expansions=["train", "track", "railroad", "railway", "metal"], - correct_domain="Ruby on Rails", - correct_lex=["ruby on rails", "rails web framework"], - correct_vec=["ruby on rails framework", "rails mvc architecture"], - ), - TechnicalTerm( - term="node", - context_indicators=[ - "javascript", - "npm", - "express", - "async", - "require", - "module", - ], - wrong_expansions=["lump", "knot", "bump", "growth", "junction"], - correct_domain="Node.js", - correct_lex=["node.js javascript", "nodejs runtime"], - correct_vec=["node.js javascript runtime", "nodejs server-side javascript"], - ), - TechnicalTerm( - term="maven", - context_indicators=[ - "java", - "pom", - "dependency", - "build", - "artifact", - "repository", - ], - wrong_expansions=["expert", "specialist", "connoisseur"], - correct_domain="Apache Maven", - correct_lex=["apache maven", "maven build tool"], - correct_vec=["apache maven java build", "maven dependency management"], - ), - TechnicalTerm( - term="gradle", - context_indicators=["java", "kotlin", "android", "build", "groovy", "task"], - wrong_expansions=["grade", "slope", "hill", "incline"], - correct_domain="Gradle build tool", - correct_lex=["gradle build tool", "gradle android"], - correct_vec=["gradle java build automation", "gradle kotlin dsl"], - ), - TechnicalTerm( - term="ant", - context_indicators=["java", "build", "xml", "target", "task"], - wrong_expansions=["insect", "bug", "colony", "hill", "picnic"], - correct_domain="Apache Ant build tool", - correct_lex=["apache ant", "ant build xml"], - correct_vec=["apache ant java build", "ant build automation"], - ), -] - - -@dataclass -class Issue: - """Represents an issue found in a dataset example.""" - - line_number: int - input_text: str - output_text: str - issue_type: str - technical_term: str - wrong_expansion_found: str - suggested_fix: Optional[str] = None - - -@dataclass -class AnalysisResult: - """Results of analyzing the dataset.""" - - total_examples: int = 0 - issues_found: list[Issue] = field(default_factory=list) - examples_with_correct_tech_terms: list[tuple[int, str]] = field( - default_factory=list - ) - term_statistics: dict = field(default_factory=lambda: defaultdict(int)) - - -def check_for_wrong_expansion(output_text: str, term: TechnicalTerm) -> Optional[str]: - """Check if the output contains wrong expansions for a technical term.""" - output_lower = output_text.lower() - for wrong in term.wrong_expansions: - if wrong.lower() in output_lower: - return wrong - return None - - -def has_tech_context(input_text: str, term: TechnicalTerm) -> bool: - """Check if the input has indicators of a technical context.""" - input_lower = input_text.lower() - for indicator in term.context_indicators: - if indicator.lower() in input_lower: - return True - return False - - -def is_likely_tech_query(input_text: str) -> bool: - """ - Heuristic to determine if a short query is likely tech-related. - Short queries like "gem find" or "yarn spin" are ambiguous. - """ - tech_patterns = [ - r"\b(install|config|setup|build|run|debug|test|deploy|compile)\b", - r"\b(api|cli|sdk|lib|pkg|npm|pip|cargo)\b", - r"\b(func|class|method|var|const|let|def)\b", - r"\b(http|https|url|port|host|server|client)\b", - r"\b(json|xml|yaml|csv|sql|html|css|js)\b", - ] - input_lower = input_text.lower() - for pattern in tech_patterns: - if re.search(pattern, input_lower): - return True - return False - - -def has_non_tech_context(input_text: str, term: TechnicalTerm) -> bool: - """ - Check if the input clearly indicates a non-technical context. - This helps avoid false positives for words like "car rust", "yarn spin", etc. - """ - input_lower = input_text.lower() - term_lower = term.term.lower() - - # Define non-tech context indicators for each ambiguous term - non_tech_contexts = { - "rust": [ - "car", - "metal", - "iron", - "steel", - "corrosion", - "prevention", - "remove", - "body", - ], - "gem": [ - "gemstone", - "jewelry", - "jewel", - "diamond", - "precious", - "stone", - "cut", - "shop", - "buy", - "wear", - ], - "yarn": [ - "knit", - "crochet", - "spin", - "wool", - "thread", - "textile", - "fabric", - "sew", - "weave", - ], - "hook": ["fishing", "crochet", "hang", "coat", "wall", "ceiling"], - "container": [ - "storage", - "plastic", - "food", - "shipping", - "cargo", - "kitchen", - "box", - ], - "branch": ["tree", "bank", "library", "store", "office", "organization"], - "decorator": [ - "interior", - "home", - "room", - "house", - "design", - "party", - "cake", - "wedding", - ], - "bean": [ - "coffee", - "soy", - "kidney", - "black", - "green", - "garden", - "cooking", - "food", - "plant", - "grow", - ], - "shell": [ - "sea", - "beach", - "egg", - "nut", - "turtle", - "snail", - "crab", - "clam", - "oyster", - ], - "spark": ["plug", "fire", "ignite", "car", "engine", "electric", "romance"], - "go": ["travel", "vacation", "trip", "walk", "run", "leave", "visit", "tour"], - "swift": ["taylor", "concert", "music", "singer", "speed", "fast", "bird"], - "pod": ["pea", "whale", "orca", "dolphin", "vegetable", "seed", "plant"], - "ant": ["insect", "colony", "fire", "carpenter", "pest", "bug", "picnic"], - "node": ["lymph", "medical", "body", "tree", "network point"], - "rails": ["train", "railroad", "railway", "track", "transit", "fence"], - "flask": ["lab", "chemistry", "drink", "hip", "thermos", "bottle", "water"], - "django": [ - "jazz", - "music", - "reinhardt", - "guitar", - "movie", - "western", - "unchained", - ], - "maven": ["expert", "connoisseur", "specialist", "guru"], - "gradle": ["grade", "school", "slope"], - "kafka": [ - "franz", - "author", - "novel", - "metamorphosis", - "literature", - "writer", - "book", - ], - "elastic": ["band", "rubber", "stretch", "flexible", "waist", "fabric"], - } - - if term_lower in non_tech_contexts: - for context_word in non_tech_contexts[term_lower]: - if context_word.lower() in input_lower: - return True - - return False - - -def analyze_example(line_num: int, input_text: str, output_text: str) -> list[Issue]: - """Analyze a single example for potential issues.""" - issues = [] - input_lower = input_text.lower() - - for term in KNOWN_TECHNICAL_TERMS: - term_lower = term.term.lower() - - # Check if the input contains this technical term - if term_lower not in input_lower: - continue - - # Check if output has wrong expansion - wrong_expansion = check_for_wrong_expansion(output_text, term) - if wrong_expansion is None: - continue - - # Skip if the context clearly indicates non-technical usage - if has_non_tech_context(input_text, term): - continue - - # Determine if this is likely a technical context - is_tech = has_tech_context(input_text, term) or is_likely_tech_query(input_text) - - # For very short inputs that contain ONLY the tech term (like "gem find"), - # these are ambiguous and could be tech-related - word_count = len(input_text.split()) - words = [w.lower() for w in input_text.split()] - - # Only flag if it's clearly a tech context OR a very short query - # where the term appears prominently (e.g., "gem find", "yarn add") - if is_tech: - # Create suggested fix for definite tech issues - suggested_output = f"lex: {term.correct_lex[0]}\nlex: {term.correct_lex[1] if len(term.correct_lex) > 1 else term.correct_lex[0]}\nvec: {term.correct_vec[0]}\nvec: {term.correct_vec[1] if len(term.correct_vec) > 1 else term.correct_vec[0]}\nhyde: {term.correct_domain} is a concept that provides functionality for software development." - - issue = Issue( - line_number=line_num, - input_text=input_text, - output_text=output_text[:200] + "..." - if len(output_text) > 200 - else output_text, - issue_type="wrong_tech_expansion", - technical_term=term.term, - wrong_expansion_found=wrong_expansion, - suggested_fix=suggested_output, - ) - issues.append(issue) - elif word_count <= 2 and term_lower in words: - # Very short query with the term as a primary word - truly ambiguous - issue = Issue( - line_number=line_num, - input_text=input_text, - output_text=output_text[:200] + "..." - if len(output_text) > 200 - else output_text, - issue_type="ambiguous_term", - technical_term=term.term, - wrong_expansion_found=wrong_expansion, - suggested_fix=None, - ) - issues.append(issue) - - return issues - - -def analyze_dataset(filepath: Path) -> AnalysisResult: - """Analyze the entire dataset for issues.""" - result = AnalysisResult() - - with open(filepath, "r", encoding="utf-8") as f: - for line_num, line in enumerate(f, 1): - line = line.strip() - if not line: - continue - - try: - example = json.loads(line) - input_text = example.get("query", "") or example.get("input", "") - output_raw = example.get("output", []) - if isinstance(output_raw, str): - output_items = normalize_output_items(parse_output_text(output_raw)) - else: - output_items = normalize_output_items(output_raw) - output_text = output_items_to_text(output_items) - - result.total_examples += 1 - - # Analyze for issues - issues = analyze_example(line_num, input_text, output_text) - result.issues_found.extend(issues) - - # Track term statistics - for term in KNOWN_TECHNICAL_TERMS: - if term.term.lower() in input_text.lower(): - result.term_statistics[term.term] += 1 - - except json.JSONDecodeError as e: - print(f"Warning: Could not parse line {line_num}: {e}") - - return result - - -def fix_example(example: dict, issues: list[Issue]) -> Optional[dict]: - """ - Attempt to fix an example based on identified issues. - Returns None if no fix is needed or possible. - """ - # Only fix examples with definite tech context issues - tech_issues = [ - i for i in issues if i.issue_type == "wrong_tech_expansion" and i.suggested_fix - ] - - if not tech_issues: - return None - - # Use the first tech issue's fix (they should be similar) - issue = tech_issues[0] - if not issue.suggested_fix: - return None - - fixed = example.copy() - fixed_output_items = normalize_output_items(parse_output_text(issue.suggested_fix)) - fixed["output"] = fixed_output_items - fixed["_fixed"] = True - original_items = example.get("output", []) - if isinstance(original_items, str): - original_items = normalize_output_items(parse_output_text(original_items)) - fixed["_original_output"] = output_items_to_text(original_items) - fixed["_fix_reason"] = ( - f"Technical term '{issue.technical_term}' was incorrectly expanded as '{issue.wrong_expansion_found}'" - ) - - return fixed - - -def generate_report(result: AnalysisResult) -> str: - """Generate a human-readable report of the analysis.""" - lines = [] - lines.append("=" * 70) - lines.append("QUERY EXPANSION DATASET QUALITY REPORT") - lines.append("=" * 70) - lines.append("") - lines.append(f"Total examples analyzed: {result.total_examples}") - lines.append(f"Issues found: {len(result.issues_found)}") - lines.append("") - - # Group issues by type - by_type = defaultdict(list) - for issue in result.issues_found: - by_type[issue.issue_type].append(issue) - - lines.append("-" * 70) - lines.append("ISSUES BY TYPE:") - lines.append("-" * 70) - - for issue_type, issues in by_type.items(): - lines.append(f"\n{issue_type.upper()}: {len(issues)} issues") - lines.append("-" * 40) - - # Show up to 10 examples per type - for issue in issues[:10]: - lines.append(f"\n Line {issue.line_number}:") - lines.append(f" Input: {issue.input_text}") - lines.append(f" Technical term: '{issue.technical_term}'") - lines.append(f" Wrong expansion found: '{issue.wrong_expansion_found}'") - if issue.suggested_fix: - lines.append(f" Suggested fix available: Yes") - - if len(issues) > 10: - lines.append(f"\n ... and {len(issues) - 10} more") - - # Term statistics - lines.append("\n" + "-" * 70) - lines.append("TECHNICAL TERM OCCURRENCES IN DATASET:") - lines.append("-" * 70) - - for term, count in sorted(result.term_statistics.items(), key=lambda x: -x[1]): - if count > 0: - lines.append(f" {term}: {count} occurrences") - - lines.append("\n" + "=" * 70) - - return "\n".join(lines) - - -def save_cleaned_dataset(filepath: Path, output_path: Path, result: AnalysisResult): - """Save a cleaned version of the dataset.""" - issues_by_line = defaultdict(list) - for issue in result.issues_found: - issues_by_line[issue.line_number].append(issue) - - fixed_count = 0 - flagged_count = 0 - - with ( - open(filepath, "r", encoding="utf-8") as f_in, - open(output_path, "w", encoding="utf-8") as f_out, - ): - for line_num, line in enumerate(f_in, 1): - line = line.strip() - if not line: - continue - - try: - example = json.loads(line) - if "query" not in example and "input" in example: - example["query"] = example.pop("input") - - output_raw = example.get("output", []) - if isinstance(output_raw, str): - example["output"] = normalize_output_items( - parse_output_text(output_raw) - ) - else: - example["output"] = normalize_output_items(output_raw) - - if line_num in issues_by_line: - issues = issues_by_line[line_num] - fixed = fix_example(example, issues) - - if fixed: - f_out.write(json.dumps(fixed) + "\n") - fixed_count += 1 - else: - # Flag but don't fix ambiguous cases - example["_flagged"] = True - example["_flag_reason"] = ( - f"Ambiguous term '{issues[0].technical_term}' may need review" - ) - f_out.write(json.dumps(example) + "\n") - flagged_count += 1 - else: - f_out.write(json.dumps(example) + "\n") - - except json.JSONDecodeError: - # Keep problematic lines as-is - f_out.write(line + "\n") - - return fixed_count, flagged_count - - -def main(): - """Main entry point.""" - # Paths - script_dir = Path(__file__).parent - input_path = script_dir / "data" / "qmd_expansion.jsonl" - output_path = script_dir / "data" / "qmd_expansion_cleaned.jsonl" - report_path = script_dir / "data" / "quality_report.txt" - - print(f"Analyzing dataset: {input_path}") - print("-" * 50) - - if not input_path.exists(): - print(f"Error: Input file not found: {input_path}") - return 1 - - # Analyze the dataset - result = analyze_dataset(input_path) - - # Generate and print report - report = generate_report(result) - print(report) - - # Save report to file - with open(report_path, "w", encoding="utf-8") as f: - f.write(report) - print(f"\nReport saved to: {report_path}") - - # Save cleaned dataset - fixed_count, flagged_count = save_cleaned_dataset(input_path, output_path, result) - - print(f"\nCleaned dataset saved to: {output_path}") - print(f" - Examples fixed: {fixed_count}") - print(f" - Examples flagged for review: {flagged_count}") - print( - f" - Examples unchanged: {result.total_examples - fixed_count - flagged_count}" - ) - - # Summary statistics - print("\n" + "=" * 50) - print("SUMMARY") - print("=" * 50) - print(f"Total examples: {result.total_examples}") - print(f"Total issues found: {len(result.issues_found)}") - - tech_issues = [ - i for i in result.issues_found if i.issue_type == "wrong_tech_expansion" - ] - ambig_issues = [i for i in result.issues_found if i.issue_type == "ambiguous_term"] - - print(f" - Definite tech term errors: {len(tech_issues)}") - print(f" - Ambiguous terms needing review: {len(ambig_issues)}") - - if len(result.issues_found) > 0: - error_rate = len(result.issues_found) / result.total_examples * 100 - print(f"\nError rate: {error_rate:.2f}%") - - return 0 - - -if __name__ == "__main__": - exit(main()) diff --git a/finetune/dataset/generate_balanced.py b/finetune/dataset/generate_balanced.py deleted file mode 100644 index 5126973e..00000000 --- a/finetune/dataset/generate_balanced.py +++ /dev/null @@ -1,823 +0,0 @@ -#!/usr/bin/env python3 -""" -Generate BALANCED QMD training examples - reduced tech focus, more life diversity. - -Categories (non-tech heavy): -- Health & Wellness (15%) -- Personal Finance & Business (15%) -- Home, Garden & DIY (10%) -- Food & Cooking (10%) -- Travel & Geography (10%) -- Hobbies & Crafts (10%) -- Education & Learning (10%) -- Arts & Culture (10%) -- Lifestyle & Relationships (5%) -- Technology (5% - minimal) -""" - -import json -import random -from pathlib import Path -from datetime import datetime - -from dataset.schema import normalize_output_items, parse_output_text - -# Category weights - balanced with reasonable tech representation -CATEGORY_WEIGHTS = { - "health_wellness": 0.12, - "finance_business": 0.12, - "home_garden": 0.10, - "food_cooking": 0.10, - "travel_geography": 0.10, - "hobbies_crafts": 0.10, - "education_learning": 0.08, - "arts_culture": 0.08, - "lifestyle_relationships": 0.05, - "technology": 0.15, # 15% - reasonable for QMD use case -} - -# === HEALTH & WELLNESS === -HEALTH_TOPICS = [ - "meditation techniques", - "sleep improvement", - "stress management", - "anxiety relief", - "healthy eating", - "meal planning", - "weight loss", - "muscle building", - "yoga poses", - "home workout", - "running form", - "swimming technique", - "vitamin supplements", - "hydration tips", - "posture correction", - "stretching routine", - "mental health", - "therapy types", - "mindfulness practice", - "breathing exercises", - "first aid basics", - "CPR technique", - "common cold remedies", - "allergy management", - "chronic pain", - "physical therapy", - "massage techniques", - "acupuncture", - "eye health", - "dental care", - "skin care routine", - "hair health", -] - -HEALTH_ACTIVITIES = [ - "improve sleep", - "reduce stress", - "manage anxiety", - "build muscle", - "lose weight", - "eat healthier", - "start meditating", - "practice yoga", - "run faster", - "swim better", - "lift weights", - "stretch properly", - "boost immunity", - "increase energy", - "reduce inflammation", - "detox body", -] - -# === FINANCE & BUSINESS === -FINANCE_TOPICS = [ - "budget planning", - "emergency fund", - "debt payoff", - "credit score", - "investment basics", - "stock market", - "retirement planning", - "401k", - "IRA", - "tax deductions", - "filing taxes", - "side hustle", - "freelance income", - "mortgage rates", - "home buying", - "rent vs buy", - "real estate investing", - "credit cards", - "rewards programs", - "travel hacking", - "points maximization", - "small business", - "LLC setup", - "business plan", - "marketing strategy", - "negotiation skills", - "salary raise", - "job interview", - "career change", - "passive income", - "dividend stocks", - "index funds", - "ETF investing", - "financial independence", - "FIRE movement", - "frugal living", - "minimalism", -] - -BUSINESS_ACTIVITIES = [ - "create budget", - "save money", - "pay off debt", - "improve credit", - "start investing", - "buy stocks", - "plan retirement", - "reduce taxes", - "start business", - "write business plan", - "market product", - "hire employees", - "negotiate salary", - "prepare interview", - "switch careers", - "build network", - "negotiate price", - "close deal", - "manage team", - "increase sales", -] - -# === HOME & GARDEN === -HOME_TOPICS = [ - "organize closet", - "declutter home", - "minimalist living", - "storage solutions", - "clean efficiently", - "deep cleaning", - "laundry tips", - "stain removal", - "home repair", - "fix leaky faucet", - "unclog drain", - "patch drywall", - "paint walls", - "choose paint color", - "interior design", - "furniture arrangement", - "small space", - "apartment living", - "studio setup", - "home office", - "garden planning", - "vegetable garden", - "herb growing", - "indoor plants", - "composting", - "raised beds", - "pest control", - "organic gardening", - "flower arranging", - "landscaping", - "lawn care", - "pruning trees", - "tool maintenance", - "basic carpentry", - "electrical basics", - "plumbing 101", -] - -# === FOOD & COOKING === -FOOD_TOPICS = [ - "meal prep", - "batch cooking", - "knife skills", - "cooking techniques", - "baking bread", - "sourdough starter", - "cake decorating", - "pastry making", - "meal planning", - "grocery shopping", - "food storage", - "meal ideas", - "healthy recipes", - "quick dinners", - "breakfast ideas", - "lunch prep", - "dietary restrictions", - "gluten free", - "vegan cooking", - "keto meals", - "international cuisine", - "Italian recipes", - "Asian cooking", - "Mexican food", - "spice combinations", - "flavor pairing", - "wine pairing", - "coffee brewing", - "fermentation", - "pickling vegetables", - "making cheese", - "home brewing", - "grilling", - "BBQ techniques", - "smoking meat", - "outdoor cooking", -] - -# === TRAVEL & GEOGRAPHY === -TRAVEL_TOPICS = [ - "budget travel", - "solo travel", - "backpacking", - "road trip planning", - "travel insurance", - "passport renewal", - "visa requirements", - "travel documents", - "packing light", - "carry on essentials", - "travel gear", - "luggage selection", - "travel photography", - "scenic routes", - "hidden gems", - "local experiences", - "cultural etiquette", - "language basics", - "travel phrases", - "translation apps", - "countries visited", - "bucket list destinations", - "seven wonders", - "UNESCO sites", - "capital cities", - "world geography", - "climate zones", - "time zones", - "currency exchange", - "travel banking", - "avoid fees", - "travel rewards", - "jet lag", - "adjust timezone", - "stay healthy", - "travel safety", -] - -# === HOBBIES & CRAFTS === -HOBBY_TOPICS = [ - "photography basics", - "camera settings", - "photo editing", - "composition rules", - "drawing techniques", - "sketching", - "watercolor", - "acrylic painting", - "knitting", - "crochet", - "sewing", - "embroidery", - "cross stitch", - "woodworking", - "wood carving", - "furniture making", - "wood finishing", - "pottery", - "ceramics", - "clay sculpting", - "wheel throwing", - "jewelry making", - "beading", - "wire wrapping", - "metal smithing", - "playing guitar", - "piano lessons", - "music theory", - "songwriting", - "bird watching", - "stargazing", - "astronomy", - "telescope selection", - "board games", - "chess strategy", - "puzzle solving", - "escape rooms", - "fishing", - "fly tying", - "bait selection", - "fishing spots", - "hiking", - "trail finding", - "orienteering", - "survival skills", - "camping", - "tent setup", - "campfire cooking", - "outdoor gear", - "calligraphy", - "hand lettering", - "font design", - "typography", - "DIY projects", - "upcycling", - "furniture restoration", - "home decor", -] - -# === EDUCATION & LEARNING === -EDUCATION_TOPICS = [ - "study techniques", - "memory techniques", - "speed reading", - "note taking", - "learning languages", - "Spanish basics", - "French phrases", - "Mandarin tones", - "online courses", - "MOOC platforms", - "certification prep", - "exam strategy", - "math fundamentals", - "calculus basics", - "statistics", - "probability", - "physics concepts", - "chemistry basics", - "biology", - "earth science", - "history timeline", - "ancient civilizations", - "world wars", - "modern history", - "literature classics", - "book recommendations", - "reading list", - "literary analysis", - "public speaking", - "presentation skills", - "storytelling", - "communication", - "critical thinking", - "logical reasoning", - "problem solving", - "decision making", - "time management", - "productivity systems", - "focus techniques", - "deep work", - "learning styles", - "visual learner", - "auditory learner", - "kinesthetic", -] - -# === ARTS & CULTURE === -ARTS_TOPICS = [ - "art history", - "renaissance art", - "impressionism", - "modern art", - "museum visits", - "gallery etiquette", - "art appreciation", - "criticism", - "classical music", - "orchestra instruments", - "opera", - "ballet", - "jazz history", - "blues music", - "rock music", - "classical composers", - "film analysis", - "cinema history", - "directors", - "film genres", - "theater", - "plays", - "Shakespeare", - "acting techniques", - "dance styles", - "ballroom dancing", - "salsa", - "contemporary dance", - "architecture styles", - "Gothic", - "Baroque", - "Modern", - "Art Deco", - "fashion history", - "style guide", - "color theory", - "design principles", - "poetry forms", - "haiku", - "sonnet", - "free verse", - "spoken word", - "cultural festivals", - "holiday traditions", - "world celebrations", - "customs", -] - -# === LIFESTYLE & RELATIONSHIPS === -LIFESTYLE_TOPICS = [ - "work life balance", - "morning routine", - "evening routine", - "habit formation", - "digital detox", - "screen time", - "social media", - "information diet", - "minimalism", - "simple living", - "intentional living", - "slow living", - "dating advice", - "relationship communication", - "conflict resolution", - "trust building", - "parenting tips", - "child development", - "teenager advice", - "empty nest", - "friendship maintenance", - "social skills", - "networking", - "introvert tips", - "family dynamics", - "sibling relationships", - "in-laws", - "family gatherings", - "pet care", - "dog training", - "cat behavior", - "pet health", - "event planning", - "dinner party", - "birthday celebration", - "wedding planning", - "etiquette rules", - "dining manners", - "thank you notes", - "gift giving", - "personal style", - "wardrobe basics", - "capsule wardrobe", - "seasonal fashion", -] - -# === TECHNOLOGY (minimal 5%) === -TECH_TOPICS = [ - "email etiquette", - "video calls", - "password manager", - "backup data", - "smartphone tips", - "app recommendations", - "digital organization", - "file management", - "basic troubleshooting", - "wifi setup", - "printer issues", - "software updates", - "online privacy", - "social media privacy", - "two factor auth", - "secure browsing", -] - -# === SHORT KEYWORD QUERIES (for all categories) === -SHORT_KEYWORDS = [ - # Health - "meditate", - "hydrate", - "stretch", - "exercise", - "sleep", - "vitamins", - "protein", - # Finance - "budget", - "save", - "invest", - "taxes", - "debt", - "credit", - "retirement", - # Home - "clean", - "organize", - "repair", - "paint", - "garden", - "compost", - "prune", - # Food - "cook", - "bake", - "recipe", - "meal", - "diet", - "nutrition", - "spices", - # Travel - "travel", - "pack", - "passport", - "visa", - "hotel", - "flight", - "itinerary", - # Hobbies - "photo", - "draw", - "paint", - "knit", - "woodwork", - "guitar", - "hike", - "camp", - # Education - "study", - "learn", - "read", - "course", - "exam", - "degree", - "certificate", - # Arts - "art", - "music", - "film", - "dance", - "theater", - "museum", - "gallery", - # Life - "habit", - "routine", - "minimal", - "organize", - "relationship", - "dating", - "parent", - # Tech (minimal) - "email", - "wifi", - "backup", - "password", - "update", -] - - -def generate_query(category: str) -> str: - """Generate a query for a specific category.""" - - templates = { - "health_wellness": [ - "how to {activity}", - "best {topic}", - "{topic} guide", - "{topic} for beginners", - "improve {topic}", - ], - "finance_business": [ - "how to {activity}", - "{topic} basics", - "{topic} strategy", - "start {topic}", - "{topic} tips", - ], - "home_garden": [ - "how to {topic}", - "DIY {topic}", - "{topic} ideas", - "best {topic}", - "{topic} tutorial", - ], - "food_cooking": [ - "how to {topic}", - "{topic} recipe", - "best {topic}", - "{topic} techniques", - "learn {topic}", - ], - "travel_geography": [ - "{topic} guide", - "how to {topic}", - "best {topic}", - "{topic} tips", - "plan {topic}", - ], - "hobbies_crafts": [ - "learn {topic}", - "{topic} basics", - "how to {topic}", - "{topic} for beginners", - "best {topic}", - ], - "education_learning": [ - "learn {topic}", - "{topic} guide", - "improve {topic}", - "{topic} techniques", - "study {topic}", - ], - "arts_culture": [ - "understand {topic}", - "{topic} guide", - "appreciate {topic}", - "learn {topic}", - "{topic} history", - ], - "lifestyle_relationships": [ - "how to {topic}", - "improve {topic}", - "{topic} advice", - "{topic} tips", - "best {topic}", - ], - "technology": [ - "how to {topic}", - "{topic} setup", - "fix {topic}", - "{topic} tips", - ], - } - - word_lists = { - "health_wellness": (HEALTH_ACTIVITIES, HEALTH_TOPICS), - "finance_business": (BUSINESS_ACTIVITIES, FINANCE_TOPICS), - "home_garden": (HOME_TOPICS, HOME_TOPICS), - "food_cooking": (FOOD_TOPICS, FOOD_TOPICS), - "travel_geography": (TRAVEL_TOPICS, TRAVEL_TOPICS), - "hobbies_crafts": (HOBBY_TOPICS, HOBBY_TOPICS), - "education_learning": (EDUCATION_TOPICS, EDUCATION_TOPICS), - "arts_culture": (ARTS_TOPICS, ARTS_TOPICS), - "lifestyle_relationships": (LIFESTYLE_TOPICS, LIFESTYLE_TOPICS), - "technology": (TECH_TOPICS, TECH_TOPICS), - } - - template = random.choice(templates[category]) - activities, topics = word_lists[category] - - if "{activity}" in template: - return template.format(activity=random.choice(activities)) - else: - return template.format(topic=random.choice(topics)) - - -def generate_short_query() -> str: - """Generate a short 1-2 word query.""" - return random.choice(SHORT_KEYWORDS) - - -def generate_expansion(query: str, category: str) -> str: - """Generate a realistic expansion for a query.""" - # Generate contextually appropriate lex/vec/hyde based on category - - domain_hints = { - "health_wellness": "health medical wellness fitness nutrition exercise", - "finance_business": "finance money investing business career salary budget", - "home_garden": "home repair DIY garden organization cleaning maintenance", - "food_cooking": "food cooking recipe culinary kitchen meal nutrition diet", - "travel_geography": "travel trip vacation destination geography tourism explore", - "hobbies_crafts": "hobby craft creative DIY leisure recreation skill learn", - "education_learning": "education learn study course academic knowledge skill", - "arts_culture": "art culture creative music film theater literature history", - "lifestyle_relationships": "life lifestyle relationship social personal development habits", - "technology": "tech digital computer software internet online tool app", - } - - domain = domain_hints.get(category, "general") - - lex_variations = [ - f"{query} guide", - f"{query} tips", - f"{query} how to", - f"{query} tutorial", - f"{query} advice", - ] - - vec_variations = [ - f"how to {query} effectively", - f"best way to {query}", - f"complete guide to {query}", - f"learn {query} step by step", - f"tips for {query} success", - ] - - # Select variations - selected_lex = random.sample(lex_variations, min(3, len(lex_variations))) - selected_vec = random.sample(vec_variations, min(2, len(vec_variations))) - - # Generate hyde passage - hyde_templates = [ - f"This comprehensive guide to {query} covers all the essential information you need to get started. Follow the steps carefully for best results.", - f"Learning {query} requires practice and patience. This resource provides detailed instructions, examples, and tips to help you master the basics quickly.", - f"Whether you're a beginner or looking to improve, this guide to {query} offers practical advice, common pitfalls to avoid, and proven strategies for success.", - ] - hyde = random.choice(hyde_templates) - - output_lines = [] - for lex in selected_lex: - output_lines.append(f"lex: {lex}") - for vec in selected_vec: - output_lines.append(f"vec: {vec}") - output_lines.append(f"hyde: {hyde}") - - return "\n".join(output_lines) - - -def main(): - """Generate balanced diverse training examples.""" - output_file = Path("data/qmd_expansion_balanced.jsonl") - - # Generate 500 examples with balanced distribution - target_count = 500 - print(f"Generating {target_count} balanced training examples...") - print(f"Tech focus reduced to {CATEGORY_WEIGHTS['technology']:.0%}") - print() - - # Show distribution - for cat, weight in CATEGORY_WEIGHTS.items(): - count = int(target_count * weight) - bar = "█" * int(weight * 40) - print(f" {cat:25} {count:3} ({weight:4.0%}) {bar}") - print() - - examples = [] - category_counts = {cat: 0 for cat in CATEGORY_WEIGHTS.keys()} - - for i in range(target_count): - # Select category based on weights - categories = list(CATEGORY_WEIGHTS.keys()) - weights = list(CATEGORY_WEIGHTS.values()) - category = random.choices(categories, weights=weights, k=1)[0] - - # 20% of queries should be short (1-2 words) - if random.random() < 0.20: - query = generate_short_query() - short_flag = True - else: - query = generate_query(category) - short_flag = False - - expansion = generate_expansion(query, category) - - output_items = normalize_output_items(parse_output_text(expansion)) - examples.append( - { - "query": query, - "output": output_items, - "category": category, - "is_short": short_flag, - } - ) - - category_counts[category] += 1 - - if (i + 1) % 100 == 0: - print(f" Generated {i + 1}/{target_count} examples...") - - # Write to file - output_file.parent.mkdir(parents=True, exist_ok=True) - with open(output_file, "w") as f: - for ex in examples: - f.write(json.dumps(ex) + "\n") - - print(f"\n✅ Saved {len(examples)} balanced examples to {output_file}") - print("\nActual distribution:") - for cat, count in sorted(category_counts.items(), key=lambda x: -x[1]): - pct = count / len(examples) - bar = "█" * int(pct * 40) - print(f" {cat:25} {count:3} ({pct:4.1%}) {bar}") - - short_count = sum(1 for ex in examples if ex["is_short"]) - print( - f"\n {'Short queries (1-2 words)':25} {short_count:3} ({short_count / len(examples):4.1%})" - ) - - print("\n📋 Usage:") - print(f" cat {output_file} >> data/qmd_expansion_v2.jsonl") - print(" uv run dataset/prepare_data.py") - - -if __name__ == "__main__": - main() diff --git a/finetune/dataset/generate_data.py b/finetune/dataset/generate_data.py deleted file mode 100644 index 766b4fbf..00000000 --- a/finetune/dataset/generate_data.py +++ /dev/null @@ -1,714 +0,0 @@ -#!/usr/bin/env python3 -"""Generate synthetic training data for QMD query expansion using Claude API.""" - -import argparse -import json -import os -import random -from pathlib import Path - -from dataset.schema import normalize_output_items, parse_output_text - -try: - import anthropic -except ImportError: - print("Install anthropic: pip install anthropic") - exit(1) - -# Sample query templates for diverse training data - organized by category -QUERY_TEMPLATES = [ - # === Technical documentation (35% of queries) === - "how to {action} {technology}", - "{technology} {concept} example", - "configure {technology} for {use_case}", - "{error_type} error in {technology}", - "best practices for {concept}", - "{technology} vs {technology2}", - "{action} {technology} {use_case}", - "setup {technology} {use_case}", - "{technology} tutorial for beginners", - "{technology} documentation", - "{technology} {error_type} troubleshooting", - "{concept} in {technology}", - "migrate from {technology} to {technology2}", - "{action} {concept} {technology}", - # === Personal notes / journals (15% of queries) === - "meeting notes {topic}", - "ideas for {project}", - "{date} journal entry", - "thoughts on {topic}", - "{project} {topic} notes", - "{topic} meeting {date}", - "reflect on {topic}", - "brainstorm {project}", - # === Research / learning (20% of queries) === - "what is {concept}", - "difference between {thing1} and {thing2}", - "{topic} tutorial", - "learn {skill}", - "understand {concept}", - "explain {concept}", - "{topic} fundamentals", - "intro to {skill}", - "{thing1} or {thing2}", - "when to use {concept}", - # === Short / keyword queries (15% of queries) === - "{keyword}", - "{keyword} {modifier}", - "{keyword} {action}", - "{keyword} {use_case}", - "{technology} {keyword}", - "{concept} {keyword}", - # === Temporal / recency queries (10% of queries) === - "latest {topic}", - "recent {concept} changes", - "new {technology} features", - "{topic} update {date}", - "what changed in {technology}", - "{technology} changelog {date}", - "{topic} news {date}", - # === Named entities / specific topics (5% of queries) === - "{named_entity} {topic}", - "{person} {concept}", - "{organization} {use_case}", - "{product} {action}", -] - -# Category weights for balanced sampling -TEMPLATE_CATEGORIES = { - "technical": list(range(0, 14)), # 0-13 - "personal": list(range(14, 22)), # 14-21 - "research": list(range(22, 31)), # 22-30 - "short": list(range(31, 36)), # 31-35 - "temporal": list(range(36, 42)), # 36-41 - "entities": list(range(42, 46)), # 42-45 -} - -ACTIONS = [ - "install", - "configure", - "setup", - "debug", - "deploy", - "test", - "optimize", - "migrate", - "build", - "run", - "lint", - "format", - "backup", - "restore", - "update", - "rollback", - "monitor", - "scale", - "secure", - "integrate", - "automate", - "refactor", - "initialize", -] - -TECHNOLOGIES = [ - # Languages - "python", - "typescript", - "javascript", - "rust", - "golang", - "java", - "kotlin", - "swift", - "ruby", - "php", - "cpp", - "c", - "elixir", - "scala", - "clojure", - "dart", - # Frameworks/Frontend - "react", - "vue", - "angular", - "svelte", - "solid", - "htmx", - "alpine", - "nextjs", - "nuxt", - # Backend - "django", - "flask", - "fastapi", - "express", - "rails", - "spring", - "laravel", - # Infrastructure - "docker", - "kubernetes", - "terraform", - "ansible", - "jenkins", - "github-actions", - # Databases - "postgres", - "mysql", - "mongodb", - "redis", - "elasticsearch", - "sqlite", - "dynamodb", - "cassandra", - "cockroachdb", - "supabase", - "firebase", - # Tools - "git", - "nginx", - "apache", - "linux", - "aws", - "gcp", - "azure", - "vercel", - "netlify", - # Data/ML - "pandas", - "numpy", - "tensorflow", - "pytorch", - "scikit-learn", - "jupyter", - "spark", - "kafka", - "airflow", - "dbt", -] - -TECHNOLOGIES_2 = [ - "docker", - "kubernetes", - "postgres", - "mysql", - "redis", - "mongodb", - "aws", - "gcp", - "react", - "vue", - "angular", - "python", - "javascript", - "typescript", - "github-actions", - "gitlab-ci", - "jenkins", - "terraform", - "ansible", -] - -CONCEPTS = [ - "authentication", - "caching", - "logging", - "testing", - "deployment", - "API", - "database", - "security", - "monitoring", - "performance", - "scalability", - "reliability", - "observability", - "microservices", - "serverless", - "virtualization", - "containerization", - "orchestration", - "CI/CD", - "version control", - "dependency injection", - "event sourcing", - "CQRS", - "load balancing", - "rate limiting", - "circuit breaker", - "retry logic", - "idempotency", -] - -USE_CASES = [ - "production", - "development", - "CI/CD", - "local", - "cloud", - "staging", - "testing", - "microservices", - "serverless", - "hybrid", - "multi-tenant", - "high-availability", - "real-time", - "batch processing", - "stream processing", - "data pipeline", -] - -ERROR_TYPES = [ - "connection", - "timeout", - "permission", - "memory", - "syntax", - "runtime", - "configuration", - "dependency", - "network", - "authentication", - "authorization", - "validation", - "concurrency", - "deadlock", - "resource", - "quota", -] - -TOPICS = [ - "productivity", - "workflow", - "architecture", - "design", - "performance", - "security", - "scalability", - "reliability", - "observability", - "maintainability", - "testing", - "documentation", - "refactoring", - "debugging", - "optimization", - "best practices", - "patterns", - "anti-patterns", - "trade-offs", - "decision making", -] - -KEYWORDS = [ - "auth", - "config", - "setup", - "api", - "cache", - "log", - "test", - "debug", - "env", - "vars", - "secrets", - "tokens", - "headers", - "params", - "query", - "body", - "route", - "middleware", - "handler", - "controller", - "model", - "view", - "template", - "migration", - "seed", - "fixture", - "mock", - "stub", - "spy", - "fake", - "build", - "bundle", - "compile", - "transpile", - "minify", - "optimize", - "deploy", - "release", - "rollback", - "promote", - "freeze", - "thaw", - "pull", - "push", - "commit", - "merge", - "rebase", - "cherry-pick", - "stash", - "up", - "down", - "scale", - "restart", - "reload", - "refresh", - "flush", - "cron", - "queue", - "job", - "worker", - "scheduler", - "trigger", - "webhook", - "alert", - "metric", - "trace", - "span", - "event", - "incident", - "oncall", -] - -MODIFIERS = [ - "best", - "fast", - "simple", - "advanced", - "secure", - "quick", - "easy", - "proper", - "correct", - "safe", - "efficient", - "reliable", - "robust", - "latest", - "recent", - "new", - "old", - "legacy", - "modern", - "local", - "remote", - "global", - "shared", - "private", - "public", -] - -NAMED_ENTITIES = [ - "React", - "Vue", - "Angular", - "Docker", - "Kubernetes", - "AWS", - "GCP", - "GitHub", - "GitLab", - "Vercel", - "Netlify", - "Supabase", - "Firebase", - "Stripe", - "Twilio", - "SendGrid", - "Datadog", - "PagerDuty", - "Sentry", - "Terraform", - "Ansible", - "Jenkins", - "CircleCI", - "TravisCI", -] - -PERSONS = [ - "Kent Beck", - "Martin Fowler", - "Robert Martin", - "Dave Thomas", - "Guido van Rossum", - "Brendan Eich", - "Ryan Dahl", - "Anders Hejlsberg", - "Linus Torvalds", - "DHH", - "Yukihiro Matsumoto", - "Rich Hickey", -] - -ORGANIZATIONS = [ - "Google", - "Microsoft", - "Amazon", - "Meta", - "Apple", - "Netflix", - "Spotify", - "Stripe", - "Shopify", - "Airbnb", - "Uber", - "Lyft", - "Slack", - "Discord", -] - -PRODUCTS = [ - "VS Code", - "IntelliJ", - "PyCharm", - "WebStorm", - "DataGrip", - "Postman", - "Insomnia", - "TablePlus", - "Docker Desktop", - "Lens", - "Figma", - "Sketch", - "Notion", - "Linear", - "Jira", - "Trello", -] - -SYSTEM_PROMPT = """You are a search query optimization expert for a markdown document search system called QMD. - -Your task is to transform user queries into retrieval-optimized outputs with THREE distinct types: - -1. **lex** lines: Keyword variations optimized for BM25 full-text search - - Short, keyword-focused - - Good for exact term matching - - 1-3 lines - -2. **vec** lines: Semantic reformulations for vector/embedding search - - Complete phrases or questions - - Capture semantic meaning - - 1-3 lines - -3. **hyde** line: A hypothetical document passage (HyDE technique) - - A realistic passage that would answer the query - - Contains domain-specific terminology - - Written as if it's FROM a document, not ABOUT the query - - MAX 1 line - -Output format (STRICT - follow exactly): -``` -hyde: A passage that would appear in a document answering this query. -lex: keyword1 -lex: keyword2 -vec: semantic query reformulation -``` - -Rules: -- Each line must start with "lex:", "vec:", or "hyde:" -- No blank lines -- No repetition between lines -- hyde should be a realistic document excerpt, not a question -- Stay focused on the original query intent""" - -USER_PROMPT_TEMPLATE = """Generate query expansion outputs for this search query: - -Query: {query} - -Respond with ONLY the lex/vec/hyde lines, nothing else.""" - - -# Category weights - BALANCED approach -# Tech at 15% (reasonable for QMD's technical document use case) -CATEGORY_WEIGHTS = { - "technical": 0.15, # 15% - Technical documentation - "personal": 0.10, # 10% - Personal notes, journals - "research": 0.10, # 10% - Research and learning - "short": 0.15, # 15% - Short keyword queries - "temporal": 0.10, # 10% - Temporal/recency queries (2025/2026) - "entities": 0.05, # 5% - Named entity queries - "health": 0.10, # 10% - Health & wellness - "finance": 0.10, # 10% - Finance & business - "lifestyle": 0.10, # 10% - Home, food, hobbies, travel - "education": 0.05, # 5% - Education & arts -} - - -def generate_random_query() -> str: - """Generate a random query from templates with category-weighted sampling.""" - # Select category based on weights - categories = list(CATEGORY_WEIGHTS.keys()) - weights = list(CATEGORY_WEIGHTS.values()) - selected_category = random.choices(categories, weights=weights, k=1)[0] - - # Select template from that category - template_idx = random.choice(TEMPLATE_CATEGORIES[selected_category]) - template = QUERY_TEMPLATES[template_idx] - - # Build replacements based on template type - replacements = { - "{action}": random.choice(ACTIONS), - "{technology}": random.choice(TECHNOLOGIES), - "{technology2}": random.choice(TECHNOLOGIES_2), - "{concept}": random.choice(CONCEPTS), - "{use_case}": random.choice(USE_CASES), - "{error_type}": random.choice(ERROR_TYPES), - "{topic}": random.choice(TOPICS), - "{project}": random.choice( - ["website", "app", "CLI tool", "API", "library", "service", "platform"] - ), - "{date}": random.choice( - # Emphasize 2025/2026 for recency queries (current era) - [ - "2026", - "2026", - "2025", - "2025", - "January 2026", - "February 2026", - "March 2026", - "last month", - "this week", - "yesterday", - "today", - "recently", - "latest", - ] - ), - "{thing1}": random.choice(CONCEPTS[:10]), - "{thing2}": random.choice(CONCEPTS[10:] if len(CONCEPTS) > 10 else CONCEPTS), - "{skill}": random.choice(TECHNOLOGIES), - "{keyword}": random.choice(KEYWORDS), - "{modifier}": random.choice(MODIFIERS), - "{named_entity}": random.choice(NAMED_ENTITIES), - "{person}": random.choice(PERSONS), - "{organization}": random.choice(ORGANIZATIONS), - "{product}": random.choice(PRODUCTS), - } - - query = template - for key, value in replacements.items(): - query = query.replace(key, value) - - return query - - -def generate_expansion(client: anthropic.Anthropic, query: str) -> str | None: - """Generate expansion using Claude API.""" - try: - response = client.messages.create( - model="claude-sonnet-4-20250514", - max_tokens=300, - system=SYSTEM_PROMPT, - messages=[ - {"role": "user", "content": USER_PROMPT_TEMPLATE.format(query=query)} - ], - ) - return response.content[0].text.strip() - except Exception as e: - print(f"Error generating expansion for '{query}': {e}") - return None - - -def validate_output(output: str) -> bool: - """Validate that output follows the expected format.""" - lines = output.strip().split("\n") - if not lines: - return False - - has_lex = False - has_vec = False - - for line in lines: - line = line.strip() - if not line: - continue - if line.startswith("lex:"): - has_lex = True - elif line.startswith("vec:"): - has_vec = True - elif line.startswith("hyde:"): - pass - else: - return False # Invalid line type - - return has_lex and has_vec - - -def main(): - parser = argparse.ArgumentParser( - description="Generate QMD query expansion training data" - ) - parser.add_argument( - "--count", type=int, default=100, help="Number of examples to generate" - ) - parser.add_argument( - "--output", - type=str, - default="data/qmd_expansion.jsonl", - help="Output file path", - ) - parser.add_argument( - "--queries", type=str, help="Optional file with custom queries (one per line)" - ) - args = parser.parse_args() - - api_key = os.environ.get("ANTHROPIC_API_KEY") - if not api_key: - print("Error: ANTHROPIC_API_KEY environment variable not set") - exit(1) - - client = anthropic.Anthropic(api_key=api_key) - output_path = Path(args.output) - output_path.parent.mkdir(parents=True, exist_ok=True) - - # Load custom queries if provided - custom_queries = [] - if args.queries and Path(args.queries).exists(): - custom_queries = Path(args.queries).read_text().strip().split("\n") - print(f"Loaded {len(custom_queries)} custom queries") - - examples = [] - seen_queries = set() - - print(f"Generating {args.count} examples...") - - i = 0 - while len(examples) < args.count: - # Use custom query or generate random one - if custom_queries and i < len(custom_queries): - query = custom_queries[i].strip() - else: - query = generate_random_query() - - i += 1 - - # Skip duplicates - if query in seen_queries: - continue - seen_queries.add(query) - - # Generate expansion - output = generate_expansion(client, query) - if output and validate_output(output): - output_items = normalize_output_items(parse_output_text(output)) - examples.append({"query": query, "output": output_items}) - print(f"[{len(examples)}/{args.count}] {query[:50]}...") - else: - print(f" Skipped invalid output for: {query[:50]}...") - - # Write output - with open(output_path, "w") as f: - for example in examples: - f.write(json.dumps(example) + "\n") - - print(f"\nGenerated {len(examples)} examples to {output_path}") - - -if __name__ == "__main__": - main() diff --git a/finetune/dataset/generate_data_offline.py b/finetune/dataset/generate_data_offline.py deleted file mode 100644 index f0ebb87f..00000000 --- a/finetune/dataset/generate_data_offline.py +++ /dev/null @@ -1,206 +0,0 @@ -#!/usr/bin/env python3 -# /// script -# requires-python = ">=3.10" -# dependencies = [ -# "datasets", -# ] -# /// -""" -Generate QMD training data by transforming s-emanuilov/query-expansion dataset -and adding synthetic hyde passages. No API calls needed. -""" - -import json -import random -from pathlib import Path - -from dataset.schema import normalize_output_items, parse_output_text - -# HyDE passage templates for different query types -HYDE_TEMPLATES = { - "how_to": [ - "To {action}, you need to {steps}. This can be done by {method}.", - "The recommended way to {action} is to first {step1}, then {step2}.", - "{Topic} can be achieved by {method}. Make sure to {consideration}.", - ], - "what_is": [ - "{Topic} is a {category} that {description}. It is commonly used for {use_case}.", - "{Topic} refers to {definition}. Key features include {features}.", - ], - "config": [ - "To configure {topic}, set the {setting} option to {value}. You can also customize {other}.", - "Configuration for {topic} is done in the {file} file. Key settings include {settings}.", - ], - "error": [ - "The {error} error occurs when {cause}. To fix this, {solution}.", - "If you encounter {error}, check that {check}. Common solutions include {solutions}.", - ], - "general": [ - "{Topic} provides {benefit} for {use_case}. It works by {mechanism}.", - "When working with {topic}, consider {considerations}. Best practices include {practices}.", - ], -} - - -def classify_query(query: str) -> str: - """Classify query type for hyde template selection.""" - q = query.lower() - if any( - w in q for w in ["how to", "how do", "setup", "install", "configure", "create"] - ): - return "how_to" - if any(w in q for w in ["what is", "what are", "definition", "meaning"]): - return "what_is" - if any(w in q for w in ["config", "setting", "option"]): - return "config" - if any(w in q for w in ["error", "issue", "problem", "fix", "debug"]): - return "error" - return "general" - - -def extract_topic(query: str) -> str: - """Extract main topic from query.""" - # Remove common prefixes - for prefix in [ - "how to ", - "how do i ", - "what is ", - "what are ", - "configure ", - "setup ", - ]: - if query.lower().startswith(prefix): - return query[len(prefix) :].strip() - return query - - -def generate_hyde(query: str, expansions: list[str]) -> str: - """Generate a hypothetical document passage by combining expansions naturally.""" - topic = extract_topic(query) - query_type = classify_query(query) - - # Use the longest, most descriptive expansion as the base - sorted_exp = sorted(expansions, key=len, reverse=True) - main_exp = sorted_exp[0] if sorted_exp else topic - - # Build a natural passage based on query type - if query_type == "how_to": - templates = [ - f"To {topic}, start by reviewing the requirements and dependencies. {main_exp.capitalize()} is the recommended approach. Make sure all prerequisites are met before proceeding.", - f"The process of {topic} involves several steps. First, {main_exp}. Follow the official documentation for detailed instructions.", - f"When you need to {topic}, the most effective method is to {main_exp}. This ensures compatibility and follows best practices.", - ] - elif query_type == "what_is": - templates = [ - f"{topic.capitalize()} refers to {main_exp}. It is widely used in various applications and provides significant benefits.", - f"The concept of {topic} encompasses {main_exp}. Understanding this is essential for effective implementation.", - f"{topic.capitalize()} is defined as {main_exp}. This plays a crucial role in modern development practices.", - ] - elif query_type == "config": - templates = [ - f"Configuration for {topic} requires setting the appropriate parameters. {main_exp.capitalize()} should be adjusted based on your specific requirements.", - f"To configure {topic}, modify the settings in your configuration file. Key options include those related to {main_exp}.", - f"The {topic} configuration can be customized by {main_exp}. Default values work for most use cases.", - ] - elif query_type == "error": - templates = [ - f"The {topic} issue typically occurs when dependencies are misconfigured. To resolve this, {main_exp}. Check your environment settings.", - f"If you encounter problems with {topic}, verify that {main_exp}. Common solutions include updating dependencies and checking permissions.", - f"Debugging {topic} requires understanding the root cause. Often, {main_exp} resolves the issue. Review logs for details.", - ] - else: - templates = [ - f"{topic.capitalize()} is an important concept that relates to {main_exp}. It provides functionality for various use cases in software development.", - f"Understanding {topic} is essential for modern development. Key aspects include {main_exp}. This knowledge helps in building robust applications.", - f"The topic of {topic} covers {main_exp}. Proper implementation follows established patterns and best practices.", - ] - - return random.choice(templates) - - -def transform_to_qmd_format(query: str, expansions: list[str]) -> str: - """Transform s-emanuilov format to QMD lex/vec/hyde format.""" - lines = [] - - # Generate hyde line first - hyde = generate_hyde(query, expansions) - lines.append(f"hyde: {hyde}") - - # Generate lex lines (keyword-focused, shorter) - lex_candidates = [] - for exp in expansions: - # Shorter versions for lex - words = exp.split() - if len(words) <= 4: - lex_candidates.append(exp) - else: - # Take key phrases - lex_candidates.append(" ".join(words[:3])) - - # Add 1-2 lex lines - for lex in lex_candidates[:2]: - if lex.lower() != query.lower(): - lines.append(f"lex: {lex}") - - # Generate vec lines (semantic, complete phrases) - vec_candidates = [exp for exp in expansions if len(exp.split()) >= 3] - if not vec_candidates: - vec_candidates = expansions - - # Add 1-2 vec lines - for vec in vec_candidates[:2]: - if vec.lower() != query.lower(): - lines.append(f"vec: {vec}") - - return "\n".join(lines) - - -def main(): - try: - from datasets import load_dataset - except ImportError: - print("Installing datasets...") - import subprocess - - subprocess.run(["uv", "pip", "install", "datasets"], check=True) - from datasets import load_dataset - - print("Loading s-emanuilov/query-expansion dataset...") - dataset = load_dataset("s-emanuilov/query-expansion", split="train") - - print(f"Loaded {len(dataset)} examples") - - # Transform each example - output_path = Path("data/qmd_expansion.jsonl") - output_path.parent.mkdir(parents=True, exist_ok=True) - - examples = [] - for item in dataset: - query = item["query"] - expansions = item["expansions"] - - output = transform_to_qmd_format(query, expansions) - output_items = normalize_output_items(parse_output_text(output)) - examples.append({"query": query, "output": output_items}) - - # Shuffle - random.seed(42) - random.shuffle(examples) - - # Write output - with open(output_path, "w") as f: - for ex in examples: - f.write(json.dumps(ex) + "\n") - - print(f"Generated {len(examples)} examples to {output_path}") - - # Show sample - print("\nSample output:") - print("-" * 50) - sample = examples[0] - print(f"Input: {sample['query']}") - print(f"Output: {sample['output']}") - - -if __name__ == "__main__": - main() diff --git a/finetune/dataset/generate_diverse.py b/finetune/dataset/generate_diverse.py deleted file mode 100644 index 992bfd53..00000000 --- a/finetune/dataset/generate_diverse.py +++ /dev/null @@ -1,441 +0,0 @@ -#!/usr/bin/env python3 -""" -Generate diverse QMD training examples for underrepresented categories. - -This script creates additional training examples focused on: -- Trivia, Geography, Philosophy, History (as requested) -- Temporal/Recency queries (important for evals) -- Named entity queries (critical for entity preservation scoring) -""" - -import json -import random -from pathlib import Path -from datetime import datetime, timedelta - -from dataset.schema import normalize_output_items, parse_output_text - -# Additional diverse query categories -TRIVIA_QUERIES = [ - "world capitals quiz", - "trivia facts about space", - "did you know history", - "random science facts", - "famous inventions timeline", - "world records list", - "fun geography facts", - "historical trivia questions", - "animal trivia facts", - "sports trivia records", -] - -GEOGRAPHY_QUERIES = [ - "largest countries by area", - "rivers that cross multiple countries", - "highest mountain peaks", - "desert climate zones", - "island nations list", - "capital cities europe", - "population by continent", - "time zones map", - "latitude longitude coordinates", - "borders between countries", - "ocean currents patterns", - "tectonic plate boundaries", - "climate zones earth", -] - -PHILOSOPHY_QUERIES = [ - "stoicism daily practice", - "existentialism meaning life", - "utilitarianism ethics explained", - "kant categorical imperative", - "free will determinism debate", - "nietzsche will to power", - "socrates method questioning", - "plato theory forms", - "aristotle virtue ethics", - "descartes cogito ergo sum", - "logic propositional calculus", - "epistemology knowledge theory", - "metaphysics existence reality", -] - -HISTORY_QUERIES = [ - "ancient civilizations timeline", - "roman empire fall reasons", - "medieval period events", - "renaissance art movement", - "industrial revolution inventions", - "world war i causes", - "cold war key events", - "french revolution timeline", - "american civil war battles", - "egyptian pharaohs dynasty", - "bronze age collapse", - "byzantine empire history", - "vietnam war timeline", -] - -SCIENCE_QUERIES = [ - "quantum mechanics basics", - "theory of relativity explained", - "dna structure discovery", - "photosynthesis process steps", - "black holes physics", - "plate tectonics theory", - "evolution natural selection", - "periodic table elements", - "cell biology fundamentals", - "climate change evidence", -] - -ARTS_CULTURE_QUERIES = [ - "impressionist painters list", - "shakespeare plays summary", - "classical music composers", - "modern art movements", - "film noir characteristics", - "jazz history origins", - "renaissance sculpture techniques", - "photography composition rules", - "poetry forms haiku", - "baroque art characteristics", - "street art graffiti history", -] - -HEALTH_MEDICINE_QUERIES = [ - "symptoms of vitamin deficiency", - "how vaccines work immune system", - "blood pressure normal range", - "sleep hygiene tips", - "intermittent fasting benefits", - "anxiety coping strategies", - "stretching exercises back pain", - "heart disease prevention", - "diabetes type 2 management", - "meditation mental health", - "nutrition macros explained", - "first aid basics", -] - -BUSINESS_FINANCE_QUERIES = [ - "compound interest calculator", - "stock market basics beginners", - "startup funding stages", - "tax deductions small business", - "budgeting methods 50 30 20", - "cryptocurrency explained simply", - "inflation effects on savings", - "retirement planning strategies", - "passive income ideas", - "venture capital vs angel investors", - "balance sheet basics", - "supply chain management", -] - -SPORTS_QUERIES = [ - "marathon training schedule", - "weightlifting proper form", - "swimming stroke techniques", - "tennis serve mechanics", - "basketball dribbling drills", - "soccer formations tactics", - "golf swing fundamentals", - "yoga poses beginners", - "running injury prevention", - "cycling gear ratios", - "rock climbing grades", - "surfing wave types", -] - -TRAVEL_QUERIES = [ - "best time visit japan", - "travel packing checklist", - "budget backpacking europe", - "visa requirements usa", - "jet lag remedies", - "road trip planning tips", - "solo travel safety", - "airport security rules", - "travel insurance coverage", - "language apps learning", - "hostel vs hotel comparison", - "travel photography tips", -] - -FOOD_COOKING_QUERIES = [ - "bread baking techniques", - "knife skills basics", - "fermentation at home", - "meal prep weekly", - "spice combinations guide", - "pasta making fresh", - "coffee brewing methods", - "wine pairing basics", - "vegetarian protein sources", - "food storage guidelines", - "sourdough starter maintenance", - "grilling temperature chart", -] - -PSYCHOLOGY_QUERIES = [ - "cognitive biases list", - "attachment theory styles", - "maslow hierarchy needs", - "growth mindset vs fixed", - "emotional intelligence components", - "memory techniques mnemonics", - "habit formation science", - "stress response fight flight", - "personality types myers briggs", - "motivation intrinsic extrinsic", - "decision making psychology", - "procrastination causes solutions", -] - -ENVIRONMENT_NATURE_QUERIES = [ - "renewable energy types", - "carbon footprint reduction", - "composting basics home", - "endangered species list", - "recycling symbols meaning", - "ocean plastic pollution", - "deforestation effects", - "sustainable living tips", - "wildlife conservation efforts", - "solar panel installation", - "water conservation methods", - "biodiversity importance", -] - -MATH_QUERIES = [ - "calculus derivatives explained", - "probability basics statistics", - "linear algebra matrices", - "geometry proofs theorems", - "logarithms rules properties", - "trigonometry identities", - "set theory basics", - "prime numbers properties", - "fractions decimals conversion", - "algebra equations solving", - "graph theory fundamentals", - "combinatorics permutations", -] - -LANGUAGE_QUERIES = [ - "spanish verb conjugation", - "japanese hiragana katakana", - "french pronunciation rules", - "german cases grammar", - "mandarin tones guide", - "latin phrases common", - "arabic alphabet basics", - "english idioms meanings", - "sign language basics", - "etymology word origins", - "grammar punctuation rules", - "writing style guides", -] - -DIY_CRAFTS_QUERIES = [ - "woodworking joints types", - "knitting patterns beginners", - "home repair basics", - "sewing machine threading", - "painting techniques acrylic", - "pottery wheel basics", - "electronics soldering guide", - "gardening soil preparation", - "candle making supplies", - "leather crafting tools", - "origami folding instructions", - "furniture restoration tips", -] - -# Temporal/Recency queries (matches evals/queries.txt requirements) -TEMPORAL_TEMPLATES = [ - "latest {topic} updates", - "recent {topic} changes {year}", - "what changed in {topic} {year}", - "{topic} changelog {year}", - "{topic} new features {year}", - "{topic} latest version release", - "{topic} recent news {month}", -] - -TEMPORAL_TOPICS = [ - "Shopify", - "React", - "Kubernetes", - "Docker", - "TypeScript", - "Python", - "AWS", - "GitHub", - "Next.js", - "Vue", - "AI", - "machine learning", - "climate tech", - "space exploration", -] - -# Named entity queries (critical for entity preservation testing) -NAMED_ENTITY_QUERIES = [ - "who is TDS motorsports", - "React hooks tutorial", - "Docker container networking", - "Kubernetes pod deployment", - "AWS Lambda functions setup", - "Stripe payment integration", - "GitHub Actions workflow", - "Vercel deployment guide", - "Supabase auth configuration", - "Twilio SMS API", - "Datadog monitoring setup", - "Sentry error tracking", - "Terraform AWS provider", - "Ansible playbook examples", -] - - -# Generate temporal queries with recent dates -def generate_temporal_queries(): - queries = [] - current_year = datetime.now().year - months = [ - "January", - "February", - "March", - "April", - "May", - "June", - "July", - "August", - "September", - "October", - "November", - "December", - ] - - for template in TEMPORAL_TEMPLATES: - for topic in TEMPORAL_TOPICS: - if "{year}" in template: - # Use current year and previous year - for year in [current_year, current_year - 1]: - queries.append(template.format(topic=topic, year=year)) - elif "{month}" in template: - # Use recent months - for month in months[-3:]: # Last 3 months - queries.append(template.format(topic=topic, month=month)) - else: - queries.append(template.format(topic=topic)) - - return list(set(queries)) # Remove duplicates - - -def generate_expansion(query: str) -> str: - """Generate a realistic expansion for a query.""" - # This is a template-based generator - in production, use Claude API - lex_variations = [ - f"{query} guide", - f"{query} documentation", - f"{query} tutorial", - f"{query} examples", - f"{query} best practices", - ] - - vec_variations = [ - f"how to {query}", - f"guide for {query}", - f"learn about {query}", - f"understanding {query}", - f"complete {query} reference", - ] - - # Select 2-3 lex and 2 vec variations - selected_lex = random.sample(lex_variations, min(3, len(lex_variations))) - selected_vec = random.sample(vec_variations, min(2, len(vec_variations))) - - # Generate hyde passage - hyde = f"This comprehensive guide covers everything you need to know about {query}. It includes practical examples, best practices, and troubleshooting tips for beginners and advanced users alike." - - output_lines = [] - for lex in selected_lex: - output_lines.append(f"lex: {lex}") - for vec in selected_vec: - output_lines.append(f"vec: {vec}") - output_lines.append(f"hyde: {hyde}") - - return "\n".join(output_lines) - - -def main(): - """Generate diverse examples and append to training data.""" - output_file = Path("data/qmd_expansion_diverse_addon.jsonl") - - all_queries = ( - TRIVIA_QUERIES - + GEOGRAPHY_QUERIES - + PHILOSOPHY_QUERIES - + HISTORY_QUERIES - + SCIENCE_QUERIES - + ARTS_CULTURE_QUERIES - + HEALTH_MEDICINE_QUERIES - + BUSINESS_FINANCE_QUERIES - + SPORTS_QUERIES - + TRAVEL_QUERIES - + FOOD_COOKING_QUERIES - + PSYCHOLOGY_QUERIES - + ENVIRONMENT_NATURE_QUERIES - + MATH_QUERIES - + LANGUAGE_QUERIES - + DIY_CRAFTS_QUERIES - + generate_temporal_queries() - + NAMED_ENTITY_QUERIES - ) - - print(f"Generating {len(all_queries)} diverse training examples...") - print(f" - Trivia: {len(TRIVIA_QUERIES)}") - print(f" - Geography: {len(GEOGRAPHY_QUERIES)}") - print(f" - Philosophy: {len(PHILOSOPHY_QUERIES)}") - print(f" - History: {len(HISTORY_QUERIES)}") - print(f" - Science: {len(SCIENCE_QUERIES)}") - print(f" - Arts/Culture: {len(ARTS_CULTURE_QUERIES)}") - print(f" - Health/Medicine: {len(HEALTH_MEDICINE_QUERIES)}") - print(f" - Business/Finance: {len(BUSINESS_FINANCE_QUERIES)}") - print(f" - Sports: {len(SPORTS_QUERIES)}") - print(f" - Travel: {len(TRAVEL_QUERIES)}") - print(f" - Food/Cooking: {len(FOOD_COOKING_QUERIES)}") - print(f" - Psychology: {len(PSYCHOLOGY_QUERIES)}") - print(f" - Environment: {len(ENVIRONMENT_NATURE_QUERIES)}") - print(f" - Math: {len(MATH_QUERIES)}") - print(f" - Language: {len(LANGUAGE_QUERIES)}") - print(f" - DIY/Crafts: {len(DIY_CRAFTS_QUERIES)}") - print(f" - Temporal: {len(generate_temporal_queries())}") - print(f" - Named Entities: {len(NAMED_ENTITY_QUERIES)}") - - examples = [] - for query in all_queries: - expansion = generate_expansion(query) - output_items = normalize_output_items(parse_output_text(expansion)) - examples.append( - {"query": query, "output": output_items, "category": "diverse_addon"} - ) - - # Write to file - output_file.parent.mkdir(parents=True, exist_ok=True) - with open(output_file, "w") as f: - for ex in examples: - f.write(json.dumps(ex) + "\n") - - print(f"\nSaved {len(examples)} diverse examples to {output_file}") - print("\nTo use these examples:") - print(f" cat {output_file} >> data/qmd_expansion_v2.jsonl") - print(" uv run dataset/prepare_data.py --add-short 2") - - -if __name__ == "__main__": - main() diff --git a/finetune/dataset/generate_ollama.py b/finetune/dataset/generate_ollama.py deleted file mode 100644 index f60a635a..00000000 --- a/finetune/dataset/generate_ollama.py +++ /dev/null @@ -1,326 +0,0 @@ -#!/usr/bin/env python3 -"""Generate synthetic training data for QMD query expansion using local Ollama.""" - -import argparse -import json -import random -import sys -import time - -from dataset.schema import normalize_output_items, parse_output_text -from pathlib import Path - -try: - import requests -except ImportError: - print("Install requests: pip install requests") - exit(1) - -# Diverse query seeds across many domains -QUERY_SEEDS = [ - # Programming & Tech - "async await javascript", - "rust ownership borrow checker", - "kubernetes pod networking", - "docker compose volumes", - "nginx reverse proxy", - "postgresql index optimization", - "redis caching strategies", - "graphql mutations", - "websocket authentication", - "terraform state management", - "ansible playbook variables", - "prometheus alerting rules", - "elasticsearch aggregations", - "kafka consumer groups", - "grpc streaming", - "oauth2 refresh tokens", - "jwt token expiration", - "cors preflight requests", - "css grid layout", - "react hooks useEffect", - "vue composition api", - "svelte stores", - "nextjs middleware", - "webpack code splitting", - "typescript generics constraints", - "python asyncio gather", - "go goroutines channels", - "java streams filter map", - "c++ smart pointers", - "swift optionals unwrapping", - # DevOps & Infrastructure - "ci cd pipeline best practices", - "blue green deployment", - "canary release strategy", - "infrastructure as code", - "secrets management vault", - "load balancer health checks", - "ssl certificate renewal", - "dns propagation time", - "cdn cache invalidation", - "container orchestration", - "service mesh istio", - "observability tracing", - "log aggregation elk", - "metrics dashboards grafana", - "incident response runbook", - # Data & ML - "pandas dataframe groupby", - "numpy array broadcasting", - "scikit learn pipeline", - "pytorch autograd", - "tensorflow keras layers", - "huggingface transformers", - "feature engineering techniques", - "hyperparameter tuning", - "model evaluation metrics", - "data preprocessing normalization", - "time series forecasting", - "anomaly detection", - "recommendation systems", - "natural language processing", - "computer vision cnn", - "reinforcement learning", - "transfer learning", - "model deployment mlops", - # Databases - "sql join types explained", - "database normalization forms", - "acid transactions", - "database sharding strategies", - "read replicas setup", - "connection pooling", - "query optimization explain", - "stored procedures triggers", - "database migrations", - "nosql document model", - "graph database queries", - "vector database similarity", - # Security - "xss prevention sanitization", - "sql injection prepared statements", - "csrf tokens", - "content security policy", - "rate limiting api", - "input validation patterns", - "password hashing bcrypt", - "two factor authentication", - "penetration testing", - "security headers http", - "vulnerability scanning", - "audit logging", - # System Administration - "linux file permissions", - "systemd service unit", - "cron job scheduling", - "ssh key management", - "firewall rules iptables", - "process monitoring", - "disk space management", - "memory leak debugging", - "network troubleshooting", - "backup restore strategies", - "log rotation configuration", - "performance profiling", - # General Knowledge - "climate change effects", - "renewable energy sources", - "electric vehicles", - "artificial intelligence ethics", - "blockchain technology", - "quantum computing basics", - "space exploration mars", - "gene editing crispr", - "vaccine development", - "economic indicators gdp", - "stock market investing", - "cryptocurrency trading", - "mental health awareness", - "nutrition diet tips", - "exercise fitness routine", - "meditation mindfulness", - "sleep hygiene habits", - "stress management", - "time management productivity", - "remote work tips", - "team collaboration", - "project management agile", - "design thinking process", - "user experience research", - # Short/Ambiguous Queries (important for training) - "cache", - "proxy", - "queue", - "mutex", - "semaphore", - "deadlock", - "heap", - "stack", - "tree", - "graph", - "hash", - "sort", - "api", - "sdk", - "cli", - "gui", - "orm", - "cdn", - "auth", - "cors", - "csrf", - "xss", - "jwt", - "ssh", -] - -PROMPT_TEMPLATE = """Generate search query expansions for: {query} - -Output EXACTLY this format (3 lex, 2 vec, 1 hyde): -lex: keyword phrase 1 -lex: keyword phrase 2 -lex: keyword phrase 3 -vec: natural language search query -vec: alternative semantic query -hyde: A specific 2-sentence document passage answering this query. - -Output:""" - - -def generate_with_ollama( - query: str, model: str = "gemma3:4b", base_url: str = "http://localhost:11434" -) -> str | None: - """Generate query expansion using Ollama API.""" - try: - response = requests.post( - f"{base_url}/api/generate", - json={ - "model": model, - "prompt": PROMPT_TEMPLATE.format(query=query), - "stream": False, - "options": { - "temperature": 0.7, - "top_p": 0.9, - "num_predict": 800, # More tokens for thinking models - }, - }, - timeout=120, - ) - response.raise_for_status() - return response.json().get("response", "").strip() - except Exception as e: - print(f"Error generating for '{query}': {e}", file=sys.stderr) - return None - - -def parse_expansion(output: str) -> list[list[str]] | None: - """Parse the model output into structured format.""" - items = normalize_output_items(parse_output_text(output)) - lex_count = sum(1 for kind, _ in items if kind == "lex") - vec_count = sum(1 for kind, _ in items if kind == "vec") - hyde_count = sum(1 for kind, _ in items if kind == "hyde") - if lex_count >= 2 and vec_count >= 1 and hyde_count >= 1: - return items - return None - - -def generate_query_variations(seed: str) -> list[str]: - """Generate variations of a seed query.""" - variations = [seed] - - # Add question forms - if not seed.startswith(("how", "what", "why", "when", "where")): - variations.append(f"how to {seed}") - variations.append(f"what is {seed}") - - # Add context - variations.append(f"{seed} tutorial") - variations.append(f"{seed} best practices") - variations.append(f"{seed} examples") - - return variations - - -def main(): - parser = argparse.ArgumentParser(description="Generate training data using Ollama") - parser.add_argument( - "--output", "-o", default="data/qmd_expansion_ollama.jsonl", help="Output file" - ) - parser.add_argument( - "--count", "-n", type=int, default=1000, help="Number of examples to generate" - ) - parser.add_argument("--model", "-m", default="gemma3:4b", help="Ollama model name") - parser.add_argument( - "--base-url", default="http://localhost:11434", help="Ollama base URL" - ) - parser.add_argument( - "--resume", action="store_true", help="Resume from existing file" - ) - args = parser.parse_args() - - output_path = Path(args.output) - output_path.parent.mkdir(parents=True, exist_ok=True) - - # Load existing if resuming - existing_queries = set() - if args.resume and output_path.exists(): - with open(output_path) as f: - for line in f: - obj = json.loads(line) - existing_queries.add(obj.get("query", obj.get("input", "")).lower()) - print( - f"Resuming with {len(existing_queries)} existing examples", file=sys.stderr - ) - - # Generate query pool - all_queries = [] - for seed in QUERY_SEEDS: - all_queries.extend(generate_query_variations(seed)) - - # Shuffle and filter - random.shuffle(all_queries) - queries_to_process = [q for q in all_queries if q.lower() not in existing_queries] - - print( - f"Processing {min(args.count, len(queries_to_process))} queries with {args.model}...", - file=sys.stderr, - ) - - generated = 0 - errors = 0 - - mode = "a" if args.resume else "w" - with open(output_path, mode) as f: - for i, query in enumerate(queries_to_process): - if generated >= args.count: - break - - output = generate_with_ollama(query, args.model, args.base_url) - if output: - parsed = parse_expansion(output) - if parsed: - example = {"query": query, "output": parsed} - f.write(json.dumps(example) + "\n") - f.flush() - generated += 1 - - if generated % 10 == 0: - print( - f"Generated {generated}/{args.count} ({errors} errors)", - file=sys.stderr, - ) - else: - errors += 1 - else: - errors += 1 - - # Small delay to avoid overwhelming the API - time.sleep(0.1) - - print(f"\nDone! Generated {generated} examples, {errors} errors", file=sys.stderr) - print(f"Output: {output_path}", file=sys.stderr) - - -if __name__ == "__main__": - main() diff --git a/finetune/dataset/prepare_data.py b/finetune/dataset/prepare_data.py index 97091063..3006be68 100644 --- a/finetune/dataset/prepare_data.py +++ b/finetune/dataset/prepare_data.py @@ -3,27 +3,29 @@ # requires-python = ">=3.10" # dependencies = [ # "transformers>=4.45.0", +# "pydantic>=2.0", # "jinja2", # ] # /// """Prepare QMD query expansion data for training. -See PROMPT_FORMAT.md for format specification. +Loads all data/*.jsonl via the strict Pydantic schema, applies the Qwen3 +chat template, deduplicates by query, and writes train/val splits. + +The prepared train files are ephemeral build artifacts — the canonical +data lives in data/*.jsonl and is always loaded through the schema. """ import argparse import json import random -import sys import os from pathlib import Path -sys.path.insert(0, str(Path(__file__).parent.parent)) from dataset.schema import ( - normalize_output_items, + TrainingExample, + load_examples, output_items_to_text, - parse_output_text, - has_type, ) from transformers import AutoTokenizer @@ -41,30 +43,33 @@ def get_tokenizer(): return _tokenizer - -def format_for_training(query_text: str, output_items: list[list[str]]) -> dict: - """Format a single example for SFT training using Qwen chat format.""" +def format_for_training(ex: TrainingExample) -> dict: + """Format a validated TrainingExample for SFT training.""" tokenizer = get_tokenizer() - output_text = output_items_to_text(output_items) + output_text = output_items_to_text(ex.output) + + user_prompt = f"/no_think Expand this search query: {ex.query}" + if ex.intent: + user_prompt = ( + f"/no_think Expand this search query: {ex.query}\n" + f"Query intent: {ex.intent.strip()}" + ) - # Use /no_think to disable thinking mode - we want direct output messages = [ { "role": "user", - "content": f"/no_think Expand this search query: {query_text}", + "content": user_prompt, }, {"role": "assistant", "content": output_text}, ] - # Use tokenizer to generate proper chat format with special tokens text = tokenizer.apply_chat_template( messages, tokenize=False, add_generation_prompt=False, ) - # Strip empty tags - we don't want thinking mode - # The template adds "\n\n\n\n" which we remove + # Strip empty tags — /no_think should suppress them text = text.replace("\n\n\n\n", "") return { @@ -88,27 +93,22 @@ def main(): "--split", type=float, default=0.1, help="Validation split ratio" ) parser.add_argument( - "--seed", - type=int, - default=42, - help="Shuffle seed (default: 42)", + "--seed", type=int, default=42, help="Shuffle seed", ) args = parser.parse_args() output_dir = Path(args.output) output_dir.mkdir(parents=True, exist_ok=True) - # Support glob patterns for input - import glob + # Resolve input files + import glob as globmod if "*" in args.input: - input_files = sorted(glob.glob(args.input)) + input_files = sorted(globmod.glob(args.input)) if not input_files: print(f"Error: No files found matching: {args.input}") exit(1) - print( - f"Found {len(input_files)} input files: {[Path(f).name for f in input_files]}" - ) + print(f"Found {len(input_files)} input files") else: input_path = Path(args.input) if not input_path.exists(): @@ -116,78 +116,63 @@ def main(): exit(1) input_files = [str(input_path)] - # Load all examples from all input files - examples = [] - + # Load all examples through strict Pydantic schema + all_examples: list[TrainingExample] = [] for input_file in input_files: - file_count = 0 - with open(input_file) as f: - for line in f: - if line.strip(): - ex = json.loads(line) - - # Normalize legacy format - if "query" not in ex and "input" in ex: - ex["query"] = ex.pop("input") - if isinstance(ex.get("output"), str): - ex["output"] = parse_output_text(ex["output"]) - ex["output"] = normalize_output_items(ex.get("output", [])) - - examples.append(ex) - file_count += 1 - print(f" {Path(input_file).name}: {file_count} examples") - - print(f"Loaded {len(examples)} examples total") - - # Combine and shuffle - all_examples = examples + examples = load_examples(input_file) + print(f" {Path(input_file).name}: {len(examples)} examples") + all_examples.extend(examples) + + print(f"Loaded {len(all_examples)} examples total") + + # Deduplicate by query (case-insensitive) + seen: set[str] = set() + deduped: list[TrainingExample] = [] + for ex in all_examples: + key = ex.query.lower().strip() + if key not in seen: + seen.add(key) + deduped.append(ex) + if len(deduped) < len(all_examples): + print(f"Deduplicated: {len(all_examples)} -> {len(deduped)}") + all_examples = deduped + + # Shuffle random.seed(args.seed) random.shuffle(all_examples) - # Format for training - formatted = [format_for_training(ex["query"], ex["output"]) for ex in all_examples] + # Format each example using the Pydantic model + formatted = [format_for_training(ex) for ex in all_examples] - # Split into train/val + # Split split_idx = int(len(formatted) * (1 - args.split)) train_data = formatted[:split_idx] val_data = formatted[split_idx:] - # Write train set - train_path = output_dir / "train.jsonl" - with open(train_path, "w") as f: - for item in train_data: - f.write(json.dumps(item) + "\n") - - # Write validation set - val_path = output_dir / "val.jsonl" - with open(val_path, "w") as f: - for item in val_data: - f.write(json.dumps(item) + "\n") + # Write (these are ephemeral build artifacts) + for name, data in [("train.jsonl", train_data), ("val.jsonl", val_data)]: + with open(output_dir / name, "w") as f: + for item in data: + f.write(json.dumps(item) + "\n") - # Write chat format (for TRL) - chat_path = output_dir / "train_chat.jsonl" - with open(chat_path, "w") as f: + with open(output_dir / "train_chat.jsonl", "w") as f: for item in train_data: f.write(json.dumps({"messages": item["messages"]}) + "\n") # Stats - short_final = sum(1 for ex in all_examples if len(ex["query"].split()) <= 2) - + short_final = sum(1 for ex in all_examples if len(ex.query.split()) <= 2) print(f"\n=== Summary ===") print(f"Total examples: {len(all_examples)}") - print( - f"Short queries: {short_final} ({100 * short_final / len(all_examples):.1f}%)" - ) + print(f"Short queries: {short_final} ({100 * short_final / len(all_examples):.1f}%)") print(f"Train: {len(train_data)}, Val: {len(val_data)}") print(f"Output: {output_dir}") - # Dataset info dataset_info = { "dataset_name": "qmd-query-expansion", "train_samples": len(train_data), "val_samples": len(val_data), "short_query_pct": round(100 * short_final / len(all_examples), 1), - "columns": ["prompt", "completion", "text", "messages"], + "columns": ["text", "messages"], } with open(output_dir / "dataset_info.json", "w") as f: json.dump(dataset_info, f, indent=2) diff --git a/finetune/dataset/schema.py b/finetune/dataset/schema.py index 742808f6..4421fdad 100644 --- a/finetune/dataset/schema.py +++ b/finetune/dataset/schema.py @@ -1,17 +1,149 @@ #!/usr/bin/env python3 -"""Schema helpers for QMD training JSONL data.""" +""" +Strict schema for QMD training data. + +Every JSONL file in data/ MUST conform to this format: + + {"query": "auth config", "output": [["hyde", "..."], ["lex", "..."], ["vec", "..."]]} + +- query: non-empty string +- output: list of [type, text] pairs where type is "lex", "vec", or "hyde" +- Extra fields (category, intent, is_short, etc.) are allowed but ignored + +There is exactly ONE format. No alternatives, no legacy fallbacks. +""" from __future__ import annotations -from typing import Iterable +import json +from enum import Enum +from pathlib import Path +from typing import Annotated, Iterable + +from pydantic import ( + BaseModel, + BeforeValidator, + ConfigDict, + field_validator, +) + + +# --------------------------------------------------------------------------- +# Types +# --------------------------------------------------------------------------- + +class OutputType(str, Enum): + lex = "lex" + vec = "vec" + hyde = "hyde" + + +VALID_OUTPUT_TYPES = {t.value for t in OutputType} + + +class OutputPair(BaseModel): + """A single expansion line: [type, text].""" + + type: OutputType + text: str + + model_config = ConfigDict(frozen=True) + + @field_validator("text") + @classmethod + def text_not_empty(cls, v: str) -> str: + if not v or not v.strip(): + raise ValueError("text must not be empty") + return v + + def to_list(self) -> list[str]: + return [self.type.value, self.text] + + +def _coerce_output_pairs(v: list) -> list[OutputPair]: + """Accept [["lex", "..."], ...] from JSON and coerce to OutputPair list.""" + pairs = [] + for i, item in enumerate(v): + if isinstance(item, OutputPair): + pairs.append(item) + elif isinstance(item, (list, tuple)) and len(item) == 2: + pairs.append(OutputPair(type=item[0], text=item[1])) + else: + raise ValueError( + f"output[{i}] must be [type, text], got {item!r}" + ) + return pairs + + +# --------------------------------------------------------------------------- +# Pydantic model — single source of truth for the JSONL schema +# --------------------------------------------------------------------------- + +class TrainingExample(BaseModel): + """One training example in the canonical JSONL format.""" + + query: str + output: Annotated[list[OutputPair], BeforeValidator(_coerce_output_pairs)] -VALID_OUTPUT_TYPES = {"hyde", "lex", "vec"} + # Optional metadata — present in some files, ignored during training. + category: str | None = None + intent: str | None = None + is_short: bool | None = None + model_config = ConfigDict(extra="ignore") + + @field_validator("query") + @classmethod + def query_not_empty(cls, v: str) -> str: + if not v or not v.strip(): + raise ValueError("query must not be empty") + return v + + @field_validator("output") + @classmethod + def output_not_empty(cls, v: list[OutputPair]) -> list[OutputPair]: + if not v: + raise ValueError("output must not be empty") + return v + + def output_as_lists(self) -> list[list[str]]: + """Return output as list-of-lists for JSON serialization.""" + return [p.to_list() for p in self.output] + + +# --------------------------------------------------------------------------- +# Loading +# --------------------------------------------------------------------------- + +def load_examples(path: str | Path) -> list[TrainingExample]: + """Load and validate a JSONL file. Fails loudly on any bad line.""" + path = Path(path) + examples: list[TrainingExample] = [] + with path.open("r", encoding="utf-8") as f: + for line_num, line in enumerate(f, 1): + line = line.strip() + if not line: + continue + try: + obj = json.loads(line) + except json.JSONDecodeError as e: + raise ValueError(f"{path}:{line_num}: invalid JSON: {e}") from e + try: + examples.append(TrainingExample.model_validate(obj)) + except Exception as e: + raise ValueError(f"{path}:{line_num}: {e}") from e + return examples + + +# --------------------------------------------------------------------------- +# Helpers (used by prepare_data.py, reward.py, and other tools) +# --------------------------------------------------------------------------- def parse_output_text(text: str) -> list[list[str]]: """Parse prefixed output text into list pairs. - Returns: [["hyde", "..."], ["lex", "..."], ...] + >>> parse_output_text("lex: foo\\nvec: bar") + [["lex", "foo"], ["vec", "bar"]] """ items: list[list[str]] = [] for raw_line in text.strip().split("\n"): @@ -27,10 +159,26 @@ def parse_output_text(text: str) -> list[list[str]]: return items -def output_items_to_text(items: Iterable[Iterable[str]]) -> str: - """Render output list pairs to prefixed text lines.""" - lines = [] +def reorder_hyde_first(items: list[list[str]]) -> list[list[str]]: + """Reorder items to put hyde first, then lex, then vec.""" + hyde_items = [item for item in items if item and item[0] == "hyde"] + lex_items = [item for item in items if item and item[0] == "lex"] + vec_items = [item for item in items if item and item[0] == "vec"] + return hyde_items + lex_items + vec_items + + +def output_items_to_text( + items: Iterable, hyde_first: bool = True +) -> str: + """Render output pairs to prefixed text lines. + + Accepts list[OutputPair] or list[list[str]]. + """ + normalized = [] for item in items: + if isinstance(item, OutputPair): + normalized.append([item.type.value, item.text.strip()]) + continue if not item: continue try: @@ -44,14 +192,27 @@ def output_items_to_text(items: Iterable[Iterable[str]]) -> str: text = str(text).strip() if not text: continue - lines.append(f"{kind}: {text}") + normalized.append([kind, text]) + + if hyde_first: + normalized = reorder_hyde_first(normalized) + + lines = [f"{kind}: {text}" for kind, text in normalized] return "\n".join(lines) -def normalize_output_items(items: Iterable[Iterable[str]]) -> list[list[str]]: - """Normalize output list pairs (filter invalid, trim whitespace).""" +def normalize_output_items( + items: Iterable, hyde_first: bool = True +) -> list[list[str]]: + """Normalize output pairs (filter invalid, trim whitespace, reorder). + + Accepts list[OutputPair] or list[list[str]]. + """ normalized: list[list[str]] = [] for item in items: + if isinstance(item, OutputPair): + normalized.append([item.type.value, item.text.strip()]) + continue if not item: continue try: @@ -66,8 +227,18 @@ def normalize_output_items(items: Iterable[Iterable[str]]) -> list[list[str]]: if not text: continue normalized.append([kind, text]) + + if hyde_first: + normalized = reorder_hyde_first(normalized) + return normalized -def has_type(items: Iterable[Iterable[str]], kind: str) -> bool: - return any(item and item[0] == kind for item in items) +def has_type(items: Iterable, kind: str) -> bool: + for item in items: + if isinstance(item, OutputPair): + if item.type.value == kind: + return True + elif item and item[0] == kind: + return True + return False diff --git a/finetune/dataset/score_data.py b/finetune/dataset/score_data.py index 703851fe..bea4eeb6 100644 --- a/finetune/dataset/score_data.py +++ b/finetune/dataset/score_data.py @@ -1,20 +1,19 @@ #!/usr/bin/env python3 +# /// script +# requires-python = ">=3.10" +# dependencies = ["pydantic>=2.0"] +# /// """Score JSONL datasets with the reward function.""" from __future__ import annotations import argparse -import json import statistics import sys from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) -from dataset.schema import ( - normalize_output_items, - output_items_to_text, - parse_output_text, -) +from dataset.schema import load_examples, output_items_to_text from reward import score_expansion_detailed @@ -24,42 +23,24 @@ def score_file(path: Path) -> tuple[int, int, list[float], dict]: scores: list[float] = [] ratings: dict[str, int] = {} - with path.open("r", encoding="utf-8") as f: - for line_num, line in enumerate(f, 1): - line = line.strip() - if not line: - continue - total += 1 - try: - obj = json.loads(line) - except json.JSONDecodeError: - errors += 1 - continue - - query = obj.get("query") or obj.get("input") - output = obj.get("output") - if not isinstance(query, str) or not query.strip(): - errors += 1 - continue - if output is None: - errors += 1 - continue - - if isinstance(output, str): - output_items = normalize_output_items(parse_output_text(output)) - else: - output_items = normalize_output_items(output) - - output_text = output_items_to_text(output_items) - if not output_text: - errors += 1 - continue - - detail = score_expansion_detailed(query, output_text) - score = detail["percentage"] - scores.append(score) - rating = detail["rating"] - ratings[rating] = ratings.get(rating, 0) + 1 + try: + examples = load_examples(path) + except ValueError as e: + print(f" Error loading {path}: {e}") + return 0, 1, [], {} + + for ex in examples: + total += 1 + output_text = output_items_to_text(ex.output) + if not output_text: + errors += 1 + continue + + detail = score_expansion_detailed(ex.query, output_text) + score = detail["percentage"] + scores.append(score) + rating = detail["rating"] + ratings[rating] = ratings.get(rating, 0) + 1 return total, errors, scores, ratings diff --git a/finetune/dataset/validate_schema.py b/finetune/dataset/validate_schema.py index 565e1ace..d6c09dfd 100644 --- a/finetune/dataset/validate_schema.py +++ b/finetune/dataset/validate_schema.py @@ -1,5 +1,9 @@ #!/usr/bin/env python3 -"""Validate JSONL files against the QMD training schema.""" +# /// script +# requires-python = ">=3.10" +# dependencies = ["pydantic>=2.0"] +# /// +"""Validate JSONL files against the strict QMD training schema.""" from __future__ import annotations @@ -9,7 +13,7 @@ from pathlib import Path sys.path.insert(0, str(Path(__file__).parent.parent)) -from dataset.schema import VALID_OUTPUT_TYPES +from dataset.schema import TrainingExample def validate_file(path: Path) -> tuple[int, int]: @@ -29,31 +33,11 @@ def validate_file(path: Path) -> tuple[int, int]: errors += 1 continue - query = obj.get("query") - output = obj.get("output") - - if not isinstance(query, str) or not query.strip(): - print(f"{path}:{line_num}: missing/invalid query") - errors += 1 - continue - - if not isinstance(output, list): - print(f"{path}:{line_num}: output must be a list") + try: + TrainingExample.model_validate(obj) + except Exception as e: + print(f"{path}:{line_num}: {e}") errors += 1 - continue - - for idx, item in enumerate(output): - if not isinstance(item, list) or len(item) != 2: - print(f"{path}:{line_num}: output[{idx}] must be [type, text]") - errors += 1 - continue - kind, text = item - if kind not in VALID_OUTPUT_TYPES: - print(f"{path}:{line_num}: invalid output type '{kind}'") - errors += 1 - if not isinstance(text, str) or not text.strip(): - print(f"{path}:{line_num}: empty output text") - errors += 1 return total, errors diff --git a/finetune/eval.py b/finetune/eval.py index cfe20acb..cc910937 100644 --- a/finetune/eval.py +++ b/finetune/eval.py @@ -12,14 +12,15 @@ Usage: uv run eval.py ./outputs/sft - uv run eval.py tobil/qmd-query-expansion-1.7B --queries evals/queries.txt + uv run eval.py ./outputs/sft --queries evals/queries.txt + +By default, query file defaults to evals/queries.txt and runs all queries unless --max-queries is set. """ import argparse import json import re import sys -import os from pathlib import Path # Import reward scoring @@ -27,18 +28,8 @@ from reward import score_expansion_detailed -QUERIES = [ - "how to configure authentication", - "docker compose networking", - "auth", - "who is TDS motorsports", - "React hooks tutorial", - "recent news about Shopify", - "how to implement caching with redis in nodejs", - "auth /only:lex", - "kubernetes pod deployment /only:vec", - "AWS Lambda cold start /only:hyde", -] + +DEFAULT_QUERY_FILE = Path(__file__).parent / "evals" / "queries.txt" def load_model(model_path: str): @@ -127,7 +118,11 @@ def generate_batch( def main(): parser = argparse.ArgumentParser(description="Evaluate QMD model") parser.add_argument("model", help="Model path (local or HF)") - parser.add_argument("--queries", help="Queries file (one per line)") + parser.add_argument( + "--queries", + default=str(DEFAULT_QUERY_FILE), + help="Queries file (one per line) [default: evals/queries.txt]", + ) parser.add_argument( "--max-new-tokens", type=int, @@ -154,11 +149,14 @@ def main(): ) args = parser.parse_args() - # Load queries - queries = QUERIES - if args.queries: - with open(args.queries) as f: - queries = [l.strip() for l in f if l.strip() and not l.startswith("#")] + # Load queries (default to full evals/queries.txt) + query_file = Path(args.queries) + if not query_file.exists(): + raise FileNotFoundError(f"Queries file not found: {query_file}") + with query_file.open(encoding="utf-8") as f: + queries = [ + l.strip() for l in f if l.strip() and not l.strip().startswith("#") + ] if args.max_queries and args.max_queries > 0: queries = queries[: args.max_queries] diff --git a/finetune/evals/queries.txt b/finetune/evals/queries.txt index 8375f88b..d2a3f919 100644 --- a/finetune/evals/queries.txt +++ b/finetune/evals/queries.txt @@ -47,6 +47,30 @@ how to implement caching with redis in nodejs best practices for api rate limiting setting up ci cd pipeline with github actions +# Personal entity preservation (issue #247: entity stripping) +# Model MUST preserve person names in lex and vec output +meeting with Bob about C++ +Sarah's presentation on Q4 goals +email from Dave about the deployment issue +notes from the Project Atlas kickoff +feedback from the Horizon team retro +conversation with Lisa about the design mockups + +# Quoted phrases (issue #247: lex phrase syntax) +# Model should use "quoted phrases" for multi-word proper nouns in lex +natural language processing transformers +monte carlo simulation finance +cross site scripting prevention +visual studio code extensions +principal component analysis dimensionality reduction + +# Negation / disambiguation (issue #247: lex negation syntax) +# Model should use -term to exclude related-but-wrong results in lex +rust ownership and borrowing +java stream api filtering +apple silicon mac development +python web scraping beautiful soup + # /only: mode tests - should output ONLY the requested type auth /only:lex React hooks tutorial /only:lex diff --git a/finetune/gepa/__init__.py b/finetune/experiments/gepa/__init__.py similarity index 100% rename from finetune/gepa/__init__.py rename to finetune/experiments/gepa/__init__.py diff --git a/finetune/gepa/best_prompt.txt b/finetune/experiments/gepa/best_prompt.txt similarity index 100% rename from finetune/gepa/best_prompt.txt rename to finetune/experiments/gepa/best_prompt.txt diff --git a/finetune/gepa/best_prompt_glm.txt b/finetune/experiments/gepa/best_prompt_glm.txt similarity index 100% rename from finetune/gepa/best_prompt_glm.txt rename to finetune/experiments/gepa/best_prompt_glm.txt diff --git a/finetune/gepa/dspy_gepa.py b/finetune/experiments/gepa/dspy_gepa.py similarity index 100% rename from finetune/gepa/dspy_gepa.py rename to finetune/experiments/gepa/dspy_gepa.py diff --git a/finetune/gepa/example.py b/finetune/experiments/gepa/example.py similarity index 100% rename from finetune/gepa/example.py rename to finetune/experiments/gepa/example.py diff --git a/finetune/gepa/generate.py b/finetune/experiments/gepa/generate.py similarity index 100% rename from finetune/gepa/generate.py rename to finetune/experiments/gepa/generate.py diff --git a/finetune/gepa/gepa_outputs.jsonl b/finetune/experiments/gepa/gepa_outputs.jsonl similarity index 100% rename from finetune/gepa/gepa_outputs.jsonl rename to finetune/experiments/gepa/gepa_outputs.jsonl diff --git a/finetune/gepa/gepa_outputs_glm.jsonl b/finetune/experiments/gepa/gepa_outputs_glm.jsonl similarity index 100% rename from finetune/gepa/gepa_outputs_glm.jsonl rename to finetune/experiments/gepa/gepa_outputs_glm.jsonl diff --git a/finetune/gepa/model.json b/finetune/experiments/gepa/model.json similarity index 100% rename from finetune/gepa/model.json rename to finetune/experiments/gepa/model.json diff --git a/finetune/gepa/optimizer.py b/finetune/experiments/gepa/optimizer.py similarity index 100% rename from finetune/gepa/optimizer.py rename to finetune/experiments/gepa/optimizer.py diff --git a/finetune/gepa/score.py b/finetune/experiments/gepa/score.py similarity index 100% rename from finetune/gepa/score.py rename to finetune/experiments/gepa/score.py diff --git a/finetune/experiments/grpo/README.md b/finetune/experiments/grpo/README.md new file mode 100644 index 00000000..3308850a --- /dev/null +++ b/finetune/experiments/grpo/README.md @@ -0,0 +1,26 @@ +# GRPO (Experimental) + +This folder contains the **experimental** GRPO training path for query expansion. +It is not part of the default production pipeline. + +## Files + +- `grpo.yaml` – experimental GRPO hyperparameters +- `grpo.py` – standalone GRPO training script + +## Run + +```bash +# Recommended default: run from repo root +cd /home/tobi/qmd +uv run finetune/experiments/grpo/grpo.py + +# Or use unified entrypoint (deprecated in main pipeline): +uv run train.py grpo --config finetune/experiments/grpo/grpo.yaml +``` + +## Notes + +- Current mainline focuses on SFT-only quality and benchmarks. +- Keep this workflow isolated unless you are explicitly experimenting with + reinforcement-learning refinement. diff --git a/finetune/jobs/grpo.py b/finetune/experiments/grpo/grpo.py similarity index 94% rename from finetune/jobs/grpo.py rename to finetune/experiments/grpo/grpo.py index 1edb6455..4493859d 100644 --- a/finetune/jobs/grpo.py +++ b/finetune/experiments/grpo/grpo.py @@ -14,8 +14,10 @@ """ GRPO training for QMD query expansion (Qwen3-1.7B). -Runs on top of merged SFT weights. Self-contained for HuggingFace Jobs: - hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 4h jobs/grpo.py +Experimental recipe run on top of merged SFT weights. Self-contained runner: + uv run experiments/grpo/grpo.py + +(If using HF Jobs, run this script as the job entrypoint.) """ import os @@ -42,7 +44,7 @@ sys.path.insert(0, os.path.dirname(os.path.abspath(__file__))) from eval_common import QMDRewardFunction, run_eval -# --- Config (inlined from configs/grpo.yaml) --- +# --- Config (inlined from experiments/grpo/grpo.yaml) --- BASE_MODEL = "Qwen/Qwen3-1.7B" SFT_MODEL = "tobil/qmd-query-expansion-1.7B-sft" OUTPUT_MODEL = "tobil/qmd-query-expansion-1.7B-grpo" diff --git a/finetune/configs/grpo.yaml b/finetune/experiments/grpo/grpo.yaml similarity index 84% rename from finetune/configs/grpo.yaml rename to finetune/experiments/grpo/grpo.yaml index ca717b43..c5b5aabd 100644 --- a/finetune/configs/grpo.yaml +++ b/finetune/experiments/grpo/grpo.yaml @@ -1,7 +1,7 @@ # GRPO Training Config for QMD Query Expansion # Target: Qwen3-1.7B, trained on top of merged SFT weights # -# Usage: uv run train.py grpo --config configs/grpo.yaml +# Usage: uv run train.py grpo --config experiments/grpo/grpo.yaml # # The reward function (reward.py) scores expansions on format compliance, # diversity, hyde quality, content quality, and named entity preservation. @@ -30,6 +30,10 @@ training: learning_rate: 0.0000005 max_grad_norm: 0.5 max_steps: 200 + # Save checkpoints every 30 minutes + save_interval_minutes: 30 + # Fallback time-step save cadence if needed (not used for wall-clock mode) + save_steps: 50 grpo: num_generations: 4 diff --git a/finetune/experiments/lfm2/sft_lfm2.py b/finetune/experiments/lfm2/sft_lfm2.py new file mode 100644 index 00000000..35a2b247 --- /dev/null +++ b/finetune/experiments/lfm2/sft_lfm2.py @@ -0,0 +1,106 @@ +# /// script +# requires-python = ">=3.10" +# dependencies = [ +# "trl>=0.12.0", +# "peft>=0.7.0", +# "transformers>=4.55.0", +# "accelerate>=0.24.0", +# "huggingface_hub>=0.20.0", +# "datasets", +# "bitsandbytes", +# "torch", +# ] +# /// +""" +SFT training for QMD query expansion with LiquidAI LFM2-1.2B. + +LFM2 is a hybrid architecture optimized for edge/on-device inference. +Uses different LoRA target modules than standard transformers. + +Self-contained script for HuggingFace Jobs: + hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 2h jobs/sft_lfm2.py +""" + +import os +from huggingface_hub import login + +# --- Config (inlined from configs/sft_lfm2.yaml) --- +BASE_MODEL = "LiquidAI/LFM2-1.2B" +OUTPUT_MODEL = "tobil/qmd-query-expansion-lfm2-sft" +DATASET = "tobil/qmd-query-expansion-train" + +hf_token = os.environ.get("HF_TOKEN") +if hf_token: + login(token=hf_token) + +from datasets import load_dataset +from peft import LoraConfig +from transformers import AutoTokenizer +from trl import SFTTrainer, SFTConfig + +# Load and split dataset +print(f"Loading dataset: {DATASET}...") +dataset = load_dataset(DATASET, split="train") +print(f"Dataset loaded: {len(dataset)} examples") + +split = dataset.train_test_split(test_size=0.1, seed=42) +train_dataset = split["train"] +eval_dataset = split["test"] +print(f" Train: {len(train_dataset)}, Eval: {len(eval_dataset)}") + +# SFT config +config = SFTConfig( + output_dir="qmd-query-expansion-lfm2-sft", + push_to_hub=True, + hub_model_id=OUTPUT_MODEL, + hub_strategy="every_save", + + num_train_epochs=5, + per_device_train_batch_size=4, + gradient_accumulation_steps=4, + learning_rate=2e-4, + max_length=512, + + logging_steps=10, + save_strategy="steps", + save_steps=200, + save_total_limit=2, + eval_strategy="steps", + eval_steps=200, + + warmup_ratio=0.03, + lr_scheduler_type="cosine", + bf16=True, + + report_to="none", +) + +# LoRA config for LFM2 architecture +# LFM2 uses different layer names than standard transformers: +# - Attention: q_proj, k_proj, v_proj, out_proj +# - Input projection: in_proj +# - FFN/MLP gates (SwiGLU): w1, w2, w3 +peft_config = LoraConfig( + r=16, + lora_alpha=32, + lora_dropout=0.0, + bias="none", + task_type="CAUSAL_LM", + target_modules=["q_proj", "k_proj", "v_proj", "out_proj", "in_proj", "w1", "w2", "w3"], +) + +print("Initializing SFT trainer...") +trainer = SFTTrainer( + model=BASE_MODEL, + train_dataset=train_dataset, + eval_dataset=eval_dataset, + args=config, + peft_config=peft_config, +) + +print("Starting SFT training (LFM2-1.2B)...") +trainer.train() + +print("Pushing to Hub...") +trainer.push_to_hub() +print(f"Done! Model: https://huggingface.co/{OUTPUT_MODEL}") diff --git a/finetune/experiments/lfm2/sft_lfm2.yaml b/finetune/experiments/lfm2/sft_lfm2.yaml new file mode 100644 index 00000000..7ece2f53 --- /dev/null +++ b/finetune/experiments/lfm2/sft_lfm2.yaml @@ -0,0 +1,60 @@ +# SFT Training Config for QMD Query Expansion with LiquidAI LFM2 +# Target: LFM2-1.2B with LoRA (hybrid architecture: convolutions + attention) +# +# LFM2 is optimized for on-device inference with fast decode/prefill. +# Recommended for: agentic tasks, data extraction, RAG, creative writing. +# +# Usage: uv run train.py sft --config configs/sft_lfm2.yaml +# +# Requirements: +# - transformers >= 4.55.0 (LFM2 architecture support) +# - May need: pip install -U transformers + +model: + base: "LiquidAI/LFM2-1.2B" + output: "outputs/sft-lfm2" # Local training output (push to HF manually after eval) + +dataset: + # Local: run `uv run dataset/prepare_data.py` first, then use "data/train/" + # HuggingFace: use "tobil/qmd-query-expansion-train" (already prepared) + name: "data/train/" + text_field: "text" + split: "train" + eval_split: 0.1 + +training: + epochs: 5 + batch_size: 4 + gradient_accumulation_steps: 4 + learning_rate: 2e-4 + max_length: 512 + warmup_ratio: 0.03 + lr_scheduler: "cosine" + +lora: + rank: 16 + alpha: 32 + dropout: 0.0 + # LFM2 uses different architecture than standard transformers: + # - Attention layers: q_proj, k_proj, v_proj, out_proj + # - Input projection: in_proj + # - FFN/MLP gates: w1, w2, w3 (SwiGLU activation) + target_modules: + - "q_proj" + - "k_proj" + - "v_proj" + - "out_proj" + - "in_proj" + - "w1" + - "w2" + - "w3" + +tracking: + project: "qmd-query-expansion" + run_name: "sft-lfm2-1.2B" + +# LFM2-specific generation settings (recommended by LiquidAI) +generation: + temperature: 0.3 + min_p: 0.15 + repetition_penalty: 1.05 diff --git a/finetune/jobs/eval_verbose.py b/finetune/jobs/eval_verbose.py deleted file mode 100644 index f5a2fc73..00000000 --- a/finetune/jobs/eval_verbose.py +++ /dev/null @@ -1,113 +0,0 @@ -# /// script -# requires-python = ">=3.10" -# dependencies = [ -# "transformers>=4.45.0", -# "peft>=0.7.0", -# "torch", -# "huggingface_hub>=0.20.0", -# "accelerate", -# ] -# /// -""" -Verbose eval: prints the actual expansions for every query. - - hf jobs uv run --flavor a10g-small --secrets HF_TOKEN --timeout 30m jobs/eval_verbose.py -""" - -import os -import re -import sys -from collections import Counter - -import torch -from huggingface_hub import login -from peft import PeftModel -from transformers import AutoModelForCausalLM, AutoTokenizer - -BASE_MODEL = "Qwen/Qwen3-1.7B" -SFT_MODEL = "tobil/qmd-query-expansion-1.7B-sft" -GRPO_MODEL = "tobil/qmd-query-expansion-1.7B-grpo" - -QUERIES = [ - "how to configure authentication", - "typescript async await", - "docker compose networking", - "git rebase vs merge", - "react useEffect cleanup", - "auth", - "config", - "setup", - "api", - "who is TDS motorsports", - "React hooks tutorial", - "Docker container networking", - "Kubernetes pod deployment", - "AWS Lambda functions", - "meeting notes project kickoff", - "ideas for new feature", - "todo list app architecture", - "what is dependency injection", - "difference between sql and nosql", - "kubernetes vs docker swarm", - "connection timeout error", - "memory leak debugging", - "cors error fix", - "recent news about Shopify", - "latest AI developments", - "best laptops right now", - "what changed in kubernetes latest version", - "how to implement caching with redis in nodejs", - "best practices for api rate limiting", - "setting up ci cd pipeline with github actions", -] - - -def load_model(base, sft=None, grpo=None): - tokenizer = AutoTokenizer.from_pretrained(base) - if tokenizer.pad_token is None: - tokenizer.pad_token = tokenizer.eos_token - model = AutoModelForCausalLM.from_pretrained(base, torch_dtype=torch.bfloat16, device_map="auto") - if sft: - model = PeftModel.from_pretrained(model, sft) - model = model.merge_and_unload() - if grpo: - model = PeftModel.from_pretrained(model, grpo) - model.eval() - return model, tokenizer - - -def generate(model, tokenizer, query): - messages = [{"role": "user", "content": f"/no_think Expand this search query: {query}"}] - prompt = tokenizer.apply_chat_template(messages, tokenize=False, add_generation_prompt=True) - inputs = tokenizer(prompt, return_tensors="pt").to(model.device) - with torch.no_grad(): - out = model.generate(**inputs, max_new_tokens=200, temperature=0.7, do_sample=True, - pad_token_id=tokenizer.pad_token_id, eos_token_id=tokenizer.eos_token_id) - text = tokenizer.decode(out[0], skip_special_tokens=True) - if "\nassistant\n" in text: - text = text.split("\nassistant\n")[-1].strip() - elif "assistant\n" in text: - text = text.split("assistant\n")[-1].strip() - if "" in text: - text = re.sub(r'.*?', '', text, flags=re.DOTALL).strip() - return text - - -def main(): - hf_token = os.environ.get("HF_TOKEN") - if hf_token: - login(token=hf_token) - - print("Loading GRPO model...", file=sys.stderr) - model, tokenizer = load_model(BASE_MODEL, sft=SFT_MODEL, grpo=GRPO_MODEL) - - for i, query in enumerate(QUERIES, 1): - expansion = generate(model, tokenizer, query) - print(f"\n{'='*60}") - print(f"[{i}/{len(QUERIES)}] {query}") - print(f"{'─'*60}") - print(expansion) - - -if __name__ == "__main__": - main() diff --git a/finetune/jobs/quantize.py b/finetune/jobs/quantize.py deleted file mode 100644 index 1312abb8..00000000 --- a/finetune/jobs/quantize.py +++ /dev/null @@ -1,244 +0,0 @@ -# /// script -# requires-python = ">=3.10" -# dependencies = [ -# "transformers>=4.45.0", -# "peft>=0.7.0", -# "torch", -# "huggingface_hub>=0.20.0", -# "accelerate", -# "sentencepiece>=0.1.99", -# "protobuf>=3.20.0", -# "numpy", -# "gguf", -# ] -# /// -""" -Merge SFT + GRPO adapters and convert to GGUF with multiple quantizations. - -Uploads each quantization to HuggingFace Hub as it's produced, so partial -results are available even if the job times out. - - hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 2h jobs/quantize.py - hf jobs uv run --flavor a10g-large --secrets HF_TOKEN --timeout 2h jobs/quantize.py -- --size 4B -""" - -import argparse -import os -import subprocess -import sys - -import torch -from huggingface_hub import HfApi, login -from peft import PeftModel -from transformers import AutoModelForCausalLM, AutoTokenizer - -PRESETS = { - "1.7B": { - "base": "Qwen/Qwen3-1.7B", - "sft": "tobil/qmd-query-expansion-1.7B-sft", - "grpo": "tobil/qmd-query-expansion-1.7B-grpo", - "output": "tobil/qmd-query-expansion-1.7B-gguf", - }, - "4B": { - "base": "Qwen/Qwen3-4B", - "sft": "tobil/qmd-query-expansion-4B-sft", - "grpo": "tobil/qmd-query-expansion-4B-grpo", - "output": "tobil/qmd-query-expansion-4B-gguf", - }, -} - -QUANT_TYPES = [ - ("Q4_K_M", "4-bit (recommended for most use)"), - ("Q5_K_M", "5-bit (balanced quality/size)"), - ("Q8_0", "8-bit (highest quality)"), -] - - -def run_cmd(cmd, description): - print(f" {description}...") - try: - result = subprocess.run(cmd, check=True, capture_output=True, text=True) - return True - except subprocess.CalledProcessError as e: - print(f" FAILED: {' '.join(cmd)}") - if e.stderr: - print(f" {e.stderr[:500]}") - return False - except FileNotFoundError: - print(f" Command not found: {cmd[0]}") - return False - - -def main(): - parser = argparse.ArgumentParser(description="Convert QMD model to GGUF") - parser.add_argument("--size", default="1.7B", choices=PRESETS.keys(), help="Model size preset") - args = parser.parse_args() - - preset = PRESETS[args.size] - base_model = preset["base"] - sft_model = preset["sft"] - grpo_model = preset["grpo"] - output_repo = preset["output"] - model_name = output_repo.split("/")[-1].replace("-gguf", "") - - print(f"QMD GGUF Conversion: {model_name}") - print("=" * 60) - - hf_token = os.environ.get("HF_TOKEN") - if hf_token: - login(token=hf_token) - - api = HfApi() - api.create_repo(repo_id=output_repo, repo_type="model", exist_ok=True) - - # Step 1: Install build tools - print("\nStep 1: Installing build dependencies...") - subprocess.run(["apt-get", "update", "-qq"], capture_output=True) - subprocess.run(["apt-get", "install", "-y", "-qq", "build-essential", "cmake", "git"], capture_output=True) - - # Step 2: Load and merge - print(f"\nStep 2: Loading base model {base_model}...") - model = AutoModelForCausalLM.from_pretrained( - base_model, torch_dtype=torch.bfloat16, device_map="auto", trust_remote_code=True, - ) - - print(f"Step 3: Merging SFT adapter {sft_model}...") - model = PeftModel.from_pretrained(model, sft_model) - model = model.merge_and_unload() - - print(f"Step 4: Merging GRPO adapter {grpo_model}...") - model = PeftModel.from_pretrained(model, grpo_model) - model = model.merge_and_unload() - - tokenizer = AutoTokenizer.from_pretrained(base_model, trust_remote_code=True) - - # Step 3: Save merged model - merged_dir = "/tmp/merged_model" - print(f"\nStep 5: Saving merged model to {merged_dir}...") - model.save_pretrained(merged_dir, safe_serialization=True) - tokenizer.save_pretrained(merged_dir) - del model - torch.cuda.empty_cache() - - # Step 4: Setup llama.cpp - print("\nStep 6: Setting up llama.cpp...") - if not os.path.exists("/tmp/llama.cpp"): - run_cmd(["git", "clone", "--depth", "1", "https://github.com/ggerganov/llama.cpp.git", "/tmp/llama.cpp"], - "Cloning llama.cpp") - subprocess.run([sys.executable, "-m", "pip", "install", "-q", "-r", "/tmp/llama.cpp/requirements.txt"], - capture_output=True) - - # Step 5: Convert to FP16 GGUF - gguf_dir = "/tmp/gguf_output" - os.makedirs(gguf_dir, exist_ok=True) - fp16_file = f"{gguf_dir}/{model_name}-f16.gguf" - - print(f"\nStep 7: Converting to FP16 GGUF...") - if not run_cmd([sys.executable, "/tmp/llama.cpp/convert_hf_to_gguf.py", - merged_dir, "--outfile", fp16_file, "--outtype", "f16"], - "Converting to FP16"): - sys.exit(1) - - size_mb = os.path.getsize(fp16_file) / (1024 * 1024) - print(f" FP16: {size_mb:.1f} MB") - - # Upload FP16 immediately - print(f" Uploading FP16 to {output_repo}...") - api.upload_file(path_or_fileobj=fp16_file, - path_in_repo=f"{model_name}-f16.gguf", repo_id=output_repo) - print(f" Uploaded: {model_name}-f16.gguf") - - # Step 6: Build quantize tool - print("\nStep 8: Building quantize tool...") - os.makedirs("/tmp/llama.cpp/build", exist_ok=True) - run_cmd(["cmake", "-B", "/tmp/llama.cpp/build", "-S", "/tmp/llama.cpp", "-DGGML_CUDA=OFF"], - "CMake configure") - run_cmd(["cmake", "--build", "/tmp/llama.cpp/build", "--target", "llama-quantize", "-j", "4"], - "Building llama-quantize") - quantize_bin = "/tmp/llama.cpp/build/bin/llama-quantize" - - # Step 7: Quantize and upload each one immediately - print("\nStep 9: Quantizing and uploading...") - for quant_type, desc in QUANT_TYPES: - qfile = f"{gguf_dir}/{model_name}-{quant_type.lower()}.gguf" - if run_cmd([quantize_bin, fp16_file, qfile, quant_type], f"{quant_type} ({desc})"): - qsize = os.path.getsize(qfile) / (1024 * 1024) - print(f" {quant_type}: {qsize:.1f} MB") - - print(f" Uploading {quant_type} to {output_repo}...") - api.upload_file(path_or_fileobj=qfile, - path_in_repo=f"{model_name}-{quant_type.lower()}.gguf", repo_id=output_repo) - print(f" Uploaded: {model_name}-{quant_type.lower()}.gguf") - - # Remove to save disk - os.remove(qfile) - - # Step 8: Upload README - ollama_name = "qmd-expand" if args.size == "1.7B" else f"qmd-expand-{args.size.lower()}" - readme = f"""--- -base_model: {base_model} -tags: [gguf, llama.cpp, quantized, query-expansion, qmd] ---- -# {model_name} (GGUF) - -GGUF quantizations of the QMD Query Expansion model for use with -[Ollama](https://ollama.com), [llama.cpp](https://github.com/ggerganov/llama.cpp), -or [LM Studio](https://lmstudio.ai). - -## Available Quantizations - -| File | Quant | Description | -|------|-------|-------------| -| `{model_name}-q4_k_m.gguf` | Q4_K_M | 4-bit — smallest, recommended for most use | -| `{model_name}-q5_k_m.gguf` | Q5_K_M | 5-bit — balanced quality/size | -| `{model_name}-q8_0.gguf` | Q8_0 | 8-bit — highest quality | -| `{model_name}-f16.gguf` | FP16 | Full precision (large) | - -## Details - -- **Base:** {base_model} -- **SFT:** {sft_model} -- **GRPO:** {grpo_model} -- **Task:** Query expansion for hybrid search (lex/vec/hyde format) -- **Eval score:** 90.7% average (29/30 Excellent) - -## Quick Start with Ollama - -```bash -huggingface-cli download {output_repo} \\ - {model_name}-q4_k_m.gguf --local-dir . - -echo 'FROM ./{model_name}-q4_k_m.gguf' > Modelfile -ollama create {ollama_name} -f Modelfile -ollama run {ollama_name} -``` - -## Prompt Format - -``` -<|im_start|>user -/no_think Expand this search query: your query here<|im_end|> -<|im_start|>assistant -``` - -The model produces structured output: -``` -lex: keyword expansion for BM25 search -lex: another keyword variant -vec: natural language expansion for vector search -vec: another semantic expansion -hyde: A hypothetical document passage that might match this query. -``` -""" - api.upload_file(path_or_fileobj=readme.encode(), - path_in_repo="README.md", repo_id=output_repo) - - print(f"\nDone! Repository: https://huggingface.co/{output_repo}") - print(f"\nTo use with Ollama:") - print(f" huggingface-cli download {output_repo} {model_name}-q4_k_m.gguf --local-dir .") - print(f" echo 'FROM ./{model_name}-q4_k_m.gguf' > Modelfile") - print(f" ollama create {ollama_name} -f Modelfile") - - -if __name__ == "__main__": - main() diff --git a/finetune/pyproject.toml b/finetune/pyproject.toml index 6eb51a64..06809213 100644 --- a/finetune/pyproject.toml +++ b/finetune/pyproject.toml @@ -16,7 +16,7 @@ dependencies = [ "gguf", "sentencepiece", "nvidia-ml-py", - "dspy-ai>=3.1.2", + "pydantic>=2.0", ] [dependency-groups] diff --git a/finetune/reward.py b/finetune/reward.py index b29e678b..9074a8a5 100644 --- a/finetune/reward.py +++ b/finetune/reward.py @@ -39,6 +39,31 @@ 'what', 'is', 'how', 'to', 'the', 'a', 'an', 'in', 'on', 'for', 'of', 'and', 'or', 'with', 'my', 'your', 'do', 'does', 'can', 'i', 'me', 'we', 'who', 'where', 'when', 'why', 'which', 'find', 'get', 'show', 'tell', + 'about', 'from', 'into', 'between', 'through', 'during', 'after', + 'before', 'like', 'than', 'then', 'that', 'this', 'their', 'its', + 'was', 'were', 'has', 'had', 'been', 'being', 'have', 'not', 'but', + 'just', 'also', 'very', 'so', 'if', 'at', 'by', 'up', 'out', 'all', + 'some', 'any', 'no', 'each', 'every', 'both', 'few', 'more', 'most', + 'other', 'only', 'same', 'such', 'here', 'there', 'asked', 'said', + 'notes', 'meeting', 'email', 'discussion', 'conversation', 'call', +}) + +# Words that commonly start queries but aren't named entities. +# Used for position-0 entity detection to avoid false positives. +QUERY_VERB_STOPWORDS = frozenset({ + 'configure', 'setup', 'install', 'build', 'create', 'make', 'run', + 'start', 'stop', 'check', 'test', 'debug', 'fix', 'update', 'change', + 'add', 'remove', 'delete', 'use', 'using', 'need', 'want', 'should', + 'would', 'could', 'help', 'please', 'best', 'good', 'new', 'old', + 'latest', 'recent', 'setting', 'settings', 'compare', 'comparing', + 'implement', 'implementing', 'deploy', 'deploying', 'migrate', + 'migrating', 'optimize', 'optimizing', 'understand', 'understanding', + 'explain', 'list', 'describe', 'define', 'convert', 'connecting', + 'performance', 'overview', 'introduction', 'tutorial', 'example', + 'difference', 'between', 'about', 'review', 'resolve', 'resolving', + 'troubleshoot', 'troubleshooting', 'monitor', 'monitoring', 'manage', + 'managing', 'enable', 'disable', 'set', 'write', 'read', 'search', + 'possible', 'common', 'typical', 'recommended', 'alternative', }) GENERIC_LEX_PHRASES = frozenset({ @@ -47,6 +72,10 @@ 'what is', 'how to', 'guide to', 'help with', }) +# Words commonly injected as filler/noise into lex lines by template generators +# (e.g. "ancient overview rome timeline"). Penalized when absent from the query. +INTERIOR_FILLER_WORDS = frozenset({'overview', 'basics'}) + # Chat template tokens that indicate a broken output CHAT_TEMPLATE_TOKENS = frozenset({ '<|im_start|>', '<|im_end|>', '<|endoftext|>', @@ -111,39 +140,55 @@ def clean_model_output(text: str) -> tuple[str, bool]: def extract_named_entities(query: str) -> set: """Extract named entities using heuristics. - Detects: ALL-CAPS acronyms (TDS, API), capitalized proper nouns (React), + Detects: ALL-CAPS acronyms (TDS, API), capitalized proper nouns (React, Bob), technical terms with special chars (node.js, C++), CamelCase (JavaScript), and compound names (TDS motorsports -> both words). + + Position-0 words are also detected as entities if they are capitalized and + not common query-starting verbs (e.g. "Bob asked about deploy" -> "bob"). + + Compound chaining extends one level from a directly-detected entity: + "TDS motorsports" -> {tds, motorsports}; "TDS motorsports team" -> {tds, motorsports}. """ entities = set() words = query.split() - prev_was_entity = False + prev_was_base_entity = False for i, word in enumerate(words): clean = word.strip('.,!?:;()[]"\'') if not clean: - prev_was_entity = False + prev_was_base_entity = False continue - is_entity = False + is_base_entity = False + # ALL-CAPS acronyms: TDS, API, GPU, AWS if clean.isupper() and len(clean) >= 2: entities.add(clean.lower()) - is_entity = True - elif i > 0 and clean[0].isupper() and clean.lower() not in KEY_TERM_STOPWORDS: - entities.add(clean.lower()) - is_entity = True + is_base_entity = True + # Capitalized proper nouns (any position, including first word) + elif clean[0].isupper() and clean.lower() not in KEY_TERM_STOPWORDS: + if i > 0: + # Non-first words: always treat as entity + entities.add(clean.lower()) + is_base_entity = True + elif clean.lower() not in QUERY_VERB_STOPWORDS: + # First word: also entity if not a common query verb + entities.add(clean.lower()) + is_base_entity = True + # Technical terms with special chars: node.js, C++, .NET elif any(c in clean for c in '.+-#@') and len(clean) >= 2: entities.add(clean.lower()) - is_entity = True + is_base_entity = True + # CamelCase: JavaScript, TypeScript elif len(clean) > 1 and any(c.isupper() for c in clean[1:]) and clean[0].isupper(): entities.add(clean.lower()) - is_entity = True - elif prev_was_entity and clean.lower() not in KEY_TERM_STOPWORDS: + is_base_entity = True + # Compound names: word following a BASE entity only (one level deep). + elif prev_was_base_entity and clean.lower() not in KEY_TERM_STOPWORDS: entities.add(clean.lower()) - is_entity = True - prev_was_entity = is_entity + prev_was_base_entity = is_base_entity return entities @@ -169,6 +214,13 @@ def lex_preserves_entities(line: str, entities: set) -> bool: return any(e in lower for e in entities) +def lex_has_filler(lex_line: str, query: str) -> bool: + """Does the lex line contain an INTERIOR_FILLER_WORDS word absent from the query?""" + query_words = set(query.lower().split()) + return any(w in INTERIOR_FILLER_WORDS and w not in query_words + for w in lex_line.lower().split()) + + def lex_is_generic(lex_line: str) -> bool: """Is this lex line a useless generic filler phrase?""" lower = lex_line.lower().strip() @@ -241,13 +293,14 @@ def _score_only_mode(query: str, base_query: str, text: str, used_thinking: bool # --- Diversity (0-30) --- diversity_score = 0 + div_threshold = 3 if len(base_query.split()) >= 5 else 2 if len(expected_items) >= 2: diversity_score += 15 # Check for diversity among items div_score = 15 for i, a in enumerate(expected_items): for b in expected_items[i+1:]: - if not is_diverse(a, b, 2): + if not is_diverse(a, b, div_threshold): div_score -= 5 deductions.append(f"{only_type} duplicate: {a[:20]}...") diversity_score += max(0, div_score) @@ -276,6 +329,11 @@ def _score_only_mode(query: str, base_query: str, text: str, used_thinking: bool quality_score += 5 else: deductions.append(f"{generic} generic lex phrases") + # Penalty: lex lines containing filler words absent from the query + filler_count = sum(1 for l in expected_items if lex_has_filler(l, base_query)) + if filler_count > 0: + quality_score -= filler_count * 3 + deductions.append(f"{filler_count} lex line(s) with filler words") elif only_type == "vec": # Vec should be natural language sentences @@ -405,10 +463,11 @@ def _fail(reason): if len(parsed["lex"]) + len(parsed["vec"]) >= 2: diversity_score += 5 + div_threshold = 3 if len(query.split()) >= 5 else 2 lex_div = 5 for i, a in enumerate(parsed["lex"]): for b in parsed["lex"][i+1:]: - if not is_diverse(a, b, 2): + if not is_diverse(a, b, div_threshold): lex_div -= 2 deductions.append(f"lex duplicate: {a[:20]}...") diversity_score += max(0, lex_div) @@ -416,7 +475,7 @@ def _fail(reason): vec_div = 5 for i, a in enumerate(parsed["vec"]): for b in parsed["vec"][i+1:]: - if not is_diverse(a, b, 3): + if not is_diverse(a, b, div_threshold): vec_div -= 2 deductions.append(f"vec duplicate: {a[:20]}...") diversity_score += max(0, vec_div) @@ -454,6 +513,9 @@ def _fail(reason): hyde_score += 5 hyde_score += max(0, 5 - word_repetition_penalty(hyde_text)) + # --- Extract entities (used by both quality and entity sections) --- + entities = extract_named_entities(query) + # --- Quality (0-20) --- quality_score = 5 # base relevance if parsed["lex"] and parsed["vec"]: @@ -475,10 +537,23 @@ def _fail(reason): else: deductions.append("lex missing key terms") + # Penalty: lex lines containing filler words absent from the query + if parsed["lex"]: + filler_count = sum(1 for l in parsed["lex"] if lex_has_filler(l, query)) + if filler_count > 0: + quality_score -= filler_count * 3 + deductions.append(f"{filler_count} lex line(s) with filler words") + + # Bonus: lex uses quoted phrases for multi-word queries (+3) + if parsed["lex"] and len(query.split()) >= 2: + lex_joined = " ".join(parsed["lex"]) + if '"' in lex_joined: + quality_score += 3 + # --- Entity Preservation (-45 to +20) --- entity_score = 0 - entities = extract_named_entities(query) if entities and parsed["lex"]: + # Per-line check: do lex lines contain entities? with_entities = sum(1 for l in parsed["lex"] if lex_preserves_entities(l, entities)) if with_entities == len(parsed["lex"]): entity_score += 15 @@ -488,6 +563,14 @@ def _fail(reason): entity_score -= 30 deductions.append(f"lex missing entities: {entities}") + # Per-entity coverage: is each entity mentioned somewhere in lex+vec? + all_output = " ".join(parsed["lex"] + parsed["vec"]).lower() + missing_entities = {e for e in entities if e not in all_output} + if missing_entities: + penalty = len(missing_entities) * 20 + entity_score -= penalty + deductions.append(f"entities dropped: {missing_entities}") + generic_count = sum(1 for l in parsed["lex"] if lex_is_generic(l)) if generic_count: entity_score -= generic_count * 15 @@ -592,6 +675,11 @@ def __call__(self, completions: list[str], prompts: list[str] = None, **kwargs) ("how to use React hooks", "lex: React hooks tutorial\nlex: useEffect useState\nvec: how to use React hooks in functional components"), ("auth", "Let me think...\nlex: auth"), ("auth", "lex: auth\nThis is some explanation\nvec: more"), + # Personal entity tests (issue #247: entity stripping) + ("meeting with Bob about C++", 'lex: Bob "C++" meeting\nlex: Bob C++ discussion notes\nvec: meeting notes with Bob about C++ programming'), + ("meeting with Bob about C++", "lex: c++ meetings\nvec: programming meeting notes"), # BAD: Bob is gone + # Quoted phrases bonus + ("python memory leak debugging", 'lex: "memory leak" python -java\nlex: tracemalloc profiler\nvec: how to find memory leaks in Python'), # "/only:" mode tests (slash prefix) ("auth /only:lex", "lex: auth setup\nlex: authentication config\nlex: login credentials"), ("auth /only:lex", "lex: auth setup\nvec: how to configure authentication"), # should fail - has vec diff --git a/finetune/train.py b/finetune/train.py index a0a49a5f..2d6646c2 100644 --- a/finetune/train.py +++ b/finetune/train.py @@ -18,23 +18,25 @@ """ Unified training script for QMD query expansion models. -Supports two stages: +Primary pipeline is SFT-only: sft - Supervised fine-tuning on labeled examples - grpo - Group Relative Policy Optimization (RL) on top of merged SFT weights + +GRPO was moved to `experiments/grpo/` and is not part of the main training +pipeline by default. Usage: uv run train.py sft --config configs/sft.yaml - uv run train.py grpo --config configs/grpo.yaml - uv run train.py grpo --config configs/grpo.yaml --dry-run """ import argparse import os import subprocess import sys +import time from pathlib import Path import yaml +from transformers import TrainerCallback def export_gguf(model, tokenizer, output_dir: str, model_name: str): @@ -156,6 +158,24 @@ def export_gguf(model, tokenizer, output_dir: str, model_name: str): print(f"GGUF files saved to: {gguf_dir}") +class TimedSaveCallback(TrainerCallback): + """Trigger periodic checkpoint saves based on elapsed wall-clock time.""" + + def __init__(self, interval_minutes: float): + self.interval_seconds = float(interval_minutes) * 60.0 + self.last_save_time = time.time() + + def on_step_end(self, args, state, control, **kwargs): + if not getattr(state, "is_world_process_zero", False): + return control + + now = time.time() + if now - self.last_save_time >= self.interval_seconds: + control.should_save = True + self.last_save_time = now + return control + + def run_eval(model_path: str) -> float | None: """Run eval.py on the trained model and return average score.""" print("\n" + "=" * 60) @@ -188,9 +208,7 @@ def run_eval(model_path: str) -> float | None: def cmd_sft(args): """Run supervised fine-tuning.""" import torch - import os from datasets import load_dataset - import torch import torch.distributed as dist from peft import LoraConfig from transformers import AutoTokenizer, AutoModelForCausalLM @@ -276,6 +294,22 @@ def cmd_sft(args): "{time}", now.strftime("%H:%M") ) + save_interval_minutes = cfg["training"].get("save_interval_minutes") + save_steps = cfg["training"].get("save_steps", 200) + save_total_limit = cfg["training"].get("save_total_limit", 2) + if save_interval_minutes: + # Prefer wall-clock checkpointing (for long jobs / preemption safety) + save_steps = max(save_steps, 10_000_000) + + callbacks = [] + if save_interval_minutes: + try: + interval_value = float(save_interval_minutes) + except (TypeError, ValueError): + interval_value = None + if interval_value and interval_value > 0: + callbacks.append(TimedSaveCallback(interval_value)) + config = SFTConfig( output_dir=output_dir, push_to_hub=push_to_hub, @@ -288,10 +322,10 @@ def cmd_sft(args): max_length=cfg["training"]["max_length"], logging_steps=10, save_strategy="steps", - save_steps=200, - save_total_limit=2, + save_steps=save_steps, + save_total_limit=save_total_limit, eval_strategy="steps", - eval_steps=200, + eval_steps=cfg["training"].get("eval_steps", 200), warmup_ratio=cfg["training"]["warmup_ratio"], lr_scheduler_type=cfg["training"]["lr_scheduler"], ddp_find_unused_parameters=cfg["training"].get( @@ -329,6 +363,7 @@ def cmd_sft(args): args=config, peft_config=peft_config, processing_class=tokenizer, + callbacks=callbacks, ) print("Starting SFT training...") @@ -377,7 +412,15 @@ def cmd_sft(args): def cmd_grpo(args): """Run GRPO reinforcement learning on top of merged SFT weights.""" + print( + "GRPO is not part of the main training pipeline and has been moved to `experiments/grpo/`." + ) + print("To run experimental GRPO, use:") + print(" cd finetune && uv run python experiments/grpo/grpo.py") + return + import torch + import torch.distributed as dist import os from datasets import load_dataset from peft import LoraConfig, PeftModel, get_peft_model @@ -494,6 +537,7 @@ def extract_prompt(example): task_type="CAUSAL_LM", target_modules=cfg["lora"]["target_modules"], modules_to_save=["embed_tokens", "lm_head"], # Critical for special tokens + ensure_weight_tying=True, ) model = get_peft_model(model, grpo_lora_config) model.print_trainable_parameters() @@ -510,6 +554,24 @@ def extract_prompt(example): if isinstance(learning_rate, str): learning_rate = float(learning_rate) + save_interval_minutes = cfg["training"].get("save_interval_minutes") + save_steps = cfg["training"].get("save_steps", 200) + save_total_limit = cfg["training"].get("save_total_limit", 2) + save_strategy = cfg["training"].get("save_strategy", "epoch") + if save_interval_minutes: + # Prefer wall-clock checkpointing (for long jobs / preemption safety) + save_steps = max(save_steps, 10_000_000) + save_strategy = "steps" + + callbacks = [] + if save_interval_minutes: + try: + interval_value = float(save_interval_minutes) + except (TypeError, ValueError): + interval_value = None + if interval_value and interval_value > 0: + callbacks.append(TimedSaveCallback(interval_value)) + config = GRPOConfig( output_dir=output_dir, push_to_hub=push_to_hub, @@ -524,7 +586,9 @@ def extract_prompt(example): max_grad_norm=cfg["training"]["max_grad_norm"], max_steps=cfg["training"].get("max_steps", -1), logging_steps=10, - save_strategy="epoch", + save_strategy=save_strategy, + save_steps=save_steps, + save_total_limit=save_total_limit, bf16=True, skip_memory_metrics=True, report_to=report_to, @@ -539,11 +603,18 @@ def extract_prompt(example): args=config, train_dataset=dataset, reward_funcs=[QMDRewardFunction()], + callbacks=callbacks, ) print("Starting GRPO training...") trainer.train() + is_main = os.environ.get("RANK", "0") == "0" + if dist.is_available() and dist.is_initialized(): + dist.barrier() + if not is_main: + return + if push_to_hub: print("Pushing to Hub...") trainer.push_to_hub() @@ -581,8 +652,6 @@ def main(): epilog=""" Examples: uv run train.py sft --config configs/sft.yaml - uv run train.py grpo --config configs/grpo.yaml - uv run train.py grpo --config configs/grpo.yaml --dry-run """, ) sub = parser.add_subparsers(dest="stage", required=True) @@ -593,19 +662,9 @@ def main(): "--dry-run", action="store_true", help="Print config and exit" ) - grpo_parser = sub.add_parser("grpo", help="GRPO reinforcement learning") - grpo_parser.add_argument("--config", required=True, help="Path to GRPO config YAML") - grpo_parser.add_argument( - "--dry-run", action="store_true", help="Print config, test reward, and exit" - ) - args = parser.parse_args() - if args.stage == "sft": - cmd_sft(args) - elif args.stage == "grpo": - cmd_grpo(args) - + cmd_sft(args) if __name__ == "__main__": main() diff --git a/finetune/uv.lock b/finetune/uv.lock index bc2fdcc7..31b91066 100644 --- a/finetune/uv.lock +++ b/finetune/uv.lock @@ -1,5 +1,5 @@ version = 1 -revision = 3 +revision = 1 requires-python = ">=3.10" resolution-markers = [ "python_full_version >= '3.13'", @@ -11,44 +11,44 @@ resolution-markers = [ [[package]] name = "accelerate" version = "1.12.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, { name = "safetensors" }, { name = "torch" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399, upload-time = "2025-11-21T11:27:46.973Z" } +sdist = { url = "https://files.pythonhosted.org/packages/4a/8e/ac2a9566747a93f8be36ee08532eb0160558b07630a081a6056a9f89bf1d/accelerate-1.12.0.tar.gz", hash = "sha256:70988c352feb481887077d2ab845125024b2a137a5090d6d7a32b57d03a45df6", size = 398399 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9f/d2/c581486aa6c4fbd7394c23c47b83fa1a919d34194e16944241daf9e762dd/accelerate-1.12.0-py3-none-any.whl", hash = "sha256:3e2091cd341423207e2f084a6654b1efcd250dc326f2a37d6dde446e07cabb11", size = 380935, upload-time = "2025-11-21T11:27:44.522Z" }, + { url = "https://files.pythonhosted.org/packages/9f/d2/c581486aa6c4fbd7394c23c47b83fa1a919d34194e16944241daf9e762dd/accelerate-1.12.0-py3-none-any.whl", hash = "sha256:3e2091cd341423207e2f084a6654b1efcd250dc326f2a37d6dde446e07cabb11", size = 380935 }, ] [[package]] name = "aiofiles" version = "24.1.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247, upload-time = "2024-06-24T11:02:03.584Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/03/a88171e277e8caa88a4c77808c20ebb04ba74cc4681bf1e9416c862de237/aiofiles-24.1.0.tar.gz", hash = "sha256:22a075c9e5a3810f0c2e48f3008c94d68c65d763b9b03857924c99e57355166c", size = 30247 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896, upload-time = "2024-06-24T11:02:01.529Z" }, + { url = "https://files.pythonhosted.org/packages/a5/45/30bb92d442636f570cb5651bc661f52b610e2eec3f891a5dc3a4c3667db0/aiofiles-24.1.0-py3-none-any.whl", hash = "sha256:b4ec55f4195e3eb5d7abd1bf7e061763e864dd4954231fb8539a0ef8bb8260e5", size = 15896 }, ] [[package]] name = "aiohappyeyeballs" version = "2.6.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760, upload-time = "2025-03-12T01:42:48.764Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/26/30/f84a107a9c4331c14b2b586036f40965c128aa4fee4dda5d3d51cb14ad54/aiohappyeyeballs-2.6.1.tar.gz", hash = "sha256:c3f9d0113123803ccadfdf3f0faa505bc78e6a72d1cc4806cbd719826e943558", size = 22760 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265, upload-time = "2025-03-12T01:42:47.083Z" }, + { url = "https://files.pythonhosted.org/packages/0f/15/5bf3b99495fb160b63f95972b81750f18f7f4e02ad051373b669d17d44f2/aiohappyeyeballs-2.6.1-py3-none-any.whl", hash = "sha256:f349ba8f4b75cb25c99c5c2d84e997e485204d2902a9597802b0371f09331fb8", size = 15265 }, ] [[package]] name = "aiohttp" version = "3.13.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "aiohappyeyeballs" }, { name = "aiosignal" }, @@ -59,648 +59,591 @@ dependencies = [ { name = "propcache" }, { name = "yarl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556, upload-time = "2026-01-03T17:33:05.204Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950, upload-time = "2026-01-03T17:29:13.002Z" }, - { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099, upload-time = "2026-01-03T17:29:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072, upload-time = "2026-01-03T17:29:16.922Z" }, - { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588, upload-time = "2026-01-03T17:29:18.539Z" }, - { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334, upload-time = "2026-01-03T17:29:21.028Z" }, - { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656, upload-time = "2026-01-03T17:29:22.531Z" }, - { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625, upload-time = "2026-01-03T17:29:24.276Z" }, - { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604, upload-time = "2026-01-03T17:29:26.099Z" }, - { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370, upload-time = "2026-01-03T17:29:28.121Z" }, - { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023, upload-time = "2026-01-03T17:29:30.002Z" }, - { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680, upload-time = "2026-01-03T17:29:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407, upload-time = "2026-01-03T17:29:33.392Z" }, - { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047, upload-time = "2026-01-03T17:29:34.855Z" }, - { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264, upload-time = "2026-01-03T17:29:36.389Z" }, - { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275, upload-time = "2026-01-03T17:29:38.162Z" }, - { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053, upload-time = "2026-01-03T17:29:40.074Z" }, - { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687, upload-time = "2026-01-03T17:29:41.819Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051, upload-time = "2026-01-03T17:29:43.287Z" }, - { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234, upload-time = "2026-01-03T17:29:44.822Z" }, - { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979, upload-time = "2026-01-03T17:29:46.405Z" }, - { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297, upload-time = "2026-01-03T17:29:48.083Z" }, - { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172, upload-time = "2026-01-03T17:29:49.648Z" }, - { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405, upload-time = "2026-01-03T17:29:51.244Z" }, - { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449, upload-time = "2026-01-03T17:29:53.938Z" }, - { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444, upload-time = "2026-01-03T17:29:55.484Z" }, - { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038, upload-time = "2026-01-03T17:29:57.179Z" }, - { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156, upload-time = "2026-01-03T17:29:58.914Z" }, - { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340, upload-time = "2026-01-03T17:30:01.962Z" }, - { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041, upload-time = "2026-01-03T17:30:03.609Z" }, - { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024, upload-time = "2026-01-03T17:30:05.132Z" }, - { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590, upload-time = "2026-01-03T17:30:07.135Z" }, - { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355, upload-time = "2026-01-03T17:30:09.083Z" }, - { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701, upload-time = "2026-01-03T17:30:10.869Z" }, - { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678, upload-time = "2026-01-03T17:30:12.719Z" }, - { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732, upload-time = "2026-01-03T17:30:14.23Z" }, - { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293, upload-time = "2026-01-03T17:30:15.96Z" }, - { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533, upload-time = "2026-01-03T17:30:17.431Z" }, - { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839, upload-time = "2026-01-03T17:30:19.422Z" }, - { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932, upload-time = "2026-01-03T17:30:21.756Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906, upload-time = "2026-01-03T17:30:23.932Z" }, - { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020, upload-time = "2026-01-03T17:30:26Z" }, - { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181, upload-time = "2026-01-03T17:30:27.554Z" }, - { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794, upload-time = "2026-01-03T17:30:29.254Z" }, - { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900, upload-time = "2026-01-03T17:30:31.033Z" }, - { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239, upload-time = "2026-01-03T17:30:32.703Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527, upload-time = "2026-01-03T17:30:34.695Z" }, - { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489, upload-time = "2026-01-03T17:30:36.864Z" }, - { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852, upload-time = "2026-01-03T17:30:39.433Z" }, - { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379, upload-time = "2026-01-03T17:30:41.081Z" }, - { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253, upload-time = "2026-01-03T17:30:42.644Z" }, - { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407, upload-time = "2026-01-03T17:30:44.195Z" }, - { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190, upload-time = "2026-01-03T17:30:45.832Z" }, - { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783, upload-time = "2026-01-03T17:30:47.466Z" }, - { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704, upload-time = "2026-01-03T17:30:49.373Z" }, - { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652, upload-time = "2026-01-03T17:30:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014, upload-time = "2026-01-03T17:30:52.729Z" }, - { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777, upload-time = "2026-01-03T17:30:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276, upload-time = "2026-01-03T17:30:56.512Z" }, - { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131, upload-time = "2026-01-03T17:30:58.256Z" }, - { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863, upload-time = "2026-01-03T17:31:00.445Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793, upload-time = "2026-01-03T17:31:03.024Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676, upload-time = "2026-01-03T17:31:04.842Z" }, - { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217, upload-time = "2026-01-03T17:31:06.868Z" }, - { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303, upload-time = "2026-01-03T17:31:08.958Z" }, - { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673, upload-time = "2026-01-03T17:31:10.676Z" }, - { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120, upload-time = "2026-01-03T17:31:12.575Z" }, - { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383, upload-time = "2026-01-03T17:31:14.382Z" }, - { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899, upload-time = "2026-01-03T17:31:15.958Z" }, - { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238, upload-time = "2026-01-03T17:31:17.909Z" }, - { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292, upload-time = "2026-01-03T17:31:19.919Z" }, - { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021, upload-time = "2026-01-03T17:31:21.636Z" }, - { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263, upload-time = "2026-01-03T17:31:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107, upload-time = "2026-01-03T17:31:25.334Z" }, - { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196, upload-time = "2026-01-03T17:31:27.394Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591, upload-time = "2026-01-03T17:31:29.238Z" }, - { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277, upload-time = "2026-01-03T17:31:31.053Z" }, - { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575, upload-time = "2026-01-03T17:31:32.87Z" }, - { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455, upload-time = "2026-01-03T17:31:34.76Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417, upload-time = "2026-01-03T17:31:36.699Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968, upload-time = "2026-01-03T17:31:38.622Z" }, - { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690, upload-time = "2026-01-03T17:31:40.57Z" }, - { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390, upload-time = "2026-01-03T17:31:42.857Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188, upload-time = "2026-01-03T17:31:44.984Z" }, - { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126, upload-time = "2026-01-03T17:31:47.463Z" }, - { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128, upload-time = "2026-01-03T17:31:49.2Z" }, - { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512, upload-time = "2026-01-03T17:31:51.134Z" }, - { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444, upload-time = "2026-01-03T17:31:52.85Z" }, - { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798, upload-time = "2026-01-03T17:31:54.91Z" }, - { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835, upload-time = "2026-01-03T17:31:56.733Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486, upload-time = "2026-01-03T17:31:58.65Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951, upload-time = "2026-01-03T17:32:00.989Z" }, - { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001, upload-time = "2026-01-03T17:32:03.122Z" }, - { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246, upload-time = "2026-01-03T17:32:05.255Z" }, - { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131, upload-time = "2026-01-03T17:32:07.607Z" }, - { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196, upload-time = "2026-01-03T17:32:09.59Z" }, - { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841, upload-time = "2026-01-03T17:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193, upload-time = "2026-01-03T17:32:13.705Z" }, - { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979, upload-time = "2026-01-03T17:32:15.965Z" }, - { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193, upload-time = "2026-01-03T17:32:18.219Z" }, - { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801, upload-time = "2026-01-03T17:32:20.25Z" }, - { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523, upload-time = "2026-01-03T17:32:22.215Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694, upload-time = "2026-01-03T17:32:24.546Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/50/42/32cf8e7704ceb4481406eb87161349abb46a57fee3f008ba9cb610968646/aiohttp-3.13.3.tar.gz", hash = "sha256:a949eee43d3782f2daae4f4a2819b2cb9b0c5d3b7f7a927067cc84dafdbb9f88", size = 7844556 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/d6/5aec9313ee6ea9c7cde8b891b69f4ff4001416867104580670a31daeba5b/aiohttp-3.13.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a372fd5afd301b3a89582817fdcdb6c34124787c70dbcc616f259013e7eef7", size = 738950 }, + { url = "https://files.pythonhosted.org/packages/68/03/8fa90a7e6d11ff20a18837a8e2b5dd23db01aabc475aa9271c8ad33299f5/aiohttp-3.13.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:147e422fd1223005c22b4fe080f5d93ced44460f5f9c105406b753612b587821", size = 496099 }, + { url = "https://files.pythonhosted.org/packages/d2/23/b81f744d402510a8366b74eb420fc0cc1170d0c43daca12d10814df85f10/aiohttp-3.13.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:859bd3f2156e81dd01432f5849fc73e2243d4a487c4fd26609b1299534ee1845", size = 491072 }, + { url = "https://files.pythonhosted.org/packages/d5/e1/56d1d1c0dd334cd203dd97706ce004c1aa24b34a813b0b8daf3383039706/aiohttp-3.13.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dca68018bf48c251ba17c72ed479f4dafe9dbd5a73707ad8d28a38d11f3d42af", size = 1671588 }, + { url = "https://files.pythonhosted.org/packages/5f/34/8d7f962604f4bc2b4e39eb1220dac7d4e4cba91fb9ba0474b4ecd67db165/aiohttp-3.13.3-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fee0c6bc7db1de362252affec009707a17478a00ec69f797d23ca256e36d5940", size = 1640334 }, + { url = "https://files.pythonhosted.org/packages/94/1d/fcccf2c668d87337ddeef9881537baee13c58d8f01f12ba8a24215f2b804/aiohttp-3.13.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c048058117fd649334d81b4b526e94bde3ccaddb20463a815ced6ecbb7d11160", size = 1722656 }, + { url = "https://files.pythonhosted.org/packages/aa/98/c6f3b081c4c606bc1e5f2ec102e87d6411c73a9ef3616fea6f2d5c98c062/aiohttp-3.13.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:215a685b6fbbfcf71dfe96e3eba7a6f58f10da1dfdf4889c7dd856abe430dca7", size = 1817625 }, + { url = "https://files.pythonhosted.org/packages/2c/c0/cfcc3d2e11b477f86e1af2863f3858c8850d751ce8dc39c4058a072c9e54/aiohttp-3.13.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de2c184bb1fe2cbd2cefba613e9db29a5ab559323f994b6737e370d3da0ac455", size = 1672604 }, + { url = "https://files.pythonhosted.org/packages/1e/77/6b4ffcbcac4c6a5d041343a756f34a6dd26174ae07f977a64fe028dda5b0/aiohttp-3.13.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:75ca857eba4e20ce9f546cd59c7007b33906a4cd48f2ff6ccf1ccfc3b646f279", size = 1554370 }, + { url = "https://files.pythonhosted.org/packages/f2/f0/e3ddfa93f17d689dbe014ba048f18e0c9f9b456033b70e94349a2e9048be/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81e97251d9298386c2b7dbeb490d3d1badbdc69107fb8c9299dd04eb39bddc0e", size = 1642023 }, + { url = "https://files.pythonhosted.org/packages/eb/45/c14019c9ec60a8e243d06d601b33dcc4fd92379424bde3021725859d7f99/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:c0e2d366af265797506f0283487223146af57815b388623f0357ef7eac9b209d", size = 1649680 }, + { url = "https://files.pythonhosted.org/packages/9c/fd/09c9451dae5aa5c5ed756df95ff9ef549d45d4be663bafd1e4954fd836f0/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4e239d501f73d6db1522599e14b9b321a7e3b1de66ce33d53a765d975e9f4808", size = 1692407 }, + { url = "https://files.pythonhosted.org/packages/a6/81/938bc2ec33c10efd6637ccb3d22f9f3160d08e8f3aa2587a2c2d5ab578eb/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0db318f7a6f065d84cb1e02662c526294450b314a02bd9e2a8e67f0d8564ce40", size = 1543047 }, + { url = "https://files.pythonhosted.org/packages/f7/23/80488ee21c8d567c83045e412e1d9b7077d27171591a4eb7822586e8c06a/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:bfc1cc2fe31a6026a8a88e4ecfb98d7f6b1fec150cfd708adbfd1d2f42257c29", size = 1715264 }, + { url = "https://files.pythonhosted.org/packages/e2/83/259a8da6683182768200b368120ab3deff5370bed93880fb9a3a86299f34/aiohttp-3.13.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af71fff7bac6bb7508956696dce8f6eec2bbb045eceb40343944b1ae62b5ef11", size = 1657275 }, + { url = "https://files.pythonhosted.org/packages/3f/4f/2c41f800a0b560785c10fb316216ac058c105f9be50bdc6a285de88db625/aiohttp-3.13.3-cp310-cp310-win32.whl", hash = "sha256:37da61e244d1749798c151421602884db5270faf479cf0ef03af0ff68954c9dd", size = 434053 }, + { url = "https://files.pythonhosted.org/packages/80/df/29cd63c7ecfdb65ccc12f7d808cac4fa2a19544660c06c61a4a48462de0c/aiohttp-3.13.3-cp310-cp310-win_amd64.whl", hash = "sha256:7e63f210bc1b57ef699035f2b4b6d9ce096b5914414a49b0997c839b2bd2223c", size = 456687 }, + { url = "https://files.pythonhosted.org/packages/f1/4c/a164164834f03924d9a29dc3acd9e7ee58f95857e0b467f6d04298594ebb/aiohttp-3.13.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5b6073099fb654e0a068ae678b10feff95c5cae95bbfcbfa7af669d361a8aa6b", size = 746051 }, + { url = "https://files.pythonhosted.org/packages/82/71/d5c31390d18d4f58115037c432b7e0348c60f6f53b727cad33172144a112/aiohttp-3.13.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cb93e166e6c28716c8c6aeb5f99dfb6d5ccf482d29fe9bf9a794110e6d0ab64", size = 499234 }, + { url = "https://files.pythonhosted.org/packages/0e/c9/741f8ac91e14b1d2e7100690425a5b2b919a87a5075406582991fb7de920/aiohttp-3.13.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:28e027cf2f6b641693a09f631759b4d9ce9165099d2b5d92af9bd4e197690eea", size = 494979 }, + { url = "https://files.pythonhosted.org/packages/75/b5/31d4d2e802dfd59f74ed47eba48869c1c21552c586d5e81a9d0d5c2ad640/aiohttp-3.13.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3b61b7169ababd7802f9568ed96142616a9118dd2be0d1866e920e77ec8fa92a", size = 1748297 }, + { url = "https://files.pythonhosted.org/packages/1a/3e/eefad0ad42959f226bb79664826883f2687d602a9ae2941a18e0484a74d3/aiohttp-3.13.3-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:80dd4c21b0f6237676449c6baaa1039abae86b91636b6c91a7f8e61c87f89540", size = 1707172 }, + { url = "https://files.pythonhosted.org/packages/c5/3a/54a64299fac2891c346cdcf2aa6803f994a2e4beeaf2e5a09dcc54acc842/aiohttp-3.13.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:65d2ccb7eabee90ce0503c17716fc77226be026dcc3e65cce859a30db715025b", size = 1805405 }, + { url = "https://files.pythonhosted.org/packages/6c/70/ddc1b7169cf64075e864f64595a14b147a895a868394a48f6a8031979038/aiohttp-3.13.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5b179331a481cb5529fca8b432d8d3c7001cb217513c94cd72d668d1248688a3", size = 1899449 }, + { url = "https://files.pythonhosted.org/packages/a1/7e/6815aab7d3a56610891c76ef79095677b8b5be6646aaf00f69b221765021/aiohttp-3.13.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d4c940f02f49483b18b079d1c27ab948721852b281f8b015c058100e9421dd1", size = 1748444 }, + { url = "https://files.pythonhosted.org/packages/6b/f2/073b145c4100da5511f457dc0f7558e99b2987cf72600d42b559db856fbc/aiohttp-3.13.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f9444f105664c4ce47a2a7171a2418bce5b7bae45fb610f4e2c36045d85911d3", size = 1606038 }, + { url = "https://files.pythonhosted.org/packages/0a/c1/778d011920cae03ae01424ec202c513dc69243cf2db303965615b81deeea/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:694976222c711d1d00ba131904beb60534f93966562f64440d0c9d41b8cdb440", size = 1724156 }, + { url = "https://files.pythonhosted.org/packages/0e/cb/3419eabf4ec1e9ec6f242c32b689248365a1cf621891f6f0386632525494/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f33ed1a2bf1997a36661874b017f5c4b760f41266341af36febaf271d179f6d7", size = 1722340 }, + { url = "https://files.pythonhosted.org/packages/7a/e5/76cf77bdbc435bf233c1f114edad39ed4177ccbfab7c329482b179cff4f4/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e636b3c5f61da31a92bf0d91da83e58fdfa96f178ba682f11d24f31944cdd28c", size = 1783041 }, + { url = "https://files.pythonhosted.org/packages/9d/d4/dd1ca234c794fd29c057ce8c0566b8ef7fd6a51069de5f06fa84b9a1971c/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5d2d94f1f5fcbe40838ac51a6ab5704a6f9ea42e72ceda48de5e6b898521da51", size = 1596024 }, + { url = "https://files.pythonhosted.org/packages/55/58/4345b5f26661a6180afa686c473620c30a66afdf120ed3dd545bbc809e85/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2be0e9ccf23e8a94f6f0650ce06042cefc6ac703d0d7ab6c7a917289f2539ad4", size = 1804590 }, + { url = "https://files.pythonhosted.org/packages/7b/06/05950619af6c2df7e0a431d889ba2813c9f0129cec76f663e547a5ad56f2/aiohttp-3.13.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9af5e68ee47d6534d36791bbe9b646d2a7c7deb6fc24d7943628edfbb3581f29", size = 1740355 }, + { url = "https://files.pythonhosted.org/packages/3e/80/958f16de79ba0422d7c1e284b2abd0c84bc03394fbe631d0a39ffa10e1eb/aiohttp-3.13.3-cp311-cp311-win32.whl", hash = "sha256:a2212ad43c0833a873d0fb3c63fa1bacedd4cf6af2fee62bf4b739ceec3ab239", size = 433701 }, + { url = "https://files.pythonhosted.org/packages/dc/f2/27cdf04c9851712d6c1b99df6821a6623c3c9e55956d4b1e318c337b5a48/aiohttp-3.13.3-cp311-cp311-win_amd64.whl", hash = "sha256:642f752c3eb117b105acbd87e2c143de710987e09860d674e068c4c2c441034f", size = 457678 }, + { url = "https://files.pythonhosted.org/packages/a0/be/4fc11f202955a69e0db803a12a062b8379c970c7c84f4882b6da17337cc1/aiohttp-3.13.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b903a4dfee7d347e2d87697d0713be59e0b87925be030c9178c5faa58ea58d5c", size = 739732 }, + { url = "https://files.pythonhosted.org/packages/97/2c/621d5b851f94fa0bb7430d6089b3aa970a9d9b75196bc93bb624b0db237a/aiohttp-3.13.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a45530014d7a1e09f4a55f4f43097ba0fd155089372e105e4bff4ca76cb1b168", size = 494293 }, + { url = "https://files.pythonhosted.org/packages/5d/43/4be01406b78e1be8320bb8316dc9c42dbab553d281c40364e0f862d5661c/aiohttp-3.13.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27234ef6d85c914f9efeb77ff616dbf4ad2380be0cda40b4db086ffc7ddd1b7d", size = 493533 }, + { url = "https://files.pythonhosted.org/packages/8d/a8/5a35dc56a06a2c90d4742cbf35294396907027f80eea696637945a106f25/aiohttp-3.13.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d32764c6c9aafb7fb55366a224756387cd50bfa720f32b88e0e6fa45b27dcf29", size = 1737839 }, + { url = "https://files.pythonhosted.org/packages/bf/62/4b9eeb331da56530bf2e198a297e5303e1c1ebdceeb00fe9b568a65c5a0c/aiohttp-3.13.3-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b1a6102b4d3ebc07dad44fbf07b45bb600300f15b552ddf1851b5390202ea2e3", size = 1703932 }, + { url = "https://files.pythonhosted.org/packages/7c/f6/af16887b5d419e6a367095994c0b1332d154f647e7dc2bd50e61876e8e3d/aiohttp-3.13.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c014c7ea7fb775dd015b2d3137378b7be0249a448a1612268b5a90c2d81de04d", size = 1771906 }, + { url = "https://files.pythonhosted.org/packages/ce/83/397c634b1bcc24292fa1e0c7822800f9f6569e32934bdeef09dae7992dfb/aiohttp-3.13.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2b8d8ddba8f95ba17582226f80e2de99c7a7948e66490ef8d947e272a93e9463", size = 1871020 }, + { url = "https://files.pythonhosted.org/packages/86/f6/a62cbbf13f0ac80a70f71b1672feba90fdb21fd7abd8dbf25c0105fb6fa3/aiohttp-3.13.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9ae8dd55c8e6c4257eae3a20fd2c8f41edaea5992ed67156642493b8daf3cecc", size = 1755181 }, + { url = "https://files.pythonhosted.org/packages/0a/87/20a35ad487efdd3fba93d5843efdfaa62d2f1479eaafa7453398a44faf13/aiohttp-3.13.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01ad2529d4b5035578f5081606a465f3b814c542882804e2e8cda61adf5c71bf", size = 1561794 }, + { url = "https://files.pythonhosted.org/packages/de/95/8fd69a66682012f6716e1bc09ef8a1a2a91922c5725cb904689f112309c4/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb4f7475e359992b580559e008c598091c45b5088f28614e855e42d39c2f1033", size = 1697900 }, + { url = "https://files.pythonhosted.org/packages/e5/66/7b94b3b5ba70e955ff597672dad1691333080e37f50280178967aff68657/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:c19b90316ad3b24c69cd78d5c9b4f3aa4497643685901185b65166293d36a00f", size = 1728239 }, + { url = "https://files.pythonhosted.org/packages/47/71/6f72f77f9f7d74719692ab65a2a0252584bf8d5f301e2ecb4c0da734530a/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:96d604498a7c782cb15a51c406acaea70d8c027ee6b90c569baa6e7b93073679", size = 1740527 }, + { url = "https://files.pythonhosted.org/packages/fa/b4/75ec16cbbd5c01bdaf4a05b19e103e78d7ce1ef7c80867eb0ace42ff4488/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:084911a532763e9d3dd95adf78a78f4096cd5f58cdc18e6fdbc1b58417a45423", size = 1554489 }, + { url = "https://files.pythonhosted.org/packages/52/8f/bc518c0eea29f8406dcf7ed1f96c9b48e3bc3995a96159b3fc11f9e08321/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7a4a94eb787e606d0a09404b9c38c113d3b099d508021faa615d70a0131907ce", size = 1767852 }, + { url = "https://files.pythonhosted.org/packages/9d/f2/a07a75173124f31f11ea6f863dc44e6f09afe2bca45dd4e64979490deab1/aiohttp-3.13.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:87797e645d9d8e222e04160ee32aa06bc5c163e8499f24db719e7852ec23093a", size = 1722379 }, + { url = "https://files.pythonhosted.org/packages/3c/4a/1a3fee7c21350cac78e5c5cef711bac1b94feca07399f3d406972e2d8fcd/aiohttp-3.13.3-cp312-cp312-win32.whl", hash = "sha256:b04be762396457bef43f3597c991e192ee7da460a4953d7e647ee4b1c28e7046", size = 428253 }, + { url = "https://files.pythonhosted.org/packages/d9/b7/76175c7cb4eb73d91ad63c34e29fc4f77c9386bba4a65b53ba8e05ee3c39/aiohttp-3.13.3-cp312-cp312-win_amd64.whl", hash = "sha256:e3531d63d3bdfa7e3ac5e9b27b2dd7ec9df3206a98e0b3445fa906f233264c57", size = 455407 }, + { url = "https://files.pythonhosted.org/packages/97/8a/12ca489246ca1faaf5432844adbfce7ff2cc4997733e0af120869345643a/aiohttp-3.13.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:5dff64413671b0d3e7d5918ea490bdccb97a4ad29b3f311ed423200b2203e01c", size = 734190 }, + { url = "https://files.pythonhosted.org/packages/32/08/de43984c74ed1fca5c014808963cc83cb00d7bb06af228f132d33862ca76/aiohttp-3.13.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87b9aab6d6ed88235aa2970294f496ff1a1f9adcd724d800e9b952395a80ffd9", size = 491783 }, + { url = "https://files.pythonhosted.org/packages/17/f8/8dd2cf6112a5a76f81f81a5130c57ca829d101ad583ce57f889179accdda/aiohttp-3.13.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:425c126c0dc43861e22cb1c14ba4c8e45d09516d0a3ae0a3f7494b79f5f233a3", size = 490704 }, + { url = "https://files.pythonhosted.org/packages/6d/40/a46b03ca03936f832bc7eaa47cfbb1ad012ba1be4790122ee4f4f8cba074/aiohttp-3.13.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f9120f7093c2a32d9647abcaf21e6ad275b4fbec5b55969f978b1a97c7c86bf", size = 1720652 }, + { url = "https://files.pythonhosted.org/packages/f7/7e/917fe18e3607af92657e4285498f500dca797ff8c918bd7d90b05abf6c2a/aiohttp-3.13.3-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:697753042d57f4bf7122cab985bf15d0cef23c770864580f5af4f52023a56bd6", size = 1692014 }, + { url = "https://files.pythonhosted.org/packages/71/b6/cefa4cbc00d315d68973b671cf105b21a609c12b82d52e5d0c9ae61d2a09/aiohttp-3.13.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6de499a1a44e7de70735d0b39f67c8f25eb3d91eb3103be99ca0fa882cdd987d", size = 1759777 }, + { url = "https://files.pythonhosted.org/packages/fb/e3/e06ee07b45e59e6d81498b591fc589629be1553abb2a82ce33efe2a7b068/aiohttp-3.13.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:37239e9f9a7ea9ac5bf6b92b0260b01f8a22281996da609206a84df860bc1261", size = 1861276 }, + { url = "https://files.pythonhosted.org/packages/7c/24/75d274228acf35ceeb2850b8ce04de9dd7355ff7a0b49d607ee60c29c518/aiohttp-3.13.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f76c1e3fe7d7c8afad7ed193f89a292e1999608170dcc9751a7462a87dfd5bc0", size = 1743131 }, + { url = "https://files.pythonhosted.org/packages/04/98/3d21dde21889b17ca2eea54fdcff21b27b93f45b7bb94ca029c31ab59dc3/aiohttp-3.13.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fc290605db2a917f6e81b0e1e0796469871f5af381ce15c604a3c5c7e51cb730", size = 1556863 }, + { url = "https://files.pythonhosted.org/packages/9e/84/da0c3ab1192eaf64782b03971ab4055b475d0db07b17eff925e8c93b3aa5/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4021b51936308aeea0367b8f006dc999ca02bc118a0cc78c303f50a2ff6afb91", size = 1682793 }, + { url = "https://files.pythonhosted.org/packages/ff/0f/5802ada182f575afa02cbd0ec5180d7e13a402afb7c2c03a9aa5e5d49060/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:49a03727c1bba9a97d3e93c9f93ca03a57300f484b6e935463099841261195d3", size = 1716676 }, + { url = "https://files.pythonhosted.org/packages/3f/8c/714d53bd8b5a4560667f7bbbb06b20c2382f9c7847d198370ec6526af39c/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3d9908a48eb7416dc1f4524e69f1d32e5d90e3981e4e37eb0aa1cd18f9cfa2a4", size = 1733217 }, + { url = "https://files.pythonhosted.org/packages/7d/79/e2176f46d2e963facea939f5be2d26368ce543622be6f00a12844d3c991f/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:2712039939ec963c237286113c68dbad80a82a4281543f3abf766d9d73228998", size = 1552303 }, + { url = "https://files.pythonhosted.org/packages/ab/6a/28ed4dea1759916090587d1fe57087b03e6c784a642b85ef48217b0277ae/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:7bfdc049127717581866fa4708791220970ce291c23e28ccf3922c700740fdc0", size = 1763673 }, + { url = "https://files.pythonhosted.org/packages/e8/35/4a3daeb8b9fab49240d21c04d50732313295e4bd813a465d840236dd0ce1/aiohttp-3.13.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8057c98e0c8472d8846b9c79f56766bcc57e3e8ac7bfd510482332366c56c591", size = 1721120 }, + { url = "https://files.pythonhosted.org/packages/bc/9f/d643bb3c5fb99547323e635e251c609fbbc660d983144cfebec529e09264/aiohttp-3.13.3-cp313-cp313-win32.whl", hash = "sha256:1449ceddcdbcf2e0446957863af03ebaaa03f94c090f945411b61269e2cb5daf", size = 427383 }, + { url = "https://files.pythonhosted.org/packages/4e/f1/ab0395f8a79933577cdd996dd2f9aa6014af9535f65dddcf88204682fe62/aiohttp-3.13.3-cp313-cp313-win_amd64.whl", hash = "sha256:693781c45a4033d31d4187d2436f5ac701e7bbfe5df40d917736108c1cc7436e", size = 453899 }, + { url = "https://files.pythonhosted.org/packages/99/36/5b6514a9f5d66f4e2597e40dea2e3db271e023eb7a5d22defe96ba560996/aiohttp-3.13.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:ea37047c6b367fd4bd632bff8077449b8fa034b69e812a18e0132a00fae6e808", size = 737238 }, + { url = "https://files.pythonhosted.org/packages/f7/49/459327f0d5bcd8c6c9ca69e60fdeebc3622861e696490d8674a6d0cb90a6/aiohttp-3.13.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:6fc0e2337d1a4c3e6acafda6a78a39d4c14caea625124817420abceed36e2415", size = 492292 }, + { url = "https://files.pythonhosted.org/packages/e8/0b/b97660c5fd05d3495b4eb27f2d0ef18dc1dc4eff7511a9bf371397ff0264/aiohttp-3.13.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c685f2d80bb67ca8c3837823ad76196b3694b0159d232206d1e461d3d434666f", size = 493021 }, + { url = "https://files.pythonhosted.org/packages/54/d4/438efabdf74e30aeceb890c3290bbaa449780583b1270b00661126b8aae4/aiohttp-3.13.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e377758516d262bde50c2584fc6c578af272559c409eecbdd2bae1601184d6", size = 1717263 }, + { url = "https://files.pythonhosted.org/packages/71/f2/7bddc7fd612367d1459c5bcf598a9e8f7092d6580d98de0e057eb42697ad/aiohttp-3.13.3-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:34749271508078b261c4abb1767d42b8d0c0cc9449c73a4df494777dc55f0687", size = 1669107 }, + { url = "https://files.pythonhosted.org/packages/00/5a/1aeaecca40e22560f97610a329e0e5efef5e0b5afdf9f857f0d93839ab2e/aiohttp-3.13.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:82611aeec80eb144416956ec85b6ca45a64d76429c1ed46ae1b5f86c6e0c9a26", size = 1760196 }, + { url = "https://files.pythonhosted.org/packages/f8/f8/0ff6992bea7bd560fc510ea1c815f87eedd745fe035589c71ce05612a19a/aiohttp-3.13.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2fff83cfc93f18f215896e3a190e8e5cb413ce01553901aca925176e7568963a", size = 1843591 }, + { url = "https://files.pythonhosted.org/packages/e3/d1/e30e537a15f53485b61f5be525f2157da719819e8377298502aebac45536/aiohttp-3.13.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bbe7d4cecacb439e2e2a8a1a7b935c25b812af7a5fd26503a66dadf428e79ec1", size = 1720277 }, + { url = "https://files.pythonhosted.org/packages/84/45/23f4c451d8192f553d38d838831ebbc156907ea6e05557f39563101b7717/aiohttp-3.13.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b928f30fe49574253644b1ca44b1b8adbd903aa0da4b9054a6c20fc7f4092a25", size = 1548575 }, + { url = "https://files.pythonhosted.org/packages/6a/ed/0a42b127a43712eda7807e7892c083eadfaf8429ca8fb619662a530a3aab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7b5e8fe4de30df199155baaf64f2fcd604f4c678ed20910db8e2c66dc4b11603", size = 1679455 }, + { url = "https://files.pythonhosted.org/packages/2e/b5/c05f0c2b4b4fe2c9d55e73b6d3ed4fd6c9dc2684b1d81cbdf77e7fad9adb/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:8542f41a62bcc58fc7f11cf7c90e0ec324ce44950003feb70640fc2a9092c32a", size = 1687417 }, + { url = "https://files.pythonhosted.org/packages/c9/6b/915bc5dad66aef602b9e459b5a973529304d4e89ca86999d9d75d80cbd0b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:5e1d8c8b8f1d91cd08d8f4a3c2b067bfca6ec043d3ff36de0f3a715feeedf926", size = 1729968 }, + { url = "https://files.pythonhosted.org/packages/11/3b/e84581290a9520024a08640b63d07673057aec5ca548177a82026187ba73/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:90455115e5da1c3c51ab619ac57f877da8fd6d73c05aacd125c5ae9819582aba", size = 1545690 }, + { url = "https://files.pythonhosted.org/packages/f5/04/0c3655a566c43fd647c81b895dfe361b9f9ad6d58c19309d45cff52d6c3b/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:042e9e0bcb5fba81886c8b4fbb9a09d6b8a00245fd8d88e4d989c1f96c74164c", size = 1746390 }, + { url = "https://files.pythonhosted.org/packages/1f/53/71165b26978f719c3419381514c9690bd5980e764a09440a10bb816ea4ab/aiohttp-3.13.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2eb752b102b12a76ca02dff751a801f028b4ffbbc478840b473597fc91a9ed43", size = 1702188 }, + { url = "https://files.pythonhosted.org/packages/29/a7/cbe6c9e8e136314fa1980da388a59d2f35f35395948a08b6747baebb6aa6/aiohttp-3.13.3-cp314-cp314-win32.whl", hash = "sha256:b556c85915d8efaed322bf1bdae9486aa0f3f764195a0fb6ee962e5c71ef5ce1", size = 433126 }, + { url = "https://files.pythonhosted.org/packages/de/56/982704adea7d3b16614fc5936014e9af85c0e34b58f9046655817f04306e/aiohttp-3.13.3-cp314-cp314-win_amd64.whl", hash = "sha256:9bf9f7a65e7aa20dd764151fb3d616c81088f91f8df39c3893a536e279b4b984", size = 459128 }, + { url = "https://files.pythonhosted.org/packages/6c/2a/3c79b638a9c3d4658d345339d22070241ea341ed4e07b5ac60fb0f418003/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:05861afbbec40650d8a07ea324367cb93e9e8cc7762e04dd4405df99fa65159c", size = 769512 }, + { url = "https://files.pythonhosted.org/packages/29/b9/3e5014d46c0ab0db8707e0ac2711ed28c4da0218c358a4e7c17bae0d8722/aiohttp-3.13.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2fc82186fadc4a8316768d61f3722c230e2c1dcab4200d52d2ebdf2482e47592", size = 506444 }, + { url = "https://files.pythonhosted.org/packages/90/03/c1d4ef9a054e151cd7839cdc497f2638f00b93cbe8043983986630d7a80c/aiohttp-3.13.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0add0900ff220d1d5c5ebbf99ed88b0c1bbf87aa7e4262300ed1376a6b13414f", size = 510798 }, + { url = "https://files.pythonhosted.org/packages/ea/76/8c1e5abbfe8e127c893fe7ead569148a4d5a799f7cf958d8c09f3eedf097/aiohttp-3.13.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:568f416a4072fbfae453dcf9a99194bbb8bdeab718e08ee13dfa2ba0e4bebf29", size = 1868835 }, + { url = "https://files.pythonhosted.org/packages/8e/ac/984c5a6f74c363b01ff97adc96a3976d9c98940b8969a1881575b279ac5d/aiohttp-3.13.3-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:add1da70de90a2569c5e15249ff76a631ccacfe198375eead4aadf3b8dc849dc", size = 1720486 }, + { url = "https://files.pythonhosted.org/packages/b2/9a/b7039c5f099c4eb632138728828b33428585031a1e658d693d41d07d89d1/aiohttp-3.13.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:10b47b7ba335d2e9b1239fa571131a87e2d8ec96b333e68b2a305e7a98b0bae2", size = 1847951 }, + { url = "https://files.pythonhosted.org/packages/3c/02/3bec2b9a1ba3c19ff89a43a19324202b8eb187ca1e928d8bdac9bbdddebd/aiohttp-3.13.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3dd4dce1c718e38081c8f35f323209d4c1df7d4db4bab1b5c88a6b4d12b74587", size = 1941001 }, + { url = "https://files.pythonhosted.org/packages/37/df/d879401cedeef27ac4717f6426c8c36c3091c6e9f08a9178cc87549c537f/aiohttp-3.13.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34bac00a67a812570d4a460447e1e9e06fae622946955f939051e7cc895cfab8", size = 1797246 }, + { url = "https://files.pythonhosted.org/packages/8d/15/be122de1f67e6953add23335c8ece6d314ab67c8bebb3f181063010795a7/aiohttp-3.13.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a19884d2ee70b06d9204b2727a7b9f983d0c684c650254679e716b0b77920632", size = 1627131 }, + { url = "https://files.pythonhosted.org/packages/12/12/70eedcac9134cfa3219ab7af31ea56bc877395b1ac30d65b1bc4b27d0438/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5f8ca7f2bb6ba8348a3614c7918cc4bb73268c5ac2a207576b7afea19d3d9f64", size = 1795196 }, + { url = "https://files.pythonhosted.org/packages/32/11/b30e1b1cd1f3054af86ebe60df96989c6a414dd87e27ad16950eee420bea/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:b0d95340658b9d2f11d9697f59b3814a9d3bb4b7a7c20b131df4bcef464037c0", size = 1782841 }, + { url = "https://files.pythonhosted.org/packages/88/0d/d98a9367b38912384a17e287850f5695c528cff0f14f791ce8ee2e4f7796/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1e53262fd202e4b40b70c3aff944a8155059beedc8a89bba9dc1f9ef06a1b56", size = 1795193 }, + { url = "https://files.pythonhosted.org/packages/43/a5/a2dfd1f5ff5581632c7f6a30e1744deda03808974f94f6534241ef60c751/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:d60ac9663f44168038586cab2157e122e46bdef09e9368b37f2d82d354c23f72", size = 1621979 }, + { url = "https://files.pythonhosted.org/packages/fa/f0/12973c382ae7c1cccbc4417e129c5bf54c374dfb85af70893646e1f0e749/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:90751b8eed69435bac9ff4e3d2f6b3af1f57e37ecb0fbeee59c0174c9e2d41df", size = 1822193 }, + { url = "https://files.pythonhosted.org/packages/3c/5f/24155e30ba7f8c96918af1350eb0663e2430aad9e001c0489d89cd708ab1/aiohttp-3.13.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fc353029f176fd2b3ec6cfc71be166aba1936fe5d73dd1992ce289ca6647a9aa", size = 1769801 }, + { url = "https://files.pythonhosted.org/packages/eb/f8/7314031ff5c10e6ece114da79b338ec17eeff3a079e53151f7e9f43c4723/aiohttp-3.13.3-cp314-cp314t-win32.whl", hash = "sha256:2e41b18a58da1e474a057b3d35248d8320029f61d70a37629535b16a0c8f3767", size = 466523 }, + { url = "https://files.pythonhosted.org/packages/b4/63/278a98c715ae467624eafe375542d8ba9b4383a016df8fdefe0ae28382a7/aiohttp-3.13.3-cp314-cp314t-win_amd64.whl", hash = "sha256:44531a36aa2264a1860089ffd4dce7baf875ee5a6079d5fb42e261c704ef7344", size = 499694 }, ] [[package]] name = "aiosignal" version = "1.4.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "frozenlist" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, -] - -[[package]] -name = "alembic" -version = "1.18.3" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "mako" }, - { name = "sqlalchemy" }, - { name = "tomli", marker = "python_full_version < '3.11'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/79/41/ab8f624929847b49f84955c594b165855efd829b0c271e1a8cac694138e5/alembic-1.18.3.tar.gz", hash = "sha256:1212aa3778626f2b0f0aa6dd4e99a5f99b94bd25a0c1ac0bba3be65e081e50b0", size = 2052564, upload-time = "2026-01-29T20:24:15.124Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/45/8e/d79281f323e7469b060f15bd229e48d7cdd219559e67e71c013720a88340/alembic-1.18.3-py3-none-any.whl", hash = "sha256:12a0359bfc068a4ecbb9b3b02cf77856033abfdb59e4a5aca08b7eacd7b74ddd", size = 262282, upload-time = "2026-01-29T20:24:17.488Z" }, + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490 }, ] [[package]] name = "annotated-doc" version = "0.0.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303 }, ] [[package]] name = "annotated-types" version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081 } wheels = [ - { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643 }, ] [[package]] name = "anyio" version = "4.12.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, { name = "idna" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685, upload-time = "2026-01-06T11:45:21.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/96/f0/5eb65b2bb0d09ac6776f2eb54adee6abe8228ea05b20a5ad0e4945de8aac/anyio-4.12.1.tar.gz", hash = "sha256:41cfcc3a4c85d3f05c932da7c26d0201ac36f72abd4435ba90d0464a3ffed703", size = 228685 } wheels = [ - { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592, upload-time = "2026-01-06T11:45:19.497Z" }, + { url = "https://files.pythonhosted.org/packages/38/0e/27be9fdef66e72d64c0cdc3cc2823101b80585f8119b5c112c2e8f5f7dab/anyio-4.12.1-py3-none-any.whl", hash = "sha256:d405828884fc140aa80a3c667b8beed277f1dfedec42ba031bd6ac3db606ab6c", size = 113592 }, ] [[package]] name = "async-timeout" version = "5.0.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, -] - -[[package]] -name = "asyncer" -version = "0.0.8" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/ff/67/7ea59c3e69eaeee42e7fc91a5be67ca5849c8979acac2b920249760c6af2/asyncer-0.0.8.tar.gz", hash = "sha256:a589d980f57e20efb07ed91d0dbe67f1d2fd343e7142c66d3a099f05c620739c", size = 18217, upload-time = "2024-08-24T23:15:36.449Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/04/15b6ca6b7842eda2748bda0a0af73f2d054e9344320f8bba01f994294bcb/asyncer-0.0.8-py3-none-any.whl", hash = "sha256:5920d48fc99c8f8f0f1576e1882f5022885589c5fcbc46ce4224ec3e53776eeb", size = 9209, upload-time = "2024-08-24T23:15:35.317Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233 }, ] [[package]] name = "attrs" version = "25.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615 }, ] [[package]] name = "audioop-lts" version = "0.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/38/53/946db57842a50b2da2e0c1e34bd37f36f5aadba1a929a3971c5d7841dbca/audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0", size = 30686, upload-time = "2025-08-05T16:43:17.409Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/de/d4/94d277ca941de5a507b07f0b592f199c22454eeaec8f008a286b3fbbacd6/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800", size = 46523, upload-time = "2025-08-05T16:42:20.836Z" }, - { url = "https://files.pythonhosted.org/packages/f8/5a/656d1c2da4b555920ce4177167bfeb8623d98765594af59702c8873f60ec/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303", size = 27455, upload-time = "2025-08-05T16:42:22.283Z" }, - { url = "https://files.pythonhosted.org/packages/1b/83/ea581e364ce7b0d41456fb79d6ee0ad482beda61faf0cab20cbd4c63a541/audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75", size = 26997, upload-time = "2025-08-05T16:42:23.849Z" }, - { url = "https://files.pythonhosted.org/packages/b8/3b/e8964210b5e216e5041593b7d33e97ee65967f17c282e8510d19c666dab4/audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d", size = 85844, upload-time = "2025-08-05T16:42:25.208Z" }, - { url = "https://files.pythonhosted.org/packages/c7/2e/0a1c52faf10d51def20531a59ce4c706cb7952323b11709e10de324d6493/audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b", size = 85056, upload-time = "2025-08-05T16:42:26.559Z" }, - { url = "https://files.pythonhosted.org/packages/75/e8/cd95eef479656cb75ab05dfece8c1f8c395d17a7c651d88f8e6e291a63ab/audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8", size = 93892, upload-time = "2025-08-05T16:42:27.902Z" }, - { url = "https://files.pythonhosted.org/packages/5c/1e/a0c42570b74f83efa5cca34905b3eef03f7ab09fe5637015df538a7f3345/audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc", size = 96660, upload-time = "2025-08-05T16:42:28.9Z" }, - { url = "https://files.pythonhosted.org/packages/50/d5/8a0ae607ca07dbb34027bac8db805498ee7bfecc05fd2c148cc1ed7646e7/audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3", size = 79143, upload-time = "2025-08-05T16:42:29.929Z" }, - { url = "https://files.pythonhosted.org/packages/12/17/0d28c46179e7910bfb0bb62760ccb33edb5de973052cb2230b662c14ca2e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6", size = 84313, upload-time = "2025-08-05T16:42:30.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/ba/bd5d3806641564f2024e97ca98ea8f8811d4e01d9b9f9831474bc9e14f9e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a", size = 93044, upload-time = "2025-08-05T16:42:31.959Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5e/435ce8d5642f1f7679540d1e73c1c42d933331c0976eb397d1717d7f01a3/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623", size = 78766, upload-time = "2025-08-05T16:42:33.302Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3b/b909e76b606cbfd53875693ec8c156e93e15a1366a012f0b7e4fb52d3c34/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7", size = 87640, upload-time = "2025-08-05T16:42:34.854Z" }, - { url = "https://files.pythonhosted.org/packages/30/e7/8f1603b4572d79b775f2140d7952f200f5e6c62904585d08a01f0a70393a/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449", size = 86052, upload-time = "2025-08-05T16:42:35.839Z" }, - { url = "https://files.pythonhosted.org/packages/b5/96/c37846df657ccdda62ba1ae2b6534fa90e2e1b1742ca8dcf8ebd38c53801/audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636", size = 26185, upload-time = "2025-08-05T16:42:37.04Z" }, - { url = "https://files.pythonhosted.org/packages/34/a5/9d78fdb5b844a83da8a71226c7bdae7cc638861085fff7a1d707cb4823fa/audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e", size = 30503, upload-time = "2025-08-05T16:42:38.427Z" }, - { url = "https://files.pythonhosted.org/packages/34/25/20d8fde083123e90c61b51afb547bb0ea7e77bab50d98c0ab243d02a0e43/audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f", size = 24173, upload-time = "2025-08-05T16:42:39.704Z" }, - { url = "https://files.pythonhosted.org/packages/58/a7/0a764f77b5c4ac58dc13c01a580f5d32ae8c74c92020b961556a43e26d02/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09", size = 47096, upload-time = "2025-08-05T16:42:40.684Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ed/ebebedde1a18848b085ad0fa54b66ceb95f1f94a3fc04f1cd1b5ccb0ed42/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58", size = 27748, upload-time = "2025-08-05T16:42:41.992Z" }, - { url = "https://files.pythonhosted.org/packages/cb/6e/11ca8c21af79f15dbb1c7f8017952ee8c810c438ce4e2b25638dfef2b02c/audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19", size = 27329, upload-time = "2025-08-05T16:42:42.987Z" }, - { url = "https://files.pythonhosted.org/packages/84/52/0022f93d56d85eec5da6b9da6a958a1ef09e80c39f2cc0a590c6af81dcbb/audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911", size = 92407, upload-time = "2025-08-05T16:42:44.336Z" }, - { url = "https://files.pythonhosted.org/packages/87/1d/48a889855e67be8718adbc7a01f3c01d5743c325453a5e81cf3717664aad/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9", size = 91811, upload-time = "2025-08-05T16:42:45.325Z" }, - { url = "https://files.pythonhosted.org/packages/98/a6/94b7213190e8077547ffae75e13ed05edc488653c85aa5c41472c297d295/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe", size = 100470, upload-time = "2025-08-05T16:42:46.468Z" }, - { url = "https://files.pythonhosted.org/packages/e9/e9/78450d7cb921ede0cfc33426d3a8023a3bda755883c95c868ee36db8d48d/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132", size = 103878, upload-time = "2025-08-05T16:42:47.576Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e2/cd5439aad4f3e34ae1ee852025dc6aa8f67a82b97641e390bf7bd9891d3e/audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753", size = 84867, upload-time = "2025-08-05T16:42:49.003Z" }, - { url = "https://files.pythonhosted.org/packages/68/4b/9d853e9076c43ebba0d411e8d2aa19061083349ac695a7d082540bad64d0/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb", size = 90001, upload-time = "2025-08-05T16:42:50.038Z" }, - { url = "https://files.pythonhosted.org/packages/58/26/4bae7f9d2f116ed5593989d0e521d679b0d583973d203384679323d8fa85/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093", size = 99046, upload-time = "2025-08-05T16:42:51.111Z" }, - { url = "https://files.pythonhosted.org/packages/b2/67/a9f4fb3e250dda9e9046f8866e9fa7d52664f8985e445c6b4ad6dfb55641/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7", size = 84788, upload-time = "2025-08-05T16:42:52.198Z" }, - { url = "https://files.pythonhosted.org/packages/70/f7/3de86562db0121956148bcb0fe5b506615e3bcf6e63c4357a612b910765a/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c", size = 94472, upload-time = "2025-08-05T16:42:53.59Z" }, - { url = "https://files.pythonhosted.org/packages/f1/32/fd772bf9078ae1001207d2df1eef3da05bea611a87dd0e8217989b2848fa/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5", size = 92279, upload-time = "2025-08-05T16:42:54.632Z" }, - { url = "https://files.pythonhosted.org/packages/4f/41/affea7181592ab0ab560044632571a38edaf9130b84928177823fbf3176a/audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917", size = 26568, upload-time = "2025-08-05T16:42:55.627Z" }, - { url = "https://files.pythonhosted.org/packages/28/2b/0372842877016641db8fc54d5c88596b542eec2f8f6c20a36fb6612bf9ee/audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547", size = 30942, upload-time = "2025-08-05T16:42:56.674Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/baf2b9cc7e96c179bb4a54f30fcd83e6ecb340031bde68f486403f943768/audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969", size = 24603, upload-time = "2025-08-05T16:42:57.571Z" }, - { url = "https://files.pythonhosted.org/packages/5c/73/413b5a2804091e2c7d5def1d618e4837f1cb82464e230f827226278556b7/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6", size = 47104, upload-time = "2025-08-05T16:42:58.518Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8c/daa3308dc6593944410c2c68306a5e217f5c05b70a12e70228e7dd42dc5c/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a", size = 27754, upload-time = "2025-08-05T16:43:00.132Z" }, - { url = "https://files.pythonhosted.org/packages/4e/86/c2e0f627168fcf61781a8f72cab06b228fe1da4b9fa4ab39cfb791b5836b/audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b", size = 27332, upload-time = "2025-08-05T16:43:01.666Z" }, - { url = "https://files.pythonhosted.org/packages/c7/bd/35dce665255434f54e5307de39e31912a6f902d4572da7c37582809de14f/audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6", size = 92396, upload-time = "2025-08-05T16:43:02.991Z" }, - { url = "https://files.pythonhosted.org/packages/2d/d2/deeb9f51def1437b3afa35aeb729d577c04bcd89394cb56f9239a9f50b6f/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf", size = 91811, upload-time = "2025-08-05T16:43:04.096Z" }, - { url = "https://files.pythonhosted.org/packages/76/3b/09f8b35b227cee28cc8231e296a82759ed80c1a08e349811d69773c48426/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd", size = 100483, upload-time = "2025-08-05T16:43:05.085Z" }, - { url = "https://files.pythonhosted.org/packages/0b/15/05b48a935cf3b130c248bfdbdea71ce6437f5394ee8533e0edd7cfd93d5e/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a", size = 103885, upload-time = "2025-08-05T16:43:06.197Z" }, - { url = "https://files.pythonhosted.org/packages/83/80/186b7fce6d35b68d3d739f228dc31d60b3412105854edb975aa155a58339/audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e", size = 84899, upload-time = "2025-08-05T16:43:07.291Z" }, - { url = "https://files.pythonhosted.org/packages/49/89/c78cc5ac6cb5828f17514fb12966e299c850bc885e80f8ad94e38d450886/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7", size = 89998, upload-time = "2025-08-05T16:43:08.335Z" }, - { url = "https://files.pythonhosted.org/packages/4c/4b/6401888d0c010e586c2ca50fce4c903d70a6bb55928b16cfbdfd957a13da/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5", size = 99046, upload-time = "2025-08-05T16:43:09.367Z" }, - { url = "https://files.pythonhosted.org/packages/de/f8/c874ca9bb447dae0e2ef2e231f6c4c2b0c39e31ae684d2420b0f9e97ee68/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9", size = 84843, upload-time = "2025-08-05T16:43:10.749Z" }, - { url = "https://files.pythonhosted.org/packages/3e/c0/0323e66f3daebc13fd46b36b30c3be47e3fc4257eae44f1e77eb828c703f/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602", size = 94490, upload-time = "2025-08-05T16:43:12.131Z" }, - { url = "https://files.pythonhosted.org/packages/98/6b/acc7734ac02d95ab791c10c3f17ffa3584ccb9ac5c18fd771c638ed6d1f5/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0", size = 92297, upload-time = "2025-08-05T16:43:13.139Z" }, - { url = "https://files.pythonhosted.org/packages/13/c3/c3dc3f564ce6877ecd2a05f8d751b9b27a8c320c2533a98b0c86349778d0/audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3", size = 27331, upload-time = "2025-08-05T16:43:14.19Z" }, - { url = "https://files.pythonhosted.org/packages/72/bb/b4608537e9ffcb86449091939d52d24a055216a36a8bf66b936af8c3e7ac/audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b", size = 31697, upload-time = "2025-08-05T16:43:15.193Z" }, - { url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206, upload-time = "2025-08-05T16:43:16.444Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/38/53/946db57842a50b2da2e0c1e34bd37f36f5aadba1a929a3971c5d7841dbca/audioop_lts-0.2.2.tar.gz", hash = "sha256:64d0c62d88e67b98a1a5e71987b7aa7b5bcffc7dcee65b635823dbdd0a8dbbd0", size = 30686 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/d4/94d277ca941de5a507b07f0b592f199c22454eeaec8f008a286b3fbbacd6/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_universal2.whl", hash = "sha256:fd3d4602dc64914d462924a08c1a9816435a2155d74f325853c1f1ac3b2d9800", size = 46523 }, + { url = "https://files.pythonhosted.org/packages/f8/5a/656d1c2da4b555920ce4177167bfeb8623d98765594af59702c8873f60ec/audioop_lts-0.2.2-cp313-abi3-macosx_10_13_x86_64.whl", hash = "sha256:550c114a8df0aafe9a05442a1162dfc8fec37e9af1d625ae6060fed6e756f303", size = 27455 }, + { url = "https://files.pythonhosted.org/packages/1b/83/ea581e364ce7b0d41456fb79d6ee0ad482beda61faf0cab20cbd4c63a541/audioop_lts-0.2.2-cp313-abi3-macosx_11_0_arm64.whl", hash = "sha256:9a13dc409f2564de15dd68be65b462ba0dde01b19663720c68c1140c782d1d75", size = 26997 }, + { url = "https://files.pythonhosted.org/packages/b8/3b/e8964210b5e216e5041593b7d33e97ee65967f17c282e8510d19c666dab4/audioop_lts-0.2.2-cp313-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:51c916108c56aa6e426ce611946f901badac950ee2ddaf302b7ed35d9958970d", size = 85844 }, + { url = "https://files.pythonhosted.org/packages/c7/2e/0a1c52faf10d51def20531a59ce4c706cb7952323b11709e10de324d6493/audioop_lts-0.2.2-cp313-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:47eba38322370347b1c47024defbd36374a211e8dd5b0dcbce7b34fdb6f8847b", size = 85056 }, + { url = "https://files.pythonhosted.org/packages/75/e8/cd95eef479656cb75ab05dfece8c1f8c395d17a7c651d88f8e6e291a63ab/audioop_lts-0.2.2-cp313-abi3-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba7c3a7e5f23e215cb271516197030c32aef2e754252c4c70a50aaff7031a2c8", size = 93892 }, + { url = "https://files.pythonhosted.org/packages/5c/1e/a0c42570b74f83efa5cca34905b3eef03f7ab09fe5637015df538a7f3345/audioop_lts-0.2.2-cp313-abi3-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:def246fe9e180626731b26e89816e79aae2276f825420a07b4a647abaa84becc", size = 96660 }, + { url = "https://files.pythonhosted.org/packages/50/d5/8a0ae607ca07dbb34027bac8db805498ee7bfecc05fd2c148cc1ed7646e7/audioop_lts-0.2.2-cp313-abi3-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e160bf9df356d841bb6c180eeeea1834085464626dc1b68fa4e1d59070affdc3", size = 79143 }, + { url = "https://files.pythonhosted.org/packages/12/17/0d28c46179e7910bfb0bb62760ccb33edb5de973052cb2230b662c14ca2e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4b4cd51a57b698b2d06cb9993b7ac8dfe89a3b2878e96bc7948e9f19ff51dba6", size = 84313 }, + { url = "https://files.pythonhosted.org/packages/84/ba/bd5d3806641564f2024e97ca98ea8f8811d4e01d9b9f9831474bc9e14f9e/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_ppc64le.whl", hash = "sha256:4a53aa7c16a60a6857e6b0b165261436396ef7293f8b5c9c828a3a203147ed4a", size = 93044 }, + { url = "https://files.pythonhosted.org/packages/f9/5e/435ce8d5642f1f7679540d1e73c1c42d933331c0976eb397d1717d7f01a3/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_riscv64.whl", hash = "sha256:3fc38008969796f0f689f1453722a0f463da1b8a6fbee11987830bfbb664f623", size = 78766 }, + { url = "https://files.pythonhosted.org/packages/ae/3b/b909e76b606cbfd53875693ec8c156e93e15a1366a012f0b7e4fb52d3c34/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_s390x.whl", hash = "sha256:15ab25dd3e620790f40e9ead897f91e79c0d3ce65fe193c8ed6c26cffdd24be7", size = 87640 }, + { url = "https://files.pythonhosted.org/packages/30/e7/8f1603b4572d79b775f2140d7952f200f5e6c62904585d08a01f0a70393a/audioop_lts-0.2.2-cp313-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:03f061a1915538fd96272bac9551841859dbb2e3bf73ebe4a23ef043766f5449", size = 86052 }, + { url = "https://files.pythonhosted.org/packages/b5/96/c37846df657ccdda62ba1ae2b6534fa90e2e1b1742ca8dcf8ebd38c53801/audioop_lts-0.2.2-cp313-abi3-win32.whl", hash = "sha256:3bcddaaf6cc5935a300a8387c99f7a7fbbe212a11568ec6cf6e4bc458c048636", size = 26185 }, + { url = "https://files.pythonhosted.org/packages/34/a5/9d78fdb5b844a83da8a71226c7bdae7cc638861085fff7a1d707cb4823fa/audioop_lts-0.2.2-cp313-abi3-win_amd64.whl", hash = "sha256:a2c2a947fae7d1062ef08c4e369e0ba2086049a5e598fda41122535557012e9e", size = 30503 }, + { url = "https://files.pythonhosted.org/packages/34/25/20d8fde083123e90c61b51afb547bb0ea7e77bab50d98c0ab243d02a0e43/audioop_lts-0.2.2-cp313-abi3-win_arm64.whl", hash = "sha256:5f93a5db13927a37d2d09637ccca4b2b6b48c19cd9eda7b17a2e9f77edee6a6f", size = 24173 }, + { url = "https://files.pythonhosted.org/packages/58/a7/0a764f77b5c4ac58dc13c01a580f5d32ae8c74c92020b961556a43e26d02/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:73f80bf4cd5d2ca7814da30a120de1f9408ee0619cc75da87d0641273d202a09", size = 47096 }, + { url = "https://files.pythonhosted.org/packages/aa/ed/ebebedde1a18848b085ad0fa54b66ceb95f1f94a3fc04f1cd1b5ccb0ed42/audioop_lts-0.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:106753a83a25ee4d6f473f2be6b0966fc1c9af7e0017192f5531a3e7463dce58", size = 27748 }, + { url = "https://files.pythonhosted.org/packages/cb/6e/11ca8c21af79f15dbb1c7f8017952ee8c810c438ce4e2b25638dfef2b02c/audioop_lts-0.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fbdd522624141e40948ab3e8cdae6e04c748d78710e9f0f8d4dae2750831de19", size = 27329 }, + { url = "https://files.pythonhosted.org/packages/84/52/0022f93d56d85eec5da6b9da6a958a1ef09e80c39f2cc0a590c6af81dcbb/audioop_lts-0.2.2-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:143fad0311e8209ece30a8dbddab3b65ab419cbe8c0dde6e8828da25999be911", size = 92407 }, + { url = "https://files.pythonhosted.org/packages/87/1d/48a889855e67be8718adbc7a01f3c01d5743c325453a5e81cf3717664aad/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfbbc74ec68a0fd08cfec1f4b5e8cca3d3cd7de5501b01c4b5d209995033cde9", size = 91811 }, + { url = "https://files.pythonhosted.org/packages/98/a6/94b7213190e8077547ffae75e13ed05edc488653c85aa5c41472c297d295/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cfcac6aa6f42397471e4943e0feb2244549db5c5d01efcd02725b96af417f3fe", size = 100470 }, + { url = "https://files.pythonhosted.org/packages/e9/e9/78450d7cb921ede0cfc33426d3a8023a3bda755883c95c868ee36db8d48d/audioop_lts-0.2.2-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:752d76472d9804ac60f0078c79cdae8b956f293177acd2316cd1e15149aee132", size = 103878 }, + { url = "https://files.pythonhosted.org/packages/4f/e2/cd5439aad4f3e34ae1ee852025dc6aa8f67a82b97641e390bf7bd9891d3e/audioop_lts-0.2.2-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:83c381767e2cc10e93e40281a04852facc4cd9334550e0f392f72d1c0a9c5753", size = 84867 }, + { url = "https://files.pythonhosted.org/packages/68/4b/9d853e9076c43ebba0d411e8d2aa19061083349ac695a7d082540bad64d0/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c0022283e9556e0f3643b7c3c03f05063ca72b3063291834cca43234f20c60bb", size = 90001 }, + { url = "https://files.pythonhosted.org/packages/58/26/4bae7f9d2f116ed5593989d0e521d679b0d583973d203384679323d8fa85/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a2d4f1513d63c795e82948e1305f31a6d530626e5f9f2605408b300ae6095093", size = 99046 }, + { url = "https://files.pythonhosted.org/packages/b2/67/a9f4fb3e250dda9e9046f8866e9fa7d52664f8985e445c6b4ad6dfb55641/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:c9c8e68d8b4a56fda8c025e538e639f8c5953f5073886b596c93ec9b620055e7", size = 84788 }, + { url = "https://files.pythonhosted.org/packages/70/f7/3de86562db0121956148bcb0fe5b506615e3bcf6e63c4357a612b910765a/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:96f19de485a2925314f5020e85911fb447ff5fbef56e8c7c6927851b95533a1c", size = 94472 }, + { url = "https://files.pythonhosted.org/packages/f1/32/fd772bf9078ae1001207d2df1eef3da05bea611a87dd0e8217989b2848fa/audioop_lts-0.2.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e541c3ef484852ef36545f66209444c48b28661e864ccadb29daddb6a4b8e5f5", size = 92279 }, + { url = "https://files.pythonhosted.org/packages/4f/41/affea7181592ab0ab560044632571a38edaf9130b84928177823fbf3176a/audioop_lts-0.2.2-cp313-cp313t-win32.whl", hash = "sha256:d5e73fa573e273e4f2e5ff96f9043858a5e9311e94ffefd88a3186a910c70917", size = 26568 }, + { url = "https://files.pythonhosted.org/packages/28/2b/0372842877016641db8fc54d5c88596b542eec2f8f6c20a36fb6612bf9ee/audioop_lts-0.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:9191d68659eda01e448188f60364c7763a7ca6653ed3f87ebb165822153a8547", size = 30942 }, + { url = "https://files.pythonhosted.org/packages/ee/ca/baf2b9cc7e96c179bb4a54f30fcd83e6ecb340031bde68f486403f943768/audioop_lts-0.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:c174e322bb5783c099aaf87faeb240c8d210686b04bd61dfd05a8e5a83d88969", size = 24603 }, + { url = "https://files.pythonhosted.org/packages/5c/73/413b5a2804091e2c7d5def1d618e4837f1cb82464e230f827226278556b7/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:f9ee9b52f5f857fbaf9d605a360884f034c92c1c23021fb90b2e39b8e64bede6", size = 47104 }, + { url = "https://files.pythonhosted.org/packages/ae/8c/daa3308dc6593944410c2c68306a5e217f5c05b70a12e70228e7dd42dc5c/audioop_lts-0.2.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:49ee1a41738a23e98d98b937a0638357a2477bc99e61b0f768a8f654f45d9b7a", size = 27754 }, + { url = "https://files.pythonhosted.org/packages/4e/86/c2e0f627168fcf61781a8f72cab06b228fe1da4b9fa4ab39cfb791b5836b/audioop_lts-0.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5b00be98ccd0fc123dcfad31d50030d25fcf31488cde9e61692029cd7394733b", size = 27332 }, + { url = "https://files.pythonhosted.org/packages/c7/bd/35dce665255434f54e5307de39e31912a6f902d4572da7c37582809de14f/audioop_lts-0.2.2-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6d2e0f9f7a69403e388894d4ca5ada5c47230716a03f2847cfc7bd1ecb589d6", size = 92396 }, + { url = "https://files.pythonhosted.org/packages/2d/d2/deeb9f51def1437b3afa35aeb729d577c04bcd89394cb56f9239a9f50b6f/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9b0b8a03ef474f56d1a842af1a2e01398b8f7654009823c6d9e0ecff4d5cfbf", size = 91811 }, + { url = "https://files.pythonhosted.org/packages/76/3b/09f8b35b227cee28cc8231e296a82759ed80c1a08e349811d69773c48426/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2b267b70747d82125f1a021506565bdc5609a2b24bcb4773c16d79d2bb260bbd", size = 100483 }, + { url = "https://files.pythonhosted.org/packages/0b/15/05b48a935cf3b130c248bfdbdea71ce6437f5394ee8533e0edd7cfd93d5e/audioop_lts-0.2.2-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0337d658f9b81f4cd0fdb1f47635070cc084871a3d4646d9de74fdf4e7c3d24a", size = 103885 }, + { url = "https://files.pythonhosted.org/packages/83/80/186b7fce6d35b68d3d739f228dc31d60b3412105854edb975aa155a58339/audioop_lts-0.2.2-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:167d3b62586faef8b6b2275c3218796b12621a60e43f7e9d5845d627b9c9b80e", size = 84899 }, + { url = "https://files.pythonhosted.org/packages/49/89/c78cc5ac6cb5828f17514fb12966e299c850bc885e80f8ad94e38d450886/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0d9385e96f9f6da847f4d571ce3cb15b5091140edf3db97276872647ce37efd7", size = 89998 }, + { url = "https://files.pythonhosted.org/packages/4c/4b/6401888d0c010e586c2ca50fce4c903d70a6bb55928b16cfbdfd957a13da/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:48159d96962674eccdca9a3df280e864e8ac75e40a577cc97c5c42667ffabfc5", size = 99046 }, + { url = "https://files.pythonhosted.org/packages/de/f8/c874ca9bb447dae0e2ef2e231f6c4c2b0c39e31ae684d2420b0f9e97ee68/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:8fefe5868cd082db1186f2837d64cfbfa78b548ea0d0543e9b28935ccce81ce9", size = 84843 }, + { url = "https://files.pythonhosted.org/packages/3e/c0/0323e66f3daebc13fd46b36b30c3be47e3fc4257eae44f1e77eb828c703f/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:58cf54380c3884fb49fdd37dfb7a772632b6701d28edd3e2904743c5e1773602", size = 94490 }, + { url = "https://files.pythonhosted.org/packages/98/6b/acc7734ac02d95ab791c10c3f17ffa3584ccb9ac5c18fd771c638ed6d1f5/audioop_lts-0.2.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:088327f00488cdeed296edd9215ca159f3a5a5034741465789cad403fcf4bec0", size = 92297 }, + { url = "https://files.pythonhosted.org/packages/13/c3/c3dc3f564ce6877ecd2a05f8d751b9b27a8c320c2533a98b0c86349778d0/audioop_lts-0.2.2-cp314-cp314t-win32.whl", hash = "sha256:068aa17a38b4e0e7de771c62c60bbca2455924b67a8814f3b0dee92b5820c0b3", size = 27331 }, + { url = "https://files.pythonhosted.org/packages/72/bb/b4608537e9ffcb86449091939d52d24a055216a36a8bf66b936af8c3e7ac/audioop_lts-0.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:a5bf613e96f49712073de86f20dbdd4014ca18efd4d34ed18c75bd808337851b", size = 31697 }, + { url = "https://files.pythonhosted.org/packages/f6/22/91616fe707a5c5510de2cac9b046a30defe7007ba8a0c04f9c08f27df312/audioop_lts-0.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:b492c3b040153e68b9fdaff5913305aaaba5bb433d8a7f73d5cf6a64ed3cc1dd", size = 25206 }, ] [[package]] name = "authlib" version = "1.6.6" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "cryptography" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bb/9b/b1661026ff24bc641b76b78c5222d614776b0c085bcfdac9bd15a1cb4b35/authlib-1.6.6.tar.gz", hash = "sha256:45770e8e056d0f283451d9996fbb59b70d45722b45d854d58f32878d0a40c38e", size = 164894, upload-time = "2025-12-12T08:01:41.464Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bb/9b/b1661026ff24bc641b76b78c5222d614776b0c085bcfdac9bd15a1cb4b35/authlib-1.6.6.tar.gz", hash = "sha256:45770e8e056d0f283451d9996fbb59b70d45722b45d854d58f32878d0a40c38e", size = 164894 } wheels = [ - { url = "https://files.pythonhosted.org/packages/54/51/321e821856452f7386c4e9df866f196720b1ad0c5ea1623ea7399969ae3b/authlib-1.6.6-py2.py3-none-any.whl", hash = "sha256:7d9e9bc535c13974313a87f53e8430eb6ea3d1cf6ae4f6efcd793f2e949143fd", size = 244005, upload-time = "2025-12-12T08:01:40.209Z" }, + { url = "https://files.pythonhosted.org/packages/54/51/321e821856452f7386c4e9df866f196720b1ad0c5ea1623ea7399969ae3b/authlib-1.6.6-py2.py3-none-any.whl", hash = "sha256:7d9e9bc535c13974313a87f53e8430eb6ea3d1cf6ae4f6efcd793f2e949143fd", size = 244005 }, ] [[package]] name = "brotli" version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/64/10/a090475284fc4a71aed40a96f32e44a7fe5bda39687353dd977720b211b6/brotli-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b90b767916ac44e93a8e28ce6adf8d551e43affb512f2377c732d486ac6514e", size = 863089, upload-time = "2025-11-05T18:38:01.181Z" }, - { url = "https://files.pythonhosted.org/packages/03/41/17416630e46c07ac21e378c3464815dd2e120b441e641bc516ac32cc51d2/brotli-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6be67c19e0b0c56365c6a76e393b932fb0e78b3b56b711d180dd7013cb1fd984", size = 445442, upload-time = "2025-11-05T18:38:02.434Z" }, - { url = "https://files.pythonhosted.org/packages/24/31/90cc06584deb5d4fcafc0985e37741fc6b9717926a78674bbb3ce018957e/brotli-1.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bbd5b5ccd157ae7913750476d48099aaf507a79841c0d04a9db4415b14842de", size = 1532658, upload-time = "2025-11-05T18:38:03.588Z" }, - { url = "https://files.pythonhosted.org/packages/62/17/33bf0c83bcbc96756dfd712201d87342732fad70bb3472c27e833a44a4f9/brotli-1.2.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f3c908bcc404c90c77d5a073e55271a0a498f4e0756e48127c35d91cf155947", size = 1631241, upload-time = "2025-11-05T18:38:04.582Z" }, - { url = "https://files.pythonhosted.org/packages/48/10/f47854a1917b62efe29bc98ac18e5d4f71df03f629184575b862ef2e743b/brotli-1.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b557b29782a643420e08d75aea889462a4a8796e9a6cf5621ab05a3f7da8ef2", size = 1424307, upload-time = "2025-11-05T18:38:05.587Z" }, - { url = "https://files.pythonhosted.org/packages/e4/b7/f88eb461719259c17483484ea8456925ee057897f8e64487d76e24e5e38d/brotli-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81da1b229b1889f25adadc929aeb9dbc4e922bd18561b65b08dd9343cfccca84", size = 1488208, upload-time = "2025-11-05T18:38:06.613Z" }, - { url = "https://files.pythonhosted.org/packages/26/59/41bbcb983a0c48b0b8004203e74706c6b6e99a04f3c7ca6f4f41f364db50/brotli-1.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff09cd8c5eec3b9d02d2408db41be150d8891c5566addce57513bf546e3d6c6d", size = 1597574, upload-time = "2025-11-05T18:38:07.838Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e6/8c89c3bdabbe802febb4c5c6ca224a395e97913b5df0dff11b54f23c1788/brotli-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a1778532b978d2536e79c05dac2d8cd857f6c55cd0c95ace5b03740824e0e2f1", size = 1492109, upload-time = "2025-11-05T18:38:08.816Z" }, - { url = "https://files.pythonhosted.org/packages/ed/9a/4b19d4310b2dbd545c0c33f176b0528fa68c3cd0754e34b2f2bcf56548ae/brotli-1.2.0-cp310-cp310-win32.whl", hash = "sha256:b232029d100d393ae3c603c8ffd7e3fe6f798c5e28ddca5feabb8e8fdb732997", size = 334461, upload-time = "2025-11-05T18:38:10.729Z" }, - { url = "https://files.pythonhosted.org/packages/ac/39/70981d9f47705e3c2b95c0847dfa3e7a37aa3b7c6030aedc4873081ed005/brotli-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef87b8ab2704da227e83a246356a2b179ef826f550f794b2c52cddb4efbd0196", size = 369035, upload-time = "2025-11-05T18:38:11.827Z" }, - { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, - { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, - { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, - { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, - { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, - { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, - { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, - { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, - { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451, upload-time = "2025-11-05T18:38:21.94Z" }, - { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035, upload-time = "2025-11-05T18:38:22.941Z" }, - { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, - { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, - { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, - { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, - { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, - { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, - { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, - { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362, upload-time = "2025-11-05T18:38:32.939Z" }, - { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115, upload-time = "2025-11-05T18:38:33.765Z" }, - { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523, upload-time = "2025-11-05T18:38:34.67Z" }, - { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289, upload-time = "2025-11-05T18:38:35.6Z" }, - { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076, upload-time = "2025-11-05T18:38:36.639Z" }, - { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880, upload-time = "2025-11-05T18:38:37.623Z" }, - { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737, upload-time = "2025-11-05T18:38:38.729Z" }, - { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440, upload-time = "2025-11-05T18:38:39.916Z" }, - { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313, upload-time = "2025-11-05T18:38:41.24Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945, upload-time = "2025-11-05T18:38:42.277Z" }, - { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368, upload-time = "2025-11-05T18:38:43.345Z" }, - { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116, upload-time = "2025-11-05T18:38:44.609Z" }, - { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080, upload-time = "2025-11-05T18:38:45.503Z" }, - { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453, upload-time = "2025-11-05T18:38:46.433Z" }, - { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168, upload-time = "2025-11-05T18:38:47.371Z" }, - { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098, upload-time = "2025-11-05T18:38:48.385Z" }, - { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861, upload-time = "2025-11-05T18:38:49.372Z" }, - { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594, upload-time = "2025-11-05T18:38:50.655Z" }, - { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455, upload-time = "2025-11-05T18:38:51.624Z" }, - { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164, upload-time = "2025-11-05T18:38:53.079Z" }, - { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280, upload-time = "2025-11-05T18:38:54.02Z" }, - { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639, upload-time = "2025-11-05T18:38:55.67Z" }, -] - -[[package]] -name = "cachetools" -version = "6.2.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/39/91/d9ae9a66b01102a18cd16db0cf4cd54187ffe10f0865cc80071a4104fbb3/cachetools-6.2.6.tar.gz", hash = "sha256:16c33e1f276b9a9c0b49ab5782d901e3ad3de0dd6da9bf9bcd29ac5672f2f9e6", size = 32363, upload-time = "2026-01-27T20:32:59.956Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/90/45/f458fa2c388e79dd9d8b9b0c99f1d31b568f27388f2fdba7bb66bbc0c6ed/cachetools-6.2.6-py3-none-any.whl", hash = "sha256:8c9717235b3c651603fff0076db52d6acbfd1b338b8ed50256092f7ce9c85bda", size = 11668, upload-time = "2026-01-27T20:32:58.527Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/10/a090475284fc4a71aed40a96f32e44a7fe5bda39687353dd977720b211b6/brotli-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b90b767916ac44e93a8e28ce6adf8d551e43affb512f2377c732d486ac6514e", size = 863089 }, + { url = "https://files.pythonhosted.org/packages/03/41/17416630e46c07ac21e378c3464815dd2e120b441e641bc516ac32cc51d2/brotli-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6be67c19e0b0c56365c6a76e393b932fb0e78b3b56b711d180dd7013cb1fd984", size = 445442 }, + { url = "https://files.pythonhosted.org/packages/24/31/90cc06584deb5d4fcafc0985e37741fc6b9717926a78674bbb3ce018957e/brotli-1.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bbd5b5ccd157ae7913750476d48099aaf507a79841c0d04a9db4415b14842de", size = 1532658 }, + { url = "https://files.pythonhosted.org/packages/62/17/33bf0c83bcbc96756dfd712201d87342732fad70bb3472c27e833a44a4f9/brotli-1.2.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f3c908bcc404c90c77d5a073e55271a0a498f4e0756e48127c35d91cf155947", size = 1631241 }, + { url = "https://files.pythonhosted.org/packages/48/10/f47854a1917b62efe29bc98ac18e5d4f71df03f629184575b862ef2e743b/brotli-1.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b557b29782a643420e08d75aea889462a4a8796e9a6cf5621ab05a3f7da8ef2", size = 1424307 }, + { url = "https://files.pythonhosted.org/packages/e4/b7/f88eb461719259c17483484ea8456925ee057897f8e64487d76e24e5e38d/brotli-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81da1b229b1889f25adadc929aeb9dbc4e922bd18561b65b08dd9343cfccca84", size = 1488208 }, + { url = "https://files.pythonhosted.org/packages/26/59/41bbcb983a0c48b0b8004203e74706c6b6e99a04f3c7ca6f4f41f364db50/brotli-1.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff09cd8c5eec3b9d02d2408db41be150d8891c5566addce57513bf546e3d6c6d", size = 1597574 }, + { url = "https://files.pythonhosted.org/packages/8e/e6/8c89c3bdabbe802febb4c5c6ca224a395e97913b5df0dff11b54f23c1788/brotli-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a1778532b978d2536e79c05dac2d8cd857f6c55cd0c95ace5b03740824e0e2f1", size = 1492109 }, + { url = "https://files.pythonhosted.org/packages/ed/9a/4b19d4310b2dbd545c0c33f176b0528fa68c3cd0754e34b2f2bcf56548ae/brotli-1.2.0-cp310-cp310-win32.whl", hash = "sha256:b232029d100d393ae3c603c8ffd7e3fe6f798c5e28ddca5feabb8e8fdb732997", size = 334461 }, + { url = "https://files.pythonhosted.org/packages/ac/39/70981d9f47705e3c2b95c0847dfa3e7a37aa3b7c6030aedc4873081ed005/brotli-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef87b8ab2704da227e83a246356a2b179ef826f550f794b2c52cddb4efbd0196", size = 369035 }, + { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110 }, + { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438 }, + { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420 }, + { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619 }, + { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014 }, + { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661 }, + { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150 }, + { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505 }, + { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451 }, + { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035 }, + { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543 }, + { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288 }, + { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071 }, + { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913 }, + { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762 }, + { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494 }, + { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302 }, + { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913 }, + { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362 }, + { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115 }, + { url = "https://files.pythonhosted.org/packages/6c/d4/4ad5432ac98c73096159d9ce7ffeb82d151c2ac84adcc6168e476bb54674/brotli-1.2.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9e5825ba2c9998375530504578fd4d5d1059d09621a02065d1b6bfc41a8e05ab", size = 861523 }, + { url = "https://files.pythonhosted.org/packages/91/9f/9cc5bd03ee68a85dc4bc89114f7067c056a3c14b3d95f171918c088bf88d/brotli-1.2.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0cf8c3b8ba93d496b2fae778039e2f5ecc7cff99df84df337ca31d8f2252896c", size = 444289 }, + { url = "https://files.pythonhosted.org/packages/2e/b6/fe84227c56a865d16a6614e2c4722864b380cb14b13f3e6bef441e73a85a/brotli-1.2.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8565e3cdc1808b1a34714b553b262c5de5fbda202285782173ec137fd13709f", size = 1528076 }, + { url = "https://files.pythonhosted.org/packages/55/de/de4ae0aaca06c790371cf6e7ee93a024f6b4bb0568727da8c3de112e726c/brotli-1.2.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:26e8d3ecb0ee458a9804f47f21b74845cc823fd1bb19f02272be70774f56e2a6", size = 1626880 }, + { url = "https://files.pythonhosted.org/packages/5f/16/a1b22cbea436642e071adcaf8d4b350a2ad02f5e0ad0da879a1be16188a0/brotli-1.2.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67a91c5187e1eec76a61625c77a6c8c785650f5b576ca732bd33ef58b0dff49c", size = 1419737 }, + { url = "https://files.pythonhosted.org/packages/46/63/c968a97cbb3bdbf7f974ef5a6ab467a2879b82afbc5ffb65b8acbb744f95/brotli-1.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4ecdb3b6dc36e6d6e14d3a1bdc6c1057c8cbf80db04031d566eb6080ce283a48", size = 1484440 }, + { url = "https://files.pythonhosted.org/packages/06/9d/102c67ea5c9fc171f423e8399e585dabea29b5bc79b05572891e70013cdd/brotli-1.2.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:3e1b35d56856f3ed326b140d3c6d9db91740f22e14b06e840fe4bb1923439a18", size = 1593313 }, + { url = "https://files.pythonhosted.org/packages/9e/4a/9526d14fa6b87bc827ba1755a8440e214ff90de03095cacd78a64abe2b7d/brotli-1.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:54a50a9dad16b32136b2241ddea9e4df159b41247b2ce6aac0b3276a66a8f1e5", size = 1487945 }, + { url = "https://files.pythonhosted.org/packages/5b/e8/3fe1ffed70cbef83c5236166acaed7bb9c766509b157854c80e2f766b38c/brotli-1.2.0-cp313-cp313-win32.whl", hash = "sha256:1b1d6a4efedd53671c793be6dd760fcf2107da3a52331ad9ea429edf0902f27a", size = 334368 }, + { url = "https://files.pythonhosted.org/packages/ff/91/e739587be970a113b37b821eae8097aac5a48e5f0eca438c22e4c7dd8648/brotli-1.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:b63daa43d82f0cdabf98dee215b375b4058cce72871fd07934f179885aad16e8", size = 369116 }, + { url = "https://files.pythonhosted.org/packages/17/e1/298c2ddf786bb7347a1cd71d63a347a79e5712a7c0cba9e3c3458ebd976f/brotli-1.2.0-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:6c12dad5cd04530323e723787ff762bac749a7b256a5bece32b2243dd5c27b21", size = 863080 }, + { url = "https://files.pythonhosted.org/packages/84/0c/aac98e286ba66868b2b3b50338ffbd85a35c7122e9531a73a37a29763d38/brotli-1.2.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3219bd9e69868e57183316ee19c84e03e8f8b5a1d1f2667e1aa8c2f91cb061ac", size = 445453 }, + { url = "https://files.pythonhosted.org/packages/ec/f1/0ca1f3f99ae300372635ab3fe2f7a79fa335fee3d874fa7f9e68575e0e62/brotli-1.2.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:963a08f3bebd8b75ac57661045402da15991468a621f014be54e50f53a58d19e", size = 1528168 }, + { url = "https://files.pythonhosted.org/packages/d6/a6/2ebfc8f766d46df8d3e65b880a2e220732395e6d7dc312c1e1244b0f074a/brotli-1.2.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9322b9f8656782414b37e6af884146869d46ab85158201d82bab9abbcb971dc7", size = 1627098 }, + { url = "https://files.pythonhosted.org/packages/f3/2f/0976d5b097ff8a22163b10617f76b2557f15f0f39d6a0fe1f02b1a53e92b/brotli-1.2.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf9cba6f5b78a2071ec6fb1e7bd39acf35071d90a81231d67e92d637776a6a63", size = 1419861 }, + { url = "https://files.pythonhosted.org/packages/9c/97/d76df7176a2ce7616ff94c1fb72d307c9a30d2189fe877f3dd99af00ea5a/brotli-1.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7547369c4392b47d30a3467fe8c3330b4f2e0f7730e45e3103d7d636678a808b", size = 1484594 }, + { url = "https://files.pythonhosted.org/packages/d3/93/14cf0b1216f43df5609f5b272050b0abd219e0b54ea80b47cef9867b45e7/brotli-1.2.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1530af5c3c275b8524f2e24841cbe2599d74462455e9bae5109e9ff42e9361", size = 1593455 }, + { url = "https://files.pythonhosted.org/packages/b3/73/3183c9e41ca755713bdf2cc1d0810df742c09484e2e1ddd693bee53877c1/brotli-1.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d2d085ded05278d1c7f65560aae97b3160aeb2ea2c0b3e26204856beccb60888", size = 1488164 }, + { url = "https://files.pythonhosted.org/packages/64/6a/0c78d8f3a582859236482fd9fa86a65a60328a00983006bcf6d83b7b2253/brotli-1.2.0-cp314-cp314-win32.whl", hash = "sha256:832c115a020e463c2f67664560449a7bea26b0c1fdd690352addad6d0a08714d", size = 339280 }, + { url = "https://files.pythonhosted.org/packages/f5/10/56978295c14794b2c12007b07f3e41ba26acda9257457d7085b0bb3bb90c/brotli-1.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:e7c0af964e0b4e3412a0ebf341ea26ec767fa0b4cf81abb5e897c9338b5ad6a3", size = 375639 }, ] [[package]] name = "certifi" version = "2026.1.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268, upload-time = "2026-01-04T02:42:41.825Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/2d/a891ca51311197f6ad14a7ef42e2399f36cf2f9bd44752b3dc4eab60fdc5/certifi-2026.1.4.tar.gz", hash = "sha256:ac726dd470482006e014ad384921ed6438c457018f4b3d204aea4281258b2120", size = 154268 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900, upload-time = "2026-01-04T02:42:40.15Z" }, + { url = "https://files.pythonhosted.org/packages/e6/ad/3cc14f097111b4de0040c83a525973216457bbeeb63739ef1ed275c1c021/certifi-2026.1.4-py3-none-any.whl", hash = "sha256:9943707519e4add1115f44c2bc244f782c0249876bf51b6599fee1ffbedd685c", size = 152900 }, ] [[package]] name = "cffi" version = "2.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "pycparser", marker = "implementation_name != 'PyPy'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, - { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, - { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, - { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, - { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, - { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, - { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, - { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, - { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, - { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, - { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, - { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, - { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, - { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, - { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, - { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, - { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, - { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, - { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, - { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, - { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, - { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, - { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, - { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, - { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, - { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, - { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, - { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, - { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, - { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, - { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, - { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, - { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, - { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, - { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, - { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, - { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, - { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, - { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, - { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, - { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, - { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, - { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, - { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, - { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, - { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, - { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, - { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, - { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, - { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, - { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, - { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, - { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, - { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, - { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, - { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, - { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, - { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, - { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, - { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, - { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, - { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, - { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, - { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, - { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, - { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, - { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283 }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504 }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811 }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402 }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217 }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079 }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475 }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829 }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211 }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036 }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184 }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790 }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344 }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560 }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613 }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476 }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374 }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597 }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574 }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971 }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972 }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078 }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076 }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820 }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635 }, + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271 }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048 }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529 }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097 }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983 }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519 }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572 }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963 }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361 }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932 }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557 }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762 }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230 }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043 }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446 }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101 }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948 }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422 }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499 }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928 }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302 }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909 }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402 }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780 }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320 }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487 }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049 }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793 }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300 }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244 }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828 }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926 }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328 }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650 }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687 }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773 }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013 }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593 }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354 }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480 }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584 }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443 }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437 }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487 }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726 }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195 }, ] [[package]] name = "charset-normalizer" version = "3.4.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418, upload-time = "2025-10-14T04:42:32.879Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709, upload-time = "2025-10-14T04:40:11.385Z" }, - { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814, upload-time = "2025-10-14T04:40:13.135Z" }, - { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467, upload-time = "2025-10-14T04:40:14.728Z" }, - { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280, upload-time = "2025-10-14T04:40:16.14Z" }, - { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454, upload-time = "2025-10-14T04:40:17.567Z" }, - { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609, upload-time = "2025-10-14T04:40:19.08Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849, upload-time = "2025-10-14T04:40:20.607Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586, upload-time = "2025-10-14T04:40:21.719Z" }, - { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290, upload-time = "2025-10-14T04:40:23.069Z" }, - { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663, upload-time = "2025-10-14T04:40:24.17Z" }, - { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964, upload-time = "2025-10-14T04:40:25.368Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064, upload-time = "2025-10-14T04:40:26.806Z" }, - { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015, upload-time = "2025-10-14T04:40:28.284Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792, upload-time = "2025-10-14T04:40:29.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198, upload-time = "2025-10-14T04:40:30.644Z" }, - { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262, upload-time = "2025-10-14T04:40:32.108Z" }, - { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988, upload-time = "2025-10-14T04:40:33.79Z" }, - { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324, upload-time = "2025-10-14T04:40:34.961Z" }, - { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742, upload-time = "2025-10-14T04:40:36.105Z" }, - { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863, upload-time = "2025-10-14T04:40:37.188Z" }, - { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837, upload-time = "2025-10-14T04:40:38.435Z" }, - { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550, upload-time = "2025-10-14T04:40:40.053Z" }, - { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162, upload-time = "2025-10-14T04:40:41.163Z" }, - { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019, upload-time = "2025-10-14T04:40:42.276Z" }, - { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310, upload-time = "2025-10-14T04:40:43.439Z" }, - { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022, upload-time = "2025-10-14T04:40:44.547Z" }, - { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383, upload-time = "2025-10-14T04:40:46.018Z" }, - { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098, upload-time = "2025-10-14T04:40:47.081Z" }, - { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991, upload-time = "2025-10-14T04:40:48.246Z" }, - { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456, upload-time = "2025-10-14T04:40:49.376Z" }, - { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978, upload-time = "2025-10-14T04:40:50.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969, upload-time = "2025-10-14T04:40:52.272Z" }, - { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425, upload-time = "2025-10-14T04:40:53.353Z" }, - { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162, upload-time = "2025-10-14T04:40:54.558Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558, upload-time = "2025-10-14T04:40:55.677Z" }, - { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497, upload-time = "2025-10-14T04:40:57.217Z" }, - { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240, upload-time = "2025-10-14T04:40:58.358Z" }, - { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471, upload-time = "2025-10-14T04:40:59.468Z" }, - { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864, upload-time = "2025-10-14T04:41:00.623Z" }, - { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647, upload-time = "2025-10-14T04:41:01.754Z" }, - { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110, upload-time = "2025-10-14T04:41:03.231Z" }, - { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839, upload-time = "2025-10-14T04:41:04.715Z" }, - { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667, upload-time = "2025-10-14T04:41:05.827Z" }, - { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535, upload-time = "2025-10-14T04:41:06.938Z" }, - { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816, upload-time = "2025-10-14T04:41:08.101Z" }, - { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694, upload-time = "2025-10-14T04:41:09.23Z" }, - { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131, upload-time = "2025-10-14T04:41:10.467Z" }, - { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390, upload-time = "2025-10-14T04:41:11.915Z" }, - { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091, upload-time = "2025-10-14T04:41:13.346Z" }, - { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936, upload-time = "2025-10-14T04:41:14.461Z" }, - { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180, upload-time = "2025-10-14T04:41:15.588Z" }, - { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346, upload-time = "2025-10-14T04:41:16.738Z" }, - { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874, upload-time = "2025-10-14T04:41:17.923Z" }, - { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076, upload-time = "2025-10-14T04:41:19.106Z" }, - { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601, upload-time = "2025-10-14T04:41:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376, upload-time = "2025-10-14T04:41:21.398Z" }, - { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825, upload-time = "2025-10-14T04:41:22.583Z" }, - { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583, upload-time = "2025-10-14T04:41:23.754Z" }, - { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366, upload-time = "2025-10-14T04:41:25.27Z" }, - { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300, upload-time = "2025-10-14T04:41:26.725Z" }, - { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465, upload-time = "2025-10-14T04:41:28.322Z" }, - { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404, upload-time = "2025-10-14T04:41:29.95Z" }, - { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092, upload-time = "2025-10-14T04:41:31.188Z" }, - { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408, upload-time = "2025-10-14T04:41:32.624Z" }, - { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746, upload-time = "2025-10-14T04:41:33.773Z" }, - { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889, upload-time = "2025-10-14T04:41:34.897Z" }, - { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641, upload-time = "2025-10-14T04:41:36.116Z" }, - { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779, upload-time = "2025-10-14T04:41:37.229Z" }, - { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035, upload-time = "2025-10-14T04:41:38.368Z" }, - { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542, upload-time = "2025-10-14T04:41:39.862Z" }, - { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524, upload-time = "2025-10-14T04:41:41.319Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395, upload-time = "2025-10-14T04:41:42.539Z" }, - { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680, upload-time = "2025-10-14T04:41:43.661Z" }, - { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045, upload-time = "2025-10-14T04:41:44.821Z" }, - { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687, upload-time = "2025-10-14T04:41:46.442Z" }, - { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014, upload-time = "2025-10-14T04:41:47.631Z" }, - { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044, upload-time = "2025-10-14T04:41:48.81Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940, upload-time = "2025-10-14T04:41:49.946Z" }, - { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104, upload-time = "2025-10-14T04:41:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743, upload-time = "2025-10-14T04:41:52.122Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402, upload-time = "2025-10-14T04:42:31.76Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1f/b8/6d51fc1d52cbd52cd4ccedd5b5b2f0f6a11bbf6765c782298b0f3e808541/charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d", size = 209709 }, + { url = "https://files.pythonhosted.org/packages/5c/af/1f9d7f7faafe2ddfb6f72a2e07a548a629c61ad510fe60f9630309908fef/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8", size = 148814 }, + { url = "https://files.pythonhosted.org/packages/79/3d/f2e3ac2bbc056ca0c204298ea4e3d9db9b4afe437812638759db2c976b5f/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad", size = 144467 }, + { url = "https://files.pythonhosted.org/packages/ec/85/1bf997003815e60d57de7bd972c57dc6950446a3e4ccac43bc3070721856/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8", size = 162280 }, + { url = "https://files.pythonhosted.org/packages/3e/8e/6aa1952f56b192f54921c436b87f2aaf7c7a7c3d0d1a765547d64fd83c13/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d", size = 159454 }, + { url = "https://files.pythonhosted.org/packages/36/3b/60cbd1f8e93aa25d1c669c649b7a655b0b5fb4c571858910ea9332678558/charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313", size = 153609 }, + { url = "https://files.pythonhosted.org/packages/64/91/6a13396948b8fd3c4b4fd5bc74d045f5637d78c9675585e8e9fbe5636554/charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e", size = 151849 }, + { url = "https://files.pythonhosted.org/packages/b7/7a/59482e28b9981d105691e968c544cc0df3b7d6133152fb3dcdc8f135da7a/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93", size = 151586 }, + { url = "https://files.pythonhosted.org/packages/92/59/f64ef6a1c4bdd2baf892b04cd78792ed8684fbc48d4c2afe467d96b4df57/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0", size = 145290 }, + { url = "https://files.pythonhosted.org/packages/6b/63/3bf9f279ddfa641ffa1962b0db6a57a9c294361cc2f5fcac997049a00e9c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84", size = 163663 }, + { url = "https://files.pythonhosted.org/packages/ed/09/c9e38fc8fa9e0849b172b581fd9803bdf6e694041127933934184e19f8c3/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e", size = 151964 }, + { url = "https://files.pythonhosted.org/packages/d2/d1/d28b747e512d0da79d8b6a1ac18b7ab2ecfd81b2944c4c710e166d8dd09c/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db", size = 161064 }, + { url = "https://files.pythonhosted.org/packages/bb/9a/31d62b611d901c3b9e5500c36aab0ff5eb442043fb3a1c254200d3d397d9/charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6", size = 155015 }, + { url = "https://files.pythonhosted.org/packages/1f/f3/107e008fa2bff0c8b9319584174418e5e5285fef32f79d8ee6a430d0039c/charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f", size = 99792 }, + { url = "https://files.pythonhosted.org/packages/eb/66/e396e8a408843337d7315bab30dbf106c38966f1819f123257f5520f8a96/charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d", size = 107198 }, + { url = "https://files.pythonhosted.org/packages/b5/58/01b4f815bf0312704c267f2ccb6e5d42bcc7752340cd487bc9f8c3710597/charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69", size = 100262 }, + { url = "https://files.pythonhosted.org/packages/ed/27/c6491ff4954e58a10f69ad90aca8a1b6fe9c5d3c6f380907af3c37435b59/charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8", size = 206988 }, + { url = "https://files.pythonhosted.org/packages/94/59/2e87300fe67ab820b5428580a53cad894272dbb97f38a7a814a2a1ac1011/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0", size = 147324 }, + { url = "https://files.pythonhosted.org/packages/07/fb/0cf61dc84b2b088391830f6274cb57c82e4da8bbc2efeac8c025edb88772/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3", size = 142742 }, + { url = "https://files.pythonhosted.org/packages/62/8b/171935adf2312cd745d290ed93cf16cf0dfe320863ab7cbeeae1dcd6535f/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc", size = 160863 }, + { url = "https://files.pythonhosted.org/packages/09/73/ad875b192bda14f2173bfc1bc9a55e009808484a4b256748d931b6948442/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897", size = 157837 }, + { url = "https://files.pythonhosted.org/packages/6d/fc/de9cce525b2c5b94b47c70a4b4fb19f871b24995c728e957ee68ab1671ea/charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381", size = 151550 }, + { url = "https://files.pythonhosted.org/packages/55/c2/43edd615fdfba8c6f2dfbd459b25a6b3b551f24ea21981e23fb768503ce1/charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815", size = 149162 }, + { url = "https://files.pythonhosted.org/packages/03/86/bde4ad8b4d0e9429a4e82c1e8f5c659993a9a863ad62c7df05cf7b678d75/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0", size = 150019 }, + { url = "https://files.pythonhosted.org/packages/1f/86/a151eb2af293a7e7bac3a739b81072585ce36ccfb4493039f49f1d3cae8c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161", size = 143310 }, + { url = "https://files.pythonhosted.org/packages/b5/fe/43dae6144a7e07b87478fdfc4dbe9efd5defb0e7ec29f5f58a55aeef7bf7/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4", size = 162022 }, + { url = "https://files.pythonhosted.org/packages/80/e6/7aab83774f5d2bca81f42ac58d04caf44f0cc2b65fc6db2b3b2e8a05f3b3/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89", size = 149383 }, + { url = "https://files.pythonhosted.org/packages/4f/e8/b289173b4edae05c0dde07f69f8db476a0b511eac556dfe0d6bda3c43384/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569", size = 159098 }, + { url = "https://files.pythonhosted.org/packages/d8/df/fe699727754cae3f8478493c7f45f777b17c3ef0600e28abfec8619eb49c/charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224", size = 152991 }, + { url = "https://files.pythonhosted.org/packages/1a/86/584869fe4ddb6ffa3bd9f491b87a01568797fb9bd8933f557dba9771beaf/charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a", size = 99456 }, + { url = "https://files.pythonhosted.org/packages/65/f6/62fdd5feb60530f50f7e38b4f6a1d5203f4d16ff4f9f0952962c044e919a/charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016", size = 106978 }, + { url = "https://files.pythonhosted.org/packages/7a/9d/0710916e6c82948b3be62d9d398cb4fcf4e97b56d6a6aeccd66c4b2f2bd5/charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1", size = 99969 }, + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425 }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162 }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558 }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497 }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240 }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471 }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864 }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647 }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110 }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839 }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667 }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535 }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816 }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694 }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131 }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390 }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091 }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936 }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180 }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346 }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874 }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076 }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601 }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376 }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825 }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583 }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366 }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300 }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465 }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404 }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092 }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408 }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746 }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889 }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641 }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779 }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035 }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542 }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524 }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395 }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680 }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045 }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687 }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014 }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044 }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940 }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104 }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743 }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402 }, ] [[package]] name = "click" version = "8.3.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065, upload-time = "2025-11-15T20:45:42.706Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274, upload-time = "2025-11-15T20:45:41.139Z" }, -] - -[[package]] -name = "cloudpickle" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065 } wheels = [ - { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274 }, ] [[package]] name = "colorama" version = "0.4.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, -] - -[[package]] -name = "colorlog" -version = "6.10.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "colorama", marker = "sys_platform == 'win32'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/a2/61/f083b5ac52e505dfc1c624eafbf8c7589a0d7f32daa398d2e7590efa5fda/colorlog-6.10.1.tar.gz", hash = "sha256:eb4ae5cb65fe7fec7773c2306061a8e63e02efc2c72eba9d27b0fa23c94f1321", size = 17162, upload-time = "2025-10-16T16:14:11.978Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/6d/c1/e419ef3723a074172b68aaa89c9f3de486ed4c2399e2dbd8113a4fdcaf9e/colorlog-6.10.1-py3-none-any.whl", hash = "sha256:2d7e8348291948af66122cff006c9f8da6255d224e7cf8e37d8de2df3bad8c9c", size = 11743, upload-time = "2025-10-16T16:14:10.512Z" }, + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, ] [[package]] name = "cryptography" version = "46.0.4" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301, upload-time = "2026-01-28T00:24:37.379Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485", size = 7173686, upload-time = "2026-01-28T00:23:07.515Z" }, - { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871, upload-time = "2026-01-28T00:23:09.439Z" }, - { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124, upload-time = "2026-01-28T00:23:11.529Z" }, - { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090, upload-time = "2026-01-28T00:23:13.123Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652, upload-time = "2026-01-28T00:23:14.554Z" }, - { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157, upload-time = "2026-01-28T00:23:16.443Z" }, - { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078, upload-time = "2026-01-28T00:23:17.838Z" }, - { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213, upload-time = "2026-01-28T00:23:19.257Z" }, - { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190, upload-time = "2026-01-28T00:23:21.244Z" }, - { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641, upload-time = "2026-01-28T00:23:22.866Z" }, - { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159, upload-time = "2026-01-28T00:23:25.278Z" }, - { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059, upload-time = "2026-01-28T00:23:26.766Z" }, - { url = "https://files.pythonhosted.org/packages/eb/a7/0fca0fd3591dffc297278a61813d7f661a14243dd60f499a7a5b48acb52a/cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5", size = 3026378, upload-time = "2026-01-28T00:23:28.317Z" }, - { url = "https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b", size = 3478614, upload-time = "2026-01-28T00:23:30.275Z" }, - { url = "https://files.pythonhosted.org/packages/b9/27/542b029f293a5cce59349d799d4d8484b3b1654a7b9a0585c266e974a488/cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908", size = 7116417, upload-time = "2026-01-28T00:23:31.958Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f5/559c25b77f40b6bf828eabaf988efb8b0e17b573545edb503368ca0a2a03/cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da", size = 4264508, upload-time = "2026-01-28T00:23:34.264Z" }, - { url = "https://files.pythonhosted.org/packages/49/a1/551fa162d33074b660dc35c9bc3616fefa21a0e8c1edd27b92559902e408/cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829", size = 4409080, upload-time = "2026-01-28T00:23:35.793Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6a/4d8d129a755f5d6df1bbee69ea2f35ebfa954fa1847690d1db2e8bca46a5/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2", size = 4270039, upload-time = "2026-01-28T00:23:37.263Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f5/ed3fcddd0a5e39321e595e144615399e47e7c153a1fb8c4862aec3151ff9/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085", size = 4926748, upload-time = "2026-01-28T00:23:38.884Z" }, - { url = "https://files.pythonhosted.org/packages/43/ae/9f03d5f0c0c00e85ecb34f06d3b79599f20630e4db91b8a6e56e8f83d410/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b", size = 4442307, upload-time = "2026-01-28T00:23:40.56Z" }, - { url = "https://files.pythonhosted.org/packages/8b/22/e0f9f2dae8040695103369cf2283ef9ac8abe4d51f68710bec2afd232609/cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd", size = 3959253, upload-time = "2026-01-28T00:23:42.827Z" }, - { url = "https://files.pythonhosted.org/packages/01/5b/6a43fcccc51dae4d101ac7d378a8724d1ba3de628a24e11bf2f4f43cba4d/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2", size = 4269372, upload-time = "2026-01-28T00:23:44.655Z" }, - { url = "https://files.pythonhosted.org/packages/17/b7/0f6b8c1dd0779df2b526e78978ff00462355e31c0a6f6cff8a3e99889c90/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e", size = 4891908, upload-time = "2026-01-28T00:23:46.48Z" }, - { url = "https://files.pythonhosted.org/packages/83/17/259409b8349aa10535358807a472c6a695cf84f106022268d31cea2b6c97/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f", size = 4441254, upload-time = "2026-01-28T00:23:48.403Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fe/e4a1b0c989b00cee5ffa0764401767e2d1cf59f45530963b894129fd5dce/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82", size = 4396520, upload-time = "2026-01-28T00:23:50.26Z" }, - { url = "https://files.pythonhosted.org/packages/b3/81/ba8fd9657d27076eb40d6a2f941b23429a3c3d2f56f5a921d6b936a27bc9/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c", size = 4651479, upload-time = "2026-01-28T00:23:51.674Z" }, - { url = "https://files.pythonhosted.org/packages/00/03/0de4ed43c71c31e4fe954edd50b9d28d658fef56555eba7641696370a8e2/cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061", size = 3001986, upload-time = "2026-01-28T00:23:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/5c/70/81830b59df7682917d7a10f833c4dab2a5574cd664e86d18139f2b421329/cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7", size = 3468288, upload-time = "2026-01-28T00:23:55.09Z" }, - { url = "https://files.pythonhosted.org/packages/56/f7/f648fdbb61d0d45902d3f374217451385edc7e7768d1b03ff1d0e5ffc17b/cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab", size = 7169583, upload-time = "2026-01-28T00:23:56.558Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419, upload-time = "2026-01-28T00:23:58.364Z" }, - { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058, upload-time = "2026-01-28T00:23:59.867Z" }, - { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151, upload-time = "2026-01-28T00:24:01.731Z" }, - { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441, upload-time = "2026-01-28T00:24:03.175Z" }, - { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617, upload-time = "2026-01-28T00:24:05.403Z" }, - { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774, upload-time = "2026-01-28T00:24:06.851Z" }, - { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008, upload-time = "2026-01-28T00:24:08.926Z" }, - { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339, upload-time = "2026-01-28T00:24:12.009Z" }, - { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216, upload-time = "2026-01-28T00:24:13.975Z" }, - { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299, upload-time = "2026-01-28T00:24:16.169Z" }, - { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837, upload-time = "2026-01-28T00:24:17.629Z" }, - { url = "https://files.pythonhosted.org/packages/0a/21/f7433d18fe6d5845329cbdc597e30caf983229c7a245bcf54afecc555938/cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc", size = 3009779, upload-time = "2026-01-28T00:24:20.198Z" }, - { url = "https://files.pythonhosted.org/packages/3a/6a/bd2e7caa2facffedf172a45c1a02e551e6d7d4828658c9a245516a598d94/cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976", size = 3466633, upload-time = "2026-01-28T00:24:21.851Z" }, - { url = "https://files.pythonhosted.org/packages/59/e0/f9c6c53e1f2a1c2507f00f2faba00f01d2f334b35b0fbfe5286715da2184/cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b", size = 3476316, upload-time = "2026-01-28T00:24:24.144Z" }, - { url = "https://files.pythonhosted.org/packages/27/7a/f8d2d13227a9a1a9fe9c7442b057efecffa41f1e3c51d8622f26b9edbe8f/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da", size = 4216693, upload-time = "2026-01-28T00:24:25.758Z" }, - { url = "https://files.pythonhosted.org/packages/c5/de/3787054e8f7972658370198753835d9d680f6cd4a39df9f877b57f0dd69c/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80", size = 4382765, upload-time = "2026-01-28T00:24:27.577Z" }, - { url = "https://files.pythonhosted.org/packages/8a/5f/60e0afb019973ba6a0b322e86b3d61edf487a4f5597618a430a2a15f2d22/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822", size = 4216066, upload-time = "2026-01-28T00:24:29.056Z" }, - { url = "https://files.pythonhosted.org/packages/81/8e/bf4a0de294f147fee66f879d9bae6f8e8d61515558e3d12785dd90eca0be/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947", size = 4382025, upload-time = "2026-01-28T00:24:30.681Z" }, - { url = "https://files.pythonhosted.org/packages/79/f4/9ceb90cfd6a3847069b0b0b353fd3075dc69b49defc70182d8af0c4ca390/cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3", size = 3406043, upload-time = "2026-01-28T00:24:32.236Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/78/19/f748958276519adf6a0c1e79e7b8860b4830dda55ccdf29f2719b5fc499c/cryptography-46.0.4.tar.gz", hash = "sha256:bfd019f60f8abc2ed1b9be4ddc21cfef059c841d86d710bb69909a688cbb8f59", size = 749301 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/99/157aae7949a5f30d51fcb1a9851e8ebd5c74bf99b5285d8bb4b8b9ee641e/cryptography-46.0.4-cp311-abi3-macosx_10_9_universal2.whl", hash = "sha256:281526e865ed4166009e235afadf3a4c4cba6056f99336a99efba65336fd5485", size = 7173686 }, + { url = "https://files.pythonhosted.org/packages/87/91/874b8910903159043b5c6a123b7e79c4559ddd1896e38967567942635778/cryptography-46.0.4-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5f14fba5bf6f4390d7ff8f086c566454bff0411f6d8aa7af79c88b6f9267aecc", size = 4275871 }, + { url = "https://files.pythonhosted.org/packages/c0/35/690e809be77896111f5b195ede56e4b4ed0435b428c2f2b6d35046fbb5e8/cryptography-46.0.4-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:47bcd19517e6389132f76e2d5303ded6cf3f78903da2158a671be8de024f4cd0", size = 4423124 }, + { url = "https://files.pythonhosted.org/packages/1a/5b/a26407d4f79d61ca4bebaa9213feafdd8806dc69d3d290ce24996d3cfe43/cryptography-46.0.4-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:01df4f50f314fbe7009f54046e908d1754f19d0c6d3070df1e6268c5a4af09fa", size = 4277090 }, + { url = "https://files.pythonhosted.org/packages/0c/d8/4bb7aec442a9049827aa34cee1aa83803e528fa55da9a9d45d01d1bb933e/cryptography-46.0.4-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:5aa3e463596b0087b3da0dbe2b2487e9fc261d25da85754e30e3b40637d61f81", size = 4947652 }, + { url = "https://files.pythonhosted.org/packages/2b/08/f83e2e0814248b844265802d081f2fac2f1cbe6cd258e72ba14ff006823a/cryptography-46.0.4-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0a9ad24359fee86f131836a9ac3bffc9329e956624a2d379b613f8f8abaf5255", size = 4455157 }, + { url = "https://files.pythonhosted.org/packages/0a/05/19d849cf4096448779d2dcc9bb27d097457dac36f7273ffa875a93b5884c/cryptography-46.0.4-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:dc1272e25ef673efe72f2096e92ae39dea1a1a450dd44918b15351f72c5a168e", size = 3981078 }, + { url = "https://files.pythonhosted.org/packages/e6/89/f7bac81d66ba7cde867a743ea5b37537b32b5c633c473002b26a226f703f/cryptography-46.0.4-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:de0f5f4ec8711ebc555f54735d4c673fc34b65c44283895f1a08c2b49d2fd99c", size = 4276213 }, + { url = "https://files.pythonhosted.org/packages/da/9f/7133e41f24edd827020ad21b068736e792bc68eecf66d93c924ad4719fb3/cryptography-46.0.4-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:eeeb2e33d8dbcccc34d64651f00a98cb41b2dc69cef866771a5717e6734dfa32", size = 4912190 }, + { url = "https://files.pythonhosted.org/packages/a6/f7/6d43cbaddf6f65b24816e4af187d211f0bc536a29961f69faedc48501d8e/cryptography-46.0.4-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:3d425eacbc9aceafd2cb429e42f4e5d5633c6f873f5e567077043ef1b9bbf616", size = 4454641 }, + { url = "https://files.pythonhosted.org/packages/9e/4f/ebd0473ad656a0ac912a16bd07db0f5d85184924e14fc88feecae2492834/cryptography-46.0.4-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:91627ebf691d1ea3976a031b61fb7bac1ccd745afa03602275dda443e11c8de0", size = 4405159 }, + { url = "https://files.pythonhosted.org/packages/d1/f7/7923886f32dc47e27adeff8246e976d77258fd2aa3efdd1754e4e323bf49/cryptography-46.0.4-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:2d08bc22efd73e8854b0b7caff402d735b354862f1145d7be3b9c0f740fef6a0", size = 4666059 }, + { url = "https://files.pythonhosted.org/packages/eb/a7/0fca0fd3591dffc297278a61813d7f661a14243dd60f499a7a5b48acb52a/cryptography-46.0.4-cp311-abi3-win32.whl", hash = "sha256:82a62483daf20b8134f6e92898da70d04d0ef9a75829d732ea1018678185f4f5", size = 3026378 }, + { url = "https://files.pythonhosted.org/packages/2d/12/652c84b6f9873f0909374864a57b003686c642ea48c84d6c7e2c515e6da5/cryptography-46.0.4-cp311-abi3-win_amd64.whl", hash = "sha256:6225d3ebe26a55dbc8ead5ad1265c0403552a63336499564675b29eb3184c09b", size = 3478614 }, + { url = "https://files.pythonhosted.org/packages/b9/27/542b029f293a5cce59349d799d4d8484b3b1654a7b9a0585c266e974a488/cryptography-46.0.4-cp314-cp314t-macosx_10_9_universal2.whl", hash = "sha256:485e2b65d25ec0d901bca7bcae0f53b00133bf3173916d8e421f6fddde103908", size = 7116417 }, + { url = "https://files.pythonhosted.org/packages/f8/f5/559c25b77f40b6bf828eabaf988efb8b0e17b573545edb503368ca0a2a03/cryptography-46.0.4-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:078e5f06bd2fa5aea5a324f2a09f914b1484f1d0c2a4d6a8a28c74e72f65f2da", size = 4264508 }, + { url = "https://files.pythonhosted.org/packages/49/a1/551fa162d33074b660dc35c9bc3616fefa21a0e8c1edd27b92559902e408/cryptography-46.0.4-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dce1e4f068f03008da7fa51cc7abc6ddc5e5de3e3d1550334eaf8393982a5829", size = 4409080 }, + { url = "https://files.pythonhosted.org/packages/b0/6a/4d8d129a755f5d6df1bbee69ea2f35ebfa954fa1847690d1db2e8bca46a5/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:2067461c80271f422ee7bdbe79b9b4be54a5162e90345f86a23445a0cf3fd8a2", size = 4270039 }, + { url = "https://files.pythonhosted.org/packages/4c/f5/ed3fcddd0a5e39321e595e144615399e47e7c153a1fb8c4862aec3151ff9/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_ppc64le.whl", hash = "sha256:c92010b58a51196a5f41c3795190203ac52edfd5dc3ff99149b4659eba9d2085", size = 4926748 }, + { url = "https://files.pythonhosted.org/packages/43/ae/9f03d5f0c0c00e85ecb34f06d3b79599f20630e4db91b8a6e56e8f83d410/cryptography-46.0.4-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:829c2b12bbc5428ab02d6b7f7e9bbfd53e33efd6672d21341f2177470171ad8b", size = 4442307 }, + { url = "https://files.pythonhosted.org/packages/8b/22/e0f9f2dae8040695103369cf2283ef9ac8abe4d51f68710bec2afd232609/cryptography-46.0.4-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:62217ba44bf81b30abaeda1488686a04a702a261e26f87db51ff61d9d3510abd", size = 3959253 }, + { url = "https://files.pythonhosted.org/packages/01/5b/6a43fcccc51dae4d101ac7d378a8724d1ba3de628a24e11bf2f4f43cba4d/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_aarch64.whl", hash = "sha256:9c2da296c8d3415b93e6053f5a728649a87a48ce084a9aaf51d6e46c87c7f2d2", size = 4269372 }, + { url = "https://files.pythonhosted.org/packages/17/b7/0f6b8c1dd0779df2b526e78978ff00462355e31c0a6f6cff8a3e99889c90/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_ppc64le.whl", hash = "sha256:9b34d8ba84454641a6bf4d6762d15847ecbd85c1316c0a7984e6e4e9f748ec2e", size = 4891908 }, + { url = "https://files.pythonhosted.org/packages/83/17/259409b8349aa10535358807a472c6a695cf84f106022268d31cea2b6c97/cryptography-46.0.4-cp314-cp314t-manylinux_2_34_x86_64.whl", hash = "sha256:df4a817fa7138dd0c96c8c8c20f04b8aaa1fac3bbf610913dcad8ea82e1bfd3f", size = 4441254 }, + { url = "https://files.pythonhosted.org/packages/9c/fe/e4a1b0c989b00cee5ffa0764401767e2d1cf59f45530963b894129fd5dce/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b1de0ebf7587f28f9190b9cb526e901bf448c9e6a99655d2b07fff60e8212a82", size = 4396520 }, + { url = "https://files.pythonhosted.org/packages/b3/81/ba8fd9657d27076eb40d6a2f941b23429a3c3d2f56f5a921d6b936a27bc9/cryptography-46.0.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9b4d17bc7bd7cdd98e3af40b441feaea4c68225e2eb2341026c84511ad246c0c", size = 4651479 }, + { url = "https://files.pythonhosted.org/packages/00/03/0de4ed43c71c31e4fe954edd50b9d28d658fef56555eba7641696370a8e2/cryptography-46.0.4-cp314-cp314t-win32.whl", hash = "sha256:c411f16275b0dea722d76544a61d6421e2cc829ad76eec79280dbdc9ddf50061", size = 3001986 }, + { url = "https://files.pythonhosted.org/packages/5c/70/81830b59df7682917d7a10f833c4dab2a5574cd664e86d18139f2b421329/cryptography-46.0.4-cp314-cp314t-win_amd64.whl", hash = "sha256:728fedc529efc1439eb6107b677f7f7558adab4553ef8669f0d02d42d7b959a7", size = 3468288 }, + { url = "https://files.pythonhosted.org/packages/56/f7/f648fdbb61d0d45902d3f374217451385edc7e7768d1b03ff1d0e5ffc17b/cryptography-46.0.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:a9556ba711f7c23f77b151d5798f3ac44a13455cc68db7697a1096e6d0563cab", size = 7169583 }, + { url = "https://files.pythonhosted.org/packages/d8/cc/8f3224cbb2a928de7298d6ed4790f5ebc48114e02bdc9559196bfb12435d/cryptography-46.0.4-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8bf75b0259e87fa70bddc0b8b4078b76e7fd512fd9afae6c1193bcf440a4dbef", size = 4275419 }, + { url = "https://files.pythonhosted.org/packages/17/43/4a18faa7a872d00e4264855134ba82d23546c850a70ff209e04ee200e76f/cryptography-46.0.4-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3c268a3490df22270955966ba236d6bc4a8f9b6e4ffddb78aac535f1a5ea471d", size = 4419058 }, + { url = "https://files.pythonhosted.org/packages/ee/64/6651969409821d791ba12346a124f55e1b76f66a819254ae840a965d4b9c/cryptography-46.0.4-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:812815182f6a0c1d49a37893a303b44eaac827d7f0d582cecfc81b6427f22973", size = 4278151 }, + { url = "https://files.pythonhosted.org/packages/20/0b/a7fce65ee08c3c02f7a8310cc090a732344066b990ac63a9dfd0a655d321/cryptography-46.0.4-cp38-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:a90e43e3ef65e6dcf969dfe3bb40cbf5aef0d523dff95bfa24256be172a845f4", size = 4939441 }, + { url = "https://files.pythonhosted.org/packages/db/a7/20c5701e2cd3e1dfd7a19d2290c522a5f435dd30957d431dcb531d0f1413/cryptography-46.0.4-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:a05177ff6296644ef2876fce50518dffb5bcdf903c85250974fc8bc85d54c0af", size = 4451617 }, + { url = "https://files.pythonhosted.org/packages/00/dc/3e16030ea9aa47b63af6524c354933b4fb0e352257c792c4deeb0edae367/cryptography-46.0.4-cp38-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:daa392191f626d50f1b136c9b4cf08af69ca8279d110ea24f5c2700054d2e263", size = 3977774 }, + { url = "https://files.pythonhosted.org/packages/42/c8/ad93f14118252717b465880368721c963975ac4b941b7ef88f3c56bf2897/cryptography-46.0.4-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:e07ea39c5b048e085f15923511d8121e4a9dc45cee4e3b970ca4f0d338f23095", size = 4277008 }, + { url = "https://files.pythonhosted.org/packages/00/cf/89c99698151c00a4631fbfcfcf459d308213ac29e321b0ff44ceeeac82f1/cryptography-46.0.4-cp38-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d5a45ddc256f492ce42a4e35879c5e5528c09cd9ad12420828c972951d8e016b", size = 4903339 }, + { url = "https://files.pythonhosted.org/packages/03/c3/c90a2cb358de4ac9309b26acf49b2a100957e1ff5cc1e98e6c4996576710/cryptography-46.0.4-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:6bb5157bf6a350e5b28aee23beb2d84ae6f5be390b2f8ee7ea179cda077e1019", size = 4451216 }, + { url = "https://files.pythonhosted.org/packages/96/2c/8d7f4171388a10208671e181ca43cdc0e596d8259ebacbbcfbd16de593da/cryptography-46.0.4-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:dd5aba870a2c40f87a3af043e0dee7d9eb02d4aff88a797b48f2b43eff8c3ab4", size = 4404299 }, + { url = "https://files.pythonhosted.org/packages/e9/23/cbb2036e450980f65c6e0a173b73a56ff3bccd8998965dea5cc9ddd424a5/cryptography-46.0.4-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:93d8291da8d71024379ab2cb0b5c57915300155ad42e07f76bea6ad838d7e59b", size = 4664837 }, + { url = "https://files.pythonhosted.org/packages/0a/21/f7433d18fe6d5845329cbdc597e30caf983229c7a245bcf54afecc555938/cryptography-46.0.4-cp38-abi3-win32.whl", hash = "sha256:0563655cb3c6d05fb2afe693340bc050c30f9f34e15763361cf08e94749401fc", size = 3009779 }, + { url = "https://files.pythonhosted.org/packages/3a/6a/bd2e7caa2facffedf172a45c1a02e551e6d7d4828658c9a245516a598d94/cryptography-46.0.4-cp38-abi3-win_amd64.whl", hash = "sha256:fa0900b9ef9c49728887d1576fd8d9e7e3ea872fa9b25ef9b64888adc434e976", size = 3466633 }, + { url = "https://files.pythonhosted.org/packages/59/e0/f9c6c53e1f2a1c2507f00f2faba00f01d2f334b35b0fbfe5286715da2184/cryptography-46.0.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:766330cce7416c92b5e90c3bb71b1b79521760cdcfc3a6a1a182d4c9fab23d2b", size = 3476316 }, + { url = "https://files.pythonhosted.org/packages/27/7a/f8d2d13227a9a1a9fe9c7442b057efecffa41f1e3c51d8622f26b9edbe8f/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c236a44acfb610e70f6b3e1c3ca20ff24459659231ef2f8c48e879e2d32b73da", size = 4216693 }, + { url = "https://files.pythonhosted.org/packages/c5/de/3787054e8f7972658370198753835d9d680f6cd4a39df9f877b57f0dd69c/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:8a15fb869670efa8f83cbffbc8753c1abf236883225aed74cd179b720ac9ec80", size = 4382765 }, + { url = "https://files.pythonhosted.org/packages/8a/5f/60e0afb019973ba6a0b322e86b3d61edf487a4f5597618a430a2a15f2d22/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:fdc3daab53b212472f1524d070735b2f0c214239df131903bae1d598016fa822", size = 4216066 }, + { url = "https://files.pythonhosted.org/packages/81/8e/bf4a0de294f147fee66f879d9bae6f8e8d61515558e3d12785dd90eca0be/cryptography-46.0.4-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:44cc0675b27cadb71bdbb96099cca1fa051cd11d2ade09e5cd3a2edb929ed947", size = 4382025 }, + { url = "https://files.pythonhosted.org/packages/79/f4/9ceb90cfd6a3847069b0b0b353fd3075dc69b49defc70182d8af0c4ca390/cryptography-46.0.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be8c01a7d5a55f9a47d1888162b76c8f49d62b234d88f0ff91a9fbebe32ffbc3", size = 3406043 }, ] [[package]] name = "cuda-bindings" version = "12.9.4" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "cuda-pathfinder" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/7a/d8/b546104b8da3f562c1ff8ab36d130c8fe1dd6a045ced80b4f6ad74f7d4e1/cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d3c842c2a4303b2a580fe955018e31aea30278be19795ae05226235268032e5", size = 12148218, upload-time = "2025-10-21T14:51:28.855Z" }, - { url = "https://files.pythonhosted.org/packages/45/e7/b47792cc2d01c7e1d37c32402182524774dadd2d26339bd224e0e913832e/cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c912a3d9e6b6651853eed8eed96d6800d69c08e94052c292fec3f282c5a817c9", size = 12210593, upload-time = "2025-10-21T14:51:36.574Z" }, - { url = "https://files.pythonhosted.org/packages/a9/c1/dabe88f52c3e3760d861401bb994df08f672ec893b8f7592dc91626adcf3/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8", size = 12151019, upload-time = "2025-10-21T14:51:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/63/56/e465c31dc9111be3441a9ba7df1941fe98f4aa6e71e8788a3fb4534ce24d/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f", size = 11906628, upload-time = "2025-10-21T14:51:49.905Z" }, - { url = "https://files.pythonhosted.org/packages/a3/84/1e6be415e37478070aeeee5884c2022713c1ecc735e6d82d744de0252eee/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb", size = 11925991, upload-time = "2025-10-21T14:51:56.535Z" }, - { url = "https://files.pythonhosted.org/packages/d1/af/6dfd8f2ed90b1d4719bc053ff8940e494640fe4212dc3dd72f383e4992da/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b72ee72a9cc1b531db31eebaaee5c69a8ec3500e32c6933f2d3b15297b53686", size = 11922703, upload-time = "2025-10-21T14:52:03.585Z" }, - { url = "https://files.pythonhosted.org/packages/6c/19/90ac264acc00f6df8a49378eedec9fd2db3061bf9263bf9f39fd3d8377c3/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80bffc357df9988dca279734bc9674c3934a654cab10cadeed27ce17d8635ee", size = 11924658, upload-time = "2025-10-21T14:52:10.411Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d8/b546104b8da3f562c1ff8ab36d130c8fe1dd6a045ced80b4f6ad74f7d4e1/cuda_bindings-12.9.4-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d3c842c2a4303b2a580fe955018e31aea30278be19795ae05226235268032e5", size = 12148218 }, + { url = "https://files.pythonhosted.org/packages/45/e7/b47792cc2d01c7e1d37c32402182524774dadd2d26339bd224e0e913832e/cuda_bindings-12.9.4-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c912a3d9e6b6651853eed8eed96d6800d69c08e94052c292fec3f282c5a817c9", size = 12210593 }, + { url = "https://files.pythonhosted.org/packages/a9/c1/dabe88f52c3e3760d861401bb994df08f672ec893b8f7592dc91626adcf3/cuda_bindings-12.9.4-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fda147a344e8eaeca0c6ff113d2851ffca8f7dfc0a6c932374ee5c47caa649c8", size = 12151019 }, + { url = "https://files.pythonhosted.org/packages/63/56/e465c31dc9111be3441a9ba7df1941fe98f4aa6e71e8788a3fb4534ce24d/cuda_bindings-12.9.4-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:32bdc5a76906be4c61eb98f546a6786c5773a881f3b166486449b5d141e4a39f", size = 11906628 }, + { url = "https://files.pythonhosted.org/packages/a3/84/1e6be415e37478070aeeee5884c2022713c1ecc735e6d82d744de0252eee/cuda_bindings-12.9.4-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56e0043c457a99ac473ddc926fe0dc4046694d99caef633e92601ab52cbe17eb", size = 11925991 }, + { url = "https://files.pythonhosted.org/packages/d1/af/6dfd8f2ed90b1d4719bc053ff8940e494640fe4212dc3dd72f383e4992da/cuda_bindings-12.9.4-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8b72ee72a9cc1b531db31eebaaee5c69a8ec3500e32c6933f2d3b15297b53686", size = 11922703 }, + { url = "https://files.pythonhosted.org/packages/6c/19/90ac264acc00f6df8a49378eedec9fd2db3061bf9263bf9f39fd3d8377c3/cuda_bindings-12.9.4-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d80bffc357df9988dca279734bc9674c3934a654cab10cadeed27ce17d8635ee", size = 11924658 }, ] [[package]] name = "cuda-pathfinder" version = "1.3.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0b/02/4dbe7568a42e46582248942f54dc64ad094769532adbe21e525e4edf7bc4/cuda_pathfinder-1.3.3-py3-none-any.whl", hash = "sha256:9984b664e404f7c134954a771be8775dfd6180ea1e1aef4a5a37d4be05d9bbb1", size = 27154, upload-time = "2025-12-04T22:35:08.996Z" }, + { url = "https://files.pythonhosted.org/packages/0b/02/4dbe7568a42e46582248942f54dc64ad094769532adbe21e525e4edf7bc4/cuda_pathfinder-1.3.3-py3-none-any.whl", hash = "sha256:9984b664e404f7c134954a771be8775dfd6180ea1e1aef4a5a37d4be05d9bbb1", size = 27154 }, ] [[package]] name = "datasets" version = "4.5.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "dill" }, { name = "filelock" }, @@ -708,8 +651,8 @@ dependencies = [ { name = "httpx" }, { name = "huggingface-hub" }, { name = "multiprocess" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pandas" }, { name = "pyarrow" }, @@ -718,316 +661,193 @@ dependencies = [ { name = "tqdm" }, { name = "xxhash" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/bf/bb927bde63d649296c83e883171ae77074717c1b80fe2868b328bd0dbcbb/datasets-4.5.0.tar.gz", hash = "sha256:00c698ce1c2452e646cc5fad47fef39d3fe78dd650a8a6eb205bb45eb63cd500", size = 588384, upload-time = "2026-01-14T18:27:54.297Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/bf/bb927bde63d649296c83e883171ae77074717c1b80fe2868b328bd0dbcbb/datasets-4.5.0.tar.gz", hash = "sha256:00c698ce1c2452e646cc5fad47fef39d3fe78dd650a8a6eb205bb45eb63cd500", size = 588384 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/d5/0d563ea3c205eee226dc8053cf7682a8ac588db8acecd0eda2b587987a0b/datasets-4.5.0-py3-none-any.whl", hash = "sha256:b5d7e08096ffa407dd69e58b1c0271c9b2506140839b8d99af07375ad31b6726", size = 515196, upload-time = "2026-01-14T18:27:52.419Z" }, + { url = "https://files.pythonhosted.org/packages/fc/d5/0d563ea3c205eee226dc8053cf7682a8ac588db8acecd0eda2b587987a0b/datasets-4.5.0-py3-none-any.whl", hash = "sha256:b5d7e08096ffa407dd69e58b1c0271c9b2506140839b8d99af07375ad31b6726", size = 515196 }, ] [[package]] name = "dill" version = "0.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976, upload-time = "2025-04-16T00:41:48.867Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/12/80/630b4b88364e9a8c8c5797f4602d0f76ef820909ee32f0bacb9f90654042/dill-0.4.0.tar.gz", hash = "sha256:0633f1d2df477324f53a895b02c901fb961bdbf65a17122586ea7019292cbcf0", size = 186976 } wheels = [ - { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668, upload-time = "2025-04-16T00:41:47.671Z" }, -] - -[[package]] -name = "diskcache" -version = "5.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/3f/21/1c1ffc1a039ddcc459db43cc108658f32c57d271d7289a2794e401d0fdb6/diskcache-5.6.3.tar.gz", hash = "sha256:2c3a3fa2743d8535d832ec61c2054a1641f41775aa7c556758a109941e33e4fc", size = 67916, upload-time = "2023-08-31T06:12:00.316Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3f/27/4570e78fc0bf5ea0ca45eb1de3818a23787af9b390c0b0a0033a1b8236f9/diskcache-5.6.3-py3-none-any.whl", hash = "sha256:5e31b2d5fbad117cc363ebaf6b689474db18a1f6438bc82358b024abd4c2ca19", size = 45550, upload-time = "2023-08-31T06:11:58.822Z" }, -] - -[[package]] -name = "distro" -version = "1.9.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fc/f8/98eea607f65de6527f8a2e8885fc8015d3e6f5775df186e443e0964a11c3/distro-1.9.0.tar.gz", hash = "sha256:2fa77c6fd8940f116ee1d6b94a2f90b13b5ea8d019b98bc8bafdcabcdd9bdbed", size = 60722, upload-time = "2023-12-24T09:54:32.31Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/12/b3/231ffd4ab1fc9d679809f356cebee130ac7daa00d6d6f3206dd4fd137e9e/distro-1.9.0-py3-none-any.whl", hash = "sha256:7bffd925d65168f85027d8da9af6bddab658135b840670a223589bc0c8ef02b2", size = 20277, upload-time = "2023-12-24T09:54:30.421Z" }, -] - -[[package]] -name = "dspy" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "asyncer" }, - { name = "cachetools" }, - { name = "cloudpickle" }, - { name = "diskcache" }, - { name = "gepa" }, - { name = "json-repair" }, - { name = "litellm" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "openai" }, - { name = "optuna" }, - { name = "orjson" }, - { name = "pydantic" }, - { name = "regex" }, - { name = "requests" }, - { name = "tenacity" }, - { name = "tqdm" }, - { name = "xxhash" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/92/4eeed6796c48e799a41aa521bf206fabab3dbb2fbf0958655b476e43726e/dspy-3.1.2.tar.gz", hash = "sha256:6dfd8a4bbf74b1b432ff466468994a590c43fce0d45c2c0094313c9314aa3bb6", size = 261253, upload-time = "2026-01-19T14:21:47.424Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/91/18/1c93641f25f4e76772b4ffb52a4e289f1706d6bda4f3b59bb6f7c339df46/dspy-3.1.2-py3-none-any.whl", hash = "sha256:23b98bf5abeda260722c445d397d07ea27488c204b8c0ccd6d3e607c4b41bc6b", size = 312290, upload-time = "2026-01-19T14:21:45.776Z" }, -] - -[[package]] -name = "dspy-ai" -version = "3.1.2" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "dspy" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/df/f1/9d7f77d6f59d635319d22ff88c2d270dff7b973fff45e185374761b05c58/dspy_ai-3.1.2.tar.gz", hash = "sha256:0dbc0f827ad4087e44fc3e9ca6648b6bb17c84b2f0844b39d53bcbbf79d5c340", size = 1104, upload-time = "2026-01-19T14:21:56.398Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c3/7a/148ad996676a166ab043d52c7beb82f79870d04c76a30858371ef6f31b42/dspy_ai-3.1.2-py3-none-any.whl", hash = "sha256:f3d3cf8bbf567211dfae537eca0e024e248c233d0cbddc1cef2685e92c84c885", size = 1096, upload-time = "2026-01-19T14:21:55.268Z" }, + { url = "https://files.pythonhosted.org/packages/50/3d/9373ad9c56321fdab5b41197068e1d8c25883b3fea29dd361f9b55116869/dill-0.4.0-py3-none-any.whl", hash = "sha256:44f54bf6412c2c8464c14e8243eb163690a9800dbe2c367330883b19c7561049", size = 119668 }, ] [[package]] name = "exceptiongroup" version = "1.3.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740 }, ] [[package]] name = "fastapi" version = "0.128.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "annotated-doc" }, { name = "pydantic" }, { name = "starlette" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682, upload-time = "2025-12-27T15:21:13.714Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094, upload-time = "2025-12-27T15:21:12.154Z" }, -] - -[[package]] -name = "fastuuid" -version = "0.14.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c3/7d/d9daedf0f2ebcacd20d599928f8913e9d2aea1d56d2d355a93bfa2b611d7/fastuuid-0.14.0.tar.gz", hash = "sha256:178947fc2f995b38497a74172adee64fdeb8b7ec18f2a5934d037641ba265d26", size = 18232, upload-time = "2025-10-19T22:19:22.402Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ad/b2/731a6696e37cd20eed353f69a09f37a984a43c9713764ee3f7ad5f57f7f9/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:6e6243d40f6c793c3e2ee14c13769e341b90be5ef0c23c82fa6515a96145181a", size = 516760, upload-time = "2025-10-19T22:25:21.509Z" }, - { url = "https://files.pythonhosted.org/packages/c5/79/c73c47be2a3b8734d16e628982653517f80bbe0570e27185d91af6096507/fastuuid-0.14.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:13ec4f2c3b04271f62be2e1ce7e95ad2dd1cf97e94503a3760db739afbd48f00", size = 264748, upload-time = "2025-10-19T22:41:52.873Z" }, - { url = "https://files.pythonhosted.org/packages/24/c5/84c1eea05977c8ba5173555b0133e3558dc628bcf868d6bf1689ff14aedc/fastuuid-0.14.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b2fdd48b5e4236df145a149d7125badb28e0a383372add3fbaac9a6b7a394470", size = 254537, upload-time = "2025-10-19T22:33:55.603Z" }, - { url = "https://files.pythonhosted.org/packages/0e/23/4e362367b7fa17dbed646922f216b9921efb486e7abe02147e4b917359f8/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f74631b8322d2780ebcf2d2d75d58045c3e9378625ec51865fe0b5620800c39d", size = 278994, upload-time = "2025-10-19T22:26:17.631Z" }, - { url = "https://files.pythonhosted.org/packages/b2/72/3985be633b5a428e9eaec4287ed4b873b7c4c53a9639a8b416637223c4cd/fastuuid-0.14.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:83cffc144dc93eb604b87b179837f2ce2af44871a7b323f2bfed40e8acb40ba8", size = 280003, upload-time = "2025-10-19T22:23:45.415Z" }, - { url = "https://files.pythonhosted.org/packages/b3/6d/6ef192a6df34e2266d5c9deb39cd3eea986df650cbcfeaf171aa52a059c3/fastuuid-0.14.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1a771f135ab4523eb786e95493803942a5d1fc1610915f131b363f55af53b219", size = 303583, upload-time = "2025-10-19T22:26:00.756Z" }, - { url = "https://files.pythonhosted.org/packages/9d/11/8a2ea753c68d4fece29d5d7c6f3f903948cc6e82d1823bc9f7f7c0355db3/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:4edc56b877d960b4eda2c4232f953a61490c3134da94f3c28af129fb9c62a4f6", size = 460955, upload-time = "2025-10-19T22:36:25.196Z" }, - { url = "https://files.pythonhosted.org/packages/23/42/7a32c93b6ce12642d9a152ee4753a078f372c9ebb893bc489d838dd4afd5/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:bcc96ee819c282e7c09b2eed2b9bd13084e3b749fdb2faf58c318d498df2efbe", size = 480763, upload-time = "2025-10-19T22:24:28.451Z" }, - { url = "https://files.pythonhosted.org/packages/b9/e9/a5f6f686b46e3ed4ed3b93770111c233baac87dd6586a411b4988018ef1d/fastuuid-0.14.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:7a3c0bca61eacc1843ea97b288d6789fbad7400d16db24e36a66c28c268cfe3d", size = 452613, upload-time = "2025-10-19T22:25:06.827Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c9/18abc73c9c5b7fc0e476c1733b678783b2e8a35b0be9babd423571d44e98/fastuuid-0.14.0-cp310-cp310-win32.whl", hash = "sha256:7f2f3efade4937fae4e77efae1af571902263de7b78a0aee1a1653795a093b2a", size = 155045, upload-time = "2025-10-19T22:28:32.732Z" }, - { url = "https://files.pythonhosted.org/packages/5e/8a/d9e33f4eb4d4f6d9f2c5c7d7e96b5cdbb535c93f3b1ad6acce97ee9d4bf8/fastuuid-0.14.0-cp310-cp310-win_amd64.whl", hash = "sha256:ae64ba730d179f439b0736208b4c279b8bc9c089b102aec23f86512ea458c8a4", size = 156122, upload-time = "2025-10-19T22:23:15.59Z" }, - { url = "https://files.pythonhosted.org/packages/98/f3/12481bda4e5b6d3e698fbf525df4443cc7dce746f246b86b6fcb2fba1844/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:73946cb950c8caf65127d4e9a325e2b6be0442a224fd51ba3b6ac44e1912ce34", size = 516386, upload-time = "2025-10-19T22:42:40.176Z" }, - { url = "https://files.pythonhosted.org/packages/59/19/2fc58a1446e4d72b655648eb0879b04e88ed6fa70d474efcf550f640f6ec/fastuuid-0.14.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:12ac85024637586a5b69645e7ed986f7535106ed3013640a393a03e461740cb7", size = 264569, upload-time = "2025-10-19T22:25:50.977Z" }, - { url = "https://files.pythonhosted.org/packages/78/29/3c74756e5b02c40cfcc8b1d8b5bac4edbd532b55917a6bcc9113550e99d1/fastuuid-0.14.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:05a8dde1f395e0c9b4be515b7a521403d1e8349443e7641761af07c7ad1624b1", size = 254366, upload-time = "2025-10-19T22:29:49.166Z" }, - { url = "https://files.pythonhosted.org/packages/52/96/d761da3fccfa84f0f353ce6e3eb8b7f76b3aa21fd25e1b00a19f9c80a063/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:09378a05020e3e4883dfdab438926f31fea15fd17604908f3d39cbeb22a0b4dc", size = 278978, upload-time = "2025-10-19T22:35:41.306Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c2/f84c90167cc7765cb82b3ff7808057608b21c14a38531845d933a4637307/fastuuid-0.14.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbb0c4b15d66b435d2538f3827f05e44e2baafcc003dd7d8472dc67807ab8fd8", size = 279692, upload-time = "2025-10-19T22:25:36.997Z" }, - { url = "https://files.pythonhosted.org/packages/af/7b/4bacd03897b88c12348e7bd77943bac32ccf80ff98100598fcff74f75f2e/fastuuid-0.14.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:cd5a7f648d4365b41dbf0e38fe8da4884e57bed4e77c83598e076ac0c93995e7", size = 303384, upload-time = "2025-10-19T22:29:46.578Z" }, - { url = "https://files.pythonhosted.org/packages/c0/a2/584f2c29641df8bd810d00c1f21d408c12e9ad0c0dafdb8b7b29e5ddf787/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:c0a94245afae4d7af8c43b3159d5e3934c53f47140be0be624b96acd672ceb73", size = 460921, upload-time = "2025-10-19T22:36:42.006Z" }, - { url = "https://files.pythonhosted.org/packages/24/68/c6b77443bb7764c760e211002c8638c0c7cce11cb584927e723215ba1398/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:2b29e23c97e77c3a9514d70ce343571e469098ac7f5a269320a0f0b3e193ab36", size = 480575, upload-time = "2025-10-19T22:28:18.975Z" }, - { url = "https://files.pythonhosted.org/packages/5a/87/93f553111b33f9bb83145be12868c3c475bf8ea87c107063d01377cc0e8e/fastuuid-0.14.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:1e690d48f923c253f28151b3a6b4e335f2b06bf669c68a02665bc150b7839e94", size = 452317, upload-time = "2025-10-19T22:25:32.75Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8c/a04d486ca55b5abb7eaa65b39df8d891b7b1635b22db2163734dc273579a/fastuuid-0.14.0-cp311-cp311-win32.whl", hash = "sha256:a6f46790d59ab38c6aa0e35c681c0484b50dc0acf9e2679c005d61e019313c24", size = 154804, upload-time = "2025-10-19T22:24:15.615Z" }, - { url = "https://files.pythonhosted.org/packages/9c/b2/2d40bf00820de94b9280366a122cbaa60090c8cf59e89ac3938cf5d75895/fastuuid-0.14.0-cp311-cp311-win_amd64.whl", hash = "sha256:e150eab56c95dc9e3fefc234a0eedb342fac433dacc273cd4d150a5b0871e1fa", size = 156099, upload-time = "2025-10-19T22:24:31.646Z" }, - { url = "https://files.pythonhosted.org/packages/02/a2/e78fcc5df65467f0d207661b7ef86c5b7ac62eea337c0c0fcedbeee6fb13/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77e94728324b63660ebf8adb27055e92d2e4611645bf12ed9d88d30486471d0a", size = 510164, upload-time = "2025-10-19T22:31:45.635Z" }, - { url = "https://files.pythonhosted.org/packages/2b/b3/c846f933f22f581f558ee63f81f29fa924acd971ce903dab1a9b6701816e/fastuuid-0.14.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:caa1f14d2102cb8d353096bc6ef6c13b2c81f347e6ab9d6fbd48b9dea41c153d", size = 261837, upload-time = "2025-10-19T22:38:38.53Z" }, - { url = "https://files.pythonhosted.org/packages/54/ea/682551030f8c4fa9a769d9825570ad28c0c71e30cf34020b85c1f7ee7382/fastuuid-0.14.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d23ef06f9e67163be38cece704170486715b177f6baae338110983f99a72c070", size = 251370, upload-time = "2025-10-19T22:40:26.07Z" }, - { url = "https://files.pythonhosted.org/packages/14/dd/5927f0a523d8e6a76b70968e6004966ee7df30322f5fc9b6cdfb0276646a/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0c9ec605ace243b6dbe3bd27ebdd5d33b00d8d1d3f580b39fdd15cd96fd71796", size = 277766, upload-time = "2025-10-19T22:37:23.779Z" }, - { url = "https://files.pythonhosted.org/packages/16/6e/c0fb547eef61293153348f12e0f75a06abb322664b34a1573a7760501336/fastuuid-0.14.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:808527f2407f58a76c916d6aa15d58692a4a019fdf8d4c32ac7ff303b7d7af09", size = 278105, upload-time = "2025-10-19T22:26:56.821Z" }, - { url = "https://files.pythonhosted.org/packages/2d/b1/b9c75e03b768f61cf2e84ee193dc18601aeaf89a4684b20f2f0e9f52b62c/fastuuid-0.14.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2fb3c0d7fef6674bbeacdd6dbd386924a7b60b26de849266d1ff6602937675c8", size = 301564, upload-time = "2025-10-19T22:30:31.604Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fa/f7395fdac07c7a54f18f801744573707321ca0cee082e638e36452355a9d/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:ab3f5d36e4393e628a4df337c2c039069344db5f4b9d2a3c9cea48284f1dd741", size = 459659, upload-time = "2025-10-19T22:31:32.341Z" }, - { url = "https://files.pythonhosted.org/packages/66/49/c9fd06a4a0b1f0f048aacb6599e7d96e5d6bc6fa680ed0d46bf111929d1b/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:b9a0ca4f03b7e0b01425281ffd44e99d360e15c895f1907ca105854ed85e2057", size = 478430, upload-time = "2025-10-19T22:26:22.962Z" }, - { url = "https://files.pythonhosted.org/packages/be/9c/909e8c95b494e8e140e8be6165d5fc3f61fdc46198c1554df7b3e1764471/fastuuid-0.14.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:3acdf655684cc09e60fb7e4cf524e8f42ea760031945aa8086c7eae2eeeabeb8", size = 450894, upload-time = "2025-10-19T22:27:01.647Z" }, - { url = "https://files.pythonhosted.org/packages/90/eb/d29d17521976e673c55ef7f210d4cdd72091a9ec6755d0fd4710d9b3c871/fastuuid-0.14.0-cp312-cp312-win32.whl", hash = "sha256:9579618be6280700ae36ac42c3efd157049fe4dd40ca49b021280481c78c3176", size = 154374, upload-time = "2025-10-19T22:29:19.879Z" }, - { url = "https://files.pythonhosted.org/packages/cc/fc/f5c799a6ea6d877faec0472d0b27c079b47c86b1cdc577720a5386483b36/fastuuid-0.14.0-cp312-cp312-win_amd64.whl", hash = "sha256:d9e4332dc4ba054434a9594cbfaf7823b57993d7d8e7267831c3e059857cf397", size = 156550, upload-time = "2025-10-19T22:27:49.658Z" }, - { url = "https://files.pythonhosted.org/packages/a5/83/ae12dd39b9a39b55d7f90abb8971f1a5f3c321fd72d5aa83f90dc67fe9ed/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:77a09cb7427e7af74c594e409f7731a0cf887221de2f698e1ca0ebf0f3139021", size = 510720, upload-time = "2025-10-19T22:42:34.633Z" }, - { url = "https://files.pythonhosted.org/packages/53/b0/a4b03ff5d00f563cc7546b933c28cb3f2a07344b2aec5834e874f7d44143/fastuuid-0.14.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:9bd57289daf7b153bfa3e8013446aa144ce5e8c825e9e366d455155ede5ea2dc", size = 262024, upload-time = "2025-10-19T22:30:25.482Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6d/64aee0a0f6a58eeabadd582e55d0d7d70258ffdd01d093b30c53d668303b/fastuuid-0.14.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ac60fc860cdf3c3f327374db87ab8e064c86566ca8c49d2e30df15eda1b0c2d5", size = 251679, upload-time = "2025-10-19T22:36:14.096Z" }, - { url = "https://files.pythonhosted.org/packages/60/f5/a7e9cda8369e4f7919d36552db9b2ae21db7915083bc6336f1b0082c8b2e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ab32f74bd56565b186f036e33129da77db8be09178cd2f5206a5d4035fb2a23f", size = 277862, upload-time = "2025-10-19T22:36:23.302Z" }, - { url = "https://files.pythonhosted.org/packages/f0/d3/8ce11827c783affffd5bd4d6378b28eb6cc6d2ddf41474006b8d62e7448e/fastuuid-0.14.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33e678459cf4addaedd9936bbb038e35b3f6b2061330fd8f2f6a1d80414c0f87", size = 278278, upload-time = "2025-10-19T22:29:43.809Z" }, - { url = "https://files.pythonhosted.org/packages/a2/51/680fb6352d0bbade04036da46264a8001f74b7484e2fd1f4da9e3db1c666/fastuuid-0.14.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1e3cc56742f76cd25ecb98e4b82a25f978ccffba02e4bdce8aba857b6d85d87b", size = 301788, upload-time = "2025-10-19T22:36:06.825Z" }, - { url = "https://files.pythonhosted.org/packages/fa/7c/2014b5785bd8ebdab04ec857635ebd84d5ee4950186a577db9eff0fb8ff6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:cb9a030f609194b679e1660f7e32733b7a0f332d519c5d5a6a0a580991290022", size = 459819, upload-time = "2025-10-19T22:35:31.623Z" }, - { url = "https://files.pythonhosted.org/packages/01/d2/524d4ceeba9160e7a9bc2ea3e8f4ccf1ad78f3bde34090ca0c51f09a5e91/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_i686.whl", hash = "sha256:09098762aad4f8da3a888eb9ae01c84430c907a297b97166b8abc07b640f2995", size = 478546, upload-time = "2025-10-19T22:26:03.023Z" }, - { url = "https://files.pythonhosted.org/packages/bc/17/354d04951ce114bf4afc78e27a18cfbd6ee319ab1829c2d5fb5e94063ac6/fastuuid-0.14.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:1383fff584fa249b16329a059c68ad45d030d5a4b70fb7c73a08d98fd53bcdab", size = 450921, upload-time = "2025-10-19T22:31:02.151Z" }, - { url = "https://files.pythonhosted.org/packages/fb/be/d7be8670151d16d88f15bb121c5b66cdb5ea6a0c2a362d0dcf30276ade53/fastuuid-0.14.0-cp313-cp313-win32.whl", hash = "sha256:a0809f8cc5731c066c909047f9a314d5f536c871a7a22e815cc4967c110ac9ad", size = 154559, upload-time = "2025-10-19T22:36:36.011Z" }, - { url = "https://files.pythonhosted.org/packages/22/1d/5573ef3624ceb7abf4a46073d3554e37191c868abc3aecd5289a72f9810a/fastuuid-0.14.0-cp313-cp313-win_amd64.whl", hash = "sha256:0df14e92e7ad3276327631c9e7cec09e32572ce82089c55cb1bb8df71cf394ed", size = 156539, upload-time = "2025-10-19T22:33:35.898Z" }, - { url = "https://files.pythonhosted.org/packages/16/c9/8c7660d1fe3862e3f8acabd9be7fc9ad71eb270f1c65cce9a2b7a31329ab/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:b852a870a61cfc26c884af205d502881a2e59cc07076b60ab4a951cc0c94d1ad", size = 510600, upload-time = "2025-10-19T22:43:44.17Z" }, - { url = "https://files.pythonhosted.org/packages/4c/f4/a989c82f9a90d0ad995aa957b3e572ebef163c5299823b4027986f133dfb/fastuuid-0.14.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c7502d6f54cd08024c3ea9b3514e2d6f190feb2f46e6dbcd3747882264bb5f7b", size = 262069, upload-time = "2025-10-19T22:43:38.38Z" }, - { url = "https://files.pythonhosted.org/packages/da/6c/a1a24f73574ac995482b1326cf7ab41301af0fabaa3e37eeb6b3df00e6e2/fastuuid-0.14.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ca61b592120cf314cfd66e662a5b54a578c5a15b26305e1b8b618a6f22df714", size = 251543, upload-time = "2025-10-19T22:32:22.537Z" }, - { url = "https://files.pythonhosted.org/packages/1a/20/2a9b59185ba7a6c7b37808431477c2d739fcbdabbf63e00243e37bd6bf49/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa75b6657ec129d0abded3bec745e6f7ab642e6dba3a5272a68247e85f5f316f", size = 277798, upload-time = "2025-10-19T22:33:53.821Z" }, - { url = "https://files.pythonhosted.org/packages/ef/33/4105ca574f6ded0af6a797d39add041bcfb468a1255fbbe82fcb6f592da2/fastuuid-0.14.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a8a0dfea3972200f72d4c7df02c8ac70bad1bb4c58d7e0ec1e6f341679073a7f", size = 278283, upload-time = "2025-10-19T22:29:02.812Z" }, - { url = "https://files.pythonhosted.org/packages/fe/8c/fca59f8e21c4deb013f574eae05723737ddb1d2937ce87cb2a5d20992dc3/fastuuid-0.14.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1bf539a7a95f35b419f9ad105d5a8a35036df35fdafae48fb2fd2e5f318f0d75", size = 301627, upload-time = "2025-10-19T22:35:54.985Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e2/f78c271b909c034d429218f2798ca4e89eeda7983f4257d7865976ddbb6c/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:9a133bf9cc78fdbd1179cb58a59ad0100aa32d8675508150f3658814aeefeaa4", size = 459778, upload-time = "2025-10-19T22:28:00.999Z" }, - { url = "https://files.pythonhosted.org/packages/1e/f0/5ff209d865897667a2ff3e7a572267a9ced8f7313919f6d6043aed8b1caa/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_i686.whl", hash = "sha256:f54d5b36c56a2d5e1a31e73b950b28a0d83eb0c37b91d10408875a5a29494bad", size = 478605, upload-time = "2025-10-19T22:36:21.764Z" }, - { url = "https://files.pythonhosted.org/packages/e0/c8/2ce1c78f983a2c4987ea865d9516dbdfb141a120fd3abb977ae6f02ba7ca/fastuuid-0.14.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:ec27778c6ca3393ef662e2762dba8af13f4ec1aaa32d08d77f71f2a70ae9feb8", size = 450837, upload-time = "2025-10-19T22:34:37.178Z" }, - { url = "https://files.pythonhosted.org/packages/df/60/dad662ec9a33b4a5fe44f60699258da64172c39bd041da2994422cdc40fe/fastuuid-0.14.0-cp314-cp314-win32.whl", hash = "sha256:e23fc6a83f112de4be0cc1990e5b127c27663ae43f866353166f87df58e73d06", size = 154532, upload-time = "2025-10-19T22:35:18.217Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f6/da4db31001e854025ffd26bc9ba0740a9cbba2c3259695f7c5834908b336/fastuuid-0.14.0-cp314-cp314-win_amd64.whl", hash = "sha256:df61342889d0f5e7a32f7284e55ef95103f2110fee433c2ae7c2c0956d76ac8a", size = 156457, upload-time = "2025-10-19T22:33:44.579Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/52/08/8c8508db6c7b9aae8f7175046af41baad690771c9bcde676419965e338c7/fastapi-0.128.0.tar.gz", hash = "sha256:1cc179e1cef10a6be60ffe429f79b829dce99d8de32d7acb7e6c8dfdf7f2645a", size = 365682 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/05/5cbb59154b093548acd0f4c7c474a118eda06da25aa75c616b72d8fcd92a/fastapi-0.128.0-py3-none-any.whl", hash = "sha256:aebd93f9716ee3b4f4fcfe13ffb7cf308d99c9f3ab5622d8877441072561582d", size = 103094 }, ] [[package]] name = "ffmpy" version = "1.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/d2/1c4c582d71bcc65c76fa69fab85de6257d50fdf6fd4a2317c53917e9a581/ffmpy-1.0.0.tar.gz", hash = "sha256:b12932e95435c8820f1cd041024402765f821971e4bae753b327fc02a6e12f8b", size = 5101, upload-time = "2025-11-11T06:24:23.856Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/d2/1c4c582d71bcc65c76fa69fab85de6257d50fdf6fd4a2317c53917e9a581/ffmpy-1.0.0.tar.gz", hash = "sha256:b12932e95435c8820f1cd041024402765f821971e4bae753b327fc02a6e12f8b", size = 5101 } wheels = [ - { url = "https://files.pythonhosted.org/packages/55/56/dd3669eccebb6d8ac81e624542ebd53fe6f08e1b8f2f8d50aeb7e3b83f99/ffmpy-1.0.0-py3-none-any.whl", hash = "sha256:5640e5f0fd03fb6236d0e119b16ccf6522db1c826fdf35dcb87087b60fd7504f", size = 5614, upload-time = "2025-11-11T06:24:22.818Z" }, + { url = "https://files.pythonhosted.org/packages/55/56/dd3669eccebb6d8ac81e624542ebd53fe6f08e1b8f2f8d50aeb7e3b83f99/ffmpy-1.0.0-py3-none-any.whl", hash = "sha256:5640e5f0fd03fb6236d0e119b16ccf6522db1c826fdf35dcb87087b60fd7504f", size = 5614 }, ] [[package]] name = "filelock" version = "3.20.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485, upload-time = "2026-01-09T17:55:05.421Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/1d/65/ce7f1b70157833bf3cb851b556a37d4547ceafc158aa9b34b36782f23696/filelock-3.20.3.tar.gz", hash = "sha256:18c57ee915c7ec61cff0ecf7f0f869936c7c30191bb0cf406f1341778d0834e1", size = 19485 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701, upload-time = "2026-01-09T17:55:04.334Z" }, + { url = "https://files.pythonhosted.org/packages/b5/36/7fb70f04bf00bc646cd5bb45aa9eddb15e19437a28b8fb2b4a5249fac770/filelock-3.20.3-py3-none-any.whl", hash = "sha256:4b0dda527ee31078689fc205ec4f1c1bf7d56cf88b6dc9426c4f230e46c2dce1", size = 16701 }, ] [[package]] name = "frozenlist" version = "1.8.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, - { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, - { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, - { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, - { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, - { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, - { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, - { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, - { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, - { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, - { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, - { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, - { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, - { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, - { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, - { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, - { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, - { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, - { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, - { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, - { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, - { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, - { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, - { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, - { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, - { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, - { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, - { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, - { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, - { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, - { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, - { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, - { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, - { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, - { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, - { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, - { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, - { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, - { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, - { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, - { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, - { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, - { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717, upload-time = "2025-10-06T05:36:27.341Z" }, - { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651, upload-time = "2025-10-06T05:36:28.855Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417, upload-time = "2025-10-06T05:36:29.877Z" }, - { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391, upload-time = "2025-10-06T05:36:31.301Z" }, - { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048, upload-time = "2025-10-06T05:36:32.531Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549, upload-time = "2025-10-06T05:36:33.706Z" }, - { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833, upload-time = "2025-10-06T05:36:34.947Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363, upload-time = "2025-10-06T05:36:36.534Z" }, - { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314, upload-time = "2025-10-06T05:36:38.582Z" }, - { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365, upload-time = "2025-10-06T05:36:40.152Z" }, - { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763, upload-time = "2025-10-06T05:36:41.355Z" }, - { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110, upload-time = "2025-10-06T05:36:42.716Z" }, - { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717, upload-time = "2025-10-06T05:36:44.251Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628, upload-time = "2025-10-06T05:36:45.423Z" }, - { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882, upload-time = "2025-10-06T05:36:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676, upload-time = "2025-10-06T05:36:47.8Z" }, - { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235, upload-time = "2025-10-06T05:36:48.78Z" }, - { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742, upload-time = "2025-10-06T05:36:49.837Z" }, - { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725, upload-time = "2025-10-06T05:36:50.851Z" }, - { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533, upload-time = "2025-10-06T05:36:51.898Z" }, - { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506, upload-time = "2025-10-06T05:36:53.101Z" }, - { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161, upload-time = "2025-10-06T05:36:54.309Z" }, - { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676, upload-time = "2025-10-06T05:36:55.566Z" }, - { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638, upload-time = "2025-10-06T05:36:56.758Z" }, - { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067, upload-time = "2025-10-06T05:36:57.965Z" }, - { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101, upload-time = "2025-10-06T05:36:59.237Z" }, - { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901, upload-time = "2025-10-06T05:37:00.811Z" }, - { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395, upload-time = "2025-10-06T05:37:02.115Z" }, - { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659, upload-time = "2025-10-06T05:37:03.711Z" }, - { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492, upload-time = "2025-10-06T05:37:04.915Z" }, - { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034, upload-time = "2025-10-06T05:37:06.343Z" }, - { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749, upload-time = "2025-10-06T05:37:07.431Z" }, - { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127, upload-time = "2025-10-06T05:37:08.438Z" }, - { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698, upload-time = "2025-10-06T05:37:09.48Z" }, - { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749, upload-time = "2025-10-06T05:37:10.569Z" }, - { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298, upload-time = "2025-10-06T05:37:11.993Z" }, - { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015, upload-time = "2025-10-06T05:37:13.194Z" }, - { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038, upload-time = "2025-10-06T05:37:14.577Z" }, - { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130, upload-time = "2025-10-06T05:37:15.781Z" }, - { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845, upload-time = "2025-10-06T05:37:17.037Z" }, - { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131, upload-time = "2025-10-06T05:37:18.221Z" }, - { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542, upload-time = "2025-10-06T05:37:19.771Z" }, - { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308, upload-time = "2025-10-06T05:37:20.969Z" }, - { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210, upload-time = "2025-10-06T05:37:22.252Z" }, - { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972, upload-time = "2025-10-06T05:37:23.5Z" }, - { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536, upload-time = "2025-10-06T05:37:25.581Z" }, - { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330, upload-time = "2025-10-06T05:37:26.928Z" }, - { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627, upload-time = "2025-10-06T05:37:28.075Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238, upload-time = "2025-10-06T05:37:29.373Z" }, - { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738, upload-time = "2025-10-06T05:37:30.792Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739, upload-time = "2025-10-06T05:37:32.127Z" }, - { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186, upload-time = "2025-10-06T05:37:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196, upload-time = "2025-10-06T05:37:36.107Z" }, - { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830, upload-time = "2025-10-06T05:37:37.663Z" }, - { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289, upload-time = "2025-10-06T05:37:39.261Z" }, - { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318, upload-time = "2025-10-06T05:37:43.213Z" }, - { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814, upload-time = "2025-10-06T05:37:45.337Z" }, - { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762, upload-time = "2025-10-06T05:37:46.657Z" }, - { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470, upload-time = "2025-10-06T05:37:47.946Z" }, - { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042, upload-time = "2025-10-06T05:37:49.499Z" }, - { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148, upload-time = "2025-10-06T05:37:50.745Z" }, - { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676, upload-time = "2025-10-06T05:37:52.222Z" }, - { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451, upload-time = "2025-10-06T05:37:53.425Z" }, - { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507, upload-time = "2025-10-06T05:37:54.513Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230 }, + { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621 }, + { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889 }, + { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464 }, + { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649 }, + { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188 }, + { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748 }, + { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351 }, + { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767 }, + { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887 }, + { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785 }, + { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312 }, + { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650 }, + { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659 }, + { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837 }, + { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989 }, + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912 }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046 }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119 }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067 }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160 }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544 }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797 }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923 }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886 }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731 }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544 }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806 }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382 }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647 }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064 }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937 }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782 }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594 }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448 }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411 }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014 }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909 }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049 }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485 }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619 }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320 }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820 }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518 }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096 }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985 }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591 }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102 }, + { url = "https://files.pythonhosted.org/packages/2d/40/0832c31a37d60f60ed79e9dfb5a92e1e2af4f40a16a29abcc7992af9edff/frozenlist-1.8.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8d92f1a84bb12d9e56f818b3a746f3efba93c1b63c8387a73dde655e1e42282a", size = 85717 }, + { url = "https://files.pythonhosted.org/packages/30/ba/b0b3de23f40bc55a7057bd38434e25c34fa48e17f20ee273bbde5e0650f3/frozenlist-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:96153e77a591c8adc2ee805756c61f59fef4cf4073a9275ee86fe8cba41241f7", size = 49651 }, + { url = "https://files.pythonhosted.org/packages/0c/ab/6e5080ee374f875296c4243c381bbdef97a9ac39c6e3ce1d5f7d42cb78d6/frozenlist-1.8.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f21f00a91358803399890ab167098c131ec2ddd5f8f5fd5fe9c9f2c6fcd91e40", size = 49417 }, + { url = "https://files.pythonhosted.org/packages/d5/4e/e4691508f9477ce67da2015d8c00acd751e6287739123113a9fca6f1604e/frozenlist-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fb30f9626572a76dfe4293c7194a09fb1fe93ba94c7d4f720dfae3b646b45027", size = 234391 }, + { url = "https://files.pythonhosted.org/packages/40/76/c202df58e3acdf12969a7895fd6f3bc016c642e6726aa63bd3025e0fc71c/frozenlist-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaa352d7047a31d87dafcacbabe89df0aa506abb5b1b85a2fb91bc3faa02d822", size = 233048 }, + { url = "https://files.pythonhosted.org/packages/f9/c0/8746afb90f17b73ca5979c7a3958116e105ff796e718575175319b5bb4ce/frozenlist-1.8.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:03ae967b4e297f58f8c774c7eabcce57fe3c2434817d4385c50661845a058121", size = 226549 }, + { url = "https://files.pythonhosted.org/packages/7e/eb/4c7eefc718ff72f9b6c4893291abaae5fbc0c82226a32dcd8ef4f7a5dbef/frozenlist-1.8.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f6292f1de555ffcc675941d65fffffb0a5bcd992905015f85d0592201793e0e5", size = 239833 }, + { url = "https://files.pythonhosted.org/packages/c2/4e/e5c02187cf704224f8b21bee886f3d713ca379535f16893233b9d672ea71/frozenlist-1.8.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29548f9b5b5e3460ce7378144c3010363d8035cea44bc0bf02d57f5a685e084e", size = 245363 }, + { url = "https://files.pythonhosted.org/packages/1f/96/cb85ec608464472e82ad37a17f844889c36100eed57bea094518bf270692/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ec3cc8c5d4084591b4237c0a272cc4f50a5b03396a47d9caaf76f5d7b38a4f11", size = 229314 }, + { url = "https://files.pythonhosted.org/packages/5d/6f/4ae69c550e4cee66b57887daeebe006fe985917c01d0fff9caab9883f6d0/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:517279f58009d0b1f2e7c1b130b377a349405da3f7621ed6bfae50b10adf20c1", size = 243365 }, + { url = "https://files.pythonhosted.org/packages/7a/58/afd56de246cf11780a40a2c28dc7cbabbf06337cc8ddb1c780a2d97e88d8/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:db1e72ede2d0d7ccb213f218df6a078a9c09a7de257c2fe8fcef16d5925230b1", size = 237763 }, + { url = "https://files.pythonhosted.org/packages/cb/36/cdfaf6ed42e2644740d4a10452d8e97fa1c062e2a8006e4b09f1b5fd7d63/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:b4dec9482a65c54a5044486847b8a66bf10c9cb4926d42927ec4e8fd5db7fed8", size = 240110 }, + { url = "https://files.pythonhosted.org/packages/03/a8/9ea226fbefad669f11b52e864c55f0bd57d3c8d7eb07e9f2e9a0b39502e1/frozenlist-1.8.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:21900c48ae04d13d416f0e1e0c4d81f7931f73a9dfa0b7a8746fb2fe7dd970ed", size = 233717 }, + { url = "https://files.pythonhosted.org/packages/1e/0b/1b5531611e83ba7d13ccc9988967ea1b51186af64c42b7a7af465dcc9568/frozenlist-1.8.0-cp313-cp313-win32.whl", hash = "sha256:8b7b94a067d1c504ee0b16def57ad5738701e4ba10cec90529f13fa03c833496", size = 39628 }, + { url = "https://files.pythonhosted.org/packages/d8/cf/174c91dbc9cc49bc7b7aab74d8b734e974d1faa8f191c74af9b7e80848e6/frozenlist-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:878be833caa6a3821caf85eb39c5ba92d28e85df26d57afb06b35b2efd937231", size = 43882 }, + { url = "https://files.pythonhosted.org/packages/c1/17/502cd212cbfa96eb1388614fe39a3fc9ab87dbbe042b66f97acb57474834/frozenlist-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:44389d135b3ff43ba8cc89ff7f51f5a0bb6b63d829c8300f79a2fe4fe61bcc62", size = 39676 }, + { url = "https://files.pythonhosted.org/packages/d2/5c/3bbfaa920dfab09e76946a5d2833a7cbdf7b9b4a91c714666ac4855b88b4/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:e25ac20a2ef37e91c1b39938b591457666a0fa835c7783c3a8f33ea42870db94", size = 89235 }, + { url = "https://files.pythonhosted.org/packages/d2/d6/f03961ef72166cec1687e84e8925838442b615bd0b8854b54923ce5b7b8a/frozenlist-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:07cdca25a91a4386d2e76ad992916a85038a9b97561bf7a3fd12d5d9ce31870c", size = 50742 }, + { url = "https://files.pythonhosted.org/packages/1e/bb/a6d12b7ba4c3337667d0e421f7181c82dda448ce4e7ad7ecd249a16fa806/frozenlist-1.8.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4e0c11f2cc6717e0a741f84a527c52616140741cd812a50422f83dc31749fb52", size = 51725 }, + { url = "https://files.pythonhosted.org/packages/bc/71/d1fed0ffe2c2ccd70b43714c6cab0f4188f09f8a67a7914a6b46ee30f274/frozenlist-1.8.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b3210649ee28062ea6099cfda39e147fa1bc039583c8ee4481cb7811e2448c51", size = 284533 }, + { url = "https://files.pythonhosted.org/packages/c9/1f/fb1685a7b009d89f9bf78a42d94461bc06581f6e718c39344754a5d9bada/frozenlist-1.8.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581ef5194c48035a7de2aefc72ac6539823bb71508189e5de01d60c9dcd5fa65", size = 292506 }, + { url = "https://files.pythonhosted.org/packages/e6/3b/b991fe1612703f7e0d05c0cf734c1b77aaf7c7d321df4572e8d36e7048c8/frozenlist-1.8.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3ef2d026f16a2b1866e1d86fc4e1291e1ed8a387b2c333809419a2f8b3a77b82", size = 274161 }, + { url = "https://files.pythonhosted.org/packages/ca/ec/c5c618767bcdf66e88945ec0157d7f6c4a1322f1473392319b7a2501ded7/frozenlist-1.8.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5500ef82073f599ac84d888e3a8c1f77ac831183244bfd7f11eaa0289fb30714", size = 294676 }, + { url = "https://files.pythonhosted.org/packages/7c/ce/3934758637d8f8a88d11f0585d6495ef54b2044ed6ec84492a91fa3b27aa/frozenlist-1.8.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50066c3997d0091c411a66e710f4e11752251e6d2d73d70d8d5d4c76442a199d", size = 300638 }, + { url = "https://files.pythonhosted.org/packages/fc/4f/a7e4d0d467298f42de4b41cbc7ddaf19d3cfeabaf9ff97c20c6c7ee409f9/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5c1c8e78426e59b3f8005e9b19f6ff46e5845895adbde20ece9218319eca6506", size = 283067 }, + { url = "https://files.pythonhosted.org/packages/dc/48/c7b163063d55a83772b268e6d1affb960771b0e203b632cfe09522d67ea5/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:eefdba20de0d938cec6a89bd4d70f346a03108a19b9df4248d3cf0d88f1b0f51", size = 292101 }, + { url = "https://files.pythonhosted.org/packages/9f/d0/2366d3c4ecdc2fd391e0afa6e11500bfba0ea772764d631bbf82f0136c9d/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cf253e0e1c3ceb4aaff6df637ce033ff6535fb8c70a764a8f46aafd3d6ab798e", size = 289901 }, + { url = "https://files.pythonhosted.org/packages/b8/94/daff920e82c1b70e3618a2ac39fbc01ae3e2ff6124e80739ce5d71c9b920/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:032efa2674356903cd0261c4317a561a6850f3ac864a63fc1583147fb05a79b0", size = 289395 }, + { url = "https://files.pythonhosted.org/packages/e3/20/bba307ab4235a09fdcd3cc5508dbabd17c4634a1af4b96e0f69bfe551ebd/frozenlist-1.8.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6da155091429aeba16851ecb10a9104a108bcd32f6c1642867eadaee401c1c41", size = 283659 }, + { url = "https://files.pythonhosted.org/packages/fd/00/04ca1c3a7a124b6de4f8a9a17cc2fcad138b4608e7a3fc5877804b8715d7/frozenlist-1.8.0-cp313-cp313t-win32.whl", hash = "sha256:0f96534f8bfebc1a394209427d0f8a63d343c9779cda6fc25e8e121b5fd8555b", size = 43492 }, + { url = "https://files.pythonhosted.org/packages/59/5e/c69f733a86a94ab10f68e496dc6b7e8bc078ebb415281d5698313e3af3a1/frozenlist-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:5d63a068f978fc69421fb0e6eb91a9603187527c86b7cd3f534a5b77a592b888", size = 48034 }, + { url = "https://files.pythonhosted.org/packages/16/6c/be9d79775d8abe79b05fa6d23da99ad6e7763a1d080fbae7290b286093fd/frozenlist-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf0a7e10b077bf5fb9380ad3ae8ce20ef919a6ad93b4552896419ac7e1d8e042", size = 41749 }, + { url = "https://files.pythonhosted.org/packages/f1/c8/85da824b7e7b9b6e7f7705b2ecaf9591ba6f79c1177f324c2735e41d36a2/frozenlist-1.8.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cee686f1f4cadeb2136007ddedd0aaf928ab95216e7691c63e50a8ec066336d0", size = 86127 }, + { url = "https://files.pythonhosted.org/packages/8e/e8/a1185e236ec66c20afd72399522f142c3724c785789255202d27ae992818/frozenlist-1.8.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:119fb2a1bd47307e899c2fac7f28e85b9a543864df47aa7ec9d3c1b4545f096f", size = 49698 }, + { url = "https://files.pythonhosted.org/packages/a1/93/72b1736d68f03fda5fdf0f2180fb6caaae3894f1b854d006ac61ecc727ee/frozenlist-1.8.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4970ece02dbc8c3a92fcc5228e36a3e933a01a999f7094ff7c23fbd2beeaa67c", size = 49749 }, + { url = "https://files.pythonhosted.org/packages/a7/b2/fabede9fafd976b991e9f1b9c8c873ed86f202889b864756f240ce6dd855/frozenlist-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:cba69cb73723c3f329622e34bdbf5ce1f80c21c290ff04256cff1cd3c2036ed2", size = 231298 }, + { url = "https://files.pythonhosted.org/packages/3a/3b/d9b1e0b0eed36e70477ffb8360c49c85c8ca8ef9700a4e6711f39a6e8b45/frozenlist-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:778a11b15673f6f1df23d9586f83c4846c471a8af693a22e066508b77d201ec8", size = 232015 }, + { url = "https://files.pythonhosted.org/packages/dc/94/be719d2766c1138148564a3960fc2c06eb688da592bdc25adcf856101be7/frozenlist-1.8.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0325024fe97f94c41c08872db482cf8ac4800d80e79222c6b0b7b162d5b13686", size = 225038 }, + { url = "https://files.pythonhosted.org/packages/e4/09/6712b6c5465f083f52f50cf74167b92d4ea2f50e46a9eea0523d658454ae/frozenlist-1.8.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:97260ff46b207a82a7567b581ab4190bd4dfa09f4db8a8b49d1a958f6aa4940e", size = 240130 }, + { url = "https://files.pythonhosted.org/packages/f8/d4/cd065cdcf21550b54f3ce6a22e143ac9e4836ca42a0de1022da8498eac89/frozenlist-1.8.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:54b2077180eb7f83dd52c40b2750d0a9f175e06a42e3213ce047219de902717a", size = 242845 }, + { url = "https://files.pythonhosted.org/packages/62/c3/f57a5c8c70cd1ead3d5d5f776f89d33110b1addae0ab010ad774d9a44fb9/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:2f05983daecab868a31e1da44462873306d3cbfd76d1f0b5b69c473d21dbb128", size = 229131 }, + { url = "https://files.pythonhosted.org/packages/6c/52/232476fe9cb64f0742f3fde2b7d26c1dac18b6d62071c74d4ded55e0ef94/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:33f48f51a446114bc5d251fb2954ab0164d5be02ad3382abcbfe07e2531d650f", size = 240542 }, + { url = "https://files.pythonhosted.org/packages/5f/85/07bf3f5d0fb5414aee5f47d33c6f5c77bfe49aac680bfece33d4fdf6a246/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:154e55ec0655291b5dd1b8731c637ecdb50975a2ae70c606d100750a540082f7", size = 237308 }, + { url = "https://files.pythonhosted.org/packages/11/99/ae3a33d5befd41ac0ca2cc7fd3aa707c9c324de2e89db0e0f45db9a64c26/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:4314debad13beb564b708b4a496020e5306c7333fa9a3ab90374169a20ffab30", size = 238210 }, + { url = "https://files.pythonhosted.org/packages/b2/60/b1d2da22f4970e7a155f0adde9b1435712ece01b3cd45ba63702aea33938/frozenlist-1.8.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:073f8bf8becba60aa931eb3bc420b217bb7d5b8f4750e6f8b3be7f3da85d38b7", size = 231972 }, + { url = "https://files.pythonhosted.org/packages/3f/ab/945b2f32de889993b9c9133216c068b7fcf257d8595a0ac420ac8677cab0/frozenlist-1.8.0-cp314-cp314-win32.whl", hash = "sha256:bac9c42ba2ac65ddc115d930c78d24ab8d4f465fd3fc473cdedfccadb9429806", size = 40536 }, + { url = "https://files.pythonhosted.org/packages/59/ad/9caa9b9c836d9ad6f067157a531ac48b7d36499f5036d4141ce78c230b1b/frozenlist-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:3e0761f4d1a44f1d1a47996511752cf3dcec5bbdd9cc2b4fe595caf97754b7a0", size = 44330 }, + { url = "https://files.pythonhosted.org/packages/82/13/e6950121764f2676f43534c555249f57030150260aee9dcf7d64efda11dd/frozenlist-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:d1eaff1d00c7751b7c6662e9c5ba6eb2c17a2306ba5e2a37f24ddf3cc953402b", size = 40627 }, + { url = "https://files.pythonhosted.org/packages/c0/c7/43200656ecc4e02d3f8bc248df68256cd9572b3f0017f0a0c4e93440ae23/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d3bb933317c52d7ea5004a1c442eef86f426886fba134ef8cf4226ea6ee1821d", size = 89238 }, + { url = "https://files.pythonhosted.org/packages/d1/29/55c5f0689b9c0fb765055629f472c0de484dcaf0acee2f7707266ae3583c/frozenlist-1.8.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8009897cdef112072f93a0efdce29cd819e717fd2f649ee3016efd3cd885a7ed", size = 50738 }, + { url = "https://files.pythonhosted.org/packages/ba/7d/b7282a445956506fa11da8c2db7d276adcbf2b17d8bb8407a47685263f90/frozenlist-1.8.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2c5dcbbc55383e5883246d11fd179782a9d07a986c40f49abe89ddf865913930", size = 51739 }, + { url = "https://files.pythonhosted.org/packages/62/1c/3d8622e60d0b767a5510d1d3cf21065b9db874696a51ea6d7a43180a259c/frozenlist-1.8.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:39ecbc32f1390387d2aa4f5a995e465e9e2f79ba3adcac92d68e3e0afae6657c", size = 284186 }, + { url = "https://files.pythonhosted.org/packages/2d/14/aa36d5f85a89679a85a1d44cd7a6657e0b1c75f61e7cad987b203d2daca8/frozenlist-1.8.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92db2bf818d5cc8d9c1f1fc56b897662e24ea5adb36ad1f1d82875bd64e03c24", size = 292196 }, + { url = "https://files.pythonhosted.org/packages/05/23/6bde59eb55abd407d34f77d39a5126fb7b4f109a3f611d3929f14b700c66/frozenlist-1.8.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2dc43a022e555de94c3b68a4ef0b11c4f747d12c024a520c7101709a2144fb37", size = 273830 }, + { url = "https://files.pythonhosted.org/packages/d2/3f/22cff331bfad7a8afa616289000ba793347fcd7bc275f3b28ecea2a27909/frozenlist-1.8.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb89a7f2de3602cfed448095bab3f178399646ab7c61454315089787df07733a", size = 294289 }, + { url = "https://files.pythonhosted.org/packages/a4/89/5b057c799de4838b6c69aa82b79705f2027615e01be996d2486a69ca99c4/frozenlist-1.8.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:33139dc858c580ea50e7e60a1b0ea003efa1fd42e6ec7fdbad78fff65fad2fd2", size = 300318 }, + { url = "https://files.pythonhosted.org/packages/30/de/2c22ab3eb2a8af6d69dc799e48455813bab3690c760de58e1bf43b36da3e/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:168c0969a329b416119507ba30b9ea13688fafffac1b7822802537569a1cb0ef", size = 282814 }, + { url = "https://files.pythonhosted.org/packages/59/f7/970141a6a8dbd7f556d94977858cfb36fa9b66e0892c6dd780d2219d8cd8/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:28bd570e8e189d7f7b001966435f9dac6718324b5be2990ac496cf1ea9ddb7fe", size = 291762 }, + { url = "https://files.pythonhosted.org/packages/c1/15/ca1adae83a719f82df9116d66f5bb28bb95557b3951903d39135620ef157/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b2a095d45c5d46e5e79ba1e5b9cb787f541a8dee0433836cea4b96a2c439dcd8", size = 289470 }, + { url = "https://files.pythonhosted.org/packages/ac/83/dca6dc53bf657d371fbc88ddeb21b79891e747189c5de990b9dfff2ccba1/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:eab8145831a0d56ec9c4139b6c3e594c7a83c2c8be25d5bcf2d86136a532287a", size = 289042 }, + { url = "https://files.pythonhosted.org/packages/96/52/abddd34ca99be142f354398700536c5bd315880ed0a213812bc491cff5e4/frozenlist-1.8.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:974b28cf63cc99dfb2188d8d222bc6843656188164848c4f679e63dae4b0708e", size = 283148 }, + { url = "https://files.pythonhosted.org/packages/af/d3/76bd4ed4317e7119c2b7f57c3f6934aba26d277acc6309f873341640e21f/frozenlist-1.8.0-cp314-cp314t-win32.whl", hash = "sha256:342c97bf697ac5480c0a7ec73cd700ecfa5a8a40ac923bd035484616efecc2df", size = 44676 }, + { url = "https://files.pythonhosted.org/packages/89/76/c615883b7b521ead2944bb3480398cbb07e12b7b4e4d073d3752eb721558/frozenlist-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:06be8f67f39c8b1dc671f5d83aaefd3358ae5cdcf8314552c57e7ed3e6475bdd", size = 49451 }, + { url = "https://files.pythonhosted.org/packages/e0/a3/5982da14e113d07b325230f95060e2169f5311b1017ea8af2a29b374c289/frozenlist-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:102e6314ca4da683dca92e3b1355490fed5f313b768500084fbe6371fddfdb79", size = 42507 }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409 }, ] [[package]] name = "fsspec" version = "2025.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", size = 309285, upload-time = "2025-10-30T14:58:44.036Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/24/7f/2747c0d332b9acfa75dc84447a066fdf812b5a6b8d30472b74d309bfe8cb/fsspec-2025.10.0.tar.gz", hash = "sha256:b6789427626f068f9a83ca4e8a3cc050850b6c0f71f99ddb4f542b8266a26a59", size = 309285 } wheels = [ - { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", size = 200966, upload-time = "2025-10-30T14:58:42.53Z" }, + { url = "https://files.pythonhosted.org/packages/eb/02/a6b21098b1d5d6249b7c5ab69dde30108a71e4e819d4a9778f1de1d5b70d/fsspec-2025.10.0-py3-none-any.whl", hash = "sha256:7c7712353ae7d875407f97715f0e1ffcc21e33d5b24556cb1e090ae9409ec61d", size = 200966 }, ] [package.optional-dependencies] @@ -1035,34 +855,25 @@ http = [ { name = "aiohttp" }, ] -[[package]] -name = "gepa" -version = "0.0.24" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/bc/2c/8f249827bcdc56212a445f4f671ee2201b864e433d2c88428933bd4b08f3/gepa-0.0.24.tar.gz", hash = "sha256:8035d1a0877661b6a63db457dc935b4878ee76acf7da1e488d7e6209bb32c054", size = 135673, upload-time = "2026-01-05T16:45:30.553Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/b1/33b035ff1aaf22d4e104c5b15ba48fe5050639764457048e967c20d6317a/gepa-0.0.24-py3-none-any.whl", hash = "sha256:6d8b16699e7b24ed01435dea7bbbc89156a88cbb4b877b14d90e7455db2b0032", size = 137539, upload-time = "2026-01-05T16:45:29.244Z" }, -] - [[package]] name = "gguf" version = "0.17.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "pyyaml" }, { name = "tqdm" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/08/08/7de1ca4b71e7bf33b547f82bb22505e221b5fa42f67d635e200e0ad22ad6/gguf-0.17.1.tar.gz", hash = "sha256:36ad71aad900a3e75fc94ebe96ea6029f03a4e44be7627ef7ad3d03e8c7bcb53", size = 89338, upload-time = "2025-06-19T14:00:33.705Z" } +sdist = { url = "https://files.pythonhosted.org/packages/08/08/7de1ca4b71e7bf33b547f82bb22505e221b5fa42f67d635e200e0ad22ad6/gguf-0.17.1.tar.gz", hash = "sha256:36ad71aad900a3e75fc94ebe96ea6029f03a4e44be7627ef7ad3d03e8c7bcb53", size = 89338 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fc/31/6a93a887617ee7deeaa602ca3d02d1c12a6cb8a742a695de5d128f5fa46a/gguf-0.17.1-py3-none-any.whl", hash = "sha256:7bc5aa7eeb1931f7d39b48fdc5b38fda6b294b9dca75cf607ac69557840a3943", size = 96224, upload-time = "2025-06-19T14:00:32.88Z" }, + { url = "https://files.pythonhosted.org/packages/fc/31/6a93a887617ee7deeaa602ca3d02d1c12a6cb8a742a695de5d128f5fa46a/gguf-0.17.1-py3-none-any.whl", hash = "sha256:7bc5aa7eeb1931f7d39b48fdc5b38fda6b294b9dca75cf607ac69557840a3943", size = 96224 }, ] [[package]] name = "gradio" version = "6.5.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "aiofiles" }, { name = "anyio" }, @@ -1076,8 +887,8 @@ dependencies = [ { name = "huggingface-hub" }, { name = "jinja2" }, { name = "markupsafe" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "orjson" }, { name = "packaging" }, { name = "pandas" }, @@ -1095,9 +906,9 @@ dependencies = [ { name = "typing-extensions" }, { name = "uvicorn" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d9/4f/b095b9a9ddc1ba433121f390df0e8a20a3360ffabd43ec13e86d6ce412b4/gradio-6.5.1.tar.gz", hash = "sha256:31223a1699f15072176dbf48a94f08457228a38263bb4c221a0ccea3a639a595", size = 40132899, upload-time = "2026-01-29T16:39:14.195Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/4f/b095b9a9ddc1ba433121f390df0e8a20a3360ffabd43ec13e86d6ce412b4/gradio-6.5.1.tar.gz", hash = "sha256:31223a1699f15072176dbf48a94f08457228a38263bb4c221a0ccea3a639a595", size = 40132899 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bf/72/4f56a920147ce215e2286defc257a613b3b6d8c90cea323758a99ca0f9fa/gradio-6.5.1-py3-none-any.whl", hash = "sha256:5d49ff9691413ca5411189a694de5cbf1b171e2d49bf9f113952ae8a93c7088d", size = 24183125, upload-time = "2026-01-29T16:39:10.908Z" }, + { url = "https://files.pythonhosted.org/packages/bf/72/4f56a920147ce215e2286defc257a613b3b6d8c90cea323758a99ca0f9fa/gradio-6.5.1-py3-none-any.whl", hash = "sha256:5d49ff9691413ca5411189a694de5cbf1b171e2d49bf9f113952ae8a93c7088d", size = 24183125 }, ] [package.optional-dependencies] @@ -1109,7 +920,7 @@ oauth = [ [[package]] name = "gradio-client" version = "2.0.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "fsspec" }, { name = "httpx" }, @@ -1117,144 +928,90 @@ dependencies = [ { name = "packaging" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d4/75/5c971cc80a6a477f038c66869178684c5010fd61b232277c120c61588d74/gradio_client-2.0.3.tar.gz", hash = "sha256:8f1cec02dccaf64ac0285ed60479a2b0db3778dfe74c85a36d7ec9a95daeccc4", size = 55027, upload-time = "2026-01-10T00:03:56.446Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/70/11/758b76a14e1783549c71828b36e81c997b99683bc4ec14b28417dff3348f/gradio_client-2.0.3-py3-none-any.whl", hash = "sha256:bcc88da74e3a387bcd41535578abbafe2091bcf4715c9542111804741b9e50b0", size = 55669, upload-time = "2026-01-10T00:03:54.262Z" }, -] - -[[package]] -name = "greenlet" -version = "3.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/8a/99/1cd3411c56a410994669062bd73dd58270c00cc074cac15f385a1fd91f8a/greenlet-3.3.1.tar.gz", hash = "sha256:41848f3230b58c08bb43dee542e74a2a2e34d3c59dc3076cec9151aeeedcae98", size = 184690, upload-time = "2026-01-23T15:31:02.076Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fe/65/5b235b40581ad75ab97dcd8b4218022ae8e3ab77c13c919f1a1dfe9171fd/greenlet-3.3.1-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:04bee4775f40ecefcdaa9d115ab44736cd4b9c5fba733575bfe9379419582e13", size = 273723, upload-time = "2026-01-23T15:30:37.521Z" }, - { url = "https://files.pythonhosted.org/packages/ce/ad/eb4729b85cba2d29499e0a04ca6fbdd8f540afd7be142fd571eea43d712f/greenlet-3.3.1-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50e1457f4fed12a50e427988a07f0f9df53cf0ee8da23fab16e6732c2ec909d4", size = 574874, upload-time = "2026-01-23T16:00:54.551Z" }, - { url = "https://files.pythonhosted.org/packages/87/32/57cad7fe4c8b82fdaa098c89498ef85ad92dfbb09d5eb713adedfc2ae1f5/greenlet-3.3.1-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:070472cd156f0656f86f92e954591644e158fd65aa415ffbe2d44ca77656a8f5", size = 586309, upload-time = "2026-01-23T16:05:25.18Z" }, - { url = "https://files.pythonhosted.org/packages/87/eb/8a1ec2da4d55824f160594a75a9d8354a5fe0a300fb1c48e7944265217e1/greenlet-3.3.1-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3a300354f27dd86bae5fbf7002e6dd2b3255cd372e9242c933faf5e859b703fe", size = 586985, upload-time = "2026-01-23T15:32:47.968Z" }, - { url = "https://files.pythonhosted.org/packages/15/1c/0621dd4321dd8c351372ee8f9308136acb628600658a49be1b7504208738/greenlet-3.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e84b51cbebf9ae573b5fbd15df88887815e3253fc000a7d0ff95170e8f7e9729", size = 1547271, upload-time = "2026-01-23T16:04:18.977Z" }, - { url = "https://files.pythonhosted.org/packages/9d/53/24047f8924c83bea7a59c8678d9571209c6bfe5f4c17c94a78c06024e9f2/greenlet-3.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e0093bd1a06d899892427217f0ff2a3c8f306182b8c754336d32e2d587c131b4", size = 1613427, upload-time = "2026-01-23T15:33:44.428Z" }, - { url = "https://files.pythonhosted.org/packages/ff/07/ac9bf1ec008916d1a3373cae212884c1dcff4a4ba0d41127ce81a8deb4e9/greenlet-3.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:7932f5f57609b6a3b82cc11877709aa7a98e3308983ed93552a1c377069b20c8", size = 226100, upload-time = "2026-01-23T15:30:56.957Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e8/2e1462c8fdbe0f210feb5ac7ad2d9029af8be3bf45bd9fa39765f821642f/greenlet-3.3.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:5fd23b9bc6d37b563211c6abbb1b3cab27db385a4449af5c32e932f93017080c", size = 274974, upload-time = "2026-01-23T15:31:02.891Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a8/530a401419a6b302af59f67aaf0b9ba1015855ea7e56c036b5928793c5bd/greenlet-3.3.1-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f51496a0bfbaa9d74d36a52d2580d1ef5ed4fdfcff0a73730abfbbbe1403dd", size = 577175, upload-time = "2026-01-23T16:00:56.213Z" }, - { url = "https://files.pythonhosted.org/packages/8e/89/7e812bb9c05e1aaef9b597ac1d0962b9021d2c6269354966451e885c4e6b/greenlet-3.3.1-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb0feb07fe6e6a74615ee62a880007d976cf739b6669cce95daa7373d4fc69c5", size = 590401, upload-time = "2026-01-23T16:05:26.365Z" }, - { url = "https://files.pythonhosted.org/packages/5c/ae/8d472e1f5ac5efe55c563f3eabb38c98a44b832602e12910750a7c025802/greenlet-3.3.1-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:39eda9ba259cc9801da05351eaa8576e9aa83eb9411e8f0c299e05d712a210f2", size = 590272, upload-time = "2026-01-23T15:32:49.411Z" }, - { url = "https://files.pythonhosted.org/packages/a8/51/0fde34bebfcadc833550717eade64e35ec8738e6b097d5d248274a01258b/greenlet-3.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e2e7e882f83149f0a71ac822ebf156d902e7a5d22c9045e3e0d1daf59cee2cc9", size = 1550729, upload-time = "2026-01-23T16:04:20.867Z" }, - { url = "https://files.pythonhosted.org/packages/16/c9/2fb47bee83b25b119d5a35d580807bb8b92480a54b68fef009a02945629f/greenlet-3.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80aa4d79eb5564f2e0a6144fcc744b5a37c56c4a92d60920720e99210d88db0f", size = 1615552, upload-time = "2026-01-23T15:33:45.743Z" }, - { url = "https://files.pythonhosted.org/packages/1f/54/dcf9f737b96606f82f8dd05becfb8d238db0633dd7397d542a296fe9cad3/greenlet-3.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:32e4ca9777c5addcbf42ff3915d99030d8e00173a56f80001fb3875998fe410b", size = 226462, upload-time = "2026-01-23T15:36:50.422Z" }, - { url = "https://files.pythonhosted.org/packages/91/37/61e1015cf944ddd2337447d8e97fb423ac9bc21f9963fb5f206b53d65649/greenlet-3.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:da19609432f353fed186cc1b85e9440db93d489f198b4bdf42ae19cc9d9ac9b4", size = 225715, upload-time = "2026-01-23T15:33:17.298Z" }, - { url = "https://files.pythonhosted.org/packages/f9/c8/9d76a66421d1ae24340dfae7e79c313957f6e3195c144d2c73333b5bfe34/greenlet-3.3.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:7e806ca53acf6d15a888405880766ec84721aa4181261cd11a457dfe9a7a4975", size = 276443, upload-time = "2026-01-23T15:30:10.066Z" }, - { url = "https://files.pythonhosted.org/packages/81/99/401ff34bb3c032d1f10477d199724f5e5f6fbfb59816ad1455c79c1eb8e7/greenlet-3.3.1-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d842c94b9155f1c9b3058036c24ffb8ff78b428414a19792b2380be9cecf4f36", size = 597359, upload-time = "2026-01-23T16:00:57.394Z" }, - { url = "https://files.pythonhosted.org/packages/2b/bc/4dcc0871ed557792d304f50be0f7487a14e017952ec689effe2180a6ff35/greenlet-3.3.1-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:20fedaadd422fa02695f82093f9a98bad3dab5fcda793c658b945fcde2ab27ba", size = 607805, upload-time = "2026-01-23T16:05:28.068Z" }, - { url = "https://files.pythonhosted.org/packages/cf/05/821587cf19e2ce1f2b24945d890b164401e5085f9d09cbd969b0c193cd20/greenlet-3.3.1-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:14194f5f4305800ff329cbf02c5fcc88f01886cadd29941b807668a45f0d2336", size = 609947, upload-time = "2026-01-23T15:32:51.004Z" }, - { url = "https://files.pythonhosted.org/packages/a4/52/ee8c46ed9f8babaa93a19e577f26e3d28a519feac6350ed6f25f1afee7e9/greenlet-3.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7b2fe4150a0cf59f847a67db8c155ac36aed89080a6a639e9f16df5d6c6096f1", size = 1567487, upload-time = "2026-01-23T16:04:22.125Z" }, - { url = "https://files.pythonhosted.org/packages/8f/7c/456a74f07029597626f3a6db71b273a3632aecb9afafeeca452cfa633197/greenlet-3.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:49f4ad195d45f4a66a0eb9c1ba4832bb380570d361912fa3554746830d332149", size = 1636087, upload-time = "2026-01-23T15:33:47.486Z" }, - { url = "https://files.pythonhosted.org/packages/34/2f/5e0e41f33c69655300a5e54aeb637cf8ff57f1786a3aba374eacc0228c1d/greenlet-3.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:cc98b9c4e4870fa983436afa999d4eb16b12872fab7071423d5262fa7120d57a", size = 227156, upload-time = "2026-01-23T15:34:34.808Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ab/717c58343cf02c5265b531384b248787e04d8160b8afe53d9eec053d7b44/greenlet-3.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:bfb2d1763d777de5ee495c85309460f6fd8146e50ec9d0ae0183dbf6f0a829d1", size = 226403, upload-time = "2026-01-23T15:31:39.372Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ab/d26750f2b7242c2b90ea2ad71de70cfcd73a948a49513188a0fc0d6fc15a/greenlet-3.3.1-cp313-cp313-macosx_11_0_universal2.whl", hash = "sha256:7ab327905cabb0622adca5971e488064e35115430cec2c35a50fd36e72a315b3", size = 275205, upload-time = "2026-01-23T15:30:24.556Z" }, - { url = "https://files.pythonhosted.org/packages/10/d3/be7d19e8fad7c5a78eeefb2d896a08cd4643e1e90c605c4be3b46264998f/greenlet-3.3.1-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:65be2f026ca6a176f88fb935ee23c18333ccea97048076aef4db1ef5bc0713ac", size = 599284, upload-time = "2026-01-23T16:00:58.584Z" }, - { url = "https://files.pythonhosted.org/packages/ae/21/fe703aaa056fdb0f17e5afd4b5c80195bbdab701208918938bd15b00d39b/greenlet-3.3.1-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7a3ae05b3d225b4155bda56b072ceb09d05e974bc74be6c3fc15463cf69f33fd", size = 610274, upload-time = "2026-01-23T16:05:29.312Z" }, - { url = "https://files.pythonhosted.org/packages/cb/86/5c6ab23bb3c28c21ed6bebad006515cfe08b04613eb105ca0041fecca852/greenlet-3.3.1-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6423481193bbbe871313de5fd06a082f2649e7ce6e08015d2a76c1e9186ca5b3", size = 612904, upload-time = "2026-01-23T15:32:52.317Z" }, - { url = "https://files.pythonhosted.org/packages/c2/f3/7949994264e22639e40718c2daf6f6df5169bf48fb038c008a489ec53a50/greenlet-3.3.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:33a956fe78bbbda82bfc95e128d61129b32d66bcf0a20a1f0c08aa4839ffa951", size = 1567316, upload-time = "2026-01-23T16:04:23.316Z" }, - { url = "https://files.pythonhosted.org/packages/8d/6e/d73c94d13b6465e9f7cd6231c68abde838bb22408596c05d9059830b7872/greenlet-3.3.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4b065d3284be43728dd280f6f9a13990b56470b81be20375a207cdc814a983f2", size = 1636549, upload-time = "2026-01-23T15:33:48.643Z" }, - { url = "https://files.pythonhosted.org/packages/5e/b3/c9c23a6478b3bcc91f979ce4ca50879e4d0b2bd7b9a53d8ecded719b92e2/greenlet-3.3.1-cp313-cp313-win_amd64.whl", hash = "sha256:27289986f4e5b0edec7b5a91063c109f0276abb09a7e9bdab08437525977c946", size = 227042, upload-time = "2026-01-23T15:33:58.216Z" }, - { url = "https://files.pythonhosted.org/packages/90/e7/824beda656097edee36ab15809fd063447b200cc03a7f6a24c34d520bc88/greenlet-3.3.1-cp313-cp313-win_arm64.whl", hash = "sha256:2f080e028001c5273e0b42690eaf359aeef9cb1389da0f171ea51a5dc3c7608d", size = 226294, upload-time = "2026-01-23T15:30:52.73Z" }, - { url = "https://files.pythonhosted.org/packages/ae/fb/011c7c717213182caf78084a9bea51c8590b0afda98001f69d9f853a495b/greenlet-3.3.1-cp314-cp314-macosx_11_0_universal2.whl", hash = "sha256:bd59acd8529b372775cd0fcbc5f420ae20681c5b045ce25bd453ed8455ab99b5", size = 275737, upload-time = "2026-01-23T15:32:16.889Z" }, - { url = "https://files.pythonhosted.org/packages/41/2e/a3a417d620363fdbb08a48b1dd582956a46a61bf8fd27ee8164f9dfe87c2/greenlet-3.3.1-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b31c05dd84ef6871dd47120386aed35323c944d86c3d91a17c4b8d23df62f15b", size = 646422, upload-time = "2026-01-23T16:01:00.354Z" }, - { url = "https://files.pythonhosted.org/packages/b4/09/c6c4a0db47defafd2d6bab8ddfe47ad19963b4e30f5bed84d75328059f8c/greenlet-3.3.1-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:02925a0bfffc41e542c70aa14c7eda3593e4d7e274bfcccca1827e6c0875902e", size = 658219, upload-time = "2026-01-23T16:05:30.956Z" }, - { url = "https://files.pythonhosted.org/packages/80/38/9d42d60dffb04b45f03dbab9430898352dba277758640751dc5cc316c521/greenlet-3.3.1-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34a729e2e4e4ffe9ae2408d5ecaf12f944853f40ad724929b7585bca808a9d6f", size = 660237, upload-time = "2026-01-23T15:32:53.967Z" }, - { url = "https://files.pythonhosted.org/packages/96/61/373c30b7197f9e756e4c81ae90a8d55dc3598c17673f91f4d31c3c689c3f/greenlet-3.3.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aec9ab04e82918e623415947921dea15851b152b822661cce3f8e4393c3df683", size = 1615261, upload-time = "2026-01-23T16:04:25.066Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d3/ca534310343f5945316f9451e953dcd89b36fe7a19de652a1dc5a0eeef3f/greenlet-3.3.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:71c767cf281a80d02b6c1bdc41c9468e1f5a494fb11bc8688c360524e273d7b1", size = 1683719, upload-time = "2026-01-23T15:33:50.61Z" }, - { url = "https://files.pythonhosted.org/packages/52/cb/c21a3fd5d2c9c8b622e7bede6d6d00e00551a5ee474ea6d831b5f567a8b4/greenlet-3.3.1-cp314-cp314-win_amd64.whl", hash = "sha256:96aff77af063b607f2489473484e39a0bbae730f2ea90c9e5606c9b73c44174a", size = 228125, upload-time = "2026-01-23T15:32:45.265Z" }, - { url = "https://files.pythonhosted.org/packages/6a/8e/8a2db6d11491837af1de64b8aff23707c6e85241be13c60ed399a72e2ef8/greenlet-3.3.1-cp314-cp314-win_arm64.whl", hash = "sha256:b066e8b50e28b503f604fa538adc764a638b38cf8e81e025011d26e8a627fa79", size = 227519, upload-time = "2026-01-23T15:31:47.284Z" }, - { url = "https://files.pythonhosted.org/packages/28/24/cbbec49bacdcc9ec652a81d3efef7b59f326697e7edf6ed775a5e08e54c2/greenlet-3.3.1-cp314-cp314t-macosx_11_0_universal2.whl", hash = "sha256:3e63252943c921b90abb035ebe9de832c436401d9c45f262d80e2d06cc659242", size = 282706, upload-time = "2026-01-23T15:33:05.525Z" }, - { url = "https://files.pythonhosted.org/packages/86/2e/4f2b9323c144c4fe8842a4e0d92121465485c3c2c5b9e9b30a52e80f523f/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:76e39058e68eb125de10c92524573924e827927df5d3891fbc97bd55764a8774", size = 651209, upload-time = "2026-01-23T16:01:01.517Z" }, - { url = "https://files.pythonhosted.org/packages/d9/87/50ca60e515f5bb55a2fbc5f0c9b5b156de7d2fc51a0a69abc9d23914a237/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c9f9d5e7a9310b7a2f416dd13d2e3fd8b42d803968ea580b7c0f322ccb389b97", size = 654300, upload-time = "2026-01-23T16:05:32.199Z" }, - { url = "https://files.pythonhosted.org/packages/1d/94/74310866dfa2b73dd08659a3d18762f83985ad3281901ba0ee9a815194fb/greenlet-3.3.1-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:92497c78adf3ac703b57f1e3813c2d874f27f71a178f9ea5887855da413cd6d2", size = 653842, upload-time = "2026-01-23T15:32:55.671Z" }, - { url = "https://files.pythonhosted.org/packages/97/43/8bf0ffa3d498eeee4c58c212a3905dd6146c01c8dc0b0a046481ca29b18c/greenlet-3.3.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ed6b402bc74d6557a705e197d47f9063733091ed6357b3de33619d8a8d93ac53", size = 1614917, upload-time = "2026-01-23T16:04:26.276Z" }, - { url = "https://files.pythonhosted.org/packages/89/90/a3be7a5f378fc6e84abe4dcfb2ba32b07786861172e502388b4c90000d1b/greenlet-3.3.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:59913f1e5ada20fde795ba906916aea25d442abcc0593fba7e26c92b7ad76249", size = 1676092, upload-time = "2026-01-23T15:33:52.176Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2b/98c7f93e6db9977aaee07eb1e51ca63bd5f779b900d362791d3252e60558/greenlet-3.3.1-cp314-cp314t-win_amd64.whl", hash = "sha256:301860987846c24cb8964bdec0e31a96ad4a2a801b41b4ef40963c1b44f33451", size = 233181, upload-time = "2026-01-23T15:33:00.29Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/d4/75/5c971cc80a6a477f038c66869178684c5010fd61b232277c120c61588d74/gradio_client-2.0.3.tar.gz", hash = "sha256:8f1cec02dccaf64ac0285ed60479a2b0db3778dfe74c85a36d7ec9a95daeccc4", size = 55027 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/11/758b76a14e1783549c71828b36e81c997b99683bc4ec14b28417dff3348f/gradio_client-2.0.3-py3-none-any.whl", hash = "sha256:bcc88da74e3a387bcd41535578abbafe2091bcf4715c9542111804741b9e50b0", size = 55669 }, ] [[package]] name = "groovy" version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/52/36/bbdede67400277bef33d3ec0e6a31750da972c469f75966b4930c753218f/groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083", size = 17325, upload-time = "2025-02-28T20:24:56.068Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/52/36/bbdede67400277bef33d3ec0e6a31750da972c469f75966b4930c753218f/groovy-0.1.2.tar.gz", hash = "sha256:25c1dc09b3f9d7e292458aa762c6beb96ea037071bf5e917fc81fb78d2231083", size = 17325 } wheels = [ - { url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090, upload-time = "2025-02-28T20:24:55.152Z" }, + { url = "https://files.pythonhosted.org/packages/28/27/3d6dcadc8a3214d8522c1e7f6a19554e33659be44546d44a2f7572ac7d2a/groovy-0.1.2-py3-none-any.whl", hash = "sha256:7f7975bab18c729a257a8b1ae9dcd70b7cafb1720481beae47719af57c35fa64", size = 14090 }, ] [[package]] name = "h11" version = "0.16.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, ] [[package]] name = "hf-xet" version = "1.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020, upload-time = "2025-10-24T19:04:32.129Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870, upload-time = "2025-10-24T19:04:11.422Z" }, - { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584, upload-time = "2025-10-24T19:04:09.586Z" }, - { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004, upload-time = "2025-10-24T19:04:00.314Z" }, - { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636, upload-time = "2025-10-24T19:03:58.111Z" }, - { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448, upload-time = "2025-10-24T19:04:20.951Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401, upload-time = "2025-10-24T19:04:22.549Z" }, - { url = "https://files.pythonhosted.org/packages/4e/64/48fffbd67fb418ab07451e4ce641a70de1c40c10a13e25325e24858ebe5a/hf_xet-1.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382", size = 2900866, upload-time = "2025-10-24T19:04:33.461Z" }, - { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861, upload-time = "2025-10-24T19:04:19.01Z" }, - { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699, upload-time = "2025-10-24T19:04:17.306Z" }, - { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885, upload-time = "2025-10-24T19:04:07.642Z" }, - { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550, upload-time = "2025-10-24T19:04:05.55Z" }, - { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010, upload-time = "2025-10-24T19:04:28.598Z" }, - { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264, upload-time = "2025-10-24T19:04:30.397Z" }, - { url = "https://files.pythonhosted.org/packages/17/b5/33764714923fa1ff922770f7ed18c2daae034d21ae6e10dbf4347c854154/hf_xet-1.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc", size = 2901071, upload-time = "2025-10-24T19:04:37.463Z" }, - { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099, upload-time = "2025-10-24T19:04:15.366Z" }, - { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178, upload-time = "2025-10-24T19:04:13.695Z" }, - { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214, upload-time = "2025-10-24T19:04:03.596Z" }, - { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054, upload-time = "2025-10-24T19:04:01.949Z" }, - { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812, upload-time = "2025-10-24T19:04:24.585Z" }, - { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920, upload-time = "2025-10-24T19:04:26.927Z" }, - { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735, upload-time = "2025-10-24T19:04:35.928Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/6e/0f11bacf08a67f7fb5ee09740f2ca54163863b07b70d579356e9222ce5d8/hf_xet-1.2.0.tar.gz", hash = "sha256:a8c27070ca547293b6890c4bf389f713f80e8c478631432962bb7f4bc0bd7d7f", size = 506020 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a5/85ef910a0aa034a2abcfadc360ab5ac6f6bc4e9112349bd40ca97551cff0/hf_xet-1.2.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:ceeefcd1b7aed4956ae8499e2199607765fbd1c60510752003b6cc0b8413b649", size = 2861870 }, + { url = "https://files.pythonhosted.org/packages/ea/40/e2e0a7eb9a51fe8828ba2d47fe22a7e74914ea8a0db68a18c3aa7449c767/hf_xet-1.2.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b70218dd548e9840224df5638fdc94bd033552963cfa97f9170829381179c813", size = 2717584 }, + { url = "https://files.pythonhosted.org/packages/a5/7d/daf7f8bc4594fdd59a8a596f9e3886133fdc68e675292218a5e4c1b7e834/hf_xet-1.2.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7d40b18769bb9a8bc82a9ede575ce1a44c75eb80e7375a01d76259089529b5dc", size = 3315004 }, + { url = "https://files.pythonhosted.org/packages/b1/ba/45ea2f605fbf6d81c8b21e4d970b168b18a53515923010c312c06cd83164/hf_xet-1.2.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:cd3a6027d59cfb60177c12d6424e31f4b5ff13d8e3a1247b3a584bf8977e6df5", size = 3222636 }, + { url = "https://files.pythonhosted.org/packages/4a/1d/04513e3cab8f29ab8c109d309ddd21a2705afab9d52f2ba1151e0c14f086/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6de1fc44f58f6dd937956c8d304d8c2dea264c80680bcfa61ca4a15e7b76780f", size = 3408448 }, + { url = "https://files.pythonhosted.org/packages/f0/7c/60a2756d7feec7387db3a1176c632357632fbe7849fce576c5559d4520c7/hf_xet-1.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f182f264ed2acd566c514e45da9f2119110e48a87a327ca271027904c70c5832", size = 3503401 }, + { url = "https://files.pythonhosted.org/packages/4e/64/48fffbd67fb418ab07451e4ce641a70de1c40c10a13e25325e24858ebe5a/hf_xet-1.2.0-cp313-cp313t-win_amd64.whl", hash = "sha256:293a7a3787e5c95d7be1857358a9130694a9c6021de3f27fa233f37267174382", size = 2900866 }, + { url = "https://files.pythonhosted.org/packages/e2/51/f7e2caae42f80af886db414d4e9885fac959330509089f97cccb339c6b87/hf_xet-1.2.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:10bfab528b968c70e062607f663e21e34e2bba349e8038db546646875495179e", size = 2861861 }, + { url = "https://files.pythonhosted.org/packages/6e/1d/a641a88b69994f9371bd347f1dd35e5d1e2e2460a2e350c8d5165fc62005/hf_xet-1.2.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2a212e842647b02eb6a911187dc878e79c4aa0aa397e88dd3b26761676e8c1f8", size = 2717699 }, + { url = "https://files.pythonhosted.org/packages/df/e0/e5e9bba7d15f0318955f7ec3f4af13f92e773fbb368c0b8008a5acbcb12f/hf_xet-1.2.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:30e06daccb3a7d4c065f34fc26c14c74f4653069bb2b194e7f18f17cbe9939c0", size = 3314885 }, + { url = "https://files.pythonhosted.org/packages/21/90/b7fe5ff6f2b7b8cbdf1bd56145f863c90a5807d9758a549bf3d916aa4dec/hf_xet-1.2.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:29c8fc913a529ec0a91867ce3d119ac1aac966e098cf49501800c870328cc090", size = 3221550 }, + { url = "https://files.pythonhosted.org/packages/6f/cb/73f276f0a7ce46cc6a6ec7d6c7d61cbfe5f2e107123d9bbd0193c355f106/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e159cbfcfbb29f920db2c09ed8b660eb894640d284f102ada929b6e3dc410a", size = 3408010 }, + { url = "https://files.pythonhosted.org/packages/b8/1e/d642a12caa78171f4be64f7cd9c40e3ca5279d055d0873188a58c0f5fbb9/hf_xet-1.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:9c91d5ae931510107f148874e9e2de8a16052b6f1b3ca3c1b12f15ccb491390f", size = 3503264 }, + { url = "https://files.pythonhosted.org/packages/17/b5/33764714923fa1ff922770f7ed18c2daae034d21ae6e10dbf4347c854154/hf_xet-1.2.0-cp314-cp314t-win_amd64.whl", hash = "sha256:210d577732b519ac6ede149d2f2f34049d44e8622bf14eb3d63bbcd2d4b332dc", size = 2901071 }, + { url = "https://files.pythonhosted.org/packages/96/2d/22338486473df5923a9ab7107d375dbef9173c338ebef5098ef593d2b560/hf_xet-1.2.0-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:46740d4ac024a7ca9b22bebf77460ff43332868b661186a8e46c227fdae01848", size = 2866099 }, + { url = "https://files.pythonhosted.org/packages/7f/8c/c5becfa53234299bc2210ba314eaaae36c2875e0045809b82e40a9544f0c/hf_xet-1.2.0-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:27df617a076420d8845bea087f59303da8be17ed7ec0cd7ee3b9b9f579dff0e4", size = 2722178 }, + { url = "https://files.pythonhosted.org/packages/9a/92/cf3ab0b652b082e66876d08da57fcc6fa2f0e6c70dfbbafbd470bb73eb47/hf_xet-1.2.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3651fd5bfe0281951b988c0facbe726aa5e347b103a675f49a3fa8144c7968fd", size = 3320214 }, + { url = "https://files.pythonhosted.org/packages/46/92/3f7ec4a1b6a65bf45b059b6d4a5d38988f63e193056de2f420137e3c3244/hf_xet-1.2.0-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d06fa97c8562fb3ee7a378dd9b51e343bc5bc8190254202c9771029152f5e08c", size = 3229054 }, + { url = "https://files.pythonhosted.org/packages/0b/dd/7ac658d54b9fb7999a0ccb07ad863b413cbaf5cf172f48ebcd9497ec7263/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:4c1428c9ae73ec0939410ec73023c4f842927f39db09b063b9482dac5a3bb737", size = 3413812 }, + { url = "https://files.pythonhosted.org/packages/92/68/89ac4e5b12a9ff6286a12174c8538a5930e2ed662091dd2572bbe0a18c8a/hf_xet-1.2.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:a55558084c16b09b5ed32ab9ed38421e2d87cf3f1f89815764d1177081b99865", size = 3508920 }, + { url = "https://files.pythonhosted.org/packages/cb/44/870d44b30e1dcfb6a65932e3e1506c103a8a5aea9103c337e7a53180322c/hf_xet-1.2.0-cp37-abi3-win_amd64.whl", hash = "sha256:e6584a52253f72c9f52f9e549d5895ca7a471608495c4ecaa6cc73dba2b24d69", size = 2905735 }, ] [[package]] name = "httpcore" version = "1.0.9" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "certifi" }, { name = "h11" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484 } wheels = [ - { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784 }, ] [[package]] name = "httpx" version = "0.28.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "anyio" }, { name = "certifi" }, { name = "httpcore" }, { name = "idna" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517 }, ] [[package]] name = "huggingface-hub" version = "1.3.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "filelock" }, { name = "fsspec" }, @@ -1267,1023 +1024,805 @@ dependencies = [ { name = "typer-slim" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/67/e9/2658cb9bc4c72a67b7f87650e827266139befaf499095883d30dabc4d49f/huggingface_hub-1.3.5.tar.gz", hash = "sha256:8045aca8ddab35d937138f3c386c6d43a275f53437c5c64cdc9aa8408653b4ed", size = 627456, upload-time = "2026-01-29T10:34:19.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/67/e9/2658cb9bc4c72a67b7f87650e827266139befaf499095883d30dabc4d49f/huggingface_hub-1.3.5.tar.gz", hash = "sha256:8045aca8ddab35d937138f3c386c6d43a275f53437c5c64cdc9aa8408653b4ed", size = 627456 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl", hash = "sha256:fe332d7f86a8af874768452295c22cd3f37730fb2463cf6cc3295e26036f8ef9", size = 536675, upload-time = "2026-01-29T10:34:17.713Z" }, + { url = "https://files.pythonhosted.org/packages/f9/84/a579b95c46fe8e319f89dc700c087596f665141575f4dcf136aaa97d856f/huggingface_hub-1.3.5-py3-none-any.whl", hash = "sha256:fe332d7f86a8af874768452295c22cd3f37730fb2463cf6cc3295e26036f8ef9", size = 536675 }, ] [[package]] name = "idna" version = "3.11" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582, upload-time = "2025-10-12T14:55:20.501Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008, upload-time = "2025-10-12T14:55:18.883Z" }, -] - -[[package]] -name = "importlib-metadata" -version = "8.7.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "zipp" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/f3/49/3b30cad09e7771a4982d9975a8cbf64f00d4a1ececb53297f1d9a7be1b10/importlib_metadata-8.7.1.tar.gz", hash = "sha256:49fef1ae6440c182052f407c8d34a68f72efc36db9ca90dc0113398f2fdde8bb", size = 57107, upload-time = "2025-12-21T10:00:19.278Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/5e/f8e9a1d23b9c20a551a8a02ea3637b4642e22c2626e3a13a9a29cdea99eb/importlib_metadata-8.7.1-py3-none-any.whl", hash = "sha256:5a1f80bf1daa489495071efbb095d75a634cf28a8bc299581244063b53176151", size = 27865, upload-time = "2025-12-21T10:00:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, ] [[package]] name = "itsdangerous" version = "2.2.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410, upload-time = "2024-04-16T21:28:15.614Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } wheels = [ - { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234, upload-time = "2024-04-16T21:28:14.499Z" }, + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, ] [[package]] name = "jinja2" version = "3.1.6" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "markupsafe" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, -] - -[[package]] -name = "jiter" -version = "0.12.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/45/9d/e0660989c1370e25848bb4c52d061c71837239738ad937e83edca174c273/jiter-0.12.0.tar.gz", hash = "sha256:64dfcd7d5c168b38d3f9f8bba7fc639edb3418abcc74f22fdbe6b8938293f30b", size = 168294, upload-time = "2025-11-09T20:49:23.302Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3b/91/13cb9505f7be74a933f37da3af22e029f6ba64f5669416cb8b2774bc9682/jiter-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:e7acbaba9703d5de82a2c98ae6a0f59ab9770ab5af5fa35e43a303aee962cf65", size = 316652, upload-time = "2025-11-09T20:46:41.021Z" }, - { url = "https://files.pythonhosted.org/packages/4e/76/4e9185e5d9bb4e482cf6dec6410d5f78dfeb374cfcecbbe9888d07c52daa/jiter-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:364f1a7294c91281260364222f535bc427f56d4de1d8ffd718162d21fbbd602e", size = 319829, upload-time = "2025-11-09T20:46:43.281Z" }, - { url = "https://files.pythonhosted.org/packages/86/af/727de50995d3a153138139f259baae2379d8cb0522c0c00419957bc478a6/jiter-0.12.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:85ee4d25805d4fb23f0a5167a962ef8e002dbfb29c0989378488e32cf2744b62", size = 350568, upload-time = "2025-11-09T20:46:45.075Z" }, - { url = "https://files.pythonhosted.org/packages/6a/c1/d6e9f4b7a3d5ac63bcbdfddeb50b2dcfbdc512c86cffc008584fdc350233/jiter-0.12.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:796f466b7942107eb889c08433b6e31b9a7ed31daceaecf8af1be26fb26c0ca8", size = 369052, upload-time = "2025-11-09T20:46:46.818Z" }, - { url = "https://files.pythonhosted.org/packages/eb/be/00824cd530f30ed73fa8a4f9f3890a705519e31ccb9e929f1e22062e7c76/jiter-0.12.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35506cb71f47dba416694e67af996bbdefb8e3608f1f78799c2e1f9058b01ceb", size = 481585, upload-time = "2025-11-09T20:46:48.319Z" }, - { url = "https://files.pythonhosted.org/packages/74/b6/2ad7990dff9504d4b5052eef64aa9574bd03d722dc7edced97aad0d47be7/jiter-0.12.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:726c764a90c9218ec9e4f99a33d6bf5ec169163f2ca0fc21b654e88c2abc0abc", size = 380541, upload-time = "2025-11-09T20:46:49.643Z" }, - { url = "https://files.pythonhosted.org/packages/b5/c7/f3c26ecbc1adbf1db0d6bba99192143d8fe8504729d9594542ecc4445784/jiter-0.12.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa47810c5565274810b726b0dc86d18dce5fd17b190ebdc3890851d7b2a0e74", size = 364423, upload-time = "2025-11-09T20:46:51.731Z" }, - { url = "https://files.pythonhosted.org/packages/18/51/eac547bf3a2d7f7e556927278e14c56a0604b8cddae75815d5739f65f81d/jiter-0.12.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8ec0259d3f26c62aed4d73b198c53e316ae11f0f69c8fbe6682c6dcfa0fcce2", size = 389958, upload-time = "2025-11-09T20:46:53.432Z" }, - { url = "https://files.pythonhosted.org/packages/2c/1f/9ca592e67175f2db156cff035e0d817d6004e293ee0c1d73692d38fcb596/jiter-0.12.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:79307d74ea83465b0152fa23e5e297149506435535282f979f18b9033c0bb025", size = 522084, upload-time = "2025-11-09T20:46:54.848Z" }, - { url = "https://files.pythonhosted.org/packages/83/ff/597d9cdc3028f28224f53e1a9d063628e28b7a5601433e3196edda578cdd/jiter-0.12.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:cf6e6dd18927121fec86739f1a8906944703941d000f0639f3eb6281cc601dca", size = 513054, upload-time = "2025-11-09T20:46:56.487Z" }, - { url = "https://files.pythonhosted.org/packages/24/6d/1970bce1351bd02e3afcc5f49e4f7ef3dabd7fb688f42be7e8091a5b809a/jiter-0.12.0-cp310-cp310-win32.whl", hash = "sha256:b6ae2aec8217327d872cbfb2c1694489057b9433afce447955763e6ab015b4c4", size = 206368, upload-time = "2025-11-09T20:46:58.638Z" }, - { url = "https://files.pythonhosted.org/packages/e3/6b/eb1eb505b2d86709b59ec06681a2b14a94d0941db091f044b9f0e16badc0/jiter-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:c7f49ce90a71e44f7e1aa9e7ec415b9686bbc6a5961e57eab511015e6759bc11", size = 204847, upload-time = "2025-11-09T20:47:00.295Z" }, - { url = "https://files.pythonhosted.org/packages/32/f9/eaca4633486b527ebe7e681c431f529b63fe2709e7c5242fc0f43f77ce63/jiter-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d8f8a7e317190b2c2d60eb2e8aa835270b008139562d70fe732e1c0020ec53c9", size = 316435, upload-time = "2025-11-09T20:47:02.087Z" }, - { url = "https://files.pythonhosted.org/packages/10/c1/40c9f7c22f5e6ff715f28113ebaba27ab85f9af2660ad6e1dd6425d14c19/jiter-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2218228a077e784c6c8f1a8e5d6b8cb1dea62ce25811c356364848554b2056cd", size = 320548, upload-time = "2025-11-09T20:47:03.409Z" }, - { url = "https://files.pythonhosted.org/packages/6b/1b/efbb68fe87e7711b00d2cfd1f26bb4bfc25a10539aefeaa7727329ffb9cb/jiter-0.12.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9354ccaa2982bf2188fd5f57f79f800ef622ec67beb8329903abf6b10da7d423", size = 351915, upload-time = "2025-11-09T20:47:05.171Z" }, - { url = "https://files.pythonhosted.org/packages/15/2d/c06e659888c128ad1e838123d0638f0efad90cc30860cb5f74dd3f2fc0b3/jiter-0.12.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8f2607185ea89b4af9a604d4c7ec40e45d3ad03ee66998b031134bc510232bb7", size = 368966, upload-time = "2025-11-09T20:47:06.508Z" }, - { url = "https://files.pythonhosted.org/packages/6b/20/058db4ae5fb07cf6a4ab2e9b9294416f606d8e467fb74c2184b2a1eeacba/jiter-0.12.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3a585a5e42d25f2e71db5f10b171f5e5ea641d3aa44f7df745aa965606111cc2", size = 482047, upload-time = "2025-11-09T20:47:08.382Z" }, - { url = "https://files.pythonhosted.org/packages/49/bb/dc2b1c122275e1de2eb12905015d61e8316b2f888bdaac34221c301495d6/jiter-0.12.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd9e21d34edff5a663c631f850edcb786719c960ce887a5661e9c828a53a95d9", size = 380835, upload-time = "2025-11-09T20:47:09.81Z" }, - { url = "https://files.pythonhosted.org/packages/23/7d/38f9cd337575349de16da575ee57ddb2d5a64d425c9367f5ef9e4612e32e/jiter-0.12.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4a612534770470686cd5431478dc5a1b660eceb410abade6b1b74e320ca98de6", size = 364587, upload-time = "2025-11-09T20:47:11.529Z" }, - { url = "https://files.pythonhosted.org/packages/f0/a3/b13e8e61e70f0bb06085099c4e2462647f53cc2ca97614f7fedcaa2bb9f3/jiter-0.12.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3985aea37d40a908f887b34d05111e0aae822943796ebf8338877fee2ab67725", size = 390492, upload-time = "2025-11-09T20:47:12.993Z" }, - { url = "https://files.pythonhosted.org/packages/07/71/e0d11422ed027e21422f7bc1883c61deba2d9752b720538430c1deadfbca/jiter-0.12.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:b1207af186495f48f72529f8d86671903c8c10127cac6381b11dddc4aaa52df6", size = 522046, upload-time = "2025-11-09T20:47:14.6Z" }, - { url = "https://files.pythonhosted.org/packages/9f/59/b968a9aa7102a8375dbbdfbd2aeebe563c7e5dddf0f47c9ef1588a97e224/jiter-0.12.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:ef2fb241de583934c9915a33120ecc06d94aa3381a134570f59eed784e87001e", size = 513392, upload-time = "2025-11-09T20:47:16.011Z" }, - { url = "https://files.pythonhosted.org/packages/ca/e4/7df62002499080dbd61b505c5cb351aa09e9959d176cac2aa8da6f93b13b/jiter-0.12.0-cp311-cp311-win32.whl", hash = "sha256:453b6035672fecce8007465896a25b28a6b59cfe8fbc974b2563a92f5a92a67c", size = 206096, upload-time = "2025-11-09T20:47:17.344Z" }, - { url = "https://files.pythonhosted.org/packages/bb/60/1032b30ae0572196b0de0e87dce3b6c26a1eff71aad5fe43dee3082d32e0/jiter-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:ca264b9603973c2ad9435c71a8ec8b49f8f715ab5ba421c85a51cde9887e421f", size = 204899, upload-time = "2025-11-09T20:47:19.365Z" }, - { url = "https://files.pythonhosted.org/packages/49/d5/c145e526fccdb834063fb45c071df78b0cc426bbaf6de38b0781f45d956f/jiter-0.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:cb00ef392e7d684f2754598c02c409f376ddcef857aae796d559e6cacc2d78a5", size = 188070, upload-time = "2025-11-09T20:47:20.75Z" }, - { url = "https://files.pythonhosted.org/packages/92/c9/5b9f7b4983f1b542c64e84165075335e8a236fa9e2ea03a0c79780062be8/jiter-0.12.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:305e061fa82f4680607a775b2e8e0bcb071cd2205ac38e6ef48c8dd5ebe1cf37", size = 314449, upload-time = "2025-11-09T20:47:22.999Z" }, - { url = "https://files.pythonhosted.org/packages/98/6e/e8efa0e78de00db0aee82c0cf9e8b3f2027efd7f8a71f859d8f4be8e98ef/jiter-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5c1860627048e302a528333c9307c818c547f214d8659b0705d2195e1a94b274", size = 319855, upload-time = "2025-11-09T20:47:24.779Z" }, - { url = "https://files.pythonhosted.org/packages/20/26/894cd88e60b5d58af53bec5c6759d1292bd0b37a8b5f60f07abf7a63ae5f/jiter-0.12.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df37577a4f8408f7e0ec3205d2a8f87672af8f17008358063a4d6425b6081ce3", size = 350171, upload-time = "2025-11-09T20:47:26.469Z" }, - { url = "https://files.pythonhosted.org/packages/f5/27/a7b818b9979ac31b3763d25f3653ec3a954044d5e9f5d87f2f247d679fd1/jiter-0.12.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75fdd787356c1c13a4f40b43c2156276ef7a71eb487d98472476476d803fb2cf", size = 365590, upload-time = "2025-11-09T20:47:27.918Z" }, - { url = "https://files.pythonhosted.org/packages/ba/7e/e46195801a97673a83746170b17984aa8ac4a455746354516d02ca5541b4/jiter-0.12.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1eb5db8d9c65b112aacf14fcd0faae9913d07a8afea5ed06ccdd12b724e966a1", size = 479462, upload-time = "2025-11-09T20:47:29.654Z" }, - { url = "https://files.pythonhosted.org/packages/ca/75/f833bfb009ab4bd11b1c9406d333e3b4357709ed0570bb48c7c06d78c7dd/jiter-0.12.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73c568cc27c473f82480abc15d1301adf333a7ea4f2e813d6a2c7d8b6ba8d0df", size = 378983, upload-time = "2025-11-09T20:47:31.026Z" }, - { url = "https://files.pythonhosted.org/packages/71/b3/7a69d77943cc837d30165643db753471aff5df39692d598da880a6e51c24/jiter-0.12.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4321e8a3d868919bcb1abb1db550d41f2b5b326f72df29e53b2df8b006eb9403", size = 361328, upload-time = "2025-11-09T20:47:33.286Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ac/a78f90caf48d65ba70d8c6efc6f23150bc39dc3389d65bbec2a95c7bc628/jiter-0.12.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0a51bad79f8cc9cac2b4b705039f814049142e0050f30d91695a2d9a6611f126", size = 386740, upload-time = "2025-11-09T20:47:34.703Z" }, - { url = "https://files.pythonhosted.org/packages/39/b6/5d31c2cc8e1b6a6bcf3c5721e4ca0a3633d1ab4754b09bc7084f6c4f5327/jiter-0.12.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2a67b678f6a5f1dd6c36d642d7db83e456bc8b104788262aaefc11a22339f5a9", size = 520875, upload-time = "2025-11-09T20:47:36.058Z" }, - { url = "https://files.pythonhosted.org/packages/30/b5/4df540fae4e9f68c54b8dab004bd8c943a752f0b00efd6e7d64aa3850339/jiter-0.12.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efe1a211fe1fd14762adea941e3cfd6c611a136e28da6c39272dbb7a1bbe6a86", size = 511457, upload-time = "2025-11-09T20:47:37.932Z" }, - { url = "https://files.pythonhosted.org/packages/07/65/86b74010e450a1a77b2c1aabb91d4a91dd3cd5afce99f34d75fd1ac64b19/jiter-0.12.0-cp312-cp312-win32.whl", hash = "sha256:d779d97c834b4278276ec703dc3fc1735fca50af63eb7262f05bdb4e62203d44", size = 204546, upload-time = "2025-11-09T20:47:40.47Z" }, - { url = "https://files.pythonhosted.org/packages/1c/c7/6659f537f9562d963488e3e55573498a442503ced01f7e169e96a6110383/jiter-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:e8269062060212b373316fe69236096aaf4c49022d267c6736eebd66bbbc60bb", size = 205196, upload-time = "2025-11-09T20:47:41.794Z" }, - { url = "https://files.pythonhosted.org/packages/21/f4/935304f5169edadfec7f9c01eacbce4c90bb9a82035ac1de1f3bd2d40be6/jiter-0.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:06cb970936c65de926d648af0ed3d21857f026b1cf5525cb2947aa5e01e05789", size = 186100, upload-time = "2025-11-09T20:47:43.007Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a6/97209693b177716e22576ee1161674d1d58029eb178e01866a0422b69224/jiter-0.12.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:6cc49d5130a14b732e0612bc76ae8db3b49898732223ef8b7599aa8d9810683e", size = 313658, upload-time = "2025-11-09T20:47:44.424Z" }, - { url = "https://files.pythonhosted.org/packages/06/4d/125c5c1537c7d8ee73ad3d530a442d6c619714b95027143f1b61c0b4dfe0/jiter-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:37f27a32ce36364d2fa4f7fdc507279db604d27d239ea2e044c8f148410defe1", size = 318605, upload-time = "2025-11-09T20:47:45.973Z" }, - { url = "https://files.pythonhosted.org/packages/99/bf/a840b89847885064c41a5f52de6e312e91fa84a520848ee56c97e4fa0205/jiter-0.12.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbc0944aa3d4b4773e348cda635252824a78f4ba44328e042ef1ff3f6080d1cf", size = 349803, upload-time = "2025-11-09T20:47:47.535Z" }, - { url = "https://files.pythonhosted.org/packages/8a/88/e63441c28e0db50e305ae23e19c1d8fae012d78ed55365da392c1f34b09c/jiter-0.12.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:da25c62d4ee1ffbacb97fac6dfe4dcd6759ebdc9015991e92a6eae5816287f44", size = 365120, upload-time = "2025-11-09T20:47:49.284Z" }, - { url = "https://files.pythonhosted.org/packages/0a/7c/49b02714af4343970eb8aca63396bc1c82fa01197dbb1e9b0d274b550d4e/jiter-0.12.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:048485c654b838140b007390b8182ba9774621103bd4d77c9c3f6f117474ba45", size = 479918, upload-time = "2025-11-09T20:47:50.807Z" }, - { url = "https://files.pythonhosted.org/packages/69/ba/0a809817fdd5a1db80490b9150645f3aae16afad166960bcd562be194f3b/jiter-0.12.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:635e737fbb7315bef0037c19b88b799143d2d7d3507e61a76751025226b3ac87", size = 379008, upload-time = "2025-11-09T20:47:52.211Z" }, - { url = "https://files.pythonhosted.org/packages/5f/c3/c9fc0232e736c8877d9e6d83d6eeb0ba4e90c6c073835cc2e8f73fdeef51/jiter-0.12.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e017c417b1ebda911bd13b1e40612704b1f5420e30695112efdbed8a4b389ed", size = 361785, upload-time = "2025-11-09T20:47:53.512Z" }, - { url = "https://files.pythonhosted.org/packages/96/61/61f69b7e442e97ca6cd53086ddc1cf59fb830549bc72c0a293713a60c525/jiter-0.12.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:89b0bfb8b2bf2351fba36bb211ef8bfceba73ef58e7f0c68fb67b5a2795ca2f9", size = 386108, upload-time = "2025-11-09T20:47:54.893Z" }, - { url = "https://files.pythonhosted.org/packages/e9/2e/76bb3332f28550c8f1eba3bf6e5efe211efda0ddbbaf24976bc7078d42a5/jiter-0.12.0-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:f5aa5427a629a824a543672778c9ce0c5e556550d1569bb6ea28a85015287626", size = 519937, upload-time = "2025-11-09T20:47:56.253Z" }, - { url = "https://files.pythonhosted.org/packages/84/d6/fa96efa87dc8bff2094fb947f51f66368fa56d8d4fc9e77b25d7fbb23375/jiter-0.12.0-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:ed53b3d6acbcb0fd0b90f20c7cb3b24c357fe82a3518934d4edfa8c6898e498c", size = 510853, upload-time = "2025-11-09T20:47:58.32Z" }, - { url = "https://files.pythonhosted.org/packages/8a/28/93f67fdb4d5904a708119a6ab58a8f1ec226ff10a94a282e0215402a8462/jiter-0.12.0-cp313-cp313-win32.whl", hash = "sha256:4747de73d6b8c78f2e253a2787930f4fffc68da7fa319739f57437f95963c4de", size = 204699, upload-time = "2025-11-09T20:47:59.686Z" }, - { url = "https://files.pythonhosted.org/packages/c4/1f/30b0eb087045a0abe2a5c9c0c0c8da110875a1d3be83afd4a9a4e548be3c/jiter-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:e25012eb0c456fcc13354255d0338cd5397cce26c77b2832b3c4e2e255ea5d9a", size = 204258, upload-time = "2025-11-09T20:48:01.01Z" }, - { url = "https://files.pythonhosted.org/packages/2c/f4/2b4daf99b96bce6fc47971890b14b2a36aef88d7beb9f057fafa032c6141/jiter-0.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:c97b92c54fe6110138c872add030a1f99aea2401ddcdaa21edf74705a646dd60", size = 185503, upload-time = "2025-11-09T20:48:02.35Z" }, - { url = "https://files.pythonhosted.org/packages/39/ca/67bb15a7061d6fe20b9b2a2fd783e296a1e0f93468252c093481a2f00efa/jiter-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:53839b35a38f56b8be26a7851a48b89bc47e5d88e900929df10ed93b95fea3d6", size = 317965, upload-time = "2025-11-09T20:48:03.783Z" }, - { url = "https://files.pythonhosted.org/packages/18/af/1788031cd22e29c3b14bc6ca80b16a39a0b10e611367ffd480c06a259831/jiter-0.12.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94f669548e55c91ab47fef8bddd9c954dab1938644e715ea49d7e117015110a4", size = 345831, upload-time = "2025-11-09T20:48:05.55Z" }, - { url = "https://files.pythonhosted.org/packages/05/17/710bf8472d1dff0d3caf4ced6031060091c1320f84ee7d5dcbed1f352417/jiter-0.12.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:351d54f2b09a41600ffea43d081522d792e81dcfb915f6d2d242744c1cc48beb", size = 361272, upload-time = "2025-11-09T20:48:06.951Z" }, - { url = "https://files.pythonhosted.org/packages/fb/f1/1dcc4618b59761fef92d10bcbb0b038b5160be653b003651566a185f1a5c/jiter-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2a5e90604620f94bf62264e7c2c038704d38217b7465b863896c6d7c902b06c7", size = 204604, upload-time = "2025-11-09T20:48:08.328Z" }, - { url = "https://files.pythonhosted.org/packages/d9/32/63cb1d9f1c5c6632a783c0052cde9ef7ba82688f7065e2f0d5f10a7e3edb/jiter-0.12.0-cp313-cp313t-win_arm64.whl", hash = "sha256:88ef757017e78d2860f96250f9393b7b577b06a956ad102c29c8237554380db3", size = 185628, upload-time = "2025-11-09T20:48:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/a8/99/45c9f0dbe4a1416b2b9a8a6d1236459540f43d7fb8883cff769a8db0612d/jiter-0.12.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c46d927acd09c67a9fb1416df45c5a04c27e83aae969267e98fba35b74e99525", size = 312478, upload-time = "2025-11-09T20:48:10.898Z" }, - { url = "https://files.pythonhosted.org/packages/4c/a7/54ae75613ba9e0f55fcb0bc5d1f807823b5167cc944e9333ff322e9f07dd/jiter-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:774ff60b27a84a85b27b88cd5583899c59940bcc126caca97eb2a9df6aa00c49", size = 318706, upload-time = "2025-11-09T20:48:12.266Z" }, - { url = "https://files.pythonhosted.org/packages/59/31/2aa241ad2c10774baf6c37f8b8e1f39c07db358f1329f4eb40eba179c2a2/jiter-0.12.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5433fab222fb072237df3f637d01b81f040a07dcac1cb4a5c75c7aa9ed0bef1", size = 351894, upload-time = "2025-11-09T20:48:13.673Z" }, - { url = "https://files.pythonhosted.org/packages/54/4f/0f2759522719133a9042781b18cc94e335b6d290f5e2d3e6899d6af933e3/jiter-0.12.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f8c593c6e71c07866ec6bfb790e202a833eeec885022296aff6b9e0b92d6a70e", size = 365714, upload-time = "2025-11-09T20:48:15.083Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6f/806b895f476582c62a2f52c453151edd8a0fde5411b0497baaa41018e878/jiter-0.12.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:90d32894d4c6877a87ae00c6b915b609406819dce8bc0d4e962e4de2784e567e", size = 478989, upload-time = "2025-11-09T20:48:16.706Z" }, - { url = "https://files.pythonhosted.org/packages/86/6c/012d894dc6e1033acd8db2b8346add33e413ec1c7c002598915278a37f79/jiter-0.12.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:798e46eed9eb10c3adbbacbd3bdb5ecd4cf7064e453d00dbef08802dae6937ff", size = 378615, upload-time = "2025-11-09T20:48:18.614Z" }, - { url = "https://files.pythonhosted.org/packages/87/30/d718d599f6700163e28e2c71c0bbaf6dace692e7df2592fd793ac9276717/jiter-0.12.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3f1368f0a6719ea80013a4eb90ba72e75d7ea67cfc7846db2ca504f3df0169a", size = 364745, upload-time = "2025-11-09T20:48:20.117Z" }, - { url = "https://files.pythonhosted.org/packages/8f/85/315b45ce4b6ddc7d7fceca24068543b02bdc8782942f4ee49d652e2cc89f/jiter-0.12.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:65f04a9d0b4406f7e51279710b27484af411896246200e461d80d3ba0caa901a", size = 386502, upload-time = "2025-11-09T20:48:21.543Z" }, - { url = "https://files.pythonhosted.org/packages/74/0b/ce0434fb40c5b24b368fe81b17074d2840748b4952256bab451b72290a49/jiter-0.12.0-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:fd990541982a24281d12b67a335e44f117e4c6cbad3c3b75c7dea68bf4ce3a67", size = 519845, upload-time = "2025-11-09T20:48:22.964Z" }, - { url = "https://files.pythonhosted.org/packages/e8/a3/7a7a4488ba052767846b9c916d208b3ed114e3eb670ee984e4c565b9cf0d/jiter-0.12.0-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:b111b0e9152fa7df870ecaebb0bd30240d9f7fff1f2003bcb4ed0f519941820b", size = 510701, upload-time = "2025-11-09T20:48:24.483Z" }, - { url = "https://files.pythonhosted.org/packages/c3/16/052ffbf9d0467b70af24e30f91e0579e13ded0c17bb4a8eb2aed3cb60131/jiter-0.12.0-cp314-cp314-win32.whl", hash = "sha256:a78befb9cc0a45b5a5a0d537b06f8544c2ebb60d19d02c41ff15da28a9e22d42", size = 205029, upload-time = "2025-11-09T20:48:25.749Z" }, - { url = "https://files.pythonhosted.org/packages/e4/18/3cf1f3f0ccc789f76b9a754bdb7a6977e5d1d671ee97a9e14f7eb728d80e/jiter-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:e1fe01c082f6aafbe5c8faf0ff074f38dfb911d53f07ec333ca03f8f6226debf", size = 204960, upload-time = "2025-11-09T20:48:27.415Z" }, - { url = "https://files.pythonhosted.org/packages/02/68/736821e52ecfdeeb0f024b8ab01b5a229f6b9293bbdb444c27efade50b0f/jiter-0.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:d72f3b5a432a4c546ea4bedc84cce0c3404874f1d1676260b9c7f048a9855451", size = 185529, upload-time = "2025-11-09T20:48:29.125Z" }, - { url = "https://files.pythonhosted.org/packages/30/61/12ed8ee7a643cce29ac97c2281f9ce3956eb76b037e88d290f4ed0d41480/jiter-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e6ded41aeba3603f9728ed2b6196e4df875348ab97b28fc8afff115ed42ba7a7", size = 318974, upload-time = "2025-11-09T20:48:30.87Z" }, - { url = "https://files.pythonhosted.org/packages/2d/c6/f3041ede6d0ed5e0e79ff0de4c8f14f401bbf196f2ef3971cdbe5fd08d1d/jiter-0.12.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a947920902420a6ada6ad51892082521978e9dd44a802663b001436e4b771684", size = 345932, upload-time = "2025-11-09T20:48:32.658Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5d/4d94835889edd01ad0e2dbfc05f7bdfaed46292e7b504a6ac7839aa00edb/jiter-0.12.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:add5e227e0554d3a52cf390a7635edaffdf4f8fce4fdbcef3cc2055bb396a30c", size = 367243, upload-time = "2025-11-09T20:48:34.093Z" }, - { url = "https://files.pythonhosted.org/packages/fd/76/0051b0ac2816253a99d27baf3dda198663aff882fa6ea7deeb94046da24e/jiter-0.12.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3f9b1cda8fcb736250d7e8711d4580ebf004a46771432be0ae4796944b5dfa5d", size = 479315, upload-time = "2025-11-09T20:48:35.507Z" }, - { url = "https://files.pythonhosted.org/packages/70/ae/83f793acd68e5cb24e483f44f482a1a15601848b9b6f199dacb970098f77/jiter-0.12.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:deeb12a2223fe0135c7ff1356a143d57f95bbf1f4a66584f1fc74df21d86b993", size = 380714, upload-time = "2025-11-09T20:48:40.014Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/4808a88338ad2c228b1126b93fcd8ba145e919e886fe910d578230dabe3b/jiter-0.12.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c596cc0f4cb574877550ce4ecd51f8037469146addd676d7c1a30ebe6391923f", size = 365168, upload-time = "2025-11-09T20:48:41.462Z" }, - { url = "https://files.pythonhosted.org/packages/0c/d4/04619a9e8095b42aef436b5aeb4c0282b4ff1b27d1db1508df9f5dc82750/jiter-0.12.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5ab4c823b216a4aeab3fdbf579c5843165756bd9ad87cc6b1c65919c4715f783", size = 387893, upload-time = "2025-11-09T20:48:42.921Z" }, - { url = "https://files.pythonhosted.org/packages/17/ea/d3c7e62e4546fdc39197fa4a4315a563a89b95b6d54c0d25373842a59cbe/jiter-0.12.0-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:e427eee51149edf962203ff8db75a7514ab89be5cb623fb9cea1f20b54f1107b", size = 520828, upload-time = "2025-11-09T20:48:44.278Z" }, - { url = "https://files.pythonhosted.org/packages/cc/0b/c6d3562a03fd767e31cb119d9041ea7958c3c80cb3d753eafb19b3b18349/jiter-0.12.0-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:edb868841f84c111255ba5e80339d386d937ec1fdce419518ce1bd9370fac5b6", size = 511009, upload-time = "2025-11-09T20:48:45.726Z" }, - { url = "https://files.pythonhosted.org/packages/aa/51/2cb4468b3448a8385ebcd15059d325c9ce67df4e2758d133ab9442b19834/jiter-0.12.0-cp314-cp314t-win32.whl", hash = "sha256:8bbcfe2791dfdb7c5e48baf646d37a6a3dcb5a97a032017741dea9f817dca183", size = 205110, upload-time = "2025-11-09T20:48:47.033Z" }, - { url = "https://files.pythonhosted.org/packages/b2/c5/ae5ec83dec9c2d1af805fd5fe8f74ebded9c8670c5210ec7820ce0dbeb1e/jiter-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2fa940963bf02e1d8226027ef461e36af472dea85d36054ff835aeed944dd873", size = 205223, upload-time = "2025-11-09T20:48:49.076Z" }, - { url = "https://files.pythonhosted.org/packages/97/9a/3c5391907277f0e55195550cf3fa8e293ae9ee0c00fb402fec1e38c0c82f/jiter-0.12.0-cp314-cp314t-win_arm64.whl", hash = "sha256:506c9708dd29b27288f9f8f1140c3cb0e3d8ddb045956d7757b1fa0e0f39a473", size = 185564, upload-time = "2025-11-09T20:48:50.376Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/5339ef1ecaa881c6948669956567a64d2670941925f245c434f494ffb0e5/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:4739a4657179ebf08f85914ce50332495811004cc1747852e8b2041ed2aab9b8", size = 311144, upload-time = "2025-11-09T20:49:10.503Z" }, - { url = "https://files.pythonhosted.org/packages/27/74/3446c652bffbd5e81ab354e388b1b5fc1d20daac34ee0ed11ff096b1b01a/jiter-0.12.0-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:41da8def934bf7bec16cb24bd33c0ca62126d2d45d81d17b864bd5ad721393c3", size = 305877, upload-time = "2025-11-09T20:49:12.269Z" }, - { url = "https://files.pythonhosted.org/packages/a1/f4/ed76ef9043450f57aac2d4fbeb27175aa0eb9c38f833be6ef6379b3b9a86/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9c44ee814f499c082e69872d426b624987dbc5943ab06e9bbaa4f81989fdb79e", size = 340419, upload-time = "2025-11-09T20:49:13.803Z" }, - { url = "https://files.pythonhosted.org/packages/21/01/857d4608f5edb0664aa791a3d45702e1a5bcfff9934da74035e7b9803846/jiter-0.12.0-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd2097de91cf03eaa27b3cbdb969addf83f0179c6afc41bbc4513705e013c65d", size = 347212, upload-time = "2025-11-09T20:49:15.643Z" }, - { url = "https://files.pythonhosted.org/packages/cb/f5/12efb8ada5f5c9edc1d4555fe383c1fb2eac05ac5859258a72d61981d999/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:e8547883d7b96ef2e5fe22b88f8a4c8725a56e7f4abafff20fd5272d634c7ecb", size = 309974, upload-time = "2025-11-09T20:49:17.187Z" }, - { url = "https://files.pythonhosted.org/packages/85/15/d6eb3b770f6a0d332675141ab3962fd4a7c270ede3515d9f3583e1d28276/jiter-0.12.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:89163163c0934854a668ed783a2546a0617f71706a2551a4a0666d91ab365d6b", size = 304233, upload-time = "2025-11-09T20:49:18.734Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3e/e7e06743294eea2cf02ced6aa0ff2ad237367394e37a0e2b4a1108c67a36/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d96b264ab7d34bbb2312dedc47ce07cd53f06835eacbc16dde3761f47c3a9e7f", size = 338537, upload-time = "2025-11-09T20:49:20.317Z" }, - { url = "https://files.pythonhosted.org/packages/2f/9c/6753e6522b8d0ef07d3a3d239426669e984fb0eba15a315cdbc1253904e4/jiter-0.12.0-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c24e864cb30ab82311c6425655b0cdab0a98c5d973b065c66a3f020740c2324c", size = 346110, upload-time = "2025-11-09T20:49:21.817Z" }, -] - -[[package]] -name = "json-repair" -version = "0.55.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c0/de/71d6bb078d167c0d0959776cee6b6bb8d2ad843f512a5222d7151dde4955/json_repair-0.55.1.tar.gz", hash = "sha256:b27aa0f6bf2e5bf58554037468690446ef26f32ca79c8753282adb3df25fb888", size = 39231, upload-time = "2026-01-23T09:37:20.93Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/56/da/289ba9eb550ae420cfc457926f6c49b87cacf8083ee9927e96921888a665/json_repair-0.55.1-py3-none-any.whl", hash = "sha256:a1bcc151982a12bc3ef9e9528198229587b1074999cfe08921ab6333b0c8e206", size = 29743, upload-time = "2026-01-23T09:37:19.404Z" }, -] - -[[package]] -name = "jsonschema" -version = "4.26.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "jsonschema-specifications" }, - { name = "referencing" }, - { name = "rpds-py" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } wheels = [ - { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, -] - -[[package]] -name = "jsonschema-specifications" -version = "2025.9.1" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "referencing" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, -] - -[[package]] -name = "litellm" -version = "1.81.5" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "aiohttp" }, - { name = "click" }, - { name = "fastuuid" }, - { name = "httpx" }, - { name = "importlib-metadata" }, - { name = "jinja2" }, - { name = "jsonschema" }, - { name = "openai" }, - { name = "pydantic" }, - { name = "python-dotenv" }, - { name = "tiktoken" }, - { name = "tokenizers" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/38/f4/c109bc5504520baa7b96a910b619d1b1b5af6cb5c28053e53adfed83e3ab/litellm-1.81.5.tar.gz", hash = "sha256:599994651cbb64b8ee7cd3b4979275139afc6e426bdd4aa840a61121bb3b04c9", size = 13615436, upload-time = "2026-01-29T01:37:54.817Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/74/0f/5312b944208efeec5dcbf8e0ed956f8f7c430b0c6458301d206380c90b56/litellm-1.81.5-py3-none-any.whl", hash = "sha256:206505c5a0c6503e465154b9c979772be3ede3f5bf746d15b37dca5ae54d239f", size = 11950016, upload-time = "2026-01-29T01:37:52.6Z" }, -] - -[[package]] -name = "mako" -version = "1.3.10" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "markupsafe" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/9e/38/bd5b78a920a64d708fe6bc8e0a2c075e1389d53bef8413725c63ba041535/mako-1.3.10.tar.gz", hash = "sha256:99579a6f39583fa7e5630a28c3c1f440e4e97a414b80372649c0ce338da2ea28", size = 392474, upload-time = "2025-04-10T12:44:31.16Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/fb/99f81ac72ae23375f22b7afdb7642aba97c00a713c217124420147681a2f/mako-1.3.10-py3-none-any.whl", hash = "sha256:baef24a52fc4fc514a0887ac600f9f1cff3d82c61d4d700a1fa84d597b88db59", size = 78509, upload-time = "2025-04-10T12:50:53.297Z" }, + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, ] [[package]] name = "markdown-it-py" version = "4.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "mdurl" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070, upload-time = "2025-08-11T12:57:52.854Z" } +sdist = { url = "https://files.pythonhosted.org/packages/5b/f5/4ec618ed16cc4f8fb3b701563655a69816155e79e24a17b651541804721d/markdown_it_py-4.0.0.tar.gz", hash = "sha256:cb0a2b4aa34f932c007117b194e945bd74e0ec24133ceb5bac59009cda1cb9f3", size = 73070 } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321, upload-time = "2025-08-11T12:57:51.923Z" }, + { url = "https://files.pythonhosted.org/packages/94/54/e7d793b573f298e1c9013b8c4dade17d481164aa517d1d7148619c2cedbf/markdown_it_py-4.0.0-py3-none-any.whl", hash = "sha256:87327c59b172c5011896038353a81343b6754500a08cd7a4973bb48c6d578147", size = 87321 }, ] [[package]] name = "markupsafe" version = "3.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, - { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, - { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, - { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, - { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, - { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, - { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, - { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, - { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, - { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, - { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, - { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, - { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, - { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, - { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, - { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, - { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, - { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, - { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, - { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, - { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, - { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, - { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, - { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, - { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, - { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, - { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, - { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, - { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, - { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, - { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, - { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, - { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, - { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, - { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, - { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, - { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, - { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, - { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, - { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, - { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, - { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, - { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, - { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, - { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, - { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, - { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, - { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, - { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, - { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, - { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, - { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, - { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, - { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, - { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, - { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, - { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, - { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, - { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, - { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, - { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, - { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, - { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, - { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, - { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, - { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, - { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, - { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, - { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, - { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631 }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057 }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050 }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681 }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705 }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524 }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282 }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745 }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571 }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056 }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932 }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631 }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058 }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287 }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940 }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887 }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692 }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471 }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923 }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572 }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077 }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876 }, + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615 }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020 }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332 }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947 }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962 }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760 }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529 }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015 }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540 }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105 }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906 }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622 }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029 }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374 }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980 }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990 }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784 }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588 }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041 }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543 }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113 }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911 }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658 }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066 }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639 }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569 }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284 }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801 }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769 }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642 }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612 }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200 }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973 }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619 }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029 }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408 }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005 }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048 }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821 }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606 }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043 }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747 }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341 }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073 }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661 }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069 }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670 }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598 }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261 }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835 }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733 }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672 }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819 }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426 }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146 }, ] [[package]] name = "mdurl" version = "0.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979 }, ] [[package]] name = "mpmath" version = "1.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106 } wheels = [ - { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198 }, ] [[package]] name = "multidict" version = "6.7.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, - { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, - { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, - { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, - { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, - { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, - { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, - { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, - { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, - { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, - { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, - { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, - { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, - { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, - { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, - { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, - { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, - { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, - { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, - { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, - { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, - { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, - { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, - { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, - { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, - { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, - { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, - { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, - { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, - { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, - { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, - { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, - { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, - { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, - { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, - { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, - { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, - { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, - { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, - { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, - { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, - { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, - { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, - { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, - { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, - { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, - { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, - { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, - { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, - { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, - { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174, upload-time = "2026-01-26T02:44:18.509Z" }, - { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116, upload-time = "2026-01-26T02:44:19.745Z" }, - { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524, upload-time = "2026-01-26T02:44:21.571Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368, upload-time = "2026-01-26T02:44:22.803Z" }, - { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952, upload-time = "2026-01-26T02:44:24.306Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317, upload-time = "2026-01-26T02:44:25.772Z" }, - { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132, upload-time = "2026-01-26T02:44:27.648Z" }, - { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140, upload-time = "2026-01-26T02:44:29.588Z" }, - { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277, upload-time = "2026-01-26T02:44:30.902Z" }, - { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291, upload-time = "2026-01-26T02:44:32.31Z" }, - { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156, upload-time = "2026-01-26T02:44:33.734Z" }, - { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742, upload-time = "2026-01-26T02:44:35.222Z" }, - { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221, upload-time = "2026-01-26T02:44:36.604Z" }, - { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664, upload-time = "2026-01-26T02:44:38.008Z" }, - { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490, upload-time = "2026-01-26T02:44:39.386Z" }, - { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695, upload-time = "2026-01-26T02:44:41.318Z" }, - { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884, upload-time = "2026-01-26T02:44:42.488Z" }, - { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122, upload-time = "2026-01-26T02:44:43.664Z" }, - { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175, upload-time = "2026-01-26T02:44:44.894Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460, upload-time = "2026-01-26T02:44:46.106Z" }, - { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930, upload-time = "2026-01-26T02:44:47.278Z" }, - { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582, upload-time = "2026-01-26T02:44:48.604Z" }, - { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031, upload-time = "2026-01-26T02:44:50.544Z" }, - { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596, upload-time = "2026-01-26T02:44:51.951Z" }, - { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492, upload-time = "2026-01-26T02:44:53.902Z" }, - { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899, upload-time = "2026-01-26T02:44:55.316Z" }, - { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970, upload-time = "2026-01-26T02:44:56.783Z" }, - { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060, upload-time = "2026-01-26T02:44:58.195Z" }, - { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888, upload-time = "2026-01-26T02:44:59.57Z" }, - { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554, upload-time = "2026-01-26T02:45:01.054Z" }, - { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341, upload-time = "2026-01-26T02:45:02.484Z" }, - { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391, upload-time = "2026-01-26T02:45:03.862Z" }, - { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422, upload-time = "2026-01-26T02:45:05.296Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770, upload-time = "2026-01-26T02:45:06.754Z" }, - { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109, upload-time = "2026-01-26T02:45:08.044Z" }, - { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573, upload-time = "2026-01-26T02:45:09.349Z" }, - { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190, upload-time = "2026-01-26T02:45:10.651Z" }, - { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486, upload-time = "2026-01-26T02:45:11.938Z" }, - { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219, upload-time = "2026-01-26T02:45:14.346Z" }, - { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132, upload-time = "2026-01-26T02:45:15.712Z" }, - { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420, upload-time = "2026-01-26T02:45:17.293Z" }, - { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510, upload-time = "2026-01-26T02:45:19.356Z" }, - { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094, upload-time = "2026-01-26T02:45:20.834Z" }, - { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786, upload-time = "2026-01-26T02:45:22.818Z" }, - { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483, upload-time = "2026-01-26T02:45:24.368Z" }, - { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403, upload-time = "2026-01-26T02:45:25.982Z" }, - { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315, upload-time = "2026-01-26T02:45:27.487Z" }, - { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528, upload-time = "2026-01-26T02:45:28.991Z" }, - { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784, upload-time = "2026-01-26T02:45:30.503Z" }, - { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980, upload-time = "2026-01-26T02:45:32.603Z" }, - { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602, upload-time = "2026-01-26T02:45:34.043Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930, upload-time = "2026-01-26T02:45:36.278Z" }, - { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074, upload-time = "2026-01-26T02:45:37.546Z" }, - { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471, upload-time = "2026-01-26T02:45:38.889Z" }, - { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401, upload-time = "2026-01-26T02:45:40.254Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143, upload-time = "2026-01-26T02:45:41.635Z" }, - { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507, upload-time = "2026-01-26T02:45:42.99Z" }, - { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358, upload-time = "2026-01-26T02:45:44.376Z" }, - { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884, upload-time = "2026-01-26T02:45:47.167Z" }, - { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878, upload-time = "2026-01-26T02:45:48.698Z" }, - { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542, upload-time = "2026-01-26T02:45:50.164Z" }, - { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403, upload-time = "2026-01-26T02:45:51.779Z" }, - { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889, upload-time = "2026-01-26T02:45:53.27Z" }, - { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982, upload-time = "2026-01-26T02:45:54.919Z" }, - { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415, upload-time = "2026-01-26T02:45:56.981Z" }, - { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337, upload-time = "2026-01-26T02:45:58.698Z" }, - { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788, upload-time = "2026-01-26T02:46:00.862Z" }, - { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842, upload-time = "2026-01-26T02:46:02.824Z" }, - { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237, upload-time = "2026-01-26T02:46:05.898Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008, upload-time = "2026-01-26T02:46:07.468Z" }, - { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542, upload-time = "2026-01-26T02:46:08.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719, upload-time = "2026-01-26T02:46:11.146Z" }, - { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176 }, + { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996 }, + { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631 }, + { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561 }, + { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223 }, + { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322 }, + { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005 }, + { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173 }, + { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273 }, + { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956 }, + { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477 }, + { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615 }, + { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930 }, + { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807 }, + { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103 }, + { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416 }, + { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022 }, + { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238 }, + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626 }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706 }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356 }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355 }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433 }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376 }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365 }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747 }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293 }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962 }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360 }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940 }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502 }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065 }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870 }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302 }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981 }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159 }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893 }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456 }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872 }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018 }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883 }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413 }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404 }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456 }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322 }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955 }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254 }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059 }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588 }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642 }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377 }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887 }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053 }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307 }, + { url = "https://files.pythonhosted.org/packages/f2/22/929c141d6c0dba87d3e1d38fbdf1ba8baba86b7776469f2bc2d3227a1e67/multidict-6.7.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:2b41f5fed0ed563624f1c17630cb9941cf2309d4df00e494b551b5f3e3d67a23", size = 76174 }, + { url = "https://files.pythonhosted.org/packages/c7/75/bc704ae15fee974f8fccd871305e254754167dce5f9e42d88a2def741a1d/multidict-6.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84e61e3af5463c19b67ced91f6c634effb89ef8bfc5ca0267f954451ed4bb6a2", size = 45116 }, + { url = "https://files.pythonhosted.org/packages/79/76/55cd7186f498ed080a18440c9013011eb548f77ae1b297206d030eb1180a/multidict-6.7.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:935434b9853c7c112eee7ac891bc4cb86455aa631269ae35442cb316790c1445", size = 43524 }, + { url = "https://files.pythonhosted.org/packages/e9/3c/414842ef8d5a1628d68edee29ba0e5bcf235dbfb3ccd3ea303a7fe8c72ff/multidict-6.7.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:432feb25a1cb67fe82a9680b4d65fb542e4635cb3166cd9c01560651ad60f177", size = 249368 }, + { url = "https://files.pythonhosted.org/packages/f6/32/befed7f74c458b4a525e60519fe8d87eef72bb1e99924fa2b0f9d97a221e/multidict-6.7.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e82d14e3c948952a1a85503817e038cba5905a3352de76b9a465075d072fba23", size = 256952 }, + { url = "https://files.pythonhosted.org/packages/03/d6/c878a44ba877f366630c860fdf74bfb203c33778f12b6ac274936853c451/multidict-6.7.1-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:4cfb48c6ea66c83bcaaf7e4dfa7ec1b6bbcf751b7db85a328902796dfde4c060", size = 240317 }, + { url = "https://files.pythonhosted.org/packages/68/49/57421b4d7ad2e9e60e25922b08ceb37e077b90444bde6ead629095327a6f/multidict-6.7.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1d540e51b7e8e170174555edecddbd5538105443754539193e3e1061864d444d", size = 267132 }, + { url = "https://files.pythonhosted.org/packages/b7/fe/ec0edd52ddbcea2a2e89e174f0206444a61440b40f39704e64dc807a70bd/multidict-6.7.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:273d23f4b40f3dce4d6c8a821c741a86dec62cded82e1175ba3d99be128147ed", size = 268140 }, + { url = "https://files.pythonhosted.org/packages/b0/73/6e1b01cbeb458807aa0831742232dbdd1fa92bfa33f52a3f176b4ff3dc11/multidict-6.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d624335fd4fa1c08a53f8b4be7676ebde19cd092b3895c421045ca87895b429", size = 254277 }, + { url = "https://files.pythonhosted.org/packages/6a/b2/5fb8c124d7561a4974c342bc8c778b471ebbeb3cc17df696f034a7e9afe7/multidict-6.7.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:12fad252f8b267cc75b66e8fc51b3079604e8d43a75428ffe193cd9e2195dfd6", size = 252291 }, + { url = "https://files.pythonhosted.org/packages/5a/96/51d4e4e06bcce92577fcd488e22600bd38e4fd59c20cb49434d054903bd2/multidict-6.7.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:03ede2a6ffbe8ef936b92cb4529f27f42be7f56afcdab5ab739cd5f27fb1cbf9", size = 250156 }, + { url = "https://files.pythonhosted.org/packages/db/6b/420e173eec5fba721a50e2a9f89eda89d9c98fded1124f8d5c675f7a0c0f/multidict-6.7.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:90efbcf47dbe33dcf643a1e400d67d59abeac5db07dc3f27d6bdeae497a2198c", size = 249742 }, + { url = "https://files.pythonhosted.org/packages/44/a3/ec5b5bd98f306bc2aa297b8c6f11a46714a56b1e6ef5ebda50a4f5d7c5fb/multidict-6.7.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:5c4b9bfc148f5a91be9244d6264c53035c8a0dcd2f51f1c3c6e30e30ebaa1c84", size = 262221 }, + { url = "https://files.pythonhosted.org/packages/cd/f7/e8c0d0da0cd1e28d10e624604e1a36bcc3353aaebdfdc3a43c72bc683a12/multidict-6.7.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:401c5a650f3add2472d1d288c26deebc540f99e2fb83e9525007a74cd2116f1d", size = 258664 }, + { url = "https://files.pythonhosted.org/packages/52/da/151a44e8016dd33feed44f730bd856a66257c1ee7aed4f44b649fb7edeb3/multidict-6.7.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:97891f3b1b3ffbded884e2916cacf3c6fc87b66bb0dde46f7357404750559f33", size = 249490 }, + { url = "https://files.pythonhosted.org/packages/87/af/a3b86bf9630b732897f6fc3f4c4714b90aa4361983ccbdcd6c0339b21b0c/multidict-6.7.1-cp313-cp313-win32.whl", hash = "sha256:e1c5988359516095535c4301af38d8a8838534158f649c05dd1050222321bcb3", size = 41695 }, + { url = "https://files.pythonhosted.org/packages/b2/35/e994121b0e90e46134673422dd564623f93304614f5d11886b1b3e06f503/multidict-6.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:960c83bf01a95b12b08fd54324a4eb1d5b52c88932b5cba5d6e712bb3ed12eb5", size = 45884 }, + { url = "https://files.pythonhosted.org/packages/ca/61/42d3e5dbf661242a69c97ea363f2d7b46c567da8eadef8890022be6e2ab0/multidict-6.7.1-cp313-cp313-win_arm64.whl", hash = "sha256:563fe25c678aaba333d5399408f5ec3c383ca5b663e7f774dd179a520b8144df", size = 43122 }, + { url = "https://files.pythonhosted.org/packages/6d/b3/e6b21c6c4f314bb956016b0b3ef2162590a529b84cb831c257519e7fde44/multidict-6.7.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:c76c4bec1538375dad9d452d246ca5368ad6e1c9039dadcf007ae59c70619ea1", size = 83175 }, + { url = "https://files.pythonhosted.org/packages/fb/76/23ecd2abfe0957b234f6c960f4ade497f55f2c16aeb684d4ecdbf1c95791/multidict-6.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:57b46b24b5d5ebcc978da4ec23a819a9402b4228b8a90d9c656422b4bdd8a963", size = 48460 }, + { url = "https://files.pythonhosted.org/packages/c4/57/a0ed92b23f3a042c36bc4227b72b97eca803f5f1801c1ab77c8a212d455e/multidict-6.7.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e954b24433c768ce78ab7929e84ccf3422e46deb45a4dc9f93438f8217fa2d34", size = 46930 }, + { url = "https://files.pythonhosted.org/packages/b5/66/02ec7ace29162e447f6382c495dc95826bf931d3818799bbef11e8f7df1a/multidict-6.7.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3bd231490fa7217cc832528e1cd8752a96f0125ddd2b5749390f7c3ec8721b65", size = 242582 }, + { url = "https://files.pythonhosted.org/packages/58/18/64f5a795e7677670e872673aca234162514696274597b3708b2c0d276cce/multidict-6.7.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:253282d70d67885a15c8a7716f3a73edf2d635793ceda8173b9ecc21f2fb8292", size = 250031 }, + { url = "https://files.pythonhosted.org/packages/c8/ed/e192291dbbe51a8290c5686f482084d31bcd9d09af24f63358c3d42fd284/multidict-6.7.1-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:0b4c48648d7649c9335cf1927a8b87fa692de3dcb15faa676c6a6f1f1aabda43", size = 228596 }, + { url = "https://files.pythonhosted.org/packages/1e/7e/3562a15a60cf747397e7f2180b0a11dc0c38d9175a650e75fa1b4d325e15/multidict-6.7.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98bc624954ec4d2c7cb074b8eefc2b5d0ce7d482e410df446414355d158fe4ca", size = 257492 }, + { url = "https://files.pythonhosted.org/packages/24/02/7d0f9eae92b5249bb50ac1595b295f10e263dd0078ebb55115c31e0eaccd/multidict-6.7.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1b99af4d9eec0b49927b4402bcbb58dea89d3e0db8806a4086117019939ad3dd", size = 255899 }, + { url = "https://files.pythonhosted.org/packages/00/e3/9b60ed9e23e64c73a5cde95269ef1330678e9c6e34dd4eb6b431b85b5a10/multidict-6.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6aac4f16b472d5b7dc6f66a0d49dd57b0e0902090be16594dc9ebfd3d17c47e7", size = 247970 }, + { url = "https://files.pythonhosted.org/packages/3e/06/538e58a63ed5cfb0bd4517e346b91da32fde409d839720f664e9a4ae4f9d/multidict-6.7.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:21f830fe223215dffd51f538e78c172ed7c7f60c9b96a2bf05c4848ad49921c3", size = 245060 }, + { url = "https://files.pythonhosted.org/packages/b2/2f/d743a3045a97c895d401e9bd29aaa09b94f5cbdf1bd561609e5a6c431c70/multidict-6.7.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f5dd81c45b05518b9aa4da4aa74e1c93d715efa234fd3e8a179df611cc85e5f4", size = 235888 }, + { url = "https://files.pythonhosted.org/packages/38/83/5a325cac191ab28b63c52f14f1131f3b0a55ba3b9aa65a6d0bf2a9b921a0/multidict-6.7.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:eb304767bca2bb92fb9c5bd33cedc95baee5bb5f6c88e63706533a1c06ad08c8", size = 243554 }, + { url = "https://files.pythonhosted.org/packages/20/1f/9d2327086bd15da2725ef6aae624208e2ef828ed99892b17f60c344e57ed/multidict-6.7.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:c9035dde0f916702850ef66460bc4239d89d08df4d02023a5926e7446724212c", size = 252341 }, + { url = "https://files.pythonhosted.org/packages/e8/2c/2a1aa0280cf579d0f6eed8ee5211c4f1730bd7e06c636ba2ee6aafda302e/multidict-6.7.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:af959b9beeb66c822380f222f0e0a1889331597e81f1ded7f374f3ecb0fd6c52", size = 246391 }, + { url = "https://files.pythonhosted.org/packages/e5/03/7ca022ffc36c5a3f6e03b179a5ceb829be9da5783e6fe395f347c0794680/multidict-6.7.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:41f2952231456154ee479651491e94118229844dd7226541788be783be2b5108", size = 243422 }, + { url = "https://files.pythonhosted.org/packages/dc/1d/b31650eab6c5778aceed46ba735bd97f7c7d2f54b319fa916c0f96e7805b/multidict-6.7.1-cp313-cp313t-win32.whl", hash = "sha256:df9f19c28adcb40b6aae30bbaa1478c389efd50c28d541d76760199fc1037c32", size = 47770 }, + { url = "https://files.pythonhosted.org/packages/ac/5b/2d2d1d522e51285bd61b1e20df8f47ae1a9d80839db0b24ea783b3832832/multidict-6.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:d54ecf9f301853f2c5e802da559604b3e95bb7a3b01a9c295c6ee591b9882de8", size = 53109 }, + { url = "https://files.pythonhosted.org/packages/3d/a3/cc409ba012c83ca024a308516703cf339bdc4b696195644a7215a5164a24/multidict-6.7.1-cp313-cp313t-win_arm64.whl", hash = "sha256:5a37ca18e360377cfda1d62f5f382ff41f2b8c4ccb329ed974cc2e1643440118", size = 45573 }, + { url = "https://files.pythonhosted.org/packages/91/cc/db74228a8be41884a567e88a62fd589a913708fcf180d029898c17a9a371/multidict-6.7.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:8f333ec9c5eb1b7105e3b84b53141e66ca05a19a605368c55450b6ba208cb9ee", size = 75190 }, + { url = "https://files.pythonhosted.org/packages/d5/22/492f2246bb5b534abd44804292e81eeaf835388901f0c574bac4eeec73c5/multidict-6.7.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:a407f13c188f804c759fc6a9f88286a565c242a76b27626594c133b82883b5c2", size = 44486 }, + { url = "https://files.pythonhosted.org/packages/f1/4f/733c48f270565d78b4544f2baddc2fb2a245e5a8640254b12c36ac7ac68e/multidict-6.7.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0e161ddf326db5577c3a4cc2d8648f81456e8a20d40415541587a71620d7a7d1", size = 43219 }, + { url = "https://files.pythonhosted.org/packages/24/bb/2c0c2287963f4259c85e8bcbba9182ced8d7fca65c780c38e99e61629d11/multidict-6.7.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:1e3a8bb24342a8201d178c3b4984c26ba81a577c80d4d525727427460a50c22d", size = 245132 }, + { url = "https://files.pythonhosted.org/packages/a7/f9/44d4b3064c65079d2467888794dea218d1601898ac50222ab8a9a8094460/multidict-6.7.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97231140a50f5d447d3164f994b86a0bed7cd016e2682f8650d6a9158e14fd31", size = 252420 }, + { url = "https://files.pythonhosted.org/packages/8b/13/78f7275e73fa17b24c9a51b0bd9d73ba64bb32d0ed51b02a746eb876abe7/multidict-6.7.1-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b10359683bd8806a200fd2909e7c8ca3a7b24ec1d8132e483d58e791d881048", size = 233510 }, + { url = "https://files.pythonhosted.org/packages/4b/25/8167187f62ae3cbd52da7893f58cb036b47ea3fb67138787c76800158982/multidict-6.7.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:283ddac99f7ac25a4acadbf004cb5ae34480bbeb063520f70ce397b281859362", size = 264094 }, + { url = "https://files.pythonhosted.org/packages/a1/e7/69a3a83b7b030cf283fb06ce074a05a02322359783424d7edf0f15fe5022/multidict-6.7.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:538cec1e18c067d0e6103aa9a74f9e832904c957adc260e61cd9d8cf0c3b3d37", size = 260786 }, + { url = "https://files.pythonhosted.org/packages/fe/3b/8ec5074bcfc450fe84273713b4b0a0dd47c0249358f5d82eb8104ffe2520/multidict-6.7.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eee46ccb30ff48a1e35bb818cc90846c6be2b68240e42a78599166722cea709", size = 248483 }, + { url = "https://files.pythonhosted.org/packages/48/5a/d5a99e3acbca0e29c5d9cba8f92ceb15dce78bab963b308ae692981e3a5d/multidict-6.7.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa263a02f4f2dd2d11a7b1bb4362aa7cb1049f84a9235d31adf63f30143469a0", size = 248403 }, + { url = "https://files.pythonhosted.org/packages/35/48/e58cd31f6c7d5102f2a4bf89f96b9cf7e00b6c6f3d04ecc44417c00a5a3c/multidict-6.7.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:2e1425e2f99ec5bd36c15a01b690a1a2456209c5deed58f95469ffb46039ccbb", size = 240315 }, + { url = "https://files.pythonhosted.org/packages/94/33/1cd210229559cb90b6786c30676bb0c58249ff42f942765f88793b41fdce/multidict-6.7.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:497394b3239fc6f0e13a78a3e1b61296e72bf1c5f94b4c4eb80b265c37a131cd", size = 245528 }, + { url = "https://files.pythonhosted.org/packages/64/f2/6e1107d226278c876c783056b7db43d800bb64c6131cec9c8dfb6903698e/multidict-6.7.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:233b398c29d3f1b9676b4b6f75c518a06fcb2ea0b925119fb2c1bc35c05e1601", size = 258784 }, + { url = "https://files.pythonhosted.org/packages/4d/c1/11f664f14d525e4a1b5327a82d4de61a1db604ab34c6603bb3c2cc63ad34/multidict-6.7.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:93b1818e4a6e0930454f0f2af7dfce69307ca03cdcfb3739bf4d91241967b6c1", size = 251980 }, + { url = "https://files.pythonhosted.org/packages/e1/9f/75a9ac888121d0c5bbd4ecf4eead45668b1766f6baabfb3b7f66a410e231/multidict-6.7.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f33dc2a3abe9249ea5d8360f969ec7f4142e7ac45ee7014d8f8d5acddf178b7b", size = 243602 }, + { url = "https://files.pythonhosted.org/packages/9a/e7/50bf7b004cc8525d80dbbbedfdc7aed3e4c323810890be4413e589074032/multidict-6.7.1-cp314-cp314-win32.whl", hash = "sha256:3ab8b9d8b75aef9df299595d5388b14530839f6422333357af1339443cff777d", size = 40930 }, + { url = "https://files.pythonhosted.org/packages/e0/bf/52f25716bbe93745595800f36fb17b73711f14da59ed0bb2eba141bc9f0f/multidict-6.7.1-cp314-cp314-win_amd64.whl", hash = "sha256:5e01429a929600e7dab7b166062d9bb54a5eed752384c7384c968c2afab8f50f", size = 45074 }, + { url = "https://files.pythonhosted.org/packages/97/ab/22803b03285fa3a525f48217963da3a65ae40f6a1b6f6cf2768879e208f9/multidict-6.7.1-cp314-cp314-win_arm64.whl", hash = "sha256:4885cb0e817aef5d00a2e8451d4665c1808378dc27c2705f1bf4ef8505c0d2e5", size = 42471 }, + { url = "https://files.pythonhosted.org/packages/e0/6d/f9293baa6146ba9507e360ea0292b6422b016907c393e2f63fc40ab7b7b5/multidict-6.7.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:0458c978acd8e6ea53c81eefaddbbee9c6c5e591f41b3f5e8e194780fe026581", size = 82401 }, + { url = "https://files.pythonhosted.org/packages/7a/68/53b5494738d83558d87c3c71a486504d8373421c3e0dbb6d0db48ad42ee0/multidict-6.7.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:c0abd12629b0af3cf590982c0b413b1e7395cd4ec026f30986818ab95bfaa94a", size = 48143 }, + { url = "https://files.pythonhosted.org/packages/37/e8/5284c53310dcdc99ce5d66563f6e5773531a9b9fe9ec7a615e9bc306b05f/multidict-6.7.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:14525a5f61d7d0c94b368a42cff4c9a4e7ba2d52e2672a7b23d84dc86fb02b0c", size = 46507 }, + { url = "https://files.pythonhosted.org/packages/e4/fc/6800d0e5b3875568b4083ecf5f310dcf91d86d52573160834fb4bfcf5e4f/multidict-6.7.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17307b22c217b4cf05033dabefe68255a534d637c6c9b0cc8382718f87be4262", size = 239358 }, + { url = "https://files.pythonhosted.org/packages/41/75/4ad0973179361cdf3a113905e6e088173198349131be2b390f9fa4da5fc6/multidict-6.7.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a7e590ff876a3eaf1c02a4dfe0724b6e69a9e9de6d8f556816f29c496046e59", size = 246884 }, + { url = "https://files.pythonhosted.org/packages/c3/9c/095bb28b5da139bd41fb9a5d5caff412584f377914bd8787c2aa98717130/multidict-6.7.1-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5fa6a95dfee63893d80a34758cd0e0c118a30b8dcb46372bf75106c591b77889", size = 225878 }, + { url = "https://files.pythonhosted.org/packages/07/d0/c0a72000243756e8f5a277b6b514fa005f2c73d481b7d9e47cd4568aa2e4/multidict-6.7.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a0543217a6a017692aa6ae5cc39adb75e587af0f3a82288b1492eb73dd6cc2a4", size = 253542 }, + { url = "https://files.pythonhosted.org/packages/c0/6b/f69da15289e384ecf2a68837ec8b5ad8c33e973aa18b266f50fe55f24b8c/multidict-6.7.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f99fe611c312b3c1c0ace793f92464d8cd263cc3b26b5721950d977b006b6c4d", size = 252403 }, + { url = "https://files.pythonhosted.org/packages/a2/76/b9669547afa5a1a25cd93eaca91c0da1c095b06b6d2d8ec25b713588d3a1/multidict-6.7.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9004d8386d133b7e6135679424c91b0b854d2d164af6ea3f289f8f2761064609", size = 244889 }, + { url = "https://files.pythonhosted.org/packages/7e/a9/a50d2669e506dad33cfc45b5d574a205587b7b8a5f426f2fbb2e90882588/multidict-6.7.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e628ef0e6859ffd8273c69412a2465c4be4a9517d07261b33334b5ec6f3c7489", size = 241982 }, + { url = "https://files.pythonhosted.org/packages/c5/bb/1609558ad8b456b4827d3c5a5b775c93b87878fd3117ed3db3423dfbce1b/multidict-6.7.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:841189848ba629c3552035a6a7f5bf3b02eb304e9fea7492ca220a8eda6b0e5c", size = 232415 }, + { url = "https://files.pythonhosted.org/packages/d8/59/6f61039d2aa9261871e03ab9dc058a550d240f25859b05b67fd70f80d4b3/multidict-6.7.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:ce1bbd7d780bb5a0da032e095c951f7014d6b0a205f8318308140f1a6aba159e", size = 240337 }, + { url = "https://files.pythonhosted.org/packages/a1/29/fdc6a43c203890dc2ae9249971ecd0c41deaedfe00d25cb6564b2edd99eb/multidict-6.7.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b26684587228afed0d50cf804cc71062cc9c1cdf55051c4c6345d372947b268c", size = 248788 }, + { url = "https://files.pythonhosted.org/packages/a9/14/a153a06101323e4cf086ecee3faadba52ff71633d471f9685c42e3736163/multidict-6.7.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9f9af11306994335398293f9958071019e3ab95e9a707dc1383a35613f6abcb9", size = 242842 }, + { url = "https://files.pythonhosted.org/packages/41/5f/604ae839e64a4a6efc80db94465348d3b328ee955e37acb24badbcd24d83/multidict-6.7.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:b4938326284c4f1224178a560987b6cf8b4d38458b113d9b8c1db1a836e640a2", size = 240237 }, + { url = "https://files.pythonhosted.org/packages/5f/60/c3a5187bf66f6fb546ff4ab8fb5a077cbdd832d7b1908d4365c7f74a1917/multidict-6.7.1-cp314-cp314t-win32.whl", hash = "sha256:98655c737850c064a65e006a3df7c997cd3b220be4ec8fe26215760b9697d4d7", size = 48008 }, + { url = "https://files.pythonhosted.org/packages/0c/f7/addf1087b860ac60e6f382240f64fb99f8bfb532bb06f7c542b83c29ca61/multidict-6.7.1-cp314-cp314t-win_amd64.whl", hash = "sha256:497bde6223c212ba11d462853cfa4f0ae6ef97465033e7dc9940cdb3ab5b48e5", size = 53542 }, + { url = "https://files.pythonhosted.org/packages/4c/81/4629d0aa32302ef7b2ec65c75a728cc5ff4fa410c50096174c1632e70b3e/multidict-6.7.1-cp314-cp314t-win_arm64.whl", hash = "sha256:2bbd113e0d4af5db41d5ebfe9ccaff89de2120578164f86a5d17d5a576d1e5b2", size = 44719 }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319 }, ] [[package]] name = "multiprocess" version = "0.70.18" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "dill" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503, upload-time = "2025-04-17T03:11:27.742Z" } +sdist = { url = "https://files.pythonhosted.org/packages/72/fd/2ae3826f5be24c6ed87266bc4e59c46ea5b059a103f3d7e7eb76a52aeecb/multiprocess-0.70.18.tar.gz", hash = "sha256:f9597128e6b3e67b23956da07cf3d2e5cba79e2f4e0fba8d7903636663ec6d0d", size = 1798503 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/f8/7f9a8f08bf98cea1dfaa181e05cc8bbcb59cecf044b5a9ac3cce39f9c449/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df", size = 135083, upload-time = "2025-04-17T03:11:04.223Z" }, - { url = "https://files.pythonhosted.org/packages/e5/03/b7b10dbfc17b2b3ce07d4d30b3ba8367d0ed32d6d46cd166e298f161dd46/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213", size = 135128, upload-time = "2025-04-17T03:11:06.045Z" }, - { url = "https://files.pythonhosted.org/packages/c1/a3/5f8d3b9690ea5580bee5868ab7d7e2cfca74b7e826b28192b40aa3881cdc/multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2", size = 135132, upload-time = "2025-04-17T03:11:07.533Z" }, - { url = "https://files.pythonhosted.org/packages/55/4d/9af0d1279c84618bcd35bf5fd7e371657358c7b0a523e54a9cffb87461f8/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6", size = 144695, upload-time = "2025-04-17T03:11:09.161Z" }, - { url = "https://files.pythonhosted.org/packages/17/bf/87323e79dd0562474fad3373c21c66bc6c3c9963b68eb2a209deb4c8575e/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3", size = 144742, upload-time = "2025-04-17T03:11:10.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/74/cb8c831e58dc6d5cf450b17c7db87f14294a1df52eb391da948b5e0a0b94/multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797", size = 144745, upload-time = "2025-04-17T03:11:11.453Z" }, - { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948, upload-time = "2025-04-17T03:11:20.223Z" }, - { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462, upload-time = "2025-04-17T03:11:21.657Z" }, - { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287, upload-time = "2025-04-17T03:11:22.69Z" }, - { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917, upload-time = "2025-04-17T03:11:24.044Z" }, - { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636, upload-time = "2025-04-17T03:11:24.936Z" }, - { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478, upload-time = "2025-04-17T03:11:26.253Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f8/7f9a8f08bf98cea1dfaa181e05cc8bbcb59cecf044b5a9ac3cce39f9c449/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:25d4012dcaaf66b9e8e955f58482b42910c2ee526d532844d8bcf661bbc604df", size = 135083 }, + { url = "https://files.pythonhosted.org/packages/e5/03/b7b10dbfc17b2b3ce07d4d30b3ba8367d0ed32d6d46cd166e298f161dd46/multiprocess-0.70.18-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:06b19433de0d02afe5869aec8931dd5c01d99074664f806c73896b0d9e527213", size = 135128 }, + { url = "https://files.pythonhosted.org/packages/c1/a3/5f8d3b9690ea5580bee5868ab7d7e2cfca74b7e826b28192b40aa3881cdc/multiprocess-0.70.18-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6fa1366f994373aaf2d4738b0f56e707caeaa05486e97a7f71ee0853823180c2", size = 135132 }, + { url = "https://files.pythonhosted.org/packages/55/4d/9af0d1279c84618bcd35bf5fd7e371657358c7b0a523e54a9cffb87461f8/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8b8940ae30139e04b076da6c5b83e9398585ebdf0f2ad3250673fef5b2ff06d6", size = 144695 }, + { url = "https://files.pythonhosted.org/packages/17/bf/87323e79dd0562474fad3373c21c66bc6c3c9963b68eb2a209deb4c8575e/multiprocess-0.70.18-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0929ba95831adb938edbd5fb801ac45e705ecad9d100b3e653946b7716cb6bd3", size = 144742 }, + { url = "https://files.pythonhosted.org/packages/dd/74/cb8c831e58dc6d5cf450b17c7db87f14294a1df52eb391da948b5e0a0b94/multiprocess-0.70.18-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4d77f8e4bfe6c6e2e661925bbf9aed4d5ade9a1c6502d5dfc10129b9d1141797", size = 144745 }, + { url = "https://files.pythonhosted.org/packages/ba/d8/0cba6cf51a1a31f20471fbc823a716170c73012ddc4fb85d706630ed6e8f/multiprocess-0.70.18-py310-none-any.whl", hash = "sha256:60c194974c31784019c1f459d984e8f33ee48f10fcf42c309ba97b30d9bd53ea", size = 134948 }, + { url = "https://files.pythonhosted.org/packages/4b/88/9039f2fed1012ef584751d4ceff9ab4a51e5ae264898f0b7cbf44340a859/multiprocess-0.70.18-py311-none-any.whl", hash = "sha256:5aa6eef98e691281b3ad923be2832bf1c55dd2c859acd73e5ec53a66aae06a1d", size = 144462 }, + { url = "https://files.pythonhosted.org/packages/bf/b6/5f922792be93b82ec6b5f270bbb1ef031fd0622847070bbcf9da816502cc/multiprocess-0.70.18-py312-none-any.whl", hash = "sha256:9b78f8e5024b573730bfb654783a13800c2c0f2dfc0c25e70b40d184d64adaa2", size = 150287 }, + { url = "https://files.pythonhosted.org/packages/ee/25/7d7e78e750bc1aecfaf0efbf826c69a791d2eeaf29cf20cba93ff4cced78/multiprocess-0.70.18-py313-none-any.whl", hash = "sha256:871743755f43ef57d7910a38433cfe41319e72be1bbd90b79c7a5ac523eb9334", size = 151917 }, + { url = "https://files.pythonhosted.org/packages/3b/c3/ca84c19bd14cdfc21c388fdcebf08b86a7a470ebc9f5c3c084fc2dbc50f7/multiprocess-0.70.18-py38-none-any.whl", hash = "sha256:dbf705e52a154fe5e90fb17b38f02556169557c2dd8bb084f2e06c2784d8279b", size = 132636 }, + { url = "https://files.pythonhosted.org/packages/6c/28/dd72947e59a6a8c856448a5e74da6201cb5502ddff644fbc790e4bd40b9a/multiprocess-0.70.18-py39-none-any.whl", hash = "sha256:e78ca805a72b1b810c690b6b4cc32579eba34f403094bbbae962b7b5bf9dfcb8", size = 133478 }, ] [[package]] name = "narwhals" version = "2.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/47/6d/b57c64e5038a8cf071bce391bb11551657a74558877ac961e7fa905ece27/narwhals-2.15.0.tar.gz", hash = "sha256:a9585975b99d95084268445a1fdd881311fa26ef1caa18020d959d5b2ff9a965", size = 603479, upload-time = "2026-01-06T08:10:13.27Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/47/6d/b57c64e5038a8cf071bce391bb11551657a74558877ac961e7fa905ece27/narwhals-2.15.0.tar.gz", hash = "sha256:a9585975b99d95084268445a1fdd881311fa26ef1caa18020d959d5b2ff9a965", size = 603479 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856, upload-time = "2026-01-06T08:10:11.511Z" }, + { url = "https://files.pythonhosted.org/packages/3d/2e/cf2ffeb386ac3763526151163ad7da9f1b586aac96d2b4f7de1eaebf0c61/narwhals-2.15.0-py3-none-any.whl", hash = "sha256:cbfe21ca19d260d9fd67f995ec75c44592d1f106933b03ddd375df7ac841f9d6", size = 432856 }, ] [[package]] name = "networkx" version = "3.4.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263 }, ] [[package]] name = "networkx" version = "3.6.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025 } wheels = [ - { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504 }, ] [[package]] name = "numpy" version = "2.2.6" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } resolution-markers = [ "python_full_version < '3.11'", ] -sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, - { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, - { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, - { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, - { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, - { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, - { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, - { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, - { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, - { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, - { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, - { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, - { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, - { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, - { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, - { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, - { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, - { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, - { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, - { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, - { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, - { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, - { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, - { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, - { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, - { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, - { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, - { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, - { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, - { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, - { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, - { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, - { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, - { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, - { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, - { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, - { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, - { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, - { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, - { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, - { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, - { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, - { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, - { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, - { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, - { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, - { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, - { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, - { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, - { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, - { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245 }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048 }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542 }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301 }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320 }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050 }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034 }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185 }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149 }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620 }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963 }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743 }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616 }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579 }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005 }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570 }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548 }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521 }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866 }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455 }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348 }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362 }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103 }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382 }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462 }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618 }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511 }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783 }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506 }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190 }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828 }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006 }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765 }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736 }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719 }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072 }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213 }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632 }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532 }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885 }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467 }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144 }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217 }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014 }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935 }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122 }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143 }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260 }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225 }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374 }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391 }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754 }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476 }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666 }, ] [[package]] name = "numpy" version = "2.4.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } resolution-markers = [ "python_full_version >= '3.13'", "python_full_version == '3.12.*'", "python_full_version == '3.11.*'", ] -sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320, upload-time = "2026-01-10T06:44:59.619Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563, upload-time = "2026-01-10T06:42:14.615Z" }, - { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658, upload-time = "2026-01-10T06:42:17.298Z" }, - { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132, upload-time = "2026-01-10T06:42:19.637Z" }, - { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159, upload-time = "2026-01-10T06:42:21.44Z" }, - { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058, upload-time = "2026-01-10T06:42:23.546Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501, upload-time = "2026-01-10T06:42:25.909Z" }, - { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627, upload-time = "2026-01-10T06:42:28.938Z" }, - { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052, upload-time = "2026-01-10T06:42:31.312Z" }, - { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575, upload-time = "2026-01-10T06:42:33.872Z" }, - { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479, upload-time = "2026-01-10T06:42:35.778Z" }, - { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325, upload-time = "2026-01-10T06:42:38.518Z" }, - { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888, upload-time = "2026-01-10T06:42:40.913Z" }, - { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956, upload-time = "2026-01-10T06:42:43.091Z" }, - { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567, upload-time = "2026-01-10T06:42:45.107Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459, upload-time = "2026-01-10T06:42:48.152Z" }, - { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859, upload-time = "2026-01-10T06:42:49.947Z" }, - { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419, upload-time = "2026-01-10T06:42:52.409Z" }, - { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131, upload-time = "2026-01-10T06:42:54.694Z" }, - { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342, upload-time = "2026-01-10T06:42:56.991Z" }, - { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015, upload-time = "2026-01-10T06:42:59.631Z" }, - { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730, upload-time = "2026-01-10T06:43:01.627Z" }, - { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166, upload-time = "2026-01-10T06:43:03.673Z" }, - { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495, upload-time = "2026-01-10T06:43:06.283Z" }, - { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657, upload-time = "2026-01-10T06:43:09.094Z" }, - { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256, upload-time = "2026-01-10T06:43:13.634Z" }, - { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212, upload-time = "2026-01-10T06:43:15.661Z" }, - { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871, upload-time = "2026-01-10T06:43:17.324Z" }, - { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305, upload-time = "2026-01-10T06:43:19.376Z" }, - { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909, upload-time = "2026-01-10T06:43:21.808Z" }, - { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380, upload-time = "2026-01-10T06:43:23.957Z" }, - { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089, upload-time = "2026-01-10T06:43:27.535Z" }, - { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230, upload-time = "2026-01-10T06:43:29.298Z" }, - { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125, upload-time = "2026-01-10T06:43:31.782Z" }, - { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156, upload-time = "2026-01-10T06:43:34.237Z" }, - { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663, upload-time = "2026-01-10T06:43:36.211Z" }, - { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224, upload-time = "2026-01-10T06:43:37.884Z" }, - { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352, upload-time = "2026-01-10T06:43:39.479Z" }, - { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279, upload-time = "2026-01-10T06:43:41.93Z" }, - { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316, upload-time = "2026-01-10T06:43:44.121Z" }, - { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884, upload-time = "2026-01-10T06:43:46.613Z" }, - { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138, upload-time = "2026-01-10T06:43:48.854Z" }, - { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478, upload-time = "2026-01-10T06:43:50.476Z" }, - { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981, upload-time = "2026-01-10T06:43:52.575Z" }, - { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046, upload-time = "2026-01-10T06:43:54.797Z" }, - { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858, upload-time = "2026-01-10T06:43:57.099Z" }, - { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417, upload-time = "2026-01-10T06:43:59.037Z" }, - { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643, upload-time = "2026-01-10T06:44:01.852Z" }, - { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963, upload-time = "2026-01-10T06:44:04.047Z" }, - { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811, upload-time = "2026-01-10T06:44:06.207Z" }, - { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643, upload-time = "2026-01-10T06:44:08.33Z" }, - { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601, upload-time = "2026-01-10T06:44:10.841Z" }, - { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722, upload-time = "2026-01-10T06:44:13.332Z" }, - { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590, upload-time = "2026-01-10T06:44:15.006Z" }, - { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180, upload-time = "2026-01-10T06:44:17.386Z" }, - { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774, upload-time = "2026-01-10T06:44:19.467Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274, upload-time = "2026-01-10T06:44:23.189Z" }, - { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306, upload-time = "2026-01-10T06:44:25.012Z" }, - { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653, upload-time = "2026-01-10T06:44:26.706Z" }, - { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144, upload-time = "2026-01-10T06:44:29.378Z" }, - { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425, upload-time = "2026-01-10T06:44:31.721Z" }, - { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053, upload-time = "2026-01-10T06:44:34.617Z" }, - { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482, upload-time = "2026-01-10T06:44:36.798Z" }, - { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117, upload-time = "2026-01-10T06:44:38.828Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121, upload-time = "2026-01-10T06:44:41.644Z" }, - { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202, upload-time = "2026-01-10T06:44:43.738Z" }, - { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985, upload-time = "2026-01-10T06:44:45.945Z" }, - { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484, upload-time = "2026-01-10T06:44:48.012Z" }, - { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216, upload-time = "2026-01-10T06:44:49.725Z" }, - { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937, upload-time = "2026-01-10T06:44:51.498Z" }, - { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830, upload-time = "2026-01-10T06:44:53.931Z" }, - { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579, upload-time = "2026-01-10T06:44:57.094Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/24/62/ae72ff66c0f1fd959925b4c11f8c2dea61f47f6acaea75a08512cdfe3fed/numpy-2.4.1.tar.gz", hash = "sha256:a1ceafc5042451a858231588a104093474c6a5c57dcc724841f5c888d237d690", size = 20721320 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/34/2b1bc18424f3ad9af577f6ce23600319968a70575bd7db31ce66731bbef9/numpy-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0cce2a669e3c8ba02ee563c7835f92c153cf02edff1ae05e1823f1dde21b16a5", size = 16944563 }, + { url = "https://files.pythonhosted.org/packages/2c/57/26e5f97d075aef3794045a6ca9eada6a4ed70eb9a40e7a4a93f9ac80d704/numpy-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:899d2c18024984814ac7e83f8f49d8e8180e2fbe1b2e252f2e7f1d06bea92425", size = 12645658 }, + { url = "https://files.pythonhosted.org/packages/8e/ba/80fc0b1e3cb2fd5c6143f00f42eb67762aa043eaa05ca924ecc3222a7849/numpy-2.4.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:09aa8a87e45b55a1c2c205d42e2808849ece5c484b2aab11fecabec3841cafba", size = 5474132 }, + { url = "https://files.pythonhosted.org/packages/40/ae/0a5b9a397f0e865ec171187c78d9b57e5588afc439a04ba9cab1ebb2c945/numpy-2.4.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:edee228f76ee2dab4579fad6f51f6a305de09d444280109e0f75df247ff21501", size = 6804159 }, + { url = "https://files.pythonhosted.org/packages/86/9c/841c15e691c7085caa6fd162f063eff494099c8327aeccd509d1ab1e36ab/numpy-2.4.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a92f227dbcdc9e4c3e193add1a189a9909947d4f8504c576f4a732fd0b54240a", size = 14708058 }, + { url = "https://files.pythonhosted.org/packages/5d/9d/7862db06743f489e6a502a3b93136d73aea27d97b2cf91504f70a27501d6/numpy-2.4.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:538bf4ec353709c765ff75ae616c34d3c3dca1a68312727e8f2676ea644f8509", size = 16651501 }, + { url = "https://files.pythonhosted.org/packages/a6/9c/6fc34ebcbd4015c6e5f0c0ce38264010ce8a546cb6beacb457b84a75dfc8/numpy-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:ac08c63cb7779b85e9d5318e6c3518b424bc1f364ac4cb2c6136f12e5ff2dccc", size = 16492627 }, + { url = "https://files.pythonhosted.org/packages/aa/63/2494a8597502dacda439f61b3c0db4da59928150e62be0e99395c3ad23c5/numpy-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4f9c360ecef085e5841c539a9a12b883dff005fbd7ce46722f5e9cef52634d82", size = 18585052 }, + { url = "https://files.pythonhosted.org/packages/6a/93/098e1162ae7522fc9b618d6272b77404c4656c72432ecee3abc029aa3de0/numpy-2.4.1-cp311-cp311-win32.whl", hash = "sha256:0f118ce6b972080ba0758c6087c3617b5ba243d806268623dc34216d69099ba0", size = 6236575 }, + { url = "https://files.pythonhosted.org/packages/8c/de/f5e79650d23d9e12f38a7bc6b03ea0835b9575494f8ec94c11c6e773b1b1/numpy-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:18e14c4d09d55eef39a6ab5b08406e84bc6869c1e34eef45564804f90b7e0574", size = 12604479 }, + { url = "https://files.pythonhosted.org/packages/dd/65/e1097a7047cff12ce3369bd003811516b20ba1078dbdec135e1cd7c16c56/numpy-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:6461de5113088b399d655d45c3897fa188766415d0f568f175ab071c8873bd73", size = 10578325 }, + { url = "https://files.pythonhosted.org/packages/78/7f/ec53e32bf10c813604edf07a3682616bd931d026fcde7b6d13195dfb684a/numpy-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d3703409aac693fa82c0aee023a1ae06a6e9d065dba10f5e8e80f642f1e9d0a2", size = 16656888 }, + { url = "https://files.pythonhosted.org/packages/b8/e0/1f9585d7dae8f14864e948fd7fa86c6cb72dee2676ca2748e63b1c5acfe0/numpy-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7211b95ca365519d3596a1d8688a95874cc94219d417504d9ecb2df99fa7bfa8", size = 12373956 }, + { url = "https://files.pythonhosted.org/packages/8e/43/9762e88909ff2326f5e7536fa8cb3c49fb03a7d92705f23e6e7f553d9cb3/numpy-2.4.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:5adf01965456a664fc727ed69cc71848f28d063217c63e1a0e200a118d5eec9a", size = 5202567 }, + { url = "https://files.pythonhosted.org/packages/4b/ee/34b7930eb61e79feb4478800a4b95b46566969d837546aa7c034c742ef98/numpy-2.4.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:26f0bcd9c79a00e339565b303badc74d3ea2bd6d52191eeca5f95936cad107d0", size = 6549459 }, + { url = "https://files.pythonhosted.org/packages/79/e3/5f115fae982565771be994867c89bcd8d7208dbfe9469185497d70de5ddf/numpy-2.4.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0093e85df2960d7e4049664b26afc58b03236e967fb942354deef3208857a04c", size = 14404859 }, + { url = "https://files.pythonhosted.org/packages/d9/7d/9c8a781c88933725445a859cac5d01b5871588a15969ee6aeb618ba99eee/numpy-2.4.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7ad270f438cbdd402c364980317fb6b117d9ec5e226fff5b4148dd9aa9fc6e02", size = 16371419 }, + { url = "https://files.pythonhosted.org/packages/a6/d2/8aa084818554543f17cf4162c42f162acbd3bb42688aefdba6628a859f77/numpy-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:297c72b1b98100c2e8f873d5d35fb551fce7040ade83d67dd51d38c8d42a2162", size = 16182131 }, + { url = "https://files.pythonhosted.org/packages/60/db/0425216684297c58a8df35f3284ef56ec4a043e6d283f8a59c53562caf1b/numpy-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf6470d91d34bf669f61d515499859fa7a4c2f7c36434afb70e82df7217933f9", size = 18295342 }, + { url = "https://files.pythonhosted.org/packages/31/4c/14cb9d86240bd8c386c881bafbe43f001284b7cce3bc01623ac9475da163/numpy-2.4.1-cp312-cp312-win32.whl", hash = "sha256:b6bcf39112e956594b3331316d90c90c90fb961e39696bda97b89462f5f3943f", size = 5959015 }, + { url = "https://files.pythonhosted.org/packages/51/cf/52a703dbeb0c65807540d29699fef5fda073434ff61846a564d5c296420f/numpy-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:e1a27bb1b2dee45a2a53f5ca6ff2d1a7f135287883a1689e930d44d1ff296c87", size = 12310730 }, + { url = "https://files.pythonhosted.org/packages/69/80/a828b2d0ade5e74a9fe0f4e0a17c30fdc26232ad2bc8c9f8b3197cf7cf18/numpy-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:0e6e8f9d9ecf95399982019c01223dc130542960a12edfa8edd1122dfa66a8a8", size = 10312166 }, + { url = "https://files.pythonhosted.org/packages/04/68/732d4b7811c00775f3bd522a21e8dd5a23f77eb11acdeb663e4a4ebf0ef4/numpy-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d797454e37570cfd61143b73b8debd623c3c0952959adb817dd310a483d58a1b", size = 16652495 }, + { url = "https://files.pythonhosted.org/packages/20/ca/857722353421a27f1465652b2c66813eeeccea9d76d5f7b74b99f298e60e/numpy-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:82c55962006156aeef1629b953fd359064aa47e4d82cfc8e67f0918f7da3344f", size = 12368657 }, + { url = "https://files.pythonhosted.org/packages/81/0d/2377c917513449cc6240031a79d30eb9a163d32a91e79e0da47c43f2c0c8/numpy-2.4.1-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:71abbea030f2cfc3092a0ff9f8c8fdefdc5e0bf7d9d9c99663538bb0ecdac0b9", size = 5197256 }, + { url = "https://files.pythonhosted.org/packages/17/39/569452228de3f5de9064ac75137082c6214be1f5c532016549a7923ab4b5/numpy-2.4.1-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5b55aa56165b17aaf15520beb9cbd33c9039810e0d9643dd4379e44294c7303e", size = 6545212 }, + { url = "https://files.pythonhosted.org/packages/8c/a4/77333f4d1e4dac4395385482557aeecf4826e6ff517e32ca48e1dafbe42a/numpy-2.4.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0faba4a331195bfa96f93dd9dfaa10b2c7aa8cda3a02b7fd635e588fe821bf5", size = 14402871 }, + { url = "https://files.pythonhosted.org/packages/ba/87/d341e519956273b39d8d47969dd1eaa1af740615394fe67d06f1efa68773/numpy-2.4.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e3087f53e2b4428766b54932644d148613c5a595150533ae7f00dab2f319a8", size = 16359305 }, + { url = "https://files.pythonhosted.org/packages/32/91/789132c6666288eaa20ae8066bb99eba1939362e8f1a534949a215246e97/numpy-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:49e792ec351315e16da54b543db06ca8a86985ab682602d90c60ef4ff4db2a9c", size = 16181909 }, + { url = "https://files.pythonhosted.org/packages/cf/b8/090b8bd27b82a844bb22ff8fdf7935cb1980b48d6e439ae116f53cdc2143/numpy-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:79e9e06c4c2379db47f3f6fc7a8652e7498251789bf8ff5bd43bf478ef314ca2", size = 18284380 }, + { url = "https://files.pythonhosted.org/packages/67/78/722b62bd31842ff029412271556a1a27a98f45359dea78b1548a3a9996aa/numpy-2.4.1-cp313-cp313-win32.whl", hash = "sha256:3d1a100e48cb266090a031397863ff8a30050ceefd798f686ff92c67a486753d", size = 5957089 }, + { url = "https://files.pythonhosted.org/packages/da/a6/cf32198b0b6e18d4fbfa9a21a992a7fca535b9bb2b0cdd217d4a3445b5ca/numpy-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:92a0e65272fd60bfa0d9278e0484c2f52fe03b97aedc02b357f33fe752c52ffb", size = 12307230 }, + { url = "https://files.pythonhosted.org/packages/44/6c/534d692bfb7d0afe30611320c5fb713659dcb5104d7cc182aff2aea092f5/numpy-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:20d4649c773f66cc2fc36f663e091f57c3b7655f936a4c681b4250855d1da8f5", size = 10313125 }, + { url = "https://files.pythonhosted.org/packages/da/a1/354583ac5c4caa566de6ddfbc42744409b515039e085fab6e0ff942e0df5/numpy-2.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f93bc6892fe7b0663e5ffa83b61aab510aacffd58c16e012bb9352d489d90cb7", size = 12496156 }, + { url = "https://files.pythonhosted.org/packages/51/b0/42807c6e8cce58c00127b1dc24d365305189991f2a7917aa694a109c8d7d/numpy-2.4.1-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:178de8f87948163d98a4c9ab5bee4ce6519ca918926ec8df195af582de28544d", size = 5324663 }, + { url = "https://files.pythonhosted.org/packages/fe/55/7a621694010d92375ed82f312b2f28017694ed784775269115323e37f5e2/numpy-2.4.1-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:98b35775e03ab7f868908b524fc0a84d38932d8daf7b7e1c3c3a1b6c7a2c9f15", size = 6645224 }, + { url = "https://files.pythonhosted.org/packages/50/96/9fa8635ed9d7c847d87e30c834f7109fac5e88549d79ef3324ab5c20919f/numpy-2.4.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:941c2a93313d030f219f3a71fd3d91a728b82979a5e8034eb2e60d394a2b83f9", size = 14462352 }, + { url = "https://files.pythonhosted.org/packages/03/d1/8cf62d8bb2062da4fb82dd5d49e47c923f9c0738032f054e0a75342faba7/numpy-2.4.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:529050522e983e00a6c1c6b67411083630de8b57f65e853d7b03d9281b8694d2", size = 16407279 }, + { url = "https://files.pythonhosted.org/packages/86/1c/95c86e17c6b0b31ce6ef219da00f71113b220bcb14938c8d9a05cee0ff53/numpy-2.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2302dc0224c1cbc49bb94f7064f3f923a971bfae45c33870dcbff63a2a550505", size = 16248316 }, + { url = "https://files.pythonhosted.org/packages/30/b4/e7f5ff8697274c9d0fa82398b6a372a27e5cef069b37df6355ccb1f1db1a/numpy-2.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9171a42fcad32dcf3fa86f0a4faa5e9f8facefdb276f54b8b390d90447cff4e2", size = 18329884 }, + { url = "https://files.pythonhosted.org/packages/37/a4/b073f3e9d77f9aec8debe8ca7f9f6a09e888ad1ba7488f0c3b36a94c03ac/numpy-2.4.1-cp313-cp313t-win32.whl", hash = "sha256:382ad67d99ef49024f11d1ce5dcb5ad8432446e4246a4b014418ba3a1175a1f4", size = 6081138 }, + { url = "https://files.pythonhosted.org/packages/16/16/af42337b53844e67752a092481ab869c0523bc95c4e5c98e4dac4e9581ac/numpy-2.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:62fea415f83ad8fdb6c20840578e5fbaf5ddd65e0ec6c3c47eda0f69da172510", size = 12447478 }, + { url = "https://files.pythonhosted.org/packages/6c/f8/fa85b2eac68ec631d0b631abc448552cb17d39afd17ec53dcbcc3537681a/numpy-2.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:a7870e8c5fc11aef57d6fea4b4085e537a3a60ad2cdd14322ed531fdca68d261", size = 10382981 }, + { url = "https://files.pythonhosted.org/packages/1b/a7/ef08d25698e0e4b4efbad8d55251d20fe2a15f6d9aa7c9b30cd03c165e6f/numpy-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:3869ea1ee1a1edc16c29bbe3a2f2a4e515cc3a44d43903ad41e0cacdbaf733dc", size = 16652046 }, + { url = "https://files.pythonhosted.org/packages/8f/39/e378b3e3ca13477e5ac70293ec027c438d1927f18637e396fe90b1addd72/numpy-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:e867df947d427cdd7a60e3e271729090b0f0df80f5f10ab7dd436f40811699c3", size = 12378858 }, + { url = "https://files.pythonhosted.org/packages/c3/74/7ec6154f0006910ed1fdbb7591cf4432307033102b8a22041599935f8969/numpy-2.4.1-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:e3bd2cb07841166420d2fa7146c96ce00cb3410664cbc1a6be028e456c4ee220", size = 5207417 }, + { url = "https://files.pythonhosted.org/packages/f7/b7/053ac11820d84e42f8feea5cb81cc4fcd1091499b45b1ed8c7415b1bf831/numpy-2.4.1-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:f0a90aba7d521e6954670550e561a4cb925713bd944445dbe9e729b71f6cabee", size = 6542643 }, + { url = "https://files.pythonhosted.org/packages/c0/c4/2e7908915c0e32ca636b92e4e4a3bdec4cb1e7eb0f8aedf1ed3c68a0d8cd/numpy-2.4.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d558123217a83b2d1ba316b986e9248a1ed1971ad495963d555ccd75dcb1556", size = 14418963 }, + { url = "https://files.pythonhosted.org/packages/eb/c0/3ed5083d94e7ffd7c404e54619c088e11f2e1939a9544f5397f4adb1b8ba/numpy-2.4.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2f44de05659b67d20499cbc96d49f2650769afcb398b79b324bb6e297bfe3844", size = 16363811 }, + { url = "https://files.pythonhosted.org/packages/0e/68/42b66f1852bf525050a67315a4fb94586ab7e9eaa541b1bef530fab0c5dd/numpy-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:69e7419c9012c4aaf695109564e3387f1259f001b4326dfa55907b098af082d3", size = 16197643 }, + { url = "https://files.pythonhosted.org/packages/d2/40/e8714fc933d85f82c6bfc7b998a0649ad9769a32f3494ba86598aaf18a48/numpy-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2ffd257026eb1b34352e749d7cc1678b5eeec3e329ad8c9965a797e08ccba205", size = 18289601 }, + { url = "https://files.pythonhosted.org/packages/80/9a/0d44b468cad50315127e884802351723daca7cf1c98d102929468c81d439/numpy-2.4.1-cp314-cp314-win32.whl", hash = "sha256:727c6c3275ddefa0dc078524a85e064c057b4f4e71ca5ca29a19163c607be745", size = 6005722 }, + { url = "https://files.pythonhosted.org/packages/7e/bb/c6513edcce5a831810e2dddc0d3452ce84d208af92405a0c2e58fd8e7881/numpy-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:7d5d7999df434a038d75a748275cd6c0094b0ecdb0837342b332a82defc4dc4d", size = 12438590 }, + { url = "https://files.pythonhosted.org/packages/e9/da/a598d5cb260780cf4d255102deba35c1d072dc028c4547832f45dd3323a8/numpy-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:ce9ce141a505053b3c7bce3216071f3bf5c182b8b28930f14cd24d43932cd2df", size = 10596180 }, + { url = "https://files.pythonhosted.org/packages/de/bc/ea3f2c96fcb382311827231f911723aeff596364eb6e1b6d1d91128aa29b/numpy-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:4e53170557d37ae404bf8d542ca5b7c629d6efa1117dac6a83e394142ea0a43f", size = 12498774 }, + { url = "https://files.pythonhosted.org/packages/aa/ab/ef9d939fe4a812648c7a712610b2ca6140b0853c5efea361301006c02ae5/numpy-2.4.1-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:a73044b752f5d34d4232f25f18160a1cc418ea4507f5f11e299d8ac36875f8a0", size = 5327274 }, + { url = "https://files.pythonhosted.org/packages/bd/31/d381368e2a95c3b08b8cf7faac6004849e960f4a042d920337f71cef0cae/numpy-2.4.1-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:fb1461c99de4d040666ca0444057b06541e5642f800b71c56e6ea92d6a853a0c", size = 6648306 }, + { url = "https://files.pythonhosted.org/packages/c8/e5/0989b44ade47430be6323d05c23207636d67d7362a1796ccbccac6773dd2/numpy-2.4.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:423797bdab2eeefbe608d7c1ec7b2b4fd3c58d51460f1ee26c7500a1d9c9ee93", size = 14464653 }, + { url = "https://files.pythonhosted.org/packages/10/a7/cfbe475c35371cae1358e61f20c5f075badc18c4797ab4354140e1d283cf/numpy-2.4.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52b5f61bdb323b566b528899cc7db2ba5d1015bda7ea811a8bcf3c89c331fa42", size = 16405144 }, + { url = "https://files.pythonhosted.org/packages/f8/a3/0c63fe66b534888fa5177cc7cef061541064dbe2b4b60dcc60ffaf0d2157/numpy-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:42d7dd5fa36d16d52a84f821eb96031836fd405ee6955dd732f2023724d0aa01", size = 16247425 }, + { url = "https://files.pythonhosted.org/packages/6b/2b/55d980cfa2c93bd40ff4c290bf824d792bd41d2fe3487b07707559071760/numpy-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7b6b5e28bbd47b7532698e5db2fe1db693d84b58c254e4389d99a27bb9b8f6b", size = 18330053 }, + { url = "https://files.pythonhosted.org/packages/23/12/8b5fc6b9c487a09a7957188e0943c9ff08432c65e34567cabc1623b03a51/numpy-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:5de60946f14ebe15e713a6f22850c2372fa72f4ff9a432ab44aa90edcadaa65a", size = 6152482 }, + { url = "https://files.pythonhosted.org/packages/00/a5/9f8ca5856b8940492fc24fbe13c1bc34d65ddf4079097cf9e53164d094e1/numpy-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:8f085da926c0d491ffff3096f91078cc97ea67e7e6b65e490bc8dcda65663be2", size = 12627117 }, + { url = "https://files.pythonhosted.org/packages/ad/0d/eca3d962f9eef265f01a8e0d20085c6dd1f443cbffc11b6dede81fd82356/numpy-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:6436cffb4f2bf26c974344439439c95e152c9a527013f26b3577be6c2ca64295", size = 10667121 }, + { url = "https://files.pythonhosted.org/packages/1e/48/d86f97919e79314a1cdee4c832178763e6e98e623e123d0bada19e92c15a/numpy-2.4.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8ad35f20be147a204e28b6a0575fbf3540c5e5f802634d4258d55b1ff5facce1", size = 16822202 }, + { url = "https://files.pythonhosted.org/packages/51/e9/1e62a7f77e0f37dcfb0ad6a9744e65df00242b6ea37dfafb55debcbf5b55/numpy-2.4.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:8097529164c0f3e32bb89412a0905d9100bf434d9692d9fc275e18dcf53c9344", size = 12569985 }, + { url = "https://files.pythonhosted.org/packages/c7/7e/914d54f0c801342306fdcdce3e994a56476f1b818c46c47fc21ae968088c/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:ea66d2b41ca4a1630aae5507ee0a71647d3124d1741980138aa8f28f44dac36e", size = 5398484 }, + { url = "https://files.pythonhosted.org/packages/1c/d8/9570b68584e293a33474e7b5a77ca404f1dcc655e40050a600dee81d27fb/numpy-2.4.1-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d3f8f0df9f4b8be57b3bf74a1d087fec68f927a2fab68231fdb442bf2c12e426", size = 6713216 }, + { url = "https://files.pythonhosted.org/packages/33/9b/9dd6e2db8d49eb24f86acaaa5258e5f4c8ed38209a4ee9de2d1a0ca25045/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2023ef86243690c2791fd6353e5b4848eedaa88ca8a2d129f462049f6d484696", size = 14538937 }, + { url = "https://files.pythonhosted.org/packages/53/87/d5bd995b0f798a37105b876350d346eea5838bd8f77ea3d7a48392f3812b/numpy-2.4.1-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8361ea4220d763e54cff2fbe7d8c93526b744f7cd9ddab47afeff7e14e8503be", size = 16479830 }, + { url = "https://files.pythonhosted.org/packages/5b/c7/b801bf98514b6ae6475e941ac05c58e6411dd863ea92916bfd6d510b08c1/numpy-2.4.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:4f1b68ff47680c2925f8063402a693ede215f0257f02596b1318ecdfb1d79e33", size = 12492579 }, ] [[package]] name = "nvidia-cublas-cu12" version = "12.8.4.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921, upload-time = "2025-03-07T01:44:31.254Z" }, + { url = "https://files.pythonhosted.org/packages/dc/61/e24b560ab2e2eaeb3c839129175fb330dfcfc29e5203196e5541a4c44682/nvidia_cublas_cu12-12.8.4.1-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:8ac4e771d5a348c551b2a426eda6193c19aa630236b418086020df5ba9667142", size = 594346921 }, ] [[package]] name = "nvidia-cuda-cupti-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621, upload-time = "2025-03-07T01:40:21.213Z" }, + { url = "https://files.pythonhosted.org/packages/f8/02/2adcaa145158bf1a8295d83591d22e4103dbfd821bcaf6f3f53151ca4ffa/nvidia_cuda_cupti_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ea0cb07ebda26bb9b29ba82cda34849e73c166c18162d3913575b0c9db9a6182", size = 10248621 }, ] [[package]] name = "nvidia-cuda-nvrtc-cu12" version = "12.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029, upload-time = "2025-03-07T01:42:13.562Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/32f747947df2da6994e999492ab306a903659555dddc0fbdeb9d71f75e52/nvidia_cuda_nvrtc_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:a7756528852ef889772a84c6cd89d41dfa74667e24cca16bb31f8f061e3e9994", size = 88040029 }, ] [[package]] name = "nvidia-cuda-runtime-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765, upload-time = "2025-03-07T01:40:01.615Z" }, + { url = "https://files.pythonhosted.org/packages/0d/9b/a997b638fcd068ad6e4d53b8551a7d30fe8b404d6f1804abf1df69838932/nvidia_cuda_runtime_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:adade8dcbd0edf427b7204d480d6066d33902cab2a4707dcfc48a2d0fd44ab90", size = 954765 }, ] [[package]] name = "nvidia-cudnn-cu12" version = "9.10.2.21" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "nvidia-cublas-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467, upload-time = "2025-06-06T21:54:08.597Z" }, + { url = "https://files.pythonhosted.org/packages/ba/51/e123d997aa098c61d029f76663dedbfb9bc8dcf8c60cbd6adbe42f76d049/nvidia_cudnn_cu12-9.10.2.21-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:949452be657fa16687d0930933f032835951ef0892b37d2d53824d1a84dc97a8", size = 706758467 }, ] [[package]] name = "nvidia-cufft-cu12" version = "11.3.3.83" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695, upload-time = "2025-03-07T01:45:27.821Z" }, + { url = "https://files.pythonhosted.org/packages/1f/13/ee4e00f30e676b66ae65b4f08cb5bcbb8392c03f54f2d5413ea99a5d1c80/nvidia_cufft_cu12-11.3.3.83-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4d2dd21ec0b88cf61b62e6b43564355e5222e4a3fb394cac0db101f2dd0d4f74", size = 193118695 }, ] [[package]] name = "nvidia-cufile-cu12" version = "1.13.1.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834, upload-time = "2025-03-07T01:45:50.723Z" }, + { url = "https://files.pythonhosted.org/packages/bb/fe/1bcba1dfbfb8d01be8d93f07bfc502c93fa23afa6fd5ab3fc7c1df71038a/nvidia_cufile_cu12-1.13.1.3-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1d069003be650e131b21c932ec3d8969c1715379251f8d23a1860554b1cb24fc", size = 1197834 }, ] [[package]] name = "nvidia-curand-cu12" version = "10.3.9.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976, upload-time = "2025-03-07T01:46:23.323Z" }, + { url = "https://files.pythonhosted.org/packages/fb/aa/6584b56dc84ebe9cf93226a5cde4d99080c8e90ab40f0c27bda7a0f29aa1/nvidia_curand_cu12-10.3.9.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:b32331d4f4df5d6eefa0554c565b626c7216f87a06a4f56fab27c3b68a830ec9", size = 63619976 }, ] [[package]] name = "nvidia-cusolver-cu12" version = "11.7.3.90" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "nvidia-cublas-cu12" }, { name = "nvidia-cusparse-cu12" }, { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905, upload-time = "2025-03-07T01:47:16.273Z" }, + { url = "https://files.pythonhosted.org/packages/85/48/9a13d2975803e8cf2777d5ed57b87a0b6ca2cc795f9a4f59796a910bfb80/nvidia_cusolver_cu12-11.7.3.90-py3-none-manylinux_2_27_x86_64.whl", hash = "sha256:4376c11ad263152bd50ea295c05370360776f8c3427b30991df774f9fb26c450", size = 267506905 }, ] [[package]] name = "nvidia-cusparse-cu12" version = "12.5.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "nvidia-nvjitlink-cu12" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466, upload-time = "2025-03-07T01:48:13.779Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f5/e1854cb2f2bcd4280c44736c93550cc300ff4b8c95ebe370d0aa7d2b473d/nvidia_cusparse_cu12-12.5.8.93-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ec05d76bbbd8b61b06a80e1eaf8cf4959c3d4ce8e711b65ebd0443bb0ebb13b", size = 288216466 }, ] [[package]] name = "nvidia-cusparselt-cu12" version = "0.7.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691, upload-time = "2025-02-26T00:15:44.104Z" }, + { url = "https://files.pythonhosted.org/packages/56/79/12978b96bd44274fe38b5dde5cfb660b1d114f70a65ef962bcbbed99b549/nvidia_cusparselt_cu12-0.7.1-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f1bb701d6b930d5a7cea44c19ceb973311500847f81b634d802b7b539dc55623", size = 287193691 }, ] [[package]] name = "nvidia-ml-py" version = "13.590.48" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/af/a0/f4fc18cf72f06821a9a665085435b901449986855519d5b3843532db35e9/nvidia_ml_py-13.590.48.tar.gz", hash = "sha256:8184d1be52914ac7f0991cd1c0d946c65dc88a840c754cd12c274b77b88760dd", size = 49732, upload-time = "2026-01-22T01:14:56.456Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/af/a0/f4fc18cf72f06821a9a665085435b901449986855519d5b3843532db35e9/nvidia_ml_py-13.590.48.tar.gz", hash = "sha256:8184d1be52914ac7f0991cd1c0d946c65dc88a840c754cd12c274b77b88760dd", size = 49732 } wheels = [ - { url = "https://files.pythonhosted.org/packages/fd/72/fb2af0d259a651affdce65fd6a495f0e07a685a0136baf585c5065204ee7/nvidia_ml_py-13.590.48-py3-none-any.whl", hash = "sha256:fd43d30ee9cd0b7940f5f9f9220b68d42722975e3992b6c21d14144c48760e43", size = 50680, upload-time = "2026-01-22T01:14:55.281Z" }, + { url = "https://files.pythonhosted.org/packages/fd/72/fb2af0d259a651affdce65fd6a495f0e07a685a0136baf585c5065204ee7/nvidia_ml_py-13.590.48-py3-none-any.whl", hash = "sha256:fd43d30ee9cd0b7940f5f9f9220b68d42722975e3992b6c21d14144c48760e43", size = 50680 }, ] [[package]] name = "nvidia-nccl-cu12" version = "2.27.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229, upload-time = "2025-06-26T04:11:28.385Z" }, + { url = "https://files.pythonhosted.org/packages/6e/89/f7a07dc961b60645dbbf42e80f2bc85ade7feb9a491b11a1e973aa00071f/nvidia_nccl_cu12-2.27.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ad730cf15cb5d25fe849c6e6ca9eb5b76db16a80f13f425ac68d8e2e55624457", size = 322348229 }, ] [[package]] name = "nvidia-nvjitlink-cu12" version = "12.8.93" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836, upload-time = "2025-03-07T01:49:55.661Z" }, + { url = "https://files.pythonhosted.org/packages/f6/74/86a07f1d0f42998ca31312f998bd3b9a7eff7f52378f4f270c8679c77fb9/nvidia_nvjitlink_cu12-12.8.93-py3-none-manylinux2010_x86_64.manylinux_2_12_x86_64.whl", hash = "sha256:81ff63371a7ebd6e6451970684f916be2eab07321b73c9d244dc2b4da7f73b88", size = 39254836 }, ] [[package]] name = "nvidia-nvshmem-cu12" version = "3.4.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/b5/09/6ea3ea725f82e1e76684f0708bbedd871fc96da89945adeba65c3835a64c/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd", size = 139103095, upload-time = "2025-09-06T00:32:31.266Z" }, + { url = "https://files.pythonhosted.org/packages/b5/09/6ea3ea725f82e1e76684f0708bbedd871fc96da89945adeba65c3835a64c/nvidia_nvshmem_cu12-3.4.5-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:042f2500f24c021db8a06c5eec2539027d57460e1c1a762055a6554f72c369bd", size = 139103095 }, ] [[package]] name = "nvidia-nvtx-cu12" version = "12.8.90" -source = { registry = "https://pypi.org/simple" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954, upload-time = "2025-03-07T01:42:44.131Z" }, -] - -[[package]] -name = "openai" -version = "2.16.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "anyio" }, - { name = "distro" }, - { name = "httpx" }, - { name = "jiter" }, - { name = "pydantic" }, - { name = "sniffio" }, - { name = "tqdm" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/b1/6c/e4c964fcf1d527fdf4739e7cc940c60075a4114d50d03871d5d5b1e13a88/openai-2.16.0.tar.gz", hash = "sha256:42eaa22ca0d8ded4367a77374104d7a2feafee5bd60a107c3c11b5243a11cd12", size = 629649, upload-time = "2026-01-27T23:28:02.579Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/16/83/0315bf2cfd75a2ce8a7e54188e9456c60cec6c0cf66728ed07bd9859ff26/openai-2.16.0-py3-none-any.whl", hash = "sha256:5f46643a8f42899a84e80c38838135d7038e7718333ce61396994f887b09a59b", size = 1068612, upload-time = "2026-01-27T23:28:00.356Z" }, -] - -[[package]] -name = "optuna" -version = "4.7.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "alembic" }, - { name = "colorlog" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, - { name = "packaging" }, - { name = "pyyaml" }, - { name = "sqlalchemy" }, - { name = "tqdm" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/58/b2/b5e12de7b4486556fe2257611b55dbabf30d0300bdb031831aa943ad20e4/optuna-4.7.0.tar.gz", hash = "sha256:d91817e2079825557bd2e97de2e8c9ae260bfc99b32712502aef8a5095b2d2c0", size = 479740, upload-time = "2026-01-19T05:45:52.604Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/75/d1/6c8a4fbb38a9e3565f5c36b871262a85ecab3da48120af036b1e4937a15c/optuna-4.7.0-py3-none-any.whl", hash = "sha256:e41ec84018cecc10eabf28143573b1f0bde0ba56dba8151631a590ecbebc1186", size = 413894, upload-time = "2026-01-19T05:45:50.815Z" }, + { url = "https://files.pythonhosted.org/packages/a2/eb/86626c1bbc2edb86323022371c39aa48df6fd8b0a1647bc274577f72e90b/nvidia_nvtx_cu12-12.8.90-py3-none-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5b17e2001cc0d751a5bc2c6ec6d26ad95913324a4adb86788c944f8ce9ba441f", size = 89954 }, ] [[package]] name = "orjson" version = "3.11.6" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/70/a3/4e09c61a5f0c521cba0bb433639610ae037437669f1a4cbc93799e731d78/orjson-3.11.6.tar.gz", hash = "sha256:0a54c72259f35299fd033042367df781c2f66d10252955ca1efb7db309b954cb", size = 6175856, upload-time = "2026-01-29T15:13:07.942Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/30/3c/098ed0e49c565fdf1ccc6a75b190115d1ca74148bf5b6ab036554a550650/orjson-3.11.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a613fc37e007143d5b6286dccb1394cd114b07832417006a02b620ddd8279e37", size = 250411, upload-time = "2026-01-29T15:11:17.941Z" }, - { url = "https://files.pythonhosted.org/packages/15/7c/cb11a360fd228ceebade03b1e8e9e138dd4b1b3b11602b72dbdad915aded/orjson-3.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46ebee78f709d3ba7a65384cfe285bb0763157c6d2f836e7bde2f12d33a867a2", size = 138147, upload-time = "2026-01-29T15:11:19.659Z" }, - { url = "https://files.pythonhosted.org/packages/4e/4b/e57b5c45ffe69fbef7cbd56e9f40e2dc0d5de920caafefcc6981d1a7efc5/orjson-3.11.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a726fa86d2368cd57990f2bd95ef5495a6e613b08fc9585dfe121ec758fb08d1", size = 135110, upload-time = "2026-01-29T15:11:21.231Z" }, - { url = "https://files.pythonhosted.org/packages/b0/6e/4f21c6256f8cee3c0c69926cf7ac821cfc36f218512eedea2e2dc4a490c8/orjson-3.11.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:150f12e59d6864197770c78126e1a6e07a3da73d1728731bf3bc1e8b96ffdbe6", size = 140995, upload-time = "2026-01-29T15:11:22.902Z" }, - { url = "https://files.pythonhosted.org/packages/d0/78/92c36205ba2f6094ba1eea60c8e646885072abe64f155196833988c14b74/orjson-3.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a2d9746a5b5ce20c0908ada451eb56da4ffa01552a50789a0354d8636a02953", size = 144435, upload-time = "2026-01-29T15:11:24.124Z" }, - { url = "https://files.pythonhosted.org/packages/4d/52/1b518d164005811eb3fea92650e76e7d9deadb0b41e92c483373b1e82863/orjson-3.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd177f5dd91666d31e9019f1b06d2fcdf8a409a1637ddcb5915085dede85680", size = 142734, upload-time = "2026-01-29T15:11:25.708Z" }, - { url = "https://files.pythonhosted.org/packages/4b/11/60ea7885a2b7c1bf60ed8b5982356078a73785bd3bab392041a5bcf8de7c/orjson-3.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d777ec41a327bd3b7de97ba7bce12cc1007815ca398e4e4de9ec56c022c090b", size = 145802, upload-time = "2026-01-29T15:11:26.917Z" }, - { url = "https://files.pythonhosted.org/packages/41/7f/15a927e7958fd4f7560fb6dbb9346bee44a168e40168093c46020d866098/orjson-3.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f3a135f83185c87c13ff231fcb7dbb2fa4332a376444bd65135b50ff4cc5265c", size = 147504, upload-time = "2026-01-29T15:11:28.07Z" }, - { url = "https://files.pythonhosted.org/packages/66/1f/cabb9132a533f4f913e29294d0a1ca818b1a9a52e990526fe3f7ddd75f1c/orjson-3.11.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:2a8eeed7d4544cf391a142b0dd06029dac588e96cc692d9ab1c3f05b1e57c7f6", size = 421408, upload-time = "2026-01-29T15:11:29.314Z" }, - { url = "https://files.pythonhosted.org/packages/4c/b9/09bda9257a982e300313e4a9fc9b9c3aaff424d07bcf765bf045e4e3ed03/orjson-3.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9d576865a21e5cc6695be8fb78afc812079fd361ce6a027a7d41561b61b33a90", size = 155801, upload-time = "2026-01-29T15:11:30.575Z" }, - { url = "https://files.pythonhosted.org/packages/98/19/4e40ea3e5f4c6a8d51f31fd2382351ee7b396fecca915b17cd1af588175b/orjson-3.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:925e2df51f60aa50f8797830f2adfc05330425803f4105875bb511ced98b7f89", size = 147647, upload-time = "2026-01-29T15:11:31.856Z" }, - { url = "https://files.pythonhosted.org/packages/5a/73/ef4bd7dd15042cf33a402d16b87b9e969e71edb452b63b6e2b05025d1f7d/orjson-3.11.6-cp310-cp310-win32.whl", hash = "sha256:09dded2de64e77ac0b312ad59f35023548fb87393a57447e1bb36a26c181a90f", size = 139770, upload-time = "2026-01-29T15:11:33.031Z" }, - { url = "https://files.pythonhosted.org/packages/b4/ac/daab6e10467f7fffd7081ba587b492505b49313130ff5446a6fe28bf076e/orjson-3.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:3a63b5e7841ca8635214c6be7c0bf0246aa8c5cd4ef0c419b14362d0b2fb13de", size = 136783, upload-time = "2026-01-29T15:11:34.686Z" }, - { url = "https://files.pythonhosted.org/packages/f3/fd/d6b0a36854179b93ed77839f107c4089d91cccc9f9ba1b752b6e3bac5f34/orjson-3.11.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e259e85a81d76d9665f03d6129e09e4435531870de5961ddcd0bf6e3a7fde7d7", size = 250029, upload-time = "2026-01-29T15:11:35.942Z" }, - { url = "https://files.pythonhosted.org/packages/a3/bb/22902619826641cf3b627c24aab62e2ad6b571bdd1d34733abb0dd57f67a/orjson-3.11.6-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:52263949f41b4a4822c6b1353bcc5ee2f7109d53a3b493501d3369d6d0e7937a", size = 134518, upload-time = "2026-01-29T15:11:37.347Z" }, - { url = "https://files.pythonhosted.org/packages/72/90/7a818da4bba1de711a9653c420749c0ac95ef8f8651cbc1dca551f462fe0/orjson-3.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6439e742fa7834a24698d358a27346bb203bff356ae0402e7f5df8f749c621a8", size = 137917, upload-time = "2026-01-29T15:11:38.511Z" }, - { url = "https://files.pythonhosted.org/packages/59/0f/02846c1cac8e205cb3822dd8aa8f9114acda216f41fd1999ace6b543418d/orjson-3.11.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b81ffd68f084b4e993e3867acb554a049fa7787cc8710bbcc1e26965580d99be", size = 134923, upload-time = "2026-01-29T15:11:39.711Z" }, - { url = "https://files.pythonhosted.org/packages/94/cf/aeaf683001b474bb3c3c757073a4231dfdfe8467fceaefa5bfd40902c99f/orjson-3.11.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5a5468e5e60f7ef6d7f9044b06c8f94a3c56ba528c6e4f7f06ae95164b595ec", size = 140752, upload-time = "2026-01-29T15:11:41.347Z" }, - { url = "https://files.pythonhosted.org/packages/fc/fe/dad52d8315a65f084044a0819d74c4c9daf9ebe0681d30f525b0d29a31f0/orjson-3.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72c5005eb45bd2535632d4f3bec7ad392832cfc46b62a3021da3b48a67734b45", size = 144201, upload-time = "2026-01-29T15:11:42.537Z" }, - { url = "https://files.pythonhosted.org/packages/36/bc/ab070dd421565b831801077f1e390c4d4af8bfcecafc110336680a33866b/orjson-3.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b14dd49f3462b014455a28a4d810d3549bf990567653eb43765cd847df09145", size = 142380, upload-time = "2026-01-29T15:11:44.309Z" }, - { url = "https://files.pythonhosted.org/packages/e6/d8/4b581c725c3a308717f28bf45a9fdac210bca08b67e8430143699413ff06/orjson-3.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bb2c1ea30ef302f0f89f9bf3e7f9ab5e2af29dc9f80eb87aa99788e4e2d65", size = 145582, upload-time = "2026-01-29T15:11:45.506Z" }, - { url = "https://files.pythonhosted.org/packages/5b/a2/09aab99b39f9a7f175ea8fa29adb9933a3d01e7d5d603cdee7f1c40c8da2/orjson-3.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:825e0a85d189533c6bff7e2fc417a28f6fcea53d27125c4551979aecd6c9a197", size = 147270, upload-time = "2026-01-29T15:11:46.782Z" }, - { url = "https://files.pythonhosted.org/packages/b8/2f/5ef8eaf7829dc50da3bf497c7775b21ee88437bc8c41f959aa3504ca6631/orjson-3.11.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b04575417a26530637f6ab4b1f7b4f666eb0433491091da4de38611f97f2fcf3", size = 421222, upload-time = "2026-01-29T15:11:48.106Z" }, - { url = "https://files.pythonhosted.org/packages/3b/b0/dd6b941294c2b5b13da5fdc7e749e58d0c55a5114ab37497155e83050e95/orjson-3.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b83eb2e40e8c4da6d6b340ee6b1d6125f5195eb1b0ebb7eac23c6d9d4f92d224", size = 155562, upload-time = "2026-01-29T15:11:49.408Z" }, - { url = "https://files.pythonhosted.org/packages/8e/09/43924331a847476ae2f9a16bd6d3c9dab301265006212ba0d3d7fd58763a/orjson-3.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1f42da604ee65a6b87eef858c913ce3e5777872b19321d11e6fc6d21de89b64f", size = 147432, upload-time = "2026-01-29T15:11:50.635Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e9/d9865961081816909f6b49d880749dbbd88425afd7c5bbce0549e2290d77/orjson-3.11.6-cp311-cp311-win32.whl", hash = "sha256:5ae45df804f2d344cffb36c43fdf03c82fb6cd247f5faa41e21891b40dfbf733", size = 139623, upload-time = "2026-01-29T15:11:51.82Z" }, - { url = "https://files.pythonhosted.org/packages/b4/f9/6836edb92f76eec1082919101eb1145d2f9c33c8f2c5e6fa399b82a2aaa8/orjson-3.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:f4295948d65ace0a2d8f2c4ccc429668b7eb8af547578ec882e16bf79b0050b2", size = 136647, upload-time = "2026-01-29T15:11:53.454Z" }, - { url = "https://files.pythonhosted.org/packages/b3/0c/4954082eea948c9ae52ee0bcbaa2f99da3216a71bcc314ab129bde22e565/orjson-3.11.6-cp311-cp311-win_arm64.whl", hash = "sha256:314e9c45e0b81b547e3a1cfa3df3e07a815821b3dac9fe8cb75014071d0c16a4", size = 135327, upload-time = "2026-01-29T15:11:56.616Z" }, - { url = "https://files.pythonhosted.org/packages/14/ba/759f2879f41910b7e5e0cdbd9cf82a4f017c527fb0e972e9869ca7fe4c8e/orjson-3.11.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6f03f30cd8953f75f2a439070c743c7336d10ee940da918d71c6f3556af3ddcf", size = 249988, upload-time = "2026-01-29T15:11:58.294Z" }, - { url = "https://files.pythonhosted.org/packages/f0/70/54cecb929e6c8b10104fcf580b0cc7dc551aa193e83787dd6f3daba28bb5/orjson-3.11.6-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:af44baae65ef386ad971469a8557a0673bb042b0b9fd4397becd9c2dfaa02588", size = 134445, upload-time = "2026-01-29T15:11:59.819Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6f/ec0309154457b9ba1ad05f11faa4441f76037152f75e1ac577db3ce7ca96/orjson-3.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c310a48542094e4f7dbb6ac076880994986dda8ca9186a58c3cb70a3514d3231", size = 137708, upload-time = "2026-01-29T15:12:01.488Z" }, - { url = "https://files.pythonhosted.org/packages/20/52/3c71b80840f8bab9cb26417302707b7716b7d25f863f3a541bcfa232fe6e/orjson-3.11.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8dfa7a5d387f15ecad94cb6b2d2d5f4aeea64efd8d526bfc03c9812d01e1cc0", size = 134798, upload-time = "2026-01-29T15:12:02.705Z" }, - { url = "https://files.pythonhosted.org/packages/30/51/b490a43b22ff736282360bd02e6bded455cf31dfc3224e01cd39f919bbd2/orjson-3.11.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba8daee3e999411b50f8b50dbb0a3071dd1845f3f9a1a0a6fa6de86d1689d84d", size = 140839, upload-time = "2026-01-29T15:12:03.956Z" }, - { url = "https://files.pythonhosted.org/packages/95/bc/4bcfe4280c1bc63c5291bb96f98298845b6355da2226d3400e17e7b51e53/orjson-3.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89d104c974eafd7436d7a5fdbc57f7a1e776789959a2f4f1b2eab5c62a339f4", size = 144080, upload-time = "2026-01-29T15:12:05.151Z" }, - { url = "https://files.pythonhosted.org/packages/01/74/22970f9ead9ab1f1b5f8c227a6c3aa8d71cd2c5acd005868a1d44f2362fa/orjson-3.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2e2e2456788ca5ea75616c40da06fc885a7dc0389780e8a41bf7c5389ba257b", size = 142435, upload-time = "2026-01-29T15:12:06.641Z" }, - { url = "https://files.pythonhosted.org/packages/29/34/d564aff85847ab92c82ee43a7a203683566c2fca0723a5f50aebbe759603/orjson-3.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a42efebc45afabb1448001e90458c4020d5c64fbac8a8dc4045b777db76cb5a", size = 145631, upload-time = "2026-01-29T15:12:08.351Z" }, - { url = "https://files.pythonhosted.org/packages/e7/ef/016957a3890752c4aa2368326ea69fa53cdc1fdae0a94a542b6410dbdf52/orjson-3.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71b7cbef8471324966c3738c90ba38775563ef01b512feb5ad4805682188d1b9", size = 147058, upload-time = "2026-01-29T15:12:10.023Z" }, - { url = "https://files.pythonhosted.org/packages/56/cc/9a899c3972085645b3225569f91a30e221f441e5dc8126e6d060b971c252/orjson-3.11.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f8515e5910f454fe9a8e13c2bb9dc4bae4c1836313e967e72eb8a4ad874f0248", size = 421161, upload-time = "2026-01-29T15:12:11.308Z" }, - { url = "https://files.pythonhosted.org/packages/21/a8/767d3fbd6d9b8fdee76974db40619399355fd49bf91a6dd2c4b6909ccf05/orjson-3.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:300360edf27c8c9bf7047345a94fddf3a8b8922df0ff69d71d854a170cb375cf", size = 155757, upload-time = "2026-01-29T15:12:12.776Z" }, - { url = "https://files.pythonhosted.org/packages/ad/0b/205cd69ac87e2272e13ef3f5f03a3d4657e317e38c1b08aaa2ef97060bbc/orjson-3.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:caaed4dad39e271adfadc106fab634d173b2bb23d9cf7e67bd645f879175ebfc", size = 147446, upload-time = "2026-01-29T15:12:14.166Z" }, - { url = "https://files.pythonhosted.org/packages/de/c5/dd9f22aa9f27c54c7d05cc32f4580c9ac9b6f13811eeb81d6c4c3f50d6b1/orjson-3.11.6-cp312-cp312-win32.whl", hash = "sha256:955368c11808c89793e847830e1b1007503a5923ddadc108547d3b77df761044", size = 139717, upload-time = "2026-01-29T15:12:15.7Z" }, - { url = "https://files.pythonhosted.org/packages/23/a1/e62fc50d904486970315a1654b8cfb5832eb46abb18cd5405118e7e1fc79/orjson-3.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:2c68de30131481150073d90a5d227a4a421982f42c025ecdfb66157f9579e06f", size = 136711, upload-time = "2026-01-29T15:12:17.055Z" }, - { url = "https://files.pythonhosted.org/packages/04/3d/b4fefad8bdf91e0fe212eb04975aeb36ea92997269d68857efcc7eb1dda3/orjson-3.11.6-cp312-cp312-win_arm64.whl", hash = "sha256:65dfa096f4e3a5e02834b681f539a87fbe85adc82001383c0db907557f666bfc", size = 135212, upload-time = "2026-01-29T15:12:18.3Z" }, - { url = "https://files.pythonhosted.org/packages/ae/45/d9c71c8c321277bc1ceebf599bc55ba826ae538b7c61f287e9a7e71bd589/orjson-3.11.6-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e4ae1670caabb598a88d385798692ce2a1b2f078971b3329cfb85253c6097f5b", size = 249828, upload-time = "2026-01-29T15:12:20.14Z" }, - { url = "https://files.pythonhosted.org/packages/ac/7e/4afcf4cfa9c2f93846d70eee9c53c3c0123286edcbeb530b7e9bd2aea1b2/orjson-3.11.6-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:2c6b81f47b13dac2caa5d20fbc953c75eb802543abf48403a4703ed3bff225f0", size = 134339, upload-time = "2026-01-29T15:12:22.01Z" }, - { url = "https://files.pythonhosted.org/packages/40/10/6d2b8a064c8d2411d3d0ea6ab43125fae70152aef6bea77bb50fa54d4097/orjson-3.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:647d6d034e463764e86670644bdcaf8e68b076e6e74783383b01085ae9ab334f", size = 137662, upload-time = "2026-01-29T15:12:23.307Z" }, - { url = "https://files.pythonhosted.org/packages/5a/50/5804ea7d586baf83ee88969eefda97a24f9a5bdba0727f73e16305175b26/orjson-3.11.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8523b9cc4ef174ae52414f7699e95ee657c16aa18b3c3c285d48d7966cce9081", size = 134626, upload-time = "2026-01-29T15:12:25.099Z" }, - { url = "https://files.pythonhosted.org/packages/9e/2e/f0492ed43e376722bb4afd648e06cc1e627fc7ec8ff55f6ee739277813ea/orjson-3.11.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:313dfd7184cde50c733fc0d5c8c0e2f09017b573afd11dc36bd7476b30b4cb17", size = 140873, upload-time = "2026-01-29T15:12:26.369Z" }, - { url = "https://files.pythonhosted.org/packages/10/15/6f874857463421794a303a39ac5494786ad46a4ab46d92bda6705d78c5aa/orjson-3.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905ee036064ff1e1fd1fb800055ac477cdcb547a78c22c1bc2bbf8d5d1a6fb42", size = 144044, upload-time = "2026-01-29T15:12:28.082Z" }, - { url = "https://files.pythonhosted.org/packages/d2/c7/b7223a3a70f1d0cc2d86953825de45f33877ee1b124a91ca1f79aa6e643f/orjson-3.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce374cb98411356ba906914441fc993f271a7a666d838d8de0e0900dd4a4bc12", size = 142396, upload-time = "2026-01-29T15:12:30.529Z" }, - { url = "https://files.pythonhosted.org/packages/87/e3/aa1b6d3ad3cd80f10394134f73ae92a1d11fdbe974c34aa199cc18bb5fcf/orjson-3.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cded072b9f65fcfd188aead45efa5bd528ba552add619b3ad2a81f67400ec450", size = 145600, upload-time = "2026-01-29T15:12:31.848Z" }, - { url = "https://files.pythonhosted.org/packages/f6/cf/e4aac5a46cbd39d7e769ef8650efa851dfce22df1ba97ae2b33efe893b12/orjson-3.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ab85bdbc138e1f73a234db6bb2e4cc1f0fcec8f4bd2bd2430e957a01aadf746", size = 146967, upload-time = "2026-01-29T15:12:33.203Z" }, - { url = "https://files.pythonhosted.org/packages/0b/04/975b86a4bcf6cfeda47aad15956d52fbeda280811206e9967380fa9355c8/orjson-3.11.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:351b96b614e3c37a27b8ab048239ebc1e0be76cc17481a430d70a77fb95d3844", size = 421003, upload-time = "2026-01-29T15:12:35.097Z" }, - { url = "https://files.pythonhosted.org/packages/28/d1/0369d0baf40eea5ff2300cebfe209883b2473ab4aa4c4974c8bd5ee42bb2/orjson-3.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f9959c85576beae5cdcaaf39510b15105f1ee8b70d5dacd90152617f57be8c83", size = 155695, upload-time = "2026-01-29T15:12:36.589Z" }, - { url = "https://files.pythonhosted.org/packages/ab/1f/d10c6d6ae26ff1d7c3eea6fd048280ef2e796d4fb260c5424fd021f68ecf/orjson-3.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75682d62b1b16b61a30716d7a2ec1f4c36195de4a1c61f6665aedd947b93a5d5", size = 147392, upload-time = "2026-01-29T15:12:37.876Z" }, - { url = "https://files.pythonhosted.org/packages/8d/43/7479921c174441a0aa5277c313732e20713c0969ac303be9f03d88d3db5d/orjson-3.11.6-cp313-cp313-win32.whl", hash = "sha256:40dc277999c2ef227dcc13072be879b4cfd325502daeb5c35ed768f706f2bf30", size = 139718, upload-time = "2026-01-29T15:12:39.274Z" }, - { url = "https://files.pythonhosted.org/packages/88/bc/9ffe7dfbf8454bc4e75bb8bf3a405ed9e0598df1d3535bb4adcd46be07d0/orjson-3.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:f0f6e9f8ff7905660bc3c8a54cd4a675aa98f7f175cf00a59815e2ff42c0d916", size = 136635, upload-time = "2026-01-29T15:12:40.593Z" }, - { url = "https://files.pythonhosted.org/packages/6f/7e/51fa90b451470447ea5023b20d83331ec741ae28d1e6d8ed547c24e7de14/orjson-3.11.6-cp313-cp313-win_arm64.whl", hash = "sha256:1608999478664de848e5900ce41f25c4ecdfc4beacbc632b6fd55e1a586e5d38", size = 135175, upload-time = "2026-01-29T15:12:41.997Z" }, - { url = "https://files.pythonhosted.org/packages/31/9f/46ca908abaeeec7560638ff20276ab327b980d73b3cc2f5b205b4a1c60b3/orjson-3.11.6-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6026db2692041d2a23fe2545606df591687787825ad5821971ef0974f2c47630", size = 249823, upload-time = "2026-01-29T15:12:43.332Z" }, - { url = "https://files.pythonhosted.org/packages/ff/78/ca478089818d18c9cd04f79c43f74ddd031b63c70fa2a946eb5e85414623/orjson-3.11.6-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:132b0ab2e20c73afa85cf142e547511feb3d2f5b7943468984658f3952b467d4", size = 134328, upload-time = "2026-01-29T15:12:45.171Z" }, - { url = "https://files.pythonhosted.org/packages/39/5e/cbb9d830ed4e47f4375ad8eef8e4fff1bf1328437732c3809054fc4e80be/orjson-3.11.6-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b376fb05f20a96ec117d47987dd3b39265c635725bda40661b4c5b73b77b5fde", size = 137651, upload-time = "2026-01-29T15:12:46.602Z" }, - { url = "https://files.pythonhosted.org/packages/7c/3a/35df6558c5bc3a65ce0961aefee7f8364e59af78749fc796ea255bfa0cf5/orjson-3.11.6-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:954dae4e080574672a1dfcf2a840eddef0f27bd89b0e94903dd0824e9c1db060", size = 134596, upload-time = "2026-01-29T15:12:47.95Z" }, - { url = "https://files.pythonhosted.org/packages/cd/8e/3d32dd7b7f26a19cc4512d6ed0ae3429567c71feef720fe699ff43c5bc9e/orjson-3.11.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe515bb89d59e1e4b48637a964f480b35c0a2676de24e65e55310f6016cca7ce", size = 140923, upload-time = "2026-01-29T15:12:49.333Z" }, - { url = "https://files.pythonhosted.org/packages/6c/9c/1efbf5c99b3304f25d6f0d493a8d1492ee98693637c10ce65d57be839d7b/orjson-3.11.6-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:380f9709c275917af28feb086813923251e11ee10687257cd7f1ea188bcd4485", size = 144068, upload-time = "2026-01-29T15:12:50.927Z" }, - { url = "https://files.pythonhosted.org/packages/82/83/0d19eeb5be797de217303bbb55dde58dba26f996ed905d301d98fd2d4637/orjson-3.11.6-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8173e0d3f6081e7034c51cf984036d02f6bab2a2126de5a759d79f8e5a140e7", size = 142493, upload-time = "2026-01-29T15:12:52.432Z" }, - { url = "https://files.pythonhosted.org/packages/32/a7/573fec3df4dc8fc259b7770dc6c0656f91adce6e19330c78d23f87945d1e/orjson-3.11.6-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dddf9ba706294906c56ef5150a958317b09aa3a8a48df1c52ccf22ec1907eac", size = 145616, upload-time = "2026-01-29T15:12:53.903Z" }, - { url = "https://files.pythonhosted.org/packages/c2/0e/23551b16f21690f7fd5122e3cf40fdca5d77052a434d0071990f97f5fe2f/orjson-3.11.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cbae5c34588dc79938dffb0b6fbe8c531f4dc8a6ad7f39759a9eb5d2da405ef2", size = 146951, upload-time = "2026-01-29T15:12:55.698Z" }, - { url = "https://files.pythonhosted.org/packages/b8/63/5e6c8f39805c39123a18e412434ea364349ee0012548d08aa586e2bd6aa9/orjson-3.11.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f75c318640acbddc419733b57f8a07515e587a939d8f54363654041fd1f4e465", size = 421024, upload-time = "2026-01-29T15:12:57.434Z" }, - { url = "https://files.pythonhosted.org/packages/1d/4d/724975cf0087f6550bd01fd62203418afc0ea33fd099aed318c5bcc52df8/orjson-3.11.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e0ab8d13aa2a3e98b4a43487c9205b2c92c38c054b4237777484d503357c8437", size = 155774, upload-time = "2026-01-29T15:12:59.397Z" }, - { url = "https://files.pythonhosted.org/packages/a8/a3/f4c4e3f46b55db29e0a5f20493b924fc791092d9a03ff2068c9fe6c1002f/orjson-3.11.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f884c7fb1020d44612bd7ac0db0babba0e2f78b68d9a650c7959bf99c783773f", size = 147393, upload-time = "2026-01-29T15:13:00.769Z" }, - { url = "https://files.pythonhosted.org/packages/ee/86/6f5529dd27230966171ee126cecb237ed08e9f05f6102bfaf63e5b32277d/orjson-3.11.6-cp314-cp314-win32.whl", hash = "sha256:8d1035d1b25732ec9f971e833a3e299d2b1a330236f75e6fd945ad982c76aaf3", size = 139760, upload-time = "2026-01-29T15:13:02.173Z" }, - { url = "https://files.pythonhosted.org/packages/d3/b5/91ae7037b2894a6b5002fb33f4fbccec98424a928469835c3837fbb22a9b/orjson-3.11.6-cp314-cp314-win_amd64.whl", hash = "sha256:931607a8865d21682bb72de54231655c86df1870502d2962dbfd12c82890d077", size = 136633, upload-time = "2026-01-29T15:13:04.267Z" }, - { url = "https://files.pythonhosted.org/packages/55/74/f473a3ec7a0a7ebc825ca8e3c86763f7d039f379860c81ba12dcdd456547/orjson-3.11.6-cp314-cp314-win_arm64.whl", hash = "sha256:fe71f6b283f4f1832204ab8235ce07adad145052614f77c876fcf0dac97bc06f", size = 135168, upload-time = "2026-01-29T15:13:05.932Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/70/a3/4e09c61a5f0c521cba0bb433639610ae037437669f1a4cbc93799e731d78/orjson-3.11.6.tar.gz", hash = "sha256:0a54c72259f35299fd033042367df781c2f66d10252955ca1efb7db309b954cb", size = 6175856 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/30/3c/098ed0e49c565fdf1ccc6a75b190115d1ca74148bf5b6ab036554a550650/orjson-3.11.6-cp310-cp310-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:a613fc37e007143d5b6286dccb1394cd114b07832417006a02b620ddd8279e37", size = 250411 }, + { url = "https://files.pythonhosted.org/packages/15/7c/cb11a360fd228ceebade03b1e8e9e138dd4b1b3b11602b72dbdad915aded/orjson-3.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:46ebee78f709d3ba7a65384cfe285bb0763157c6d2f836e7bde2f12d33a867a2", size = 138147 }, + { url = "https://files.pythonhosted.org/packages/4e/4b/e57b5c45ffe69fbef7cbd56e9f40e2dc0d5de920caafefcc6981d1a7efc5/orjson-3.11.6-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a726fa86d2368cd57990f2bd95ef5495a6e613b08fc9585dfe121ec758fb08d1", size = 135110 }, + { url = "https://files.pythonhosted.org/packages/b0/6e/4f21c6256f8cee3c0c69926cf7ac821cfc36f218512eedea2e2dc4a490c8/orjson-3.11.6-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:150f12e59d6864197770c78126e1a6e07a3da73d1728731bf3bc1e8b96ffdbe6", size = 140995 }, + { url = "https://files.pythonhosted.org/packages/d0/78/92c36205ba2f6094ba1eea60c8e646885072abe64f155196833988c14b74/orjson-3.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a2d9746a5b5ce20c0908ada451eb56da4ffa01552a50789a0354d8636a02953", size = 144435 }, + { url = "https://files.pythonhosted.org/packages/4d/52/1b518d164005811eb3fea92650e76e7d9deadb0b41e92c483373b1e82863/orjson-3.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:afd177f5dd91666d31e9019f1b06d2fcdf8a409a1637ddcb5915085dede85680", size = 142734 }, + { url = "https://files.pythonhosted.org/packages/4b/11/60ea7885a2b7c1bf60ed8b5982356078a73785bd3bab392041a5bcf8de7c/orjson-3.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d777ec41a327bd3b7de97ba7bce12cc1007815ca398e4e4de9ec56c022c090b", size = 145802 }, + { url = "https://files.pythonhosted.org/packages/41/7f/15a927e7958fd4f7560fb6dbb9346bee44a168e40168093c46020d866098/orjson-3.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f3a135f83185c87c13ff231fcb7dbb2fa4332a376444bd65135b50ff4cc5265c", size = 147504 }, + { url = "https://files.pythonhosted.org/packages/66/1f/cabb9132a533f4f913e29294d0a1ca818b1a9a52e990526fe3f7ddd75f1c/orjson-3.11.6-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:2a8eeed7d4544cf391a142b0dd06029dac588e96cc692d9ab1c3f05b1e57c7f6", size = 421408 }, + { url = "https://files.pythonhosted.org/packages/4c/b9/09bda9257a982e300313e4a9fc9b9c3aaff424d07bcf765bf045e4e3ed03/orjson-3.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9d576865a21e5cc6695be8fb78afc812079fd361ce6a027a7d41561b61b33a90", size = 155801 }, + { url = "https://files.pythonhosted.org/packages/98/19/4e40ea3e5f4c6a8d51f31fd2382351ee7b396fecca915b17cd1af588175b/orjson-3.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:925e2df51f60aa50f8797830f2adfc05330425803f4105875bb511ced98b7f89", size = 147647 }, + { url = "https://files.pythonhosted.org/packages/5a/73/ef4bd7dd15042cf33a402d16b87b9e969e71edb452b63b6e2b05025d1f7d/orjson-3.11.6-cp310-cp310-win32.whl", hash = "sha256:09dded2de64e77ac0b312ad59f35023548fb87393a57447e1bb36a26c181a90f", size = 139770 }, + { url = "https://files.pythonhosted.org/packages/b4/ac/daab6e10467f7fffd7081ba587b492505b49313130ff5446a6fe28bf076e/orjson-3.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:3a63b5e7841ca8635214c6be7c0bf0246aa8c5cd4ef0c419b14362d0b2fb13de", size = 136783 }, + { url = "https://files.pythonhosted.org/packages/f3/fd/d6b0a36854179b93ed77839f107c4089d91cccc9f9ba1b752b6e3bac5f34/orjson-3.11.6-cp311-cp311-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e259e85a81d76d9665f03d6129e09e4435531870de5961ddcd0bf6e3a7fde7d7", size = 250029 }, + { url = "https://files.pythonhosted.org/packages/a3/bb/22902619826641cf3b627c24aab62e2ad6b571bdd1d34733abb0dd57f67a/orjson-3.11.6-cp311-cp311-macosx_15_0_arm64.whl", hash = "sha256:52263949f41b4a4822c6b1353bcc5ee2f7109d53a3b493501d3369d6d0e7937a", size = 134518 }, + { url = "https://files.pythonhosted.org/packages/72/90/7a818da4bba1de711a9653c420749c0ac95ef8f8651cbc1dca551f462fe0/orjson-3.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6439e742fa7834a24698d358a27346bb203bff356ae0402e7f5df8f749c621a8", size = 137917 }, + { url = "https://files.pythonhosted.org/packages/59/0f/02846c1cac8e205cb3822dd8aa8f9114acda216f41fd1999ace6b543418d/orjson-3.11.6-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b81ffd68f084b4e993e3867acb554a049fa7787cc8710bbcc1e26965580d99be", size = 134923 }, + { url = "https://files.pythonhosted.org/packages/94/cf/aeaf683001b474bb3c3c757073a4231dfdfe8467fceaefa5bfd40902c99f/orjson-3.11.6-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5a5468e5e60f7ef6d7f9044b06c8f94a3c56ba528c6e4f7f06ae95164b595ec", size = 140752 }, + { url = "https://files.pythonhosted.org/packages/fc/fe/dad52d8315a65f084044a0819d74c4c9daf9ebe0681d30f525b0d29a31f0/orjson-3.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:72c5005eb45bd2535632d4f3bec7ad392832cfc46b62a3021da3b48a67734b45", size = 144201 }, + { url = "https://files.pythonhosted.org/packages/36/bc/ab070dd421565b831801077f1e390c4d4af8bfcecafc110336680a33866b/orjson-3.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0b14dd49f3462b014455a28a4d810d3549bf990567653eb43765cd847df09145", size = 142380 }, + { url = "https://files.pythonhosted.org/packages/e6/d8/4b581c725c3a308717f28bf45a9fdac210bca08b67e8430143699413ff06/orjson-3.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e0bb2c1ea30ef302f0f89f9bf3e7f9ab5e2af29dc9f80eb87aa99788e4e2d65", size = 145582 }, + { url = "https://files.pythonhosted.org/packages/5b/a2/09aab99b39f9a7f175ea8fa29adb9933a3d01e7d5d603cdee7f1c40c8da2/orjson-3.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:825e0a85d189533c6bff7e2fc417a28f6fcea53d27125c4551979aecd6c9a197", size = 147270 }, + { url = "https://files.pythonhosted.org/packages/b8/2f/5ef8eaf7829dc50da3bf497c7775b21ee88437bc8c41f959aa3504ca6631/orjson-3.11.6-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:b04575417a26530637f6ab4b1f7b4f666eb0433491091da4de38611f97f2fcf3", size = 421222 }, + { url = "https://files.pythonhosted.org/packages/3b/b0/dd6b941294c2b5b13da5fdc7e749e58d0c55a5114ab37497155e83050e95/orjson-3.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b83eb2e40e8c4da6d6b340ee6b1d6125f5195eb1b0ebb7eac23c6d9d4f92d224", size = 155562 }, + { url = "https://files.pythonhosted.org/packages/8e/09/43924331a847476ae2f9a16bd6d3c9dab301265006212ba0d3d7fd58763a/orjson-3.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1f42da604ee65a6b87eef858c913ce3e5777872b19321d11e6fc6d21de89b64f", size = 147432 }, + { url = "https://files.pythonhosted.org/packages/5d/e9/d9865961081816909f6b49d880749dbbd88425afd7c5bbce0549e2290d77/orjson-3.11.6-cp311-cp311-win32.whl", hash = "sha256:5ae45df804f2d344cffb36c43fdf03c82fb6cd247f5faa41e21891b40dfbf733", size = 139623 }, + { url = "https://files.pythonhosted.org/packages/b4/f9/6836edb92f76eec1082919101eb1145d2f9c33c8f2c5e6fa399b82a2aaa8/orjson-3.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:f4295948d65ace0a2d8f2c4ccc429668b7eb8af547578ec882e16bf79b0050b2", size = 136647 }, + { url = "https://files.pythonhosted.org/packages/b3/0c/4954082eea948c9ae52ee0bcbaa2f99da3216a71bcc314ab129bde22e565/orjson-3.11.6-cp311-cp311-win_arm64.whl", hash = "sha256:314e9c45e0b81b547e3a1cfa3df3e07a815821b3dac9fe8cb75014071d0c16a4", size = 135327 }, + { url = "https://files.pythonhosted.org/packages/14/ba/759f2879f41910b7e5e0cdbd9cf82a4f017c527fb0e972e9869ca7fe4c8e/orjson-3.11.6-cp312-cp312-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6f03f30cd8953f75f2a439070c743c7336d10ee940da918d71c6f3556af3ddcf", size = 249988 }, + { url = "https://files.pythonhosted.org/packages/f0/70/54cecb929e6c8b10104fcf580b0cc7dc551aa193e83787dd6f3daba28bb5/orjson-3.11.6-cp312-cp312-macosx_15_0_arm64.whl", hash = "sha256:af44baae65ef386ad971469a8557a0673bb042b0b9fd4397becd9c2dfaa02588", size = 134445 }, + { url = "https://files.pythonhosted.org/packages/f2/6f/ec0309154457b9ba1ad05f11faa4441f76037152f75e1ac577db3ce7ca96/orjson-3.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c310a48542094e4f7dbb6ac076880994986dda8ca9186a58c3cb70a3514d3231", size = 137708 }, + { url = "https://files.pythonhosted.org/packages/20/52/3c71b80840f8bab9cb26417302707b7716b7d25f863f3a541bcfa232fe6e/orjson-3.11.6-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:d8dfa7a5d387f15ecad94cb6b2d2d5f4aeea64efd8d526bfc03c9812d01e1cc0", size = 134798 }, + { url = "https://files.pythonhosted.org/packages/30/51/b490a43b22ff736282360bd02e6bded455cf31dfc3224e01cd39f919bbd2/orjson-3.11.6-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba8daee3e999411b50f8b50dbb0a3071dd1845f3f9a1a0a6fa6de86d1689d84d", size = 140839 }, + { url = "https://files.pythonhosted.org/packages/95/bc/4bcfe4280c1bc63c5291bb96f98298845b6355da2226d3400e17e7b51e53/orjson-3.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f89d104c974eafd7436d7a5fdbc57f7a1e776789959a2f4f1b2eab5c62a339f4", size = 144080 }, + { url = "https://files.pythonhosted.org/packages/01/74/22970f9ead9ab1f1b5f8c227a6c3aa8d71cd2c5acd005868a1d44f2362fa/orjson-3.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2e2e2456788ca5ea75616c40da06fc885a7dc0389780e8a41bf7c5389ba257b", size = 142435 }, + { url = "https://files.pythonhosted.org/packages/29/34/d564aff85847ab92c82ee43a7a203683566c2fca0723a5f50aebbe759603/orjson-3.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2a42efebc45afabb1448001e90458c4020d5c64fbac8a8dc4045b777db76cb5a", size = 145631 }, + { url = "https://files.pythonhosted.org/packages/e7/ef/016957a3890752c4aa2368326ea69fa53cdc1fdae0a94a542b6410dbdf52/orjson-3.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71b7cbef8471324966c3738c90ba38775563ef01b512feb5ad4805682188d1b9", size = 147058 }, + { url = "https://files.pythonhosted.org/packages/56/cc/9a899c3972085645b3225569f91a30e221f441e5dc8126e6d060b971c252/orjson-3.11.6-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:f8515e5910f454fe9a8e13c2bb9dc4bae4c1836313e967e72eb8a4ad874f0248", size = 421161 }, + { url = "https://files.pythonhosted.org/packages/21/a8/767d3fbd6d9b8fdee76974db40619399355fd49bf91a6dd2c4b6909ccf05/orjson-3.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:300360edf27c8c9bf7047345a94fddf3a8b8922df0ff69d71d854a170cb375cf", size = 155757 }, + { url = "https://files.pythonhosted.org/packages/ad/0b/205cd69ac87e2272e13ef3f5f03a3d4657e317e38c1b08aaa2ef97060bbc/orjson-3.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:caaed4dad39e271adfadc106fab634d173b2bb23d9cf7e67bd645f879175ebfc", size = 147446 }, + { url = "https://files.pythonhosted.org/packages/de/c5/dd9f22aa9f27c54c7d05cc32f4580c9ac9b6f13811eeb81d6c4c3f50d6b1/orjson-3.11.6-cp312-cp312-win32.whl", hash = "sha256:955368c11808c89793e847830e1b1007503a5923ddadc108547d3b77df761044", size = 139717 }, + { url = "https://files.pythonhosted.org/packages/23/a1/e62fc50d904486970315a1654b8cfb5832eb46abb18cd5405118e7e1fc79/orjson-3.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:2c68de30131481150073d90a5d227a4a421982f42c025ecdfb66157f9579e06f", size = 136711 }, + { url = "https://files.pythonhosted.org/packages/04/3d/b4fefad8bdf91e0fe212eb04975aeb36ea92997269d68857efcc7eb1dda3/orjson-3.11.6-cp312-cp312-win_arm64.whl", hash = "sha256:65dfa096f4e3a5e02834b681f539a87fbe85adc82001383c0db907557f666bfc", size = 135212 }, + { url = "https://files.pythonhosted.org/packages/ae/45/d9c71c8c321277bc1ceebf599bc55ba826ae538b7c61f287e9a7e71bd589/orjson-3.11.6-cp313-cp313-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:e4ae1670caabb598a88d385798692ce2a1b2f078971b3329cfb85253c6097f5b", size = 249828 }, + { url = "https://files.pythonhosted.org/packages/ac/7e/4afcf4cfa9c2f93846d70eee9c53c3c0123286edcbeb530b7e9bd2aea1b2/orjson-3.11.6-cp313-cp313-macosx_15_0_arm64.whl", hash = "sha256:2c6b81f47b13dac2caa5d20fbc953c75eb802543abf48403a4703ed3bff225f0", size = 134339 }, + { url = "https://files.pythonhosted.org/packages/40/10/6d2b8a064c8d2411d3d0ea6ab43125fae70152aef6bea77bb50fa54d4097/orjson-3.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:647d6d034e463764e86670644bdcaf8e68b076e6e74783383b01085ae9ab334f", size = 137662 }, + { url = "https://files.pythonhosted.org/packages/5a/50/5804ea7d586baf83ee88969eefda97a24f9a5bdba0727f73e16305175b26/orjson-3.11.6-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8523b9cc4ef174ae52414f7699e95ee657c16aa18b3c3c285d48d7966cce9081", size = 134626 }, + { url = "https://files.pythonhosted.org/packages/9e/2e/f0492ed43e376722bb4afd648e06cc1e627fc7ec8ff55f6ee739277813ea/orjson-3.11.6-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:313dfd7184cde50c733fc0d5c8c0e2f09017b573afd11dc36bd7476b30b4cb17", size = 140873 }, + { url = "https://files.pythonhosted.org/packages/10/15/6f874857463421794a303a39ac5494786ad46a4ab46d92bda6705d78c5aa/orjson-3.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905ee036064ff1e1fd1fb800055ac477cdcb547a78c22c1bc2bbf8d5d1a6fb42", size = 144044 }, + { url = "https://files.pythonhosted.org/packages/d2/c7/b7223a3a70f1d0cc2d86953825de45f33877ee1b124a91ca1f79aa6e643f/orjson-3.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ce374cb98411356ba906914441fc993f271a7a666d838d8de0e0900dd4a4bc12", size = 142396 }, + { url = "https://files.pythonhosted.org/packages/87/e3/aa1b6d3ad3cd80f10394134f73ae92a1d11fdbe974c34aa199cc18bb5fcf/orjson-3.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cded072b9f65fcfd188aead45efa5bd528ba552add619b3ad2a81f67400ec450", size = 145600 }, + { url = "https://files.pythonhosted.org/packages/f6/cf/e4aac5a46cbd39d7e769ef8650efa851dfce22df1ba97ae2b33efe893b12/orjson-3.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ab85bdbc138e1f73a234db6bb2e4cc1f0fcec8f4bd2bd2430e957a01aadf746", size = 146967 }, + { url = "https://files.pythonhosted.org/packages/0b/04/975b86a4bcf6cfeda47aad15956d52fbeda280811206e9967380fa9355c8/orjson-3.11.6-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:351b96b614e3c37a27b8ab048239ebc1e0be76cc17481a430d70a77fb95d3844", size = 421003 }, + { url = "https://files.pythonhosted.org/packages/28/d1/0369d0baf40eea5ff2300cebfe209883b2473ab4aa4c4974c8bd5ee42bb2/orjson-3.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:f9959c85576beae5cdcaaf39510b15105f1ee8b70d5dacd90152617f57be8c83", size = 155695 }, + { url = "https://files.pythonhosted.org/packages/ab/1f/d10c6d6ae26ff1d7c3eea6fd048280ef2e796d4fb260c5424fd021f68ecf/orjson-3.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:75682d62b1b16b61a30716d7a2ec1f4c36195de4a1c61f6665aedd947b93a5d5", size = 147392 }, + { url = "https://files.pythonhosted.org/packages/8d/43/7479921c174441a0aa5277c313732e20713c0969ac303be9f03d88d3db5d/orjson-3.11.6-cp313-cp313-win32.whl", hash = "sha256:40dc277999c2ef227dcc13072be879b4cfd325502daeb5c35ed768f706f2bf30", size = 139718 }, + { url = "https://files.pythonhosted.org/packages/88/bc/9ffe7dfbf8454bc4e75bb8bf3a405ed9e0598df1d3535bb4adcd46be07d0/orjson-3.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:f0f6e9f8ff7905660bc3c8a54cd4a675aa98f7f175cf00a59815e2ff42c0d916", size = 136635 }, + { url = "https://files.pythonhosted.org/packages/6f/7e/51fa90b451470447ea5023b20d83331ec741ae28d1e6d8ed547c24e7de14/orjson-3.11.6-cp313-cp313-win_arm64.whl", hash = "sha256:1608999478664de848e5900ce41f25c4ecdfc4beacbc632b6fd55e1a586e5d38", size = 135175 }, + { url = "https://files.pythonhosted.org/packages/31/9f/46ca908abaeeec7560638ff20276ab327b980d73b3cc2f5b205b4a1c60b3/orjson-3.11.6-cp314-cp314-macosx_10_15_x86_64.macosx_11_0_arm64.macosx_10_15_universal2.whl", hash = "sha256:6026db2692041d2a23fe2545606df591687787825ad5821971ef0974f2c47630", size = 249823 }, + { url = "https://files.pythonhosted.org/packages/ff/78/ca478089818d18c9cd04f79c43f74ddd031b63c70fa2a946eb5e85414623/orjson-3.11.6-cp314-cp314-macosx_15_0_arm64.whl", hash = "sha256:132b0ab2e20c73afa85cf142e547511feb3d2f5b7943468984658f3952b467d4", size = 134328 }, + { url = "https://files.pythonhosted.org/packages/39/5e/cbb9d830ed4e47f4375ad8eef8e4fff1bf1328437732c3809054fc4e80be/orjson-3.11.6-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b376fb05f20a96ec117d47987dd3b39265c635725bda40661b4c5b73b77b5fde", size = 137651 }, + { url = "https://files.pythonhosted.org/packages/7c/3a/35df6558c5bc3a65ce0961aefee7f8364e59af78749fc796ea255bfa0cf5/orjson-3.11.6-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:954dae4e080574672a1dfcf2a840eddef0f27bd89b0e94903dd0824e9c1db060", size = 134596 }, + { url = "https://files.pythonhosted.org/packages/cd/8e/3d32dd7b7f26a19cc4512d6ed0ae3429567c71feef720fe699ff43c5bc9e/orjson-3.11.6-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fe515bb89d59e1e4b48637a964f480b35c0a2676de24e65e55310f6016cca7ce", size = 140923 }, + { url = "https://files.pythonhosted.org/packages/6c/9c/1efbf5c99b3304f25d6f0d493a8d1492ee98693637c10ce65d57be839d7b/orjson-3.11.6-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:380f9709c275917af28feb086813923251e11ee10687257cd7f1ea188bcd4485", size = 144068 }, + { url = "https://files.pythonhosted.org/packages/82/83/0d19eeb5be797de217303bbb55dde58dba26f996ed905d301d98fd2d4637/orjson-3.11.6-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a8173e0d3f6081e7034c51cf984036d02f6bab2a2126de5a759d79f8e5a140e7", size = 142493 }, + { url = "https://files.pythonhosted.org/packages/32/a7/573fec3df4dc8fc259b7770dc6c0656f91adce6e19330c78d23f87945d1e/orjson-3.11.6-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6dddf9ba706294906c56ef5150a958317b09aa3a8a48df1c52ccf22ec1907eac", size = 145616 }, + { url = "https://files.pythonhosted.org/packages/c2/0e/23551b16f21690f7fd5122e3cf40fdca5d77052a434d0071990f97f5fe2f/orjson-3.11.6-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cbae5c34588dc79938dffb0b6fbe8c531f4dc8a6ad7f39759a9eb5d2da405ef2", size = 146951 }, + { url = "https://files.pythonhosted.org/packages/b8/63/5e6c8f39805c39123a18e412434ea364349ee0012548d08aa586e2bd6aa9/orjson-3.11.6-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:f75c318640acbddc419733b57f8a07515e587a939d8f54363654041fd1f4e465", size = 421024 }, + { url = "https://files.pythonhosted.org/packages/1d/4d/724975cf0087f6550bd01fd62203418afc0ea33fd099aed318c5bcc52df8/orjson-3.11.6-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:e0ab8d13aa2a3e98b4a43487c9205b2c92c38c054b4237777484d503357c8437", size = 155774 }, + { url = "https://files.pythonhosted.org/packages/a8/a3/f4c4e3f46b55db29e0a5f20493b924fc791092d9a03ff2068c9fe6c1002f/orjson-3.11.6-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:f884c7fb1020d44612bd7ac0db0babba0e2f78b68d9a650c7959bf99c783773f", size = 147393 }, + { url = "https://files.pythonhosted.org/packages/ee/86/6f5529dd27230966171ee126cecb237ed08e9f05f6102bfaf63e5b32277d/orjson-3.11.6-cp314-cp314-win32.whl", hash = "sha256:8d1035d1b25732ec9f971e833a3e299d2b1a330236f75e6fd945ad982c76aaf3", size = 139760 }, + { url = "https://files.pythonhosted.org/packages/d3/b5/91ae7037b2894a6b5002fb33f4fbccec98424a928469835c3837fbb22a9b/orjson-3.11.6-cp314-cp314-win_amd64.whl", hash = "sha256:931607a8865d21682bb72de54231655c86df1870502d2962dbfd12c82890d077", size = 136633 }, + { url = "https://files.pythonhosted.org/packages/55/74/f473a3ec7a0a7ebc825ca8e3c86763f7d039f379860c81ba12dcdd456547/orjson-3.11.6-cp314-cp314-win_arm64.whl", hash = "sha256:fe71f6b283f4f1832204ab8235ce07adad145052614f77c876fcf0dac97bc06f", size = 135168 }, ] [[package]] name = "packaging" version = "26.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416, upload-time = "2026-01-21T20:50:39.064Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/65/ee/299d360cdc32edc7d2cf530f3accf79c4fca01e96ffc950d8a52213bd8e4/packaging-26.0.tar.gz", hash = "sha256:00243ae351a257117b6a241061796684b084ed1c516a08c48a3f7e147a9d80b4", size = 143416 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366, upload-time = "2026-01-21T20:50:37.788Z" }, + { url = "https://files.pythonhosted.org/packages/b7/b9/c538f279a4e237a006a2c98387d081e9eb060d203d8ed34467cc0f0b9b53/packaging-26.0-py3-none-any.whl", hash = "sha256:b36f1fef9334a5588b4166f8bcd26a14e521f2b55e6b9de3aaa80d3ff7a37529", size = 74366 }, ] [[package]] name = "pandas" version = "2.3.3" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "python-dateutil" }, { name = "pytz" }, { name = "tzdata" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, - { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, - { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, - { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, - { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, - { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, - { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, - { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, - { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, - { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, - { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, - { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, - { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, - { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, - { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, - { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, - { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, - { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, - { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671, upload-time = "2025-09-29T23:21:05.024Z" }, - { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807, upload-time = "2025-09-29T23:21:15.979Z" }, - { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872, upload-time = "2025-09-29T23:21:27.165Z" }, - { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371, upload-time = "2025-09-29T23:21:40.532Z" }, - { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333, upload-time = "2025-09-29T23:21:55.77Z" }, - { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120, upload-time = "2025-09-29T23:22:10.109Z" }, - { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991, upload-time = "2025-09-29T23:25:04.889Z" }, - { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227, upload-time = "2025-09-29T23:22:24.343Z" }, - { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056, upload-time = "2025-09-29T23:22:37.762Z" }, - { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189, upload-time = "2025-09-29T23:22:51.688Z" }, - { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912, upload-time = "2025-09-29T23:23:05.042Z" }, - { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160, upload-time = "2025-09-29T23:23:28.57Z" }, - { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233, upload-time = "2025-09-29T23:24:24.876Z" }, - { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635, upload-time = "2025-09-29T23:25:52.486Z" }, - { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079, upload-time = "2025-09-29T23:26:33.204Z" }, - { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049, upload-time = "2025-09-29T23:27:15.384Z" }, - { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638, upload-time = "2025-09-29T23:27:51.625Z" }, - { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834, upload-time = "2025-09-29T23:28:21.289Z" }, - { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925, upload-time = "2025-09-29T23:28:58.261Z" }, - { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071, upload-time = "2025-09-29T23:32:27.484Z" }, - { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504, upload-time = "2025-09-29T23:29:31.47Z" }, - { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702, upload-time = "2025-09-29T23:29:54.591Z" }, - { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535, upload-time = "2025-09-29T23:30:21.003Z" }, - { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582, upload-time = "2025-09-29T23:30:43.391Z" }, - { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963, upload-time = "2025-09-29T23:31:10.009Z" }, - { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175, upload-time = "2025-09-29T23:31:59.173Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763 }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217 }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791 }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373 }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444 }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459 }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086 }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790 }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831 }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267 }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281 }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453 }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361 }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702 }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846 }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618 }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212 }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693 }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002 }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971 }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722 }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671 }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807 }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872 }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371 }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333 }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120 }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991 }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227 }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056 }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189 }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912 }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160 }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233 }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635 }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079 }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049 }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638 }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834 }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925 }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071 }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504 }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702 }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535 }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582 }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963 }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175 }, ] [[package]] name = "peft" version = "0.18.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "accelerate" }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "psutil" }, { name = "pyyaml" }, @@ -2292,586 +1831,577 @@ dependencies = [ { name = "tqdm" }, { name = "transformers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/d8/48/147b3ea999560b40a34fd78724c7777aa9d18409c2250bdcaf9c4f2db7fc/peft-0.18.1.tar.gz", hash = "sha256:2dd0d6bfce936d1850e48aaddbd250941c5c02fc8ef3237cd8fd5aac35e0bae2", size = 635030, upload-time = "2026-01-09T13:08:01.136Z" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/48/147b3ea999560b40a34fd78724c7777aa9d18409c2250bdcaf9c4f2db7fc/peft-0.18.1.tar.gz", hash = "sha256:2dd0d6bfce936d1850e48aaddbd250941c5c02fc8ef3237cd8fd5aac35e0bae2", size = 635030 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b3/14/b4e3f574acf349ae6f61f9c000a77f97a3b315b4bb6ad03791e79ae4a568/peft-0.18.1-py3-none-any.whl", hash = "sha256:0bf06847a3551e3019fc58c440cffc9a6b73e6e2962c95b52e224f77bbdb50f1", size = 556960, upload-time = "2026-01-09T13:07:55.865Z" }, + { url = "https://files.pythonhosted.org/packages/b3/14/b4e3f574acf349ae6f61f9c000a77f97a3b315b4bb6ad03791e79ae4a568/peft-0.18.1-py3-none-any.whl", hash = "sha256:0bf06847a3551e3019fc58c440cffc9a6b73e6e2962c95b52e224f77bbdb50f1", size = 556960 }, ] [[package]] name = "pillow" version = "11.3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069, upload-time = "2025-07-01T09:16:30.666Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554, upload-time = "2025-07-01T09:13:39.342Z" }, - { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548, upload-time = "2025-07-01T09:13:41.835Z" }, - { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742, upload-time = "2025-07-03T13:09:47.439Z" }, - { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087, upload-time = "2025-07-03T13:09:51.796Z" }, - { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350, upload-time = "2025-07-01T09:13:43.865Z" }, - { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840, upload-time = "2025-07-01T09:13:46.161Z" }, - { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005, upload-time = "2025-07-01T09:13:47.829Z" }, - { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372, upload-time = "2025-07-01T09:13:52.145Z" }, - { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090, upload-time = "2025-07-01T09:13:53.915Z" }, - { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988, upload-time = "2025-07-01T09:13:55.699Z" }, - { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899, upload-time = "2025-07-01T09:13:57.497Z" }, - { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531, upload-time = "2025-07-01T09:13:59.203Z" }, - { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560, upload-time = "2025-07-01T09:14:01.101Z" }, - { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978, upload-time = "2025-07-03T13:09:55.638Z" }, - { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168, upload-time = "2025-07-03T13:10:00.37Z" }, - { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053, upload-time = "2025-07-01T09:14:04.491Z" }, - { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273, upload-time = "2025-07-01T09:14:06.235Z" }, - { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043, upload-time = "2025-07-01T09:14:07.978Z" }, - { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516, upload-time = "2025-07-01T09:14:10.233Z" }, - { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768, upload-time = "2025-07-01T09:14:11.921Z" }, - { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055, upload-time = "2025-07-01T09:14:13.623Z" }, - { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079, upload-time = "2025-07-01T09:14:15.268Z" }, - { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800, upload-time = "2025-07-01T09:14:17.648Z" }, - { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296, upload-time = "2025-07-01T09:14:19.828Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726, upload-time = "2025-07-03T13:10:04.448Z" }, - { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652, upload-time = "2025-07-03T13:10:10.391Z" }, - { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787, upload-time = "2025-07-01T09:14:21.63Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236, upload-time = "2025-07-01T09:14:23.321Z" }, - { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950, upload-time = "2025-07-01T09:14:25.237Z" }, - { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358, upload-time = "2025-07-01T09:14:27.053Z" }, - { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079, upload-time = "2025-07-01T09:14:30.104Z" }, - { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324, upload-time = "2025-07-01T09:14:31.899Z" }, - { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067, upload-time = "2025-07-01T09:14:33.709Z" }, - { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328, upload-time = "2025-07-01T09:14:35.276Z" }, - { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652, upload-time = "2025-07-01T09:14:37.203Z" }, - { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443, upload-time = "2025-07-01T09:14:39.344Z" }, - { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474, upload-time = "2025-07-01T09:14:41.843Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038, upload-time = "2025-07-01T09:14:44.008Z" }, - { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407, upload-time = "2025-07-03T13:10:15.628Z" }, - { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094, upload-time = "2025-07-03T13:10:21.857Z" }, - { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503, upload-time = "2025-07-01T09:14:45.698Z" }, - { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574, upload-time = "2025-07-01T09:14:47.415Z" }, - { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060, upload-time = "2025-07-01T09:14:49.636Z" }, - { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407, upload-time = "2025-07-01T09:14:51.962Z" }, - { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841, upload-time = "2025-07-01T09:14:54.142Z" }, - { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450, upload-time = "2025-07-01T09:14:56.436Z" }, - { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055, upload-time = "2025-07-01T09:14:58.072Z" }, - { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110, upload-time = "2025-07-01T09:14:59.79Z" }, - { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547, upload-time = "2025-07-01T09:15:01.648Z" }, - { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554, upload-time = "2025-07-03T13:10:27.018Z" }, - { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132, upload-time = "2025-07-03T13:10:33.01Z" }, - { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001, upload-time = "2025-07-01T09:15:03.365Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814, upload-time = "2025-07-01T09:15:05.655Z" }, - { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124, upload-time = "2025-07-01T09:15:07.358Z" }, - { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186, upload-time = "2025-07-01T09:15:09.317Z" }, - { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546, upload-time = "2025-07-01T09:15:11.311Z" }, - { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102, upload-time = "2025-07-01T09:15:13.164Z" }, - { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803, upload-time = "2025-07-01T09:15:15.695Z" }, - { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520, upload-time = "2025-07-01T09:15:17.429Z" }, - { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116, upload-time = "2025-07-01T09:15:19.423Z" }, - { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597, upload-time = "2025-07-03T13:10:38.404Z" }, - { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246, upload-time = "2025-07-03T13:10:44.987Z" }, - { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336, upload-time = "2025-07-01T09:15:21.237Z" }, - { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699, upload-time = "2025-07-01T09:15:23.186Z" }, - { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789, upload-time = "2025-07-01T09:15:25.1Z" }, - { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386, upload-time = "2025-07-01T09:15:27.378Z" }, - { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911, upload-time = "2025-07-01T09:15:29.294Z" }, - { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383, upload-time = "2025-07-01T09:15:31.128Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385, upload-time = "2025-07-01T09:15:33.328Z" }, - { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129, upload-time = "2025-07-01T09:15:35.194Z" }, - { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580, upload-time = "2025-07-01T09:15:37.114Z" }, - { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860, upload-time = "2025-07-03T13:10:50.248Z" }, - { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694, upload-time = "2025-07-03T13:10:56.432Z" }, - { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888, upload-time = "2025-07-01T09:15:39.436Z" }, - { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330, upload-time = "2025-07-01T09:15:41.269Z" }, - { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089, upload-time = "2025-07-01T09:15:43.13Z" }, - { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206, upload-time = "2025-07-01T09:15:44.937Z" }, - { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370, upload-time = "2025-07-01T09:15:46.673Z" }, - { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500, upload-time = "2025-07-01T09:15:48.512Z" }, - { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835, upload-time = "2025-07-01T09:15:50.399Z" }, - { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556, upload-time = "2025-07-01T09:16:09.961Z" }, - { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625, upload-time = "2025-07-01T09:16:11.913Z" }, - { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207, upload-time = "2025-07-03T13:11:10.201Z" }, - { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939, upload-time = "2025-07-03T13:11:15.68Z" }, - { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166, upload-time = "2025-07-01T09:16:13.74Z" }, - { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482, upload-time = "2025-07-01T09:16:16.107Z" }, - { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596, upload-time = "2025-07-01T09:16:18.07Z" }, - { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566, upload-time = "2025-07-01T09:16:19.801Z" }, - { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618, upload-time = "2025-07-01T09:16:21.818Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248, upload-time = "2025-07-03T13:11:20.738Z" }, - { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963, upload-time = "2025-07-03T13:11:26.283Z" }, - { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170, upload-time = "2025-07-01T09:16:23.762Z" }, - { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505, upload-time = "2025-07-01T09:16:25.593Z" }, - { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598, upload-time = "2025-07-01T09:16:27.732Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/0d/d0d6dea55cd152ce3d6767bb38a8fc10e33796ba4ba210cbab9354b6d238/pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523", size = 47113069 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4c/5d/45a3553a253ac8763f3561371432a90bdbe6000fbdcf1397ffe502aa206c/pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860", size = 5316554 }, + { url = "https://files.pythonhosted.org/packages/7c/c8/67c12ab069ef586a25a4a79ced553586748fad100c77c0ce59bb4983ac98/pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad", size = 4686548 }, + { url = "https://files.pythonhosted.org/packages/2f/bd/6741ebd56263390b382ae4c5de02979af7f8bd9807346d068700dd6d5cf9/pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0", size = 5859742 }, + { url = "https://files.pythonhosted.org/packages/ca/0b/c412a9e27e1e6a829e6ab6c2dca52dd563efbedf4c9c6aa453d9a9b77359/pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b", size = 7633087 }, + { url = "https://files.pythonhosted.org/packages/59/9d/9b7076aaf30f5dd17e5e5589b2d2f5a5d7e30ff67a171eb686e4eecc2adf/pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50", size = 5963350 }, + { url = "https://files.pythonhosted.org/packages/f0/16/1a6bf01fb622fb9cf5c91683823f073f053005c849b1f52ed613afcf8dae/pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae", size = 6631840 }, + { url = "https://files.pythonhosted.org/packages/7b/e6/6ff7077077eb47fde78739e7d570bdcd7c10495666b6afcd23ab56b19a43/pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9", size = 6074005 }, + { url = "https://files.pythonhosted.org/packages/c3/3a/b13f36832ea6d279a697231658199e0a03cd87ef12048016bdcc84131601/pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e", size = 6708372 }, + { url = "https://files.pythonhosted.org/packages/6c/e4/61b2e1a7528740efbc70b3d581f33937e38e98ef3d50b05007267a55bcb2/pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6", size = 6277090 }, + { url = "https://files.pythonhosted.org/packages/a9/d3/60c781c83a785d6afbd6a326ed4d759d141de43aa7365725cbcd65ce5e54/pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f", size = 6985988 }, + { url = "https://files.pythonhosted.org/packages/9f/28/4f4a0203165eefb3763939c6789ba31013a2e90adffb456610f30f613850/pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f", size = 2422899 }, + { url = "https://files.pythonhosted.org/packages/db/26/77f8ed17ca4ffd60e1dcd220a6ec6d71210ba398cfa33a13a1cd614c5613/pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722", size = 5316531 }, + { url = "https://files.pythonhosted.org/packages/cb/39/ee475903197ce709322a17a866892efb560f57900d9af2e55f86db51b0a5/pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288", size = 4686560 }, + { url = "https://files.pythonhosted.org/packages/d5/90/442068a160fd179938ba55ec8c97050a612426fae5ec0a764e345839f76d/pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d", size = 5870978 }, + { url = "https://files.pythonhosted.org/packages/13/92/dcdd147ab02daf405387f0218dcf792dc6dd5b14d2573d40b4caeef01059/pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494", size = 7641168 }, + { url = "https://files.pythonhosted.org/packages/6e/db/839d6ba7fd38b51af641aa904e2960e7a5644d60ec754c046b7d2aee00e5/pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58", size = 5973053 }, + { url = "https://files.pythonhosted.org/packages/f2/2f/d7675ecae6c43e9f12aa8d58b6012683b20b6edfbdac7abcb4e6af7a3784/pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f", size = 6640273 }, + { url = "https://files.pythonhosted.org/packages/45/ad/931694675ede172e15b2ff03c8144a0ddaea1d87adb72bb07655eaffb654/pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e", size = 6082043 }, + { url = "https://files.pythonhosted.org/packages/3a/04/ba8f2b11fc80d2dd462d7abec16351b45ec99cbbaea4387648a44190351a/pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94", size = 6715516 }, + { url = "https://files.pythonhosted.org/packages/48/59/8cd06d7f3944cc7d892e8533c56b0acb68399f640786313275faec1e3b6f/pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0", size = 6274768 }, + { url = "https://files.pythonhosted.org/packages/f1/cc/29c0f5d64ab8eae20f3232da8f8571660aa0ab4b8f1331da5c2f5f9a938e/pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac", size = 6986055 }, + { url = "https://files.pythonhosted.org/packages/c6/df/90bd886fabd544c25addd63e5ca6932c86f2b701d5da6c7839387a076b4a/pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd", size = 2423079 }, + { url = "https://files.pythonhosted.org/packages/40/fe/1bc9b3ee13f68487a99ac9529968035cca2f0a51ec36892060edcc51d06a/pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4", size = 5278800 }, + { url = "https://files.pythonhosted.org/packages/2c/32/7e2ac19b5713657384cec55f89065fb306b06af008cfd87e572035b27119/pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69", size = 4686296 }, + { url = "https://files.pythonhosted.org/packages/8e/1e/b9e12bbe6e4c2220effebc09ea0923a07a6da1e1f1bfbc8d7d29a01ce32b/pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d", size = 5871726 }, + { url = "https://files.pythonhosted.org/packages/8d/33/e9200d2bd7ba00dc3ddb78df1198a6e80d7669cce6c2bdbeb2530a74ec58/pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6", size = 7644652 }, + { url = "https://files.pythonhosted.org/packages/41/f1/6f2427a26fc683e00d985bc391bdd76d8dd4e92fac33d841127eb8fb2313/pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7", size = 5977787 }, + { url = "https://files.pythonhosted.org/packages/e4/c9/06dd4a38974e24f932ff5f98ea3c546ce3f8c995d3f0985f8e5ba48bba19/pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024", size = 6645236 }, + { url = "https://files.pythonhosted.org/packages/40/e7/848f69fb79843b3d91241bad658e9c14f39a32f71a301bcd1d139416d1be/pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809", size = 6086950 }, + { url = "https://files.pythonhosted.org/packages/0b/1a/7cff92e695a2a29ac1958c2a0fe4c0b2393b60aac13b04a4fe2735cad52d/pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d", size = 6723358 }, + { url = "https://files.pythonhosted.org/packages/26/7d/73699ad77895f69edff76b0f332acc3d497f22f5d75e5360f78cbcaff248/pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149", size = 6275079 }, + { url = "https://files.pythonhosted.org/packages/8c/ce/e7dfc873bdd9828f3b6e5c2bbb74e47a98ec23cc5c74fc4e54462f0d9204/pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d", size = 6986324 }, + { url = "https://files.pythonhosted.org/packages/16/8f/b13447d1bf0b1f7467ce7d86f6e6edf66c0ad7cf44cf5c87a37f9bed9936/pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542", size = 2423067 }, + { url = "https://files.pythonhosted.org/packages/1e/93/0952f2ed8db3a5a4c7a11f91965d6184ebc8cd7cbb7941a260d5f018cd2d/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd", size = 2128328 }, + { url = "https://files.pythonhosted.org/packages/4b/e8/100c3d114b1a0bf4042f27e0f87d2f25e857e838034e98ca98fe7b8c0a9c/pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8", size = 2170652 }, + { url = "https://files.pythonhosted.org/packages/aa/86/3f758a28a6e381758545f7cdb4942e1cb79abd271bea932998fc0db93cb6/pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f", size = 2227443 }, + { url = "https://files.pythonhosted.org/packages/01/f4/91d5b3ffa718df2f53b0dc109877993e511f4fd055d7e9508682e8aba092/pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c", size = 5278474 }, + { url = "https://files.pythonhosted.org/packages/f9/0e/37d7d3eca6c879fbd9dba21268427dffda1ab00d4eb05b32923d4fbe3b12/pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd", size = 4686038 }, + { url = "https://files.pythonhosted.org/packages/ff/b0/3426e5c7f6565e752d81221af9d3676fdbb4f352317ceafd42899aaf5d8a/pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e", size = 5864407 }, + { url = "https://files.pythonhosted.org/packages/fc/c1/c6c423134229f2a221ee53f838d4be9d82bab86f7e2f8e75e47b6bf6cd77/pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1", size = 7639094 }, + { url = "https://files.pythonhosted.org/packages/ba/c9/09e6746630fe6372c67c648ff9deae52a2bc20897d51fa293571977ceb5d/pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805", size = 5973503 }, + { url = "https://files.pythonhosted.org/packages/d5/1c/a2a29649c0b1983d3ef57ee87a66487fdeb45132df66ab30dd37f7dbe162/pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8", size = 6642574 }, + { url = "https://files.pythonhosted.org/packages/36/de/d5cc31cc4b055b6c6fd990e3e7f0f8aaf36229a2698501bcb0cdf67c7146/pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2", size = 6084060 }, + { url = "https://files.pythonhosted.org/packages/d5/ea/502d938cbaeec836ac28a9b730193716f0114c41325db428e6b280513f09/pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b", size = 6721407 }, + { url = "https://files.pythonhosted.org/packages/45/9c/9c5e2a73f125f6cbc59cc7087c8f2d649a7ae453f83bd0362ff7c9e2aee2/pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3", size = 6273841 }, + { url = "https://files.pythonhosted.org/packages/23/85/397c73524e0cd212067e0c969aa245b01d50183439550d24d9f55781b776/pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51", size = 6978450 }, + { url = "https://files.pythonhosted.org/packages/17/d2/622f4547f69cd173955194b78e4d19ca4935a1b0f03a302d655c9f6aae65/pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580", size = 2423055 }, + { url = "https://files.pythonhosted.org/packages/dd/80/a8a2ac21dda2e82480852978416cfacd439a4b490a501a288ecf4fe2532d/pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e", size = 5281110 }, + { url = "https://files.pythonhosted.org/packages/44/d6/b79754ca790f315918732e18f82a8146d33bcd7f4494380457ea89eb883d/pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d", size = 4689547 }, + { url = "https://files.pythonhosted.org/packages/49/20/716b8717d331150cb00f7fdd78169c01e8e0c219732a78b0e59b6bdb2fd6/pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced", size = 5901554 }, + { url = "https://files.pythonhosted.org/packages/74/cf/a9f3a2514a65bb071075063a96f0a5cf949c2f2fce683c15ccc83b1c1cab/pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c", size = 7669132 }, + { url = "https://files.pythonhosted.org/packages/98/3c/da78805cbdbee9cb43efe8261dd7cc0b4b93f2ac79b676c03159e9db2187/pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8", size = 6005001 }, + { url = "https://files.pythonhosted.org/packages/6c/fa/ce044b91faecf30e635321351bba32bab5a7e034c60187fe9698191aef4f/pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59", size = 6668814 }, + { url = "https://files.pythonhosted.org/packages/7b/51/90f9291406d09bf93686434f9183aba27b831c10c87746ff49f127ee80cb/pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe", size = 6113124 }, + { url = "https://files.pythonhosted.org/packages/cd/5a/6fec59b1dfb619234f7636d4157d11fb4e196caeee220232a8d2ec48488d/pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c", size = 6747186 }, + { url = "https://files.pythonhosted.org/packages/49/6b/00187a044f98255225f172de653941e61da37104a9ea60e4f6887717e2b5/pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788", size = 6277546 }, + { url = "https://files.pythonhosted.org/packages/e8/5c/6caaba7e261c0d75bab23be79f1d06b5ad2a2ae49f028ccec801b0e853d6/pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31", size = 6985102 }, + { url = "https://files.pythonhosted.org/packages/f3/7e/b623008460c09a0cb38263c93b828c666493caee2eb34ff67f778b87e58c/pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e", size = 2424803 }, + { url = "https://files.pythonhosted.org/packages/73/f4/04905af42837292ed86cb1b1dabe03dce1edc008ef14c473c5c7e1443c5d/pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12", size = 5278520 }, + { url = "https://files.pythonhosted.org/packages/41/b0/33d79e377a336247df6348a54e6d2a2b85d644ca202555e3faa0cf811ecc/pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a", size = 4686116 }, + { url = "https://files.pythonhosted.org/packages/49/2d/ed8bc0ab219ae8768f529597d9509d184fe8a6c4741a6864fea334d25f3f/pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632", size = 5864597 }, + { url = "https://files.pythonhosted.org/packages/b5/3d/b932bb4225c80b58dfadaca9d42d08d0b7064d2d1791b6a237f87f661834/pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673", size = 7638246 }, + { url = "https://files.pythonhosted.org/packages/09/b5/0487044b7c096f1b48f0d7ad416472c02e0e4bf6919541b111efd3cae690/pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027", size = 5973336 }, + { url = "https://files.pythonhosted.org/packages/a8/2d/524f9318f6cbfcc79fbc004801ea6b607ec3f843977652fdee4857a7568b/pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77", size = 6642699 }, + { url = "https://files.pythonhosted.org/packages/6f/d2/a9a4f280c6aefedce1e8f615baaa5474e0701d86dd6f1dede66726462bbd/pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874", size = 6083789 }, + { url = "https://files.pythonhosted.org/packages/fe/54/86b0cd9dbb683a9d5e960b66c7379e821a19be4ac5810e2e5a715c09a0c0/pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a", size = 6720386 }, + { url = "https://files.pythonhosted.org/packages/e7/95/88efcaf384c3588e24259c4203b909cbe3e3c2d887af9e938c2022c9dd48/pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214", size = 6370911 }, + { url = "https://files.pythonhosted.org/packages/2e/cc/934e5820850ec5eb107e7b1a72dd278140731c669f396110ebc326f2a503/pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635", size = 7117383 }, + { url = "https://files.pythonhosted.org/packages/d6/e9/9c0a616a71da2a5d163aa37405e8aced9a906d574b4a214bede134e731bc/pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6", size = 2511385 }, + { url = "https://files.pythonhosted.org/packages/1a/33/c88376898aff369658b225262cd4f2659b13e8178e7534df9e6e1fa289f6/pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae", size = 5281129 }, + { url = "https://files.pythonhosted.org/packages/1f/70/d376247fb36f1844b42910911c83a02d5544ebd2a8bad9efcc0f707ea774/pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653", size = 4689580 }, + { url = "https://files.pythonhosted.org/packages/eb/1c/537e930496149fbac69efd2fc4329035bbe2e5475b4165439e3be9cb183b/pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6", size = 5902860 }, + { url = "https://files.pythonhosted.org/packages/bd/57/80f53264954dcefeebcf9dae6e3eb1daea1b488f0be8b8fef12f79a3eb10/pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36", size = 7670694 }, + { url = "https://files.pythonhosted.org/packages/70/ff/4727d3b71a8578b4587d9c276e90efad2d6fe0335fd76742a6da08132e8c/pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b", size = 6005888 }, + { url = "https://files.pythonhosted.org/packages/05/ae/716592277934f85d3be51d7256f3636672d7b1abfafdc42cf3f8cbd4b4c8/pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477", size = 6670330 }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7fe6cddcc8827b01b1a9766f5fdeb7418680744f9082035bdbabecf1d57f/pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50", size = 6114089 }, + { url = "https://files.pythonhosted.org/packages/8b/f5/06bfaa444c8e80f1a8e4bff98da9c83b37b5be3b1deaa43d27a0db37ef84/pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b", size = 6748206 }, + { url = "https://files.pythonhosted.org/packages/f0/77/bc6f92a3e8e6e46c0ca78abfffec0037845800ea38c73483760362804c41/pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12", size = 6377370 }, + { url = "https://files.pythonhosted.org/packages/4a/82/3a721f7d69dca802befb8af08b7c79ebcab461007ce1c18bd91a5d5896f9/pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db", size = 7121500 }, + { url = "https://files.pythonhosted.org/packages/89/c7/5572fa4a3f45740eaab6ae86fcdf7195b55beac1371ac8c619d880cfe948/pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa", size = 2512835 }, + { url = "https://files.pythonhosted.org/packages/6f/8b/209bd6b62ce8367f47e68a218bffac88888fdf2c9fcf1ecadc6c3ec1ebc7/pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967", size = 5270556 }, + { url = "https://files.pythonhosted.org/packages/2e/e6/231a0b76070c2cfd9e260a7a5b504fb72da0a95279410fa7afd99d9751d6/pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe", size = 4654625 }, + { url = "https://files.pythonhosted.org/packages/13/f4/10cf94fda33cb12765f2397fc285fa6d8eb9c29de7f3185165b702fc7386/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c", size = 4874207 }, + { url = "https://files.pythonhosted.org/packages/72/c9/583821097dc691880c92892e8e2d41fe0a5a3d6021f4963371d2f6d57250/pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25", size = 6583939 }, + { url = "https://files.pythonhosted.org/packages/3b/8e/5c9d410f9217b12320efc7c413e72693f48468979a013ad17fd690397b9a/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27", size = 4957166 }, + { url = "https://files.pythonhosted.org/packages/62/bb/78347dbe13219991877ffb3a91bf09da8317fbfcd4b5f9140aeae020ad71/pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a", size = 5581482 }, + { url = "https://files.pythonhosted.org/packages/d9/28/1000353d5e61498aaeaaf7f1e4b49ddb05f2c6575f9d4f9f914a3538b6e1/pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f", size = 6984596 }, + { url = "https://files.pythonhosted.org/packages/9e/e3/6fa84033758276fb31da12e5fb66ad747ae83b93c67af17f8c6ff4cc8f34/pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6", size = 5270566 }, + { url = "https://files.pythonhosted.org/packages/5b/ee/e8d2e1ab4892970b561e1ba96cbd59c0d28cf66737fc44abb2aec3795a4e/pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438", size = 4654618 }, + { url = "https://files.pythonhosted.org/packages/f2/6d/17f80f4e1f0761f02160fc433abd4109fa1548dcfdca46cfdadaf9efa565/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3", size = 4874248 }, + { url = "https://files.pythonhosted.org/packages/de/5f/c22340acd61cef960130585bbe2120e2fd8434c214802f07e8c03596b17e/pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c", size = 6583963 }, + { url = "https://files.pythonhosted.org/packages/31/5e/03966aedfbfcbb4d5f8aa042452d3361f325b963ebbadddac05b122e47dd/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361", size = 4957170 }, + { url = "https://files.pythonhosted.org/packages/cc/2d/e082982aacc927fc2cab48e1e731bdb1643a1406acace8bed0900a61464e/pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7", size = 5581505 }, + { url = "https://files.pythonhosted.org/packages/34/e7/ae39f538fd6844e982063c3a5e4598b8ced43b9633baa3a85ef33af8c05c/pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8", size = 6984598 }, ] [[package]] name = "plotly" version = "6.5.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "narwhals" }, { name = "packaging" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/e3/4f/8a10a9b9f5192cb6fdef62f1d77fa7d834190b2c50c0cd256bd62879212b/plotly-6.5.2.tar.gz", hash = "sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393", size = 7015695, upload-time = "2026-01-14T21:26:51.222Z" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/4f/8a10a9b9f5192cb6fdef62f1d77fa7d834190b2c50c0cd256bd62879212b/plotly-6.5.2.tar.gz", hash = "sha256:7478555be0198562d1435dee4c308268187553cc15516a2f4dd034453699e393", size = 7015695 } wheels = [ - { url = "https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl", hash = "sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4", size = 9895973, upload-time = "2026-01-14T21:26:47.135Z" }, + { url = "https://files.pythonhosted.org/packages/8a/67/f95b5460f127840310d2187f916cf0023b5875c0717fdf893f71e1325e87/plotly-6.5.2-py3-none-any.whl", hash = "sha256:91757653bd9c550eeea2fa2404dba6b85d1e366d54804c340b2c874e5a7eb4a4", size = 9895973 }, ] [[package]] name = "propcache" version = "0.4.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442, upload-time = "2025-10-08T19:49:02.291Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534, upload-time = "2025-10-08T19:46:02.083Z" }, - { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526, upload-time = "2025-10-08T19:46:03.884Z" }, - { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263, upload-time = "2025-10-08T19:46:05.405Z" }, - { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012, upload-time = "2025-10-08T19:46:07.165Z" }, - { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491, upload-time = "2025-10-08T19:46:08.909Z" }, - { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319, upload-time = "2025-10-08T19:46:10.7Z" }, - { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856, upload-time = "2025-10-08T19:46:12.003Z" }, - { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241, upload-time = "2025-10-08T19:46:13.495Z" }, - { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552, upload-time = "2025-10-08T19:46:14.938Z" }, - { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113, upload-time = "2025-10-08T19:46:16.695Z" }, - { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778, upload-time = "2025-10-08T19:46:18.023Z" }, - { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047, upload-time = "2025-10-08T19:46:19.449Z" }, - { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093, upload-time = "2025-10-08T19:46:20.643Z" }, - { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638, upload-time = "2025-10-08T19:46:21.935Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229, upload-time = "2025-10-08T19:46:23.368Z" }, - { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208, upload-time = "2025-10-08T19:46:24.597Z" }, - { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777, upload-time = "2025-10-08T19:46:25.733Z" }, - { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647, upload-time = "2025-10-08T19:46:27.304Z" }, - { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929, upload-time = "2025-10-08T19:46:28.62Z" }, - { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778, upload-time = "2025-10-08T19:46:30.358Z" }, - { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144, upload-time = "2025-10-08T19:46:32.607Z" }, - { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030, upload-time = "2025-10-08T19:46:33.969Z" }, - { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252, upload-time = "2025-10-08T19:46:35.309Z" }, - { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064, upload-time = "2025-10-08T19:46:36.993Z" }, - { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429, upload-time = "2025-10-08T19:46:38.398Z" }, - { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727, upload-time = "2025-10-08T19:46:39.732Z" }, - { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097, upload-time = "2025-10-08T19:46:41.025Z" }, - { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084, upload-time = "2025-10-08T19:46:42.693Z" }, - { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637, upload-time = "2025-10-08T19:46:43.778Z" }, - { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064, upload-time = "2025-10-08T19:46:44.872Z" }, - { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061, upload-time = "2025-10-08T19:46:46.075Z" }, - { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037, upload-time = "2025-10-08T19:46:47.23Z" }, - { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324, upload-time = "2025-10-08T19:46:48.384Z" }, - { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505, upload-time = "2025-10-08T19:46:50.055Z" }, - { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242, upload-time = "2025-10-08T19:46:51.815Z" }, - { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474, upload-time = "2025-10-08T19:46:53.208Z" }, - { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575, upload-time = "2025-10-08T19:46:54.511Z" }, - { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736, upload-time = "2025-10-08T19:46:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019, upload-time = "2025-10-08T19:46:57.595Z" }, - { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376, upload-time = "2025-10-08T19:46:59.067Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988, upload-time = "2025-10-08T19:47:00.544Z" }, - { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615, upload-time = "2025-10-08T19:47:01.968Z" }, - { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066, upload-time = "2025-10-08T19:47:03.503Z" }, - { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655, upload-time = "2025-10-08T19:47:04.973Z" }, - { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789, upload-time = "2025-10-08T19:47:06.077Z" }, - { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750, upload-time = "2025-10-08T19:47:07.648Z" }, - { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780, upload-time = "2025-10-08T19:47:08.851Z" }, - { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308, upload-time = "2025-10-08T19:47:09.982Z" }, - { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182, upload-time = "2025-10-08T19:47:11.319Z" }, - { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215, upload-time = "2025-10-08T19:47:13.146Z" }, - { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112, upload-time = "2025-10-08T19:47:14.913Z" }, - { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442, upload-time = "2025-10-08T19:47:16.277Z" }, - { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398, upload-time = "2025-10-08T19:47:17.962Z" }, - { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920, upload-time = "2025-10-08T19:47:19.355Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748, upload-time = "2025-10-08T19:47:21.338Z" }, - { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877, upload-time = "2025-10-08T19:47:23.059Z" }, - { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437, upload-time = "2025-10-08T19:47:24.445Z" }, - { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586, upload-time = "2025-10-08T19:47:25.736Z" }, - { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790, upload-time = "2025-10-08T19:47:26.847Z" }, - { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158, upload-time = "2025-10-08T19:47:27.961Z" }, - { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451, upload-time = "2025-10-08T19:47:29.445Z" }, - { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374, upload-time = "2025-10-08T19:47:30.579Z" }, - { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396, upload-time = "2025-10-08T19:47:31.79Z" }, - { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950, upload-time = "2025-10-08T19:47:33.481Z" }, - { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856, upload-time = "2025-10-08T19:47:34.906Z" }, - { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420, upload-time = "2025-10-08T19:47:36.338Z" }, - { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254, upload-time = "2025-10-08T19:47:37.692Z" }, - { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205, upload-time = "2025-10-08T19:47:39.659Z" }, - { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873, upload-time = "2025-10-08T19:47:41.084Z" }, - { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739, upload-time = "2025-10-08T19:47:42.51Z" }, - { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514, upload-time = "2025-10-08T19:47:43.927Z" }, - { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781, upload-time = "2025-10-08T19:47:45.448Z" }, - { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396, upload-time = "2025-10-08T19:47:47.202Z" }, - { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897, upload-time = "2025-10-08T19:47:48.336Z" }, - { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789, upload-time = "2025-10-08T19:47:49.876Z" }, - { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152, upload-time = "2025-10-08T19:47:51.051Z" }, - { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869, upload-time = "2025-10-08T19:47:52.594Z" }, - { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596, upload-time = "2025-10-08T19:47:54.073Z" }, - { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981, upload-time = "2025-10-08T19:47:55.715Z" }, - { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490, upload-time = "2025-10-08T19:47:57.499Z" }, - { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371, upload-time = "2025-10-08T19:47:59.317Z" }, - { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424, upload-time = "2025-10-08T19:48:00.67Z" }, - { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566, upload-time = "2025-10-08T19:48:02.604Z" }, - { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130, upload-time = "2025-10-08T19:48:04.499Z" }, - { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625, upload-time = "2025-10-08T19:48:06.213Z" }, - { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209, upload-time = "2025-10-08T19:48:08.432Z" }, - { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797, upload-time = "2025-10-08T19:48:09.968Z" }, - { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140, upload-time = "2025-10-08T19:48:11.232Z" }, - { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257, upload-time = "2025-10-08T19:48:12.707Z" }, - { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097, upload-time = "2025-10-08T19:48:13.923Z" }, - { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455, upload-time = "2025-10-08T19:48:15.16Z" }, - { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372, upload-time = "2025-10-08T19:48:16.424Z" }, - { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411, upload-time = "2025-10-08T19:48:17.577Z" }, - { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712, upload-time = "2025-10-08T19:48:18.901Z" }, - { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557, upload-time = "2025-10-08T19:48:20.762Z" }, - { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015, upload-time = "2025-10-08T19:48:22.592Z" }, - { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880, upload-time = "2025-10-08T19:48:23.947Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938, upload-time = "2025-10-08T19:48:25.656Z" }, - { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641, upload-time = "2025-10-08T19:48:27.207Z" }, - { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510, upload-time = "2025-10-08T19:48:28.65Z" }, - { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161, upload-time = "2025-10-08T19:48:30.133Z" }, - { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393, upload-time = "2025-10-08T19:48:31.567Z" }, - { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546, upload-time = "2025-10-08T19:48:32.872Z" }, - { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259, upload-time = "2025-10-08T19:48:34.226Z" }, - { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428, upload-time = "2025-10-08T19:48:35.441Z" }, - { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305, upload-time = "2025-10-08T19:49:00.792Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/9e/da/e9fc233cf63743258bff22b3dfa7ea5baef7b5bc324af47a0ad89b8ffc6f/propcache-0.4.1.tar.gz", hash = "sha256:f48107a8c637e80362555f37ecf49abe20370e557cc4ab374f04ec4423c97c3d", size = 46442 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/0e/934b541323035566a9af292dba85a195f7b78179114f2c6ebb24551118a9/propcache-0.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c2d1fa3201efaf55d730400d945b5b3ab6e672e100ba0f9a409d950ab25d7db", size = 79534 }, + { url = "https://files.pythonhosted.org/packages/a1/6b/db0d03d96726d995dc7171286c6ba9d8d14251f37433890f88368951a44e/propcache-0.4.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:1eb2994229cc8ce7fe9b3db88f5465f5fd8651672840b2e426b88cdb1a30aac8", size = 45526 }, + { url = "https://files.pythonhosted.org/packages/e4/c3/82728404aea669e1600f304f2609cde9e665c18df5a11cdd57ed73c1dceb/propcache-0.4.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:66c1f011f45a3b33d7bcb22daed4b29c0c9e2224758b6be00686731e1b46f925", size = 47263 }, + { url = "https://files.pythonhosted.org/packages/df/1b/39313ddad2bf9187a1432654c38249bab4562ef535ef07f5eb6eb04d0b1b/propcache-0.4.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9a52009f2adffe195d0b605c25ec929d26b36ef986ba85244891dee3b294df21", size = 201012 }, + { url = "https://files.pythonhosted.org/packages/5b/01/f1d0b57d136f294a142acf97f4ed58c8e5b974c21e543000968357115011/propcache-0.4.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5d4e2366a9c7b837555cf02fb9be2e3167d333aff716332ef1b7c3a142ec40c5", size = 209491 }, + { url = "https://files.pythonhosted.org/packages/a1/c8/038d909c61c5bb039070b3fb02ad5cccdb1dde0d714792e251cdb17c9c05/propcache-0.4.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:9d2b6caef873b4f09e26ea7e33d65f42b944837563a47a94719cc3544319a0db", size = 215319 }, + { url = "https://files.pythonhosted.org/packages/08/57/8c87e93142b2c1fa2408e45695205a7ba05fb5db458c0bf5c06ba0e09ea6/propcache-0.4.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2b16ec437a8c8a965ecf95739448dd938b5c7f56e67ea009f4300d8df05f32b7", size = 196856 }, + { url = "https://files.pythonhosted.org/packages/42/df/5615fec76aa561987a534759b3686008a288e73107faa49a8ae5795a9f7a/propcache-0.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:296f4c8ed03ca7476813fe666c9ea97869a8d7aec972618671b33a38a5182ef4", size = 193241 }, + { url = "https://files.pythonhosted.org/packages/d5/21/62949eb3a7a54afe8327011c90aca7e03547787a88fb8bd9726806482fea/propcache-0.4.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:1f0978529a418ebd1f49dad413a2b68af33f85d5c5ca5c6ca2a3bed375a7ac60", size = 190552 }, + { url = "https://files.pythonhosted.org/packages/30/ee/ab4d727dd70806e5b4de96a798ae7ac6e4d42516f030ee60522474b6b332/propcache-0.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fd138803047fb4c062b1c1dd95462f5209456bfab55c734458f15d11da288f8f", size = 200113 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/38b46208e6711b016aa8966a3ac793eee0d05c7159d8342aa27fc0bc365e/propcache-0.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8c9b3cbe4584636d72ff556d9036e0c9317fa27b3ac1f0f558e7e84d1c9c5900", size = 200778 }, + { url = "https://files.pythonhosted.org/packages/cf/81/5abec54355ed344476bee711e9f04815d4b00a311ab0535599204eecc257/propcache-0.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f93243fdc5657247533273ac4f86ae106cc6445a0efacb9a1bfe982fcfefd90c", size = 193047 }, + { url = "https://files.pythonhosted.org/packages/ec/b6/1f237c04e32063cb034acd5f6ef34ef3a394f75502e72703545631ab1ef6/propcache-0.4.1-cp310-cp310-win32.whl", hash = "sha256:a0ee98db9c5f80785b266eb805016e36058ac72c51a064040f2bc43b61101cdb", size = 38093 }, + { url = "https://files.pythonhosted.org/packages/a6/67/354aac4e0603a15f76439caf0427781bcd6797f370377f75a642133bc954/propcache-0.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:1cdb7988c4e5ac7f6d175a28a9aa0c94cb6f2ebe52756a3c0cda98d2809a9e37", size = 41638 }, + { url = "https://files.pythonhosted.org/packages/e0/e1/74e55b9fd1a4c209ff1a9a824bf6c8b3d1fc5a1ac3eabe23462637466785/propcache-0.4.1-cp310-cp310-win_arm64.whl", hash = "sha256:d82ad62b19645419fe79dd63b3f9253e15b30e955c0170e5cebc350c1844e581", size = 38229 }, + { url = "https://files.pythonhosted.org/packages/8c/d4/4e2c9aaf7ac2242b9358f98dccd8f90f2605402f5afeff6c578682c2c491/propcache-0.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:60a8fda9644b7dfd5dece8c61d8a85e271cb958075bfc4e01083c148b61a7caf", size = 80208 }, + { url = "https://files.pythonhosted.org/packages/c2/21/d7b68e911f9c8e18e4ae43bdbc1e1e9bbd971f8866eb81608947b6f585ff/propcache-0.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c30b53e7e6bda1d547cabb47c825f3843a0a1a42b0496087bb58d8fedf9f41b5", size = 45777 }, + { url = "https://files.pythonhosted.org/packages/d3/1d/11605e99ac8ea9435651ee71ab4cb4bf03f0949586246476a25aadfec54a/propcache-0.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6918ecbd897443087a3b7cd978d56546a812517dcaaca51b49526720571fa93e", size = 47647 }, + { url = "https://files.pythonhosted.org/packages/58/1a/3c62c127a8466c9c843bccb503d40a273e5cc69838805f322e2826509e0d/propcache-0.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d902a36df4e5989763425a8ab9e98cd8ad5c52c823b34ee7ef307fd50582566", size = 214929 }, + { url = "https://files.pythonhosted.org/packages/56/b9/8fa98f850960b367c4b8fe0592e7fc341daa7a9462e925228f10a60cf74f/propcache-0.4.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a9695397f85973bb40427dedddf70d8dc4a44b22f1650dd4af9eedf443d45165", size = 221778 }, + { url = "https://files.pythonhosted.org/packages/46/a6/0ab4f660eb59649d14b3d3d65c439421cf2f87fe5dd68591cbe3c1e78a89/propcache-0.4.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2bb07ffd7eaad486576430c89f9b215f9e4be68c4866a96e97db9e97fead85dc", size = 228144 }, + { url = "https://files.pythonhosted.org/packages/52/6a/57f43e054fb3d3a56ac9fc532bc684fc6169a26c75c353e65425b3e56eef/propcache-0.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fd6f30fdcf9ae2a70abd34da54f18da086160e4d7d9251f81f3da0ff84fc5a48", size = 210030 }, + { url = "https://files.pythonhosted.org/packages/40/e2/27e6feebb5f6b8408fa29f5efbb765cd54c153ac77314d27e457a3e993b7/propcache-0.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:fc38cba02d1acba4e2869eef1a57a43dfbd3d49a59bf90dda7444ec2be6a5570", size = 208252 }, + { url = "https://files.pythonhosted.org/packages/9e/f8/91c27b22ccda1dbc7967f921c42825564fa5336a01ecd72eb78a9f4f53c2/propcache-0.4.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:67fad6162281e80e882fb3ec355398cf72864a54069d060321f6cd0ade95fe85", size = 202064 }, + { url = "https://files.pythonhosted.org/packages/f2/26/7f00bd6bd1adba5aafe5f4a66390f243acab58eab24ff1a08bebb2ef9d40/propcache-0.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f10207adf04d08bec185bae14d9606a1444715bc99180f9331c9c02093e1959e", size = 212429 }, + { url = "https://files.pythonhosted.org/packages/84/89/fd108ba7815c1117ddca79c228f3f8a15fc82a73bca8b142eb5de13b2785/propcache-0.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e9b0d8d0845bbc4cfcdcbcdbf5086886bc8157aa963c31c777ceff7846c77757", size = 216727 }, + { url = "https://files.pythonhosted.org/packages/79/37/3ec3f7e3173e73f1d600495d8b545b53802cbf35506e5732dd8578db3724/propcache-0.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:981333cb2f4c1896a12f4ab92a9cc8f09ea664e9b7dbdc4eff74627af3a11c0f", size = 205097 }, + { url = "https://files.pythonhosted.org/packages/61/b0/b2631c19793f869d35f47d5a3a56fb19e9160d3c119f15ac7344fc3ccae7/propcache-0.4.1-cp311-cp311-win32.whl", hash = "sha256:f1d2f90aeec838a52f1c1a32fe9a619fefd5e411721a9117fbf82aea638fe8a1", size = 38084 }, + { url = "https://files.pythonhosted.org/packages/f4/78/6cce448e2098e9f3bfc91bb877f06aa24b6ccace872e39c53b2f707c4648/propcache-0.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:364426a62660f3f699949ac8c621aad6977be7126c5807ce48c0aeb8e7333ea6", size = 41637 }, + { url = "https://files.pythonhosted.org/packages/9c/e9/754f180cccd7f51a39913782c74717c581b9cc8177ad0e949f4d51812383/propcache-0.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:e53f3a38d3510c11953f3e6a33f205c6d1b001129f972805ca9b42fc308bc239", size = 38064 }, + { url = "https://files.pythonhosted.org/packages/a2/0f/f17b1b2b221d5ca28b4b876e8bb046ac40466513960646bda8e1853cdfa2/propcache-0.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e153e9cd40cc8945138822807139367f256f89c6810c2634a4f6902b52d3b4e2", size = 80061 }, + { url = "https://files.pythonhosted.org/packages/76/47/8ccf75935f51448ba9a16a71b783eb7ef6b9ee60f5d14c7f8a8a79fbeed7/propcache-0.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cd547953428f7abb73c5ad82cbb32109566204260d98e41e5dfdc682eb7f8403", size = 46037 }, + { url = "https://files.pythonhosted.org/packages/0a/b6/5c9a0e42df4d00bfb4a3cbbe5cf9f54260300c88a0e9af1f47ca5ce17ac0/propcache-0.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f048da1b4f243fc44f205dfd320933a951b8d89e0afd4c7cacc762a8b9165207", size = 47324 }, + { url = "https://files.pythonhosted.org/packages/9e/d3/6c7ee328b39a81ee877c962469f1e795f9db87f925251efeb0545e0020d0/propcache-0.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ec17c65562a827bba85e3872ead335f95405ea1674860d96483a02f5c698fa72", size = 225505 }, + { url = "https://files.pythonhosted.org/packages/01/5d/1c53f4563490b1d06a684742cc6076ef944bc6457df6051b7d1a877c057b/propcache-0.4.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:405aac25c6394ef275dee4c709be43745d36674b223ba4eb7144bf4d691b7367", size = 230242 }, + { url = "https://files.pythonhosted.org/packages/20/e1/ce4620633b0e2422207c3cb774a0ee61cac13abc6217763a7b9e2e3f4a12/propcache-0.4.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0013cb6f8dde4b2a2f66903b8ba740bdfe378c943c4377a200551ceb27f379e4", size = 238474 }, + { url = "https://files.pythonhosted.org/packages/46/4b/3aae6835b8e5f44ea6a68348ad90f78134047b503765087be2f9912140ea/propcache-0.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15932ab57837c3368b024473a525e25d316d8353016e7cc0e5ba9eb343fbb1cf", size = 221575 }, + { url = "https://files.pythonhosted.org/packages/6e/a5/8a5e8678bcc9d3a1a15b9a29165640d64762d424a16af543f00629c87338/propcache-0.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:031dce78b9dc099f4c29785d9cf5577a3faf9ebf74ecbd3c856a7b92768c3df3", size = 216736 }, + { url = "https://files.pythonhosted.org/packages/f1/63/b7b215eddeac83ca1c6b934f89d09a625aa9ee4ba158338854c87210cc36/propcache-0.4.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ab08df6c9a035bee56e31af99be621526bd237bea9f32def431c656b29e41778", size = 213019 }, + { url = "https://files.pythonhosted.org/packages/57/74/f580099a58c8af587cac7ba19ee7cb418506342fbbe2d4a4401661cca886/propcache-0.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4d7af63f9f93fe593afbf104c21b3b15868efb2c21d07d8732c0c4287e66b6a6", size = 220376 }, + { url = "https://files.pythonhosted.org/packages/c4/ee/542f1313aff7eaf19c2bb758c5d0560d2683dac001a1c96d0774af799843/propcache-0.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cfc27c945f422e8b5071b6e93169679e4eb5bf73bbcbf1ba3ae3a83d2f78ebd9", size = 226988 }, + { url = "https://files.pythonhosted.org/packages/8f/18/9c6b015dd9c6930f6ce2229e1f02fb35298b847f2087ea2b436a5bfa7287/propcache-0.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:35c3277624a080cc6ec6f847cbbbb5b49affa3598c4535a0a4682a697aaa5c75", size = 215615 }, + { url = "https://files.pythonhosted.org/packages/80/9e/e7b85720b98c45a45e1fca6a177024934dc9bc5f4d5dd04207f216fc33ed/propcache-0.4.1-cp312-cp312-win32.whl", hash = "sha256:671538c2262dadb5ba6395e26c1731e1d52534bfe9ae56d0b5573ce539266aa8", size = 38066 }, + { url = "https://files.pythonhosted.org/packages/54/09/d19cff2a5aaac632ec8fc03737b223597b1e347416934c1b3a7df079784c/propcache-0.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:cb2d222e72399fcf5890d1d5cc1060857b9b236adff2792ff48ca2dfd46c81db", size = 41655 }, + { url = "https://files.pythonhosted.org/packages/68/ab/6b5c191bb5de08036a8c697b265d4ca76148efb10fa162f14af14fb5f076/propcache-0.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:204483131fb222bdaaeeea9f9e6c6ed0cac32731f75dfc1d4a567fc1926477c1", size = 37789 }, + { url = "https://files.pythonhosted.org/packages/bf/df/6d9c1b6ac12b003837dde8a10231a7344512186e87b36e855bef32241942/propcache-0.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:43eedf29202c08550aac1d14e0ee619b0430aaef78f85864c1a892294fbc28cf", size = 77750 }, + { url = "https://files.pythonhosted.org/packages/8b/e8/677a0025e8a2acf07d3418a2e7ba529c9c33caf09d3c1f25513023c1db56/propcache-0.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d62cdfcfd89ccb8de04e0eda998535c406bf5e060ffd56be6c586cbcc05b3311", size = 44780 }, + { url = "https://files.pythonhosted.org/packages/89/a4/92380f7ca60f99ebae761936bc48a72a639e8a47b29050615eef757cb2a7/propcache-0.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:cae65ad55793da34db5f54e4029b89d3b9b9490d8abe1b4c7ab5d4b8ec7ebf74", size = 46308 }, + { url = "https://files.pythonhosted.org/packages/2d/48/c5ac64dee5262044348d1d78a5f85dd1a57464a60d30daee946699963eb3/propcache-0.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:333ddb9031d2704a301ee3e506dc46b1fe5f294ec198ed6435ad5b6a085facfe", size = 208182 }, + { url = "https://files.pythonhosted.org/packages/c6/0c/cd762dd011a9287389a6a3eb43aa30207bde253610cca06824aeabfe9653/propcache-0.4.1-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:fd0858c20f078a32cf55f7e81473d96dcf3b93fd2ccdb3d40fdf54b8573df3af", size = 211215 }, + { url = "https://files.pythonhosted.org/packages/30/3e/49861e90233ba36890ae0ca4c660e95df565b2cd15d4a68556ab5865974e/propcache-0.4.1-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:678ae89ebc632c5c204c794f8dab2837c5f159aeb59e6ed0539500400577298c", size = 218112 }, + { url = "https://files.pythonhosted.org/packages/f1/8b/544bc867e24e1bd48f3118cecd3b05c694e160a168478fa28770f22fd094/propcache-0.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d472aeb4fbf9865e0c6d622d7f4d54a4e101a89715d8904282bb5f9a2f476c3f", size = 204442 }, + { url = "https://files.pythonhosted.org/packages/50/a6/4282772fd016a76d3e5c0df58380a5ea64900afd836cec2c2f662d1b9bb3/propcache-0.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4d3df5fa7e36b3225954fba85589da77a0fe6a53e3976de39caf04a0db4c36f1", size = 199398 }, + { url = "https://files.pythonhosted.org/packages/3e/ec/d8a7cd406ee1ddb705db2139f8a10a8a427100347bd698e7014351c7af09/propcache-0.4.1-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:ee17f18d2498f2673e432faaa71698032b0127ebf23ae5974eeaf806c279df24", size = 196920 }, + { url = "https://files.pythonhosted.org/packages/f6/6c/f38ab64af3764f431e359f8baf9e0a21013e24329e8b85d2da32e8ed07ca/propcache-0.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:580e97762b950f993ae618e167e7be9256b8353c2dcd8b99ec100eb50f5286aa", size = 203748 }, + { url = "https://files.pythonhosted.org/packages/d6/e3/fa846bd70f6534d647886621388f0a265254d30e3ce47e5c8e6e27dbf153/propcache-0.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:501d20b891688eb8e7aa903021f0b72d5a55db40ffaab27edefd1027caaafa61", size = 205877 }, + { url = "https://files.pythonhosted.org/packages/e2/39/8163fc6f3133fea7b5f2827e8eba2029a0277ab2c5beee6c1db7b10fc23d/propcache-0.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a0bd56e5b100aef69bd8562b74b46254e7c8812918d3baa700c8a8009b0af66", size = 199437 }, + { url = "https://files.pythonhosted.org/packages/93/89/caa9089970ca49c7c01662bd0eeedfe85494e863e8043565aeb6472ce8fe/propcache-0.4.1-cp313-cp313-win32.whl", hash = "sha256:bcc9aaa5d80322bc2fb24bb7accb4a30f81e90ab8d6ba187aec0744bc302ad81", size = 37586 }, + { url = "https://files.pythonhosted.org/packages/f5/ab/f76ec3c3627c883215b5c8080debb4394ef5a7a29be811f786415fc1e6fd/propcache-0.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:381914df18634f5494334d201e98245c0596067504b9372d8cf93f4bb23e025e", size = 40790 }, + { url = "https://files.pythonhosted.org/packages/59/1b/e71ae98235f8e2ba5004d8cb19765a74877abf189bc53fc0c80d799e56c3/propcache-0.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:8873eb4460fd55333ea49b7d189749ecf6e55bf85080f11b1c4530ed3034cba1", size = 37158 }, + { url = "https://files.pythonhosted.org/packages/83/ce/a31bbdfc24ee0dcbba458c8175ed26089cf109a55bbe7b7640ed2470cfe9/propcache-0.4.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:92d1935ee1f8d7442da9c0c4fa7ac20d07e94064184811b685f5c4fada64553b", size = 81451 }, + { url = "https://files.pythonhosted.org/packages/25/9c/442a45a470a68456e710d96cacd3573ef26a1d0a60067e6a7d5e655621ed/propcache-0.4.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:473c61b39e1460d386479b9b2f337da492042447c9b685f28be4f74d3529e566", size = 46374 }, + { url = "https://files.pythonhosted.org/packages/f4/bf/b1d5e21dbc3b2e889ea4327044fb16312a736d97640fb8b6aa3f9c7b3b65/propcache-0.4.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:c0ef0aaafc66fbd87842a3fe3902fd889825646bc21149eafe47be6072725835", size = 48396 }, + { url = "https://files.pythonhosted.org/packages/f4/04/5b4c54a103d480e978d3c8a76073502b18db0c4bc17ab91b3cb5092ad949/propcache-0.4.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f95393b4d66bfae908c3ca8d169d5f79cd65636ae15b5e7a4f6e67af675adb0e", size = 275950 }, + { url = "https://files.pythonhosted.org/packages/b4/c1/86f846827fb969c4b78b0af79bba1d1ea2156492e1b83dea8b8a6ae27395/propcache-0.4.1-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c07fda85708bc48578467e85099645167a955ba093be0a2dcba962195676e859", size = 273856 }, + { url = "https://files.pythonhosted.org/packages/36/1d/fc272a63c8d3bbad6878c336c7a7dea15e8f2d23a544bda43205dfa83ada/propcache-0.4.1-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:af223b406d6d000830c6f65f1e6431783fc3f713ba3e6cc8c024d5ee96170a4b", size = 280420 }, + { url = "https://files.pythonhosted.org/packages/07/0c/01f2219d39f7e53d52e5173bcb09c976609ba30209912a0680adfb8c593a/propcache-0.4.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a78372c932c90ee474559c5ddfffd718238e8673c340dc21fe45c5b8b54559a0", size = 263254 }, + { url = "https://files.pythonhosted.org/packages/2d/18/cd28081658ce597898f0c4d174d4d0f3c5b6d4dc27ffafeef835c95eb359/propcache-0.4.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:564d9f0d4d9509e1a870c920a89b2fec951b44bf5ba7d537a9e7c1ccec2c18af", size = 261205 }, + { url = "https://files.pythonhosted.org/packages/7a/71/1f9e22eb8b8316701c2a19fa1f388c8a3185082607da8e406a803c9b954e/propcache-0.4.1-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:17612831fda0138059cc5546f4d12a2aacfb9e47068c06af35c400ba58ba7393", size = 247873 }, + { url = "https://files.pythonhosted.org/packages/4a/65/3d4b61f36af2b4eddba9def857959f1016a51066b4f1ce348e0cf7881f58/propcache-0.4.1-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:41a89040cb10bd345b3c1a873b2bf36413d48da1def52f268a055f7398514874", size = 262739 }, + { url = "https://files.pythonhosted.org/packages/2a/42/26746ab087faa77c1c68079b228810436ccd9a5ce9ac85e2b7307195fd06/propcache-0.4.1-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:e35b88984e7fa64aacecea39236cee32dd9bd8c55f57ba8a75cf2399553f9bd7", size = 263514 }, + { url = "https://files.pythonhosted.org/packages/94/13/630690fe201f5502d2403dd3cfd451ed8858fe3c738ee88d095ad2ff407b/propcache-0.4.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6f8b465489f927b0df505cbe26ffbeed4d6d8a2bbc61ce90eb074ff129ef0ab1", size = 257781 }, + { url = "https://files.pythonhosted.org/packages/92/f7/1d4ec5841505f423469efbfc381d64b7b467438cd5a4bbcbb063f3b73d27/propcache-0.4.1-cp313-cp313t-win32.whl", hash = "sha256:2ad890caa1d928c7c2965b48f3a3815c853180831d0e5503d35cf00c472f4717", size = 41396 }, + { url = "https://files.pythonhosted.org/packages/48/f0/615c30622316496d2cbbc29f5985f7777d3ada70f23370608c1d3e081c1f/propcache-0.4.1-cp313-cp313t-win_amd64.whl", hash = "sha256:f7ee0e597f495cf415bcbd3da3caa3bd7e816b74d0d52b8145954c5e6fd3ff37", size = 44897 }, + { url = "https://files.pythonhosted.org/packages/fd/ca/6002e46eccbe0e33dcd4069ef32f7f1c9e243736e07adca37ae8c4830ec3/propcache-0.4.1-cp313-cp313t-win_arm64.whl", hash = "sha256:929d7cbe1f01bb7baffb33dc14eb5691c95831450a26354cd210a8155170c93a", size = 39789 }, + { url = "https://files.pythonhosted.org/packages/8e/5c/bca52d654a896f831b8256683457ceddd490ec18d9ec50e97dfd8fc726a8/propcache-0.4.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3f7124c9d820ba5548d431afb4632301acf965db49e666aa21c305cbe8c6de12", size = 78152 }, + { url = "https://files.pythonhosted.org/packages/65/9b/03b04e7d82a5f54fb16113d839f5ea1ede58a61e90edf515f6577c66fa8f/propcache-0.4.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c0d4b719b7da33599dfe3b22d3db1ef789210a0597bc650b7cee9c77c2be8c5c", size = 44869 }, + { url = "https://files.pythonhosted.org/packages/b2/fa/89a8ef0468d5833a23fff277b143d0573897cf75bd56670a6d28126c7d68/propcache-0.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:9f302f4783709a78240ebc311b793f123328716a60911d667e0c036bc5dcbded", size = 46596 }, + { url = "https://files.pythonhosted.org/packages/86/bd/47816020d337f4a746edc42fe8d53669965138f39ee117414c7d7a340cfe/propcache-0.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c80ee5802e3fb9ea37938e7eecc307fb984837091d5fd262bb37238b1ae97641", size = 206981 }, + { url = "https://files.pythonhosted.org/packages/df/f6/c5fa1357cc9748510ee55f37173eb31bfde6d94e98ccd9e6f033f2fc06e1/propcache-0.4.1-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ed5a841e8bb29a55fb8159ed526b26adc5bdd7e8bd7bf793ce647cb08656cdf4", size = 211490 }, + { url = "https://files.pythonhosted.org/packages/80/1e/e5889652a7c4a3846683401a48f0f2e5083ce0ec1a8a5221d8058fbd1adf/propcache-0.4.1-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:55c72fd6ea2da4c318e74ffdf93c4fe4e926051133657459131a95c846d16d44", size = 215371 }, + { url = "https://files.pythonhosted.org/packages/b2/f2/889ad4b2408f72fe1a4f6a19491177b30ea7bf1a0fd5f17050ca08cfc882/propcache-0.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8326e144341460402713f91df60ade3c999d601e7eb5ff8f6f7862d54de0610d", size = 201424 }, + { url = "https://files.pythonhosted.org/packages/27/73/033d63069b57b0812c8bd19f311faebeceb6ba31b8f32b73432d12a0b826/propcache-0.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:060b16ae65bc098da7f6d25bf359f1f31f688384858204fe5d652979e0015e5b", size = 197566 }, + { url = "https://files.pythonhosted.org/packages/dc/89/ce24f3dc182630b4e07aa6d15f0ff4b14ed4b9955fae95a0b54c58d66c05/propcache-0.4.1-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:89eb3fa9524f7bec9de6e83cf3faed9d79bffa560672c118a96a171a6f55831e", size = 193130 }, + { url = "https://files.pythonhosted.org/packages/a9/24/ef0d5fd1a811fb5c609278d0209c9f10c35f20581fcc16f818da959fc5b4/propcache-0.4.1-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:dee69d7015dc235f526fe80a9c90d65eb0039103fe565776250881731f06349f", size = 202625 }, + { url = "https://files.pythonhosted.org/packages/f5/02/98ec20ff5546f68d673df2f7a69e8c0d076b5abd05ca882dc7ee3a83653d/propcache-0.4.1-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:5558992a00dfd54ccbc64a32726a3357ec93825a418a401f5cc67df0ac5d9e49", size = 204209 }, + { url = "https://files.pythonhosted.org/packages/a0/87/492694f76759b15f0467a2a93ab68d32859672b646aa8a04ce4864e7932d/propcache-0.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c9b822a577f560fbd9554812526831712c1436d2c046cedee4c3796d3543b144", size = 197797 }, + { url = "https://files.pythonhosted.org/packages/ee/36/66367de3575db1d2d3f3d177432bd14ee577a39d3f5d1b3d5df8afe3b6e2/propcache-0.4.1-cp314-cp314-win32.whl", hash = "sha256:ab4c29b49d560fe48b696cdcb127dd36e0bc2472548f3bf56cc5cb3da2b2984f", size = 38140 }, + { url = "https://files.pythonhosted.org/packages/0c/2a/a758b47de253636e1b8aef181c0b4f4f204bf0dd964914fb2af90a95b49b/propcache-0.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:5a103c3eb905fcea0ab98be99c3a9a5ab2de60228aa5aceedc614c0281cf6153", size = 41257 }, + { url = "https://files.pythonhosted.org/packages/34/5e/63bd5896c3fec12edcbd6f12508d4890d23c265df28c74b175e1ef9f4f3b/propcache-0.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:74c1fb26515153e482e00177a1ad654721bf9207da8a494a0c05e797ad27b992", size = 38097 }, + { url = "https://files.pythonhosted.org/packages/99/85/9ff785d787ccf9bbb3f3106f79884a130951436f58392000231b4c737c80/propcache-0.4.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:824e908bce90fb2743bd6b59db36eb4f45cd350a39637c9f73b1c1ea66f5b75f", size = 81455 }, + { url = "https://files.pythonhosted.org/packages/90/85/2431c10c8e7ddb1445c1f7c4b54d886e8ad20e3c6307e7218f05922cad67/propcache-0.4.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2b5e7db5328427c57c8e8831abda175421b709672f6cfc3d630c3b7e2146393", size = 46372 }, + { url = "https://files.pythonhosted.org/packages/01/20/b0972d902472da9bcb683fa595099911f4d2e86e5683bcc45de60dd05dc3/propcache-0.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:6f6ff873ed40292cd4969ef5310179afd5db59fdf055897e282485043fc80ad0", size = 48411 }, + { url = "https://files.pythonhosted.org/packages/e2/e3/7dc89f4f21e8f99bad3d5ddb3a3389afcf9da4ac69e3deb2dcdc96e74169/propcache-0.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a2dc67c154db2c1463013594c458881a069fcf98940e61a0569016a583020a", size = 275712 }, + { url = "https://files.pythonhosted.org/packages/20/67/89800c8352489b21a8047c773067644e3897f02ecbbd610f4d46b7f08612/propcache-0.4.1-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:005f08e6a0529984491e37d8dbc3dd86f84bd78a8ceb5fa9a021f4c48d4984be", size = 273557 }, + { url = "https://files.pythonhosted.org/packages/e2/a1/b52b055c766a54ce6d9c16d9aca0cad8059acd9637cdf8aa0222f4a026ef/propcache-0.4.1-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5c3310452e0d31390da9035c348633b43d7e7feb2e37be252be6da45abd1abcc", size = 280015 }, + { url = "https://files.pythonhosted.org/packages/48/c8/33cee30bd890672c63743049f3c9e4be087e6780906bfc3ec58528be59c1/propcache-0.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3c70630930447f9ef1caac7728c8ad1c56bc5015338b20fed0d08ea2480b3a", size = 262880 }, + { url = "https://files.pythonhosted.org/packages/0c/b1/8f08a143b204b418285c88b83d00edbd61afbc2c6415ffafc8905da7038b/propcache-0.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8e57061305815dfc910a3634dcf584f08168a8836e6999983569f51a8544cd89", size = 260938 }, + { url = "https://files.pythonhosted.org/packages/cf/12/96e4664c82ca2f31e1c8dff86afb867348979eb78d3cb8546a680287a1e9/propcache-0.4.1-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:521a463429ef54143092c11a77e04056dd00636f72e8c45b70aaa3140d639726", size = 247641 }, + { url = "https://files.pythonhosted.org/packages/18/ed/e7a9cfca28133386ba52278136d42209d3125db08d0a6395f0cba0c0285c/propcache-0.4.1-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:120c964da3fdc75e3731aa392527136d4ad35868cc556fd09bb6d09172d9a367", size = 262510 }, + { url = "https://files.pythonhosted.org/packages/f5/76/16d8bf65e8845dd62b4e2b57444ab81f07f40caa5652b8969b87ddcf2ef6/propcache-0.4.1-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:d8f353eb14ee3441ee844ade4277d560cdd68288838673273b978e3d6d2c8f36", size = 263161 }, + { url = "https://files.pythonhosted.org/packages/e7/70/c99e9edb5d91d5ad8a49fa3c1e8285ba64f1476782fed10ab251ff413ba1/propcache-0.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ab2943be7c652f09638800905ee1bab2c544e537edb57d527997a24c13dc1455", size = 257393 }, + { url = "https://files.pythonhosted.org/packages/08/02/87b25304249a35c0915d236575bc3574a323f60b47939a2262b77632a3ee/propcache-0.4.1-cp314-cp314t-win32.whl", hash = "sha256:05674a162469f31358c30bcaa8883cb7829fa3110bf9c0991fe27d7896c42d85", size = 42546 }, + { url = "https://files.pythonhosted.org/packages/cb/ef/3c6ecf8b317aa982f309835e8f96987466123c6e596646d4e6a1dfcd080f/propcache-0.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:990f6b3e2a27d683cb7602ed6c86f15ee6b43b1194736f9baaeb93d0016633b1", size = 46259 }, + { url = "https://files.pythonhosted.org/packages/c4/2d/346e946d4951f37eca1e4f55be0f0174c52cd70720f84029b02f296f4a38/propcache-0.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:ecef2343af4cc68e05131e45024ba34f6095821988a9d0a02aa7c73fcc448aa9", size = 40428 }, + { url = "https://files.pythonhosted.org/packages/5b/5a/bc7b4a4ef808fa59a816c17b20c4bef6884daebbdf627ff2a161da67da19/propcache-0.4.1-py3-none-any.whl", hash = "sha256:af2a6052aeb6cf17d3e46ee169099044fd8224cbaf75c76a2ef596e8163e2237", size = 13305 }, ] [[package]] name = "psutil" version = "7.2.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, - { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, - { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, - { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, - { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, - { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, - { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, - { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, - { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, - { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, - { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, - { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, - { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, - { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, - { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, - { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, - { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, - { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, - { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, - { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595 }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082 }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476 }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062 }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893 }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589 }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664 }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087 }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383 }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210 }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228 }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284 }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090 }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859 }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560 }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997 }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972 }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266 }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737 }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617 }, ] [[package]] name = "pyarrow" version = "23.0.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/01/33/ffd9c3eb087fa41dd79c3cf20c4c0ae3cdb877c4f8e1107a446006344924/pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615", size = 1167185, upload-time = "2026-01-18T16:19:42.218Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ae/2f/23e042a5aa99bcb15e794e14030e8d065e00827e846e53a66faec73c7cd6/pyarrow-23.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cbdc2bf5947aa4d462adcf8453cf04aee2f7932653cb67a27acd96e5e8528a67", size = 34281861, upload-time = "2026-01-18T16:13:34.332Z" }, - { url = "https://files.pythonhosted.org/packages/8b/65/1651933f504b335ec9cd8f99463718421eb08d883ed84f0abd2835a16cad/pyarrow-23.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4d38c836930ce15cd31dce20114b21ba082da231c884bdc0a7b53e1477fe7f07", size = 35825067, upload-time = "2026-01-18T16:13:42.549Z" }, - { url = "https://files.pythonhosted.org/packages/84/ec/d6fceaec050c893f4e35c0556b77d4cc9973fcc24b0a358a5781b1234582/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4222ff8f76919ecf6c716175a0e5fddb5599faeed4c56d9ea41a2c42be4998b2", size = 44458539, upload-time = "2026-01-18T16:13:52.975Z" }, - { url = "https://files.pythonhosted.org/packages/fd/d9/369f134d652b21db62fe3ec1c5c2357e695f79eb67394b8a93f3a2b2cffa/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:87f06159cbe38125852657716889296c83c37b4d09a5e58f3d10245fd1f69795", size = 47535889, upload-time = "2026-01-18T16:14:03.693Z" }, - { url = "https://files.pythonhosted.org/packages/a3/95/f37b6a252fdbf247a67a78fb3f61a529fe0600e304c4d07741763d3522b1/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1675c374570d8b91ea6d4edd4608fa55951acd44e0c31bd146e091b4005de24f", size = 48157777, upload-time = "2026-01-18T16:14:12.483Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ab/fb94923108c9c6415dab677cf1f066d3307798eafc03f9a65ab4abc61056/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:247374428fde4f668f138b04031a7e7077ba5fa0b5b1722fdf89a017bf0b7ee0", size = 50580441, upload-time = "2026-01-18T16:14:20.187Z" }, - { url = "https://files.pythonhosted.org/packages/ae/78/897ba6337b517fc8e914891e1bd918da1c4eb8e936a553e95862e67b80f6/pyarrow-23.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:de53b1bd3b88a2ee93c9af412c903e57e738c083be4f6392288294513cd8b2c1", size = 27530028, upload-time = "2026-01-18T16:14:27.353Z" }, - { url = "https://files.pythonhosted.org/packages/aa/c0/57fe251102ca834fee0ef69a84ad33cc0ff9d5dfc50f50b466846356ecd7/pyarrow-23.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5574d541923efcbfdf1294a2746ae3b8c2498a2dc6cd477882f6f4e7b1ac08d3", size = 34276762, upload-time = "2026-01-18T16:14:34.128Z" }, - { url = "https://files.pythonhosted.org/packages/f8/4e/24130286548a5bc250cbed0b6bbf289a2775378a6e0e6f086ae8c68fc098/pyarrow-23.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:2ef0075c2488932e9d3c2eb3482f9459c4be629aa673b725d5e3cf18f777f8e4", size = 35821420, upload-time = "2026-01-18T16:14:40.699Z" }, - { url = "https://files.pythonhosted.org/packages/ee/55/a869e8529d487aa2e842d6c8865eb1e2c9ec33ce2786eb91104d2c3e3f10/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:65666fc269669af1ef1c14478c52222a2aa5c907f28b68fb50a203c777e4f60c", size = 44457412, upload-time = "2026-01-18T16:14:49.051Z" }, - { url = "https://files.pythonhosted.org/packages/36/81/1de4f0edfa9a483bbdf0082a05790bd6a20ed2169ea12a65039753be3a01/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4d85cb6177198f3812db4788e394b757223f60d9a9f5ad6634b3e32be1525803", size = 47534285, upload-time = "2026-01-18T16:14:56.748Z" }, - { url = "https://files.pythonhosted.org/packages/f2/04/464a052d673b5ece074518f27377861662449f3c1fdb39ce740d646fd098/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9ff6fa4141c24a03a1a434c63c8fa97ce70f8f36bccabc18ebba905ddf0f17", size = 48157913, upload-time = "2026-01-18T16:15:05.114Z" }, - { url = "https://files.pythonhosted.org/packages/f4/1b/32a4de9856ee6688c670ca2def588382e573cce45241a965af04c2f61687/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:84839d060a54ae734eb60a756aeacb62885244aaa282f3c968f5972ecc7b1ecc", size = 50582529, upload-time = "2026-01-18T16:15:12.846Z" }, - { url = "https://files.pythonhosted.org/packages/db/c7/d6581f03e9b9e44ea60b52d1750ee1a7678c484c06f939f45365a45f7eef/pyarrow-23.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a149a647dbfe928ce8830a713612aa0b16e22c64feac9d1761529778e4d4eaa5", size = 27542646, upload-time = "2026-01-18T16:15:18.89Z" }, - { url = "https://files.pythonhosted.org/packages/3d/bd/c861d020831ee57609b73ea721a617985ece817684dc82415b0bc3e03ac3/pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8", size = 34189116, upload-time = "2026-01-18T16:15:28.054Z" }, - { url = "https://files.pythonhosted.org/packages/8c/23/7725ad6cdcbaf6346221391e7b3eecd113684c805b0a95f32014e6fa0736/pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a", size = 35803831, upload-time = "2026-01-18T16:15:33.798Z" }, - { url = "https://files.pythonhosted.org/packages/57/06/684a421543455cdc2944d6a0c2cc3425b028a4c6b90e34b35580c4899743/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333", size = 44436452, upload-time = "2026-01-18T16:15:41.598Z" }, - { url = "https://files.pythonhosted.org/packages/c6/6f/8f9eb40c2328d66e8b097777ddcf38494115ff9f1b5bc9754ba46991191e/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b", size = 47557396, upload-time = "2026-01-18T16:15:51.252Z" }, - { url = "https://files.pythonhosted.org/packages/10/6e/f08075f1472e5159553501fde2cc7bc6700944bdabe49a03f8a035ee6ccd/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de", size = 48147129, upload-time = "2026-01-18T16:16:00.299Z" }, - { url = "https://files.pythonhosted.org/packages/7d/82/d5a680cd507deed62d141cc7f07f7944a6766fc51019f7f118e4d8ad0fb8/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df", size = 50596642, upload-time = "2026-01-18T16:16:08.502Z" }, - { url = "https://files.pythonhosted.org/packages/a9/26/4f29c61b3dce9fa7780303b86895ec6a0917c9af927101daaaf118fbe462/pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c", size = 27660628, upload-time = "2026-01-18T16:16:15.28Z" }, - { url = "https://files.pythonhosted.org/packages/66/34/564db447d083ec7ff93e0a883a597d2f214e552823bfc178a2d0b1f2c257/pyarrow-23.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ad96a597547af7827342ffb3c503c8316e5043bb09b47a84885ce39394c96e00", size = 34184630, upload-time = "2026-01-18T16:16:22.141Z" }, - { url = "https://files.pythonhosted.org/packages/aa/3a/3999daebcb5e6119690c92a621c4d78eef2ffba7a0a1b56386d2875fcd77/pyarrow-23.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b9edf990df77c2901e79608f08c13fbde60202334a4fcadb15c1f57bf7afee43", size = 35796820, upload-time = "2026-01-18T16:16:29.441Z" }, - { url = "https://files.pythonhosted.org/packages/ec/ee/39195233056c6a8d0976d7d1ac1cd4fe21fb0ec534eca76bc23ef3f60e11/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:36d1b5bc6ddcaff0083ceec7e2561ed61a51f49cce8be079ee8ed406acb6fdef", size = 44438735, upload-time = "2026-01-18T16:16:38.79Z" }, - { url = "https://files.pythonhosted.org/packages/2c/41/6a7328ee493527e7afc0c88d105ecca69a3580e29f2faaeac29308369fd7/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4292b889cd224f403304ddda8b63a36e60f92911f89927ec8d98021845ea21be", size = 47557263, upload-time = "2026-01-18T16:16:46.248Z" }, - { url = "https://files.pythonhosted.org/packages/c6/ee/34e95b21ee84db494eae60083ddb4383477b31fb1fd19fd866d794881696/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dfd9e133e60eaa847fd80530a1b89a052f09f695d0b9c34c235ea6b2e0924cf7", size = 48153529, upload-time = "2026-01-18T16:16:53.412Z" }, - { url = "https://files.pythonhosted.org/packages/52/88/8a8d83cea30f4563efa1b7bf51d241331ee5cd1b185a7e063f5634eca415/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832141cc09fac6aab1cd3719951d23301396968de87080c57c9a7634e0ecd068", size = 50598851, upload-time = "2026-01-18T16:17:01.133Z" }, - { url = "https://files.pythonhosted.org/packages/c6/4c/2929c4be88723ba025e7b3453047dc67e491c9422965c141d24bab6b5962/pyarrow-23.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:7a7d067c9a88faca655c71bcc30ee2782038d59c802d57950826a07f60d83c4c", size = 27577747, upload-time = "2026-01-18T16:18:02.413Z" }, - { url = "https://files.pythonhosted.org/packages/64/52/564a61b0b82d72bd68ec3aef1adda1e3eba776f89134b9ebcb5af4b13cb6/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ce9486e0535a843cf85d990e2ec5820a47918235183a5c7b8b97ed7e92c2d47d", size = 34446038, upload-time = "2026-01-18T16:17:07.861Z" }, - { url = "https://files.pythonhosted.org/packages/cc/c9/232d4f9855fd1de0067c8a7808a363230d223c83aeee75e0fe6eab851ba9/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:075c29aeaa685fd1182992a9ed2499c66f084ee54eea47da3eb76e125e06064c", size = 35921142, upload-time = "2026-01-18T16:17:15.401Z" }, - { url = "https://files.pythonhosted.org/packages/96/f2/60af606a3748367b906bb82d41f0032e059f075444445d47e32a7ff1df62/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:799965a5379589510d888be3094c2296efd186a17ca1cef5b77703d4d5121f53", size = 44490374, upload-time = "2026-01-18T16:17:23.93Z" }, - { url = "https://files.pythonhosted.org/packages/ff/2d/7731543050a678ea3a413955a2d5d80d2a642f270aa57a3cb7d5a86e3f46/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef7cac8fe6fccd8b9e7617bfac785b0371a7fe26af59463074e4882747145d40", size = 47527896, upload-time = "2026-01-18T16:17:33.393Z" }, - { url = "https://files.pythonhosted.org/packages/5a/90/f3342553b7ac9879413aed46500f1637296f3c8222107523a43a1c08b42a/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15a414f710dc927132dd67c361f78c194447479555af57317066ee5116b90e9e", size = 48210401, upload-time = "2026-01-18T16:17:42.012Z" }, - { url = "https://files.pythonhosted.org/packages/f3/da/9862ade205ecc46c172b6ce5038a74b5151c7401e36255f15975a45878b2/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e0d2e6915eca7d786be6a77bf227fbc06d825a75b5b5fe9bcbef121dec32685", size = 50579677, upload-time = "2026-01-18T16:17:50.241Z" }, - { url = "https://files.pythonhosted.org/packages/c2/4c/f11f371f5d4740a5dafc2e11c76bcf42d03dfdb2d68696da97de420b6963/pyarrow-23.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4b317ea6e800b5704e5e5929acb6e2dc13e9276b708ea97a39eb8b345aa2658b", size = 27631889, upload-time = "2026-01-18T16:17:56.55Z" }, - { url = "https://files.pythonhosted.org/packages/97/bb/15aec78bcf43a0c004067bd33eb5352836a29a49db8581fc56f2b6ca88b7/pyarrow-23.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:20b187ed9550d233a872074159f765f52f9d92973191cd4b93f293a19efbe377", size = 34213265, upload-time = "2026-01-18T16:18:07.904Z" }, - { url = "https://files.pythonhosted.org/packages/f6/6c/deb2c594bbba41c37c5d9aa82f510376998352aa69dfcb886cb4b18ad80f/pyarrow-23.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:18ec84e839b493c3886b9b5e06861962ab4adfaeb79b81c76afbd8d84c7d5fda", size = 35819211, upload-time = "2026-01-18T16:18:13.94Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e5/ee82af693cb7b5b2b74f6524cdfede0e6ace779d7720ebca24d68b57c36b/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e438dd3f33894e34fd02b26bd12a32d30d006f5852315f611aa4add6c7fab4bc", size = 44502313, upload-time = "2026-01-18T16:18:20.367Z" }, - { url = "https://files.pythonhosted.org/packages/9c/86/95c61ad82236495f3c31987e85135926ba3ec7f3819296b70a68d8066b49/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:a244279f240c81f135631be91146d7fa0e9e840e1dfed2aba8483eba25cd98e6", size = 47585886, upload-time = "2026-01-18T16:18:27.544Z" }, - { url = "https://files.pythonhosted.org/packages/bb/6e/a72d901f305201802f016d015de1e05def7706fff68a1dedefef5dc7eff7/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c4692e83e42438dba512a570c6eaa42be2f8b6c0f492aea27dec54bdc495103a", size = 48207055, upload-time = "2026-01-18T16:18:35.425Z" }, - { url = "https://files.pythonhosted.org/packages/f9/e5/5de029c537630ca18828db45c30e2a78da03675a70ac6c3528203c416fe3/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae7f30f898dfe44ea69654a35c93e8da4cef6606dc4c72394068fd95f8e9f54a", size = 50619812, upload-time = "2026-01-18T16:18:43.553Z" }, - { url = "https://files.pythonhosted.org/packages/59/8d/2af846cd2412e67a087f5bda4a8e23dfd4ebd570f777db2e8686615dafc1/pyarrow-23.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:5b86bb649e4112fb0614294b7d0a175c7513738876b89655605ebb87c804f861", size = 28263851, upload-time = "2026-01-18T16:19:38.567Z" }, - { url = "https://files.pythonhosted.org/packages/7b/7f/caab863e587041156f6786c52e64151b7386742c8c27140f637176e9230e/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ebc017d765d71d80a3f8584ca0566b53e40464586585ac64176115baa0ada7d3", size = 34463240, upload-time = "2026-01-18T16:18:49.755Z" }, - { url = "https://files.pythonhosted.org/packages/c9/fa/3a5b8c86c958e83622b40865e11af0857c48ec763c11d472c87cd518283d/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:0800cc58a6d17d159df823f87ad66cefebf105b982493d4bad03ee7fab84b993", size = 35935712, upload-time = "2026-01-18T16:18:55.626Z" }, - { url = "https://files.pythonhosted.org/packages/c5/08/17a62078fc1a53decb34a9aa79cf9009efc74d63d2422e5ade9fed2f99e3/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3a7c68c722da9bb5b0f8c10e3eae71d9825a4b429b40b32709df5d1fa55beb3d", size = 44503523, upload-time = "2026-01-18T16:19:03.958Z" }, - { url = "https://files.pythonhosted.org/packages/cc/70/84d45c74341e798aae0323d33b7c39194e23b1abc439ceaf60a68a7a969a/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:bd5556c24622df90551063ea41f559b714aa63ca953db884cfb958559087a14e", size = 47542490, upload-time = "2026-01-18T16:19:11.208Z" }, - { url = "https://files.pythonhosted.org/packages/61/d9/d1274b0e6f19e235de17441e53224f4716574b2ca837022d55702f24d71d/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54810f6e6afc4ffee7c2e0051b61722fbea9a4961b46192dcfae8ea12fa09059", size = 48233605, upload-time = "2026-01-18T16:19:19.544Z" }, - { url = "https://files.pythonhosted.org/packages/39/07/e4e2d568cb57543d84482f61e510732820cddb0f47c4bb7df629abfed852/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:14de7d48052cf4b0ed174533eafa3cfe0711b8076ad70bede32cf59f744f0d7c", size = 50603979, upload-time = "2026-01-18T16:19:26.717Z" }, - { url = "https://files.pythonhosted.org/packages/72/9c/47693463894b610f8439b2e970b82ef81e9599c757bf2049365e40ff963c/pyarrow-23.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:427deac1f535830a744a4f04a6ac183a64fcac4341b3f618e693c41b7b98d2b0", size = 28338905, upload-time = "2026-01-18T16:19:32.93Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/01/33/ffd9c3eb087fa41dd79c3cf20c4c0ae3cdb877c4f8e1107a446006344924/pyarrow-23.0.0.tar.gz", hash = "sha256:180e3150e7edfcd182d3d9afba72f7cf19839a497cc76555a8dce998a8f67615", size = 1167185 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/2f/23e042a5aa99bcb15e794e14030e8d065e00827e846e53a66faec73c7cd6/pyarrow-23.0.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:cbdc2bf5947aa4d462adcf8453cf04aee2f7932653cb67a27acd96e5e8528a67", size = 34281861 }, + { url = "https://files.pythonhosted.org/packages/8b/65/1651933f504b335ec9cd8f99463718421eb08d883ed84f0abd2835a16cad/pyarrow-23.0.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:4d38c836930ce15cd31dce20114b21ba082da231c884bdc0a7b53e1477fe7f07", size = 35825067 }, + { url = "https://files.pythonhosted.org/packages/84/ec/d6fceaec050c893f4e35c0556b77d4cc9973fcc24b0a358a5781b1234582/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:4222ff8f76919ecf6c716175a0e5fddb5599faeed4c56d9ea41a2c42be4998b2", size = 44458539 }, + { url = "https://files.pythonhosted.org/packages/fd/d9/369f134d652b21db62fe3ec1c5c2357e695f79eb67394b8a93f3a2b2cffa/pyarrow-23.0.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:87f06159cbe38125852657716889296c83c37b4d09a5e58f3d10245fd1f69795", size = 47535889 }, + { url = "https://files.pythonhosted.org/packages/a3/95/f37b6a252fdbf247a67a78fb3f61a529fe0600e304c4d07741763d3522b1/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1675c374570d8b91ea6d4edd4608fa55951acd44e0c31bd146e091b4005de24f", size = 48157777 }, + { url = "https://files.pythonhosted.org/packages/ab/ab/fb94923108c9c6415dab677cf1f066d3307798eafc03f9a65ab4abc61056/pyarrow-23.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:247374428fde4f668f138b04031a7e7077ba5fa0b5b1722fdf89a017bf0b7ee0", size = 50580441 }, + { url = "https://files.pythonhosted.org/packages/ae/78/897ba6337b517fc8e914891e1bd918da1c4eb8e936a553e95862e67b80f6/pyarrow-23.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:de53b1bd3b88a2ee93c9af412c903e57e738c083be4f6392288294513cd8b2c1", size = 27530028 }, + { url = "https://files.pythonhosted.org/packages/aa/c0/57fe251102ca834fee0ef69a84ad33cc0ff9d5dfc50f50b466846356ecd7/pyarrow-23.0.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:5574d541923efcbfdf1294a2746ae3b8c2498a2dc6cd477882f6f4e7b1ac08d3", size = 34276762 }, + { url = "https://files.pythonhosted.org/packages/f8/4e/24130286548a5bc250cbed0b6bbf289a2775378a6e0e6f086ae8c68fc098/pyarrow-23.0.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:2ef0075c2488932e9d3c2eb3482f9459c4be629aa673b725d5e3cf18f777f8e4", size = 35821420 }, + { url = "https://files.pythonhosted.org/packages/ee/55/a869e8529d487aa2e842d6c8865eb1e2c9ec33ce2786eb91104d2c3e3f10/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:65666fc269669af1ef1c14478c52222a2aa5c907f28b68fb50a203c777e4f60c", size = 44457412 }, + { url = "https://files.pythonhosted.org/packages/36/81/1de4f0edfa9a483bbdf0082a05790bd6a20ed2169ea12a65039753be3a01/pyarrow-23.0.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:4d85cb6177198f3812db4788e394b757223f60d9a9f5ad6634b3e32be1525803", size = 47534285 }, + { url = "https://files.pythonhosted.org/packages/f2/04/464a052d673b5ece074518f27377861662449f3c1fdb39ce740d646fd098/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1a9ff6fa4141c24a03a1a434c63c8fa97ce70f8f36bccabc18ebba905ddf0f17", size = 48157913 }, + { url = "https://files.pythonhosted.org/packages/f4/1b/32a4de9856ee6688c670ca2def588382e573cce45241a965af04c2f61687/pyarrow-23.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:84839d060a54ae734eb60a756aeacb62885244aaa282f3c968f5972ecc7b1ecc", size = 50582529 }, + { url = "https://files.pythonhosted.org/packages/db/c7/d6581f03e9b9e44ea60b52d1750ee1a7678c484c06f939f45365a45f7eef/pyarrow-23.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:a149a647dbfe928ce8830a713612aa0b16e22c64feac9d1761529778e4d4eaa5", size = 27542646 }, + { url = "https://files.pythonhosted.org/packages/3d/bd/c861d020831ee57609b73ea721a617985ece817684dc82415b0bc3e03ac3/pyarrow-23.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5961a9f646c232697c24f54d3419e69b4261ba8a8b66b0ac54a1851faffcbab8", size = 34189116 }, + { url = "https://files.pythonhosted.org/packages/8c/23/7725ad6cdcbaf6346221391e7b3eecd113684c805b0a95f32014e6fa0736/pyarrow-23.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:632b3e7c3d232f41d64e1a4a043fb82d44f8a349f339a1188c6a0dd9d2d47d8a", size = 35803831 }, + { url = "https://files.pythonhosted.org/packages/57/06/684a421543455cdc2944d6a0c2cc3425b028a4c6b90e34b35580c4899743/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:76242c846db1411f1d6c2cc3823be6b86b40567ee24493344f8226ba34a81333", size = 44436452 }, + { url = "https://files.pythonhosted.org/packages/c6/6f/8f9eb40c2328d66e8b097777ddcf38494115ff9f1b5bc9754ba46991191e/pyarrow-23.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b73519f8b52ae28127000986bf228fda781e81d3095cd2d3ece76eb5cf760e1b", size = 47557396 }, + { url = "https://files.pythonhosted.org/packages/10/6e/f08075f1472e5159553501fde2cc7bc6700944bdabe49a03f8a035ee6ccd/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:068701f6823449b1b6469120f399a1239766b117d211c5d2519d4ed5861f75de", size = 48147129 }, + { url = "https://files.pythonhosted.org/packages/7d/82/d5a680cd507deed62d141cc7f07f7944a6766fc51019f7f118e4d8ad0fb8/pyarrow-23.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1801ba947015d10e23bca9dd6ef5d0e9064a81569a89b6e9a63b59224fd060df", size = 50596642 }, + { url = "https://files.pythonhosted.org/packages/a9/26/4f29c61b3dce9fa7780303b86895ec6a0917c9af927101daaaf118fbe462/pyarrow-23.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:52265266201ec25b6839bf6bd4ea918ca6d50f31d13e1cf200b4261cd11dc25c", size = 27660628 }, + { url = "https://files.pythonhosted.org/packages/66/34/564db447d083ec7ff93e0a883a597d2f214e552823bfc178a2d0b1f2c257/pyarrow-23.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:ad96a597547af7827342ffb3c503c8316e5043bb09b47a84885ce39394c96e00", size = 34184630 }, + { url = "https://files.pythonhosted.org/packages/aa/3a/3999daebcb5e6119690c92a621c4d78eef2ffba7a0a1b56386d2875fcd77/pyarrow-23.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:b9edf990df77c2901e79608f08c13fbde60202334a4fcadb15c1f57bf7afee43", size = 35796820 }, + { url = "https://files.pythonhosted.org/packages/ec/ee/39195233056c6a8d0976d7d1ac1cd4fe21fb0ec534eca76bc23ef3f60e11/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:36d1b5bc6ddcaff0083ceec7e2561ed61a51f49cce8be079ee8ed406acb6fdef", size = 44438735 }, + { url = "https://files.pythonhosted.org/packages/2c/41/6a7328ee493527e7afc0c88d105ecca69a3580e29f2faaeac29308369fd7/pyarrow-23.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4292b889cd224f403304ddda8b63a36e60f92911f89927ec8d98021845ea21be", size = 47557263 }, + { url = "https://files.pythonhosted.org/packages/c6/ee/34e95b21ee84db494eae60083ddb4383477b31fb1fd19fd866d794881696/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:dfd9e133e60eaa847fd80530a1b89a052f09f695d0b9c34c235ea6b2e0924cf7", size = 48153529 }, + { url = "https://files.pythonhosted.org/packages/52/88/8a8d83cea30f4563efa1b7bf51d241331ee5cd1b185a7e063f5634eca415/pyarrow-23.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:832141cc09fac6aab1cd3719951d23301396968de87080c57c9a7634e0ecd068", size = 50598851 }, + { url = "https://files.pythonhosted.org/packages/c6/4c/2929c4be88723ba025e7b3453047dc67e491c9422965c141d24bab6b5962/pyarrow-23.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:7a7d067c9a88faca655c71bcc30ee2782038d59c802d57950826a07f60d83c4c", size = 27577747 }, + { url = "https://files.pythonhosted.org/packages/64/52/564a61b0b82d72bd68ec3aef1adda1e3eba776f89134b9ebcb5af4b13cb6/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:ce9486e0535a843cf85d990e2ec5820a47918235183a5c7b8b97ed7e92c2d47d", size = 34446038 }, + { url = "https://files.pythonhosted.org/packages/cc/c9/232d4f9855fd1de0067c8a7808a363230d223c83aeee75e0fe6eab851ba9/pyarrow-23.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:075c29aeaa685fd1182992a9ed2499c66f084ee54eea47da3eb76e125e06064c", size = 35921142 }, + { url = "https://files.pythonhosted.org/packages/96/f2/60af606a3748367b906bb82d41f0032e059f075444445d47e32a7ff1df62/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:799965a5379589510d888be3094c2296efd186a17ca1cef5b77703d4d5121f53", size = 44490374 }, + { url = "https://files.pythonhosted.org/packages/ff/2d/7731543050a678ea3a413955a2d5d80d2a642f270aa57a3cb7d5a86e3f46/pyarrow-23.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:ef7cac8fe6fccd8b9e7617bfac785b0371a7fe26af59463074e4882747145d40", size = 47527896 }, + { url = "https://files.pythonhosted.org/packages/5a/90/f3342553b7ac9879413aed46500f1637296f3c8222107523a43a1c08b42a/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:15a414f710dc927132dd67c361f78c194447479555af57317066ee5116b90e9e", size = 48210401 }, + { url = "https://files.pythonhosted.org/packages/f3/da/9862ade205ecc46c172b6ce5038a74b5151c7401e36255f15975a45878b2/pyarrow-23.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:3e0d2e6915eca7d786be6a77bf227fbc06d825a75b5b5fe9bcbef121dec32685", size = 50579677 }, + { url = "https://files.pythonhosted.org/packages/c2/4c/f11f371f5d4740a5dafc2e11c76bcf42d03dfdb2d68696da97de420b6963/pyarrow-23.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:4b317ea6e800b5704e5e5929acb6e2dc13e9276b708ea97a39eb8b345aa2658b", size = 27631889 }, + { url = "https://files.pythonhosted.org/packages/97/bb/15aec78bcf43a0c004067bd33eb5352836a29a49db8581fc56f2b6ca88b7/pyarrow-23.0.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:20b187ed9550d233a872074159f765f52f9d92973191cd4b93f293a19efbe377", size = 34213265 }, + { url = "https://files.pythonhosted.org/packages/f6/6c/deb2c594bbba41c37c5d9aa82f510376998352aa69dfcb886cb4b18ad80f/pyarrow-23.0.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:18ec84e839b493c3886b9b5e06861962ab4adfaeb79b81c76afbd8d84c7d5fda", size = 35819211 }, + { url = "https://files.pythonhosted.org/packages/e0/e5/ee82af693cb7b5b2b74f6524cdfede0e6ace779d7720ebca24d68b57c36b/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:e438dd3f33894e34fd02b26bd12a32d30d006f5852315f611aa4add6c7fab4bc", size = 44502313 }, + { url = "https://files.pythonhosted.org/packages/9c/86/95c61ad82236495f3c31987e85135926ba3ec7f3819296b70a68d8066b49/pyarrow-23.0.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:a244279f240c81f135631be91146d7fa0e9e840e1dfed2aba8483eba25cd98e6", size = 47585886 }, + { url = "https://files.pythonhosted.org/packages/bb/6e/a72d901f305201802f016d015de1e05def7706fff68a1dedefef5dc7eff7/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c4692e83e42438dba512a570c6eaa42be2f8b6c0f492aea27dec54bdc495103a", size = 48207055 }, + { url = "https://files.pythonhosted.org/packages/f9/e5/5de029c537630ca18828db45c30e2a78da03675a70ac6c3528203c416fe3/pyarrow-23.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ae7f30f898dfe44ea69654a35c93e8da4cef6606dc4c72394068fd95f8e9f54a", size = 50619812 }, + { url = "https://files.pythonhosted.org/packages/59/8d/2af846cd2412e67a087f5bda4a8e23dfd4ebd570f777db2e8686615dafc1/pyarrow-23.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:5b86bb649e4112fb0614294b7d0a175c7513738876b89655605ebb87c804f861", size = 28263851 }, + { url = "https://files.pythonhosted.org/packages/7b/7f/caab863e587041156f6786c52e64151b7386742c8c27140f637176e9230e/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:ebc017d765d71d80a3f8584ca0566b53e40464586585ac64176115baa0ada7d3", size = 34463240 }, + { url = "https://files.pythonhosted.org/packages/c9/fa/3a5b8c86c958e83622b40865e11af0857c48ec763c11d472c87cd518283d/pyarrow-23.0.0-cp314-cp314t-macosx_12_0_x86_64.whl", hash = "sha256:0800cc58a6d17d159df823f87ad66cefebf105b982493d4bad03ee7fab84b993", size = 35935712 }, + { url = "https://files.pythonhosted.org/packages/c5/08/17a62078fc1a53decb34a9aa79cf9009efc74d63d2422e5ade9fed2f99e3/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:3a7c68c722da9bb5b0f8c10e3eae71d9825a4b429b40b32709df5d1fa55beb3d", size = 44503523 }, + { url = "https://files.pythonhosted.org/packages/cc/70/84d45c74341e798aae0323d33b7c39194e23b1abc439ceaf60a68a7a969a/pyarrow-23.0.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:bd5556c24622df90551063ea41f559b714aa63ca953db884cfb958559087a14e", size = 47542490 }, + { url = "https://files.pythonhosted.org/packages/61/d9/d1274b0e6f19e235de17441e53224f4716574b2ca837022d55702f24d71d/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54810f6e6afc4ffee7c2e0051b61722fbea9a4961b46192dcfae8ea12fa09059", size = 48233605 }, + { url = "https://files.pythonhosted.org/packages/39/07/e4e2d568cb57543d84482f61e510732820cddb0f47c4bb7df629abfed852/pyarrow-23.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:14de7d48052cf4b0ed174533eafa3cfe0711b8076ad70bede32cf59f744f0d7c", size = 50603979 }, + { url = "https://files.pythonhosted.org/packages/72/9c/47693463894b610f8439b2e970b82ef81e9599c757bf2049365e40ff963c/pyarrow-23.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:427deac1f535830a744a4f04a6ac183a64fcac4341b3f618e693c41b7b98d2b0", size = 28338905 }, ] [[package]] name = "pycparser" version = "3.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492 } wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172 }, ] [[package]] name = "pydantic" version = "2.12.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "annotated-types" }, { name = "pydantic-core" }, { name = "typing-extensions" }, { name = "typing-inspection" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591, upload-time = "2025-11-26T15:11:46.471Z" } +sdist = { url = "https://files.pythonhosted.org/packages/69/44/36f1a6e523abc58ae5f928898e4aca2e0ea509b5aa6f6f392a5d882be928/pydantic-2.12.5.tar.gz", hash = "sha256:4d351024c75c0f085a9febbb665ce8c0c6ec5d30e903bdb6394b7ede26aebb49", size = 821591 } wheels = [ - { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580, upload-time = "2025-11-26T15:11:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/5a/87/b70ad306ebb6f9b585f114d0ac2137d792b48be34d732d60e597c2f8465a/pydantic-2.12.5-py3-none-any.whl", hash = "sha256:e561593fccf61e8a20fc46dfc2dfe075b8be7d0188df33f221ad1f0139180f9d", size = 463580 }, ] [[package]] name = "pydantic-core" version = "2.41.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952, upload-time = "2025-11-04T13:43:49.098Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298, upload-time = "2025-11-04T13:39:04.116Z" }, - { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475, upload-time = "2025-11-04T13:39:06.055Z" }, - { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815, upload-time = "2025-11-04T13:39:10.41Z" }, - { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567, upload-time = "2025-11-04T13:39:12.244Z" }, - { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442, upload-time = "2025-11-04T13:39:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956, upload-time = "2025-11-04T13:39:15.889Z" }, - { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253, upload-time = "2025-11-04T13:39:17.403Z" }, - { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050, upload-time = "2025-11-04T13:39:19.351Z" }, - { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178, upload-time = "2025-11-04T13:39:21Z" }, - { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833, upload-time = "2025-11-04T13:39:22.606Z" }, - { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156, upload-time = "2025-11-04T13:39:25.843Z" }, - { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378, upload-time = "2025-11-04T13:39:27.92Z" }, - { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622, upload-time = "2025-11-04T13:39:29.848Z" }, - { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873, upload-time = "2025-11-04T13:39:31.373Z" }, - { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826, upload-time = "2025-11-04T13:39:32.897Z" }, - { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869, upload-time = "2025-11-04T13:39:34.469Z" }, - { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890, upload-time = "2025-11-04T13:39:36.053Z" }, - { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740, upload-time = "2025-11-04T13:39:37.753Z" }, - { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021, upload-time = "2025-11-04T13:39:40.94Z" }, - { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378, upload-time = "2025-11-04T13:39:42.523Z" }, - { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761, upload-time = "2025-11-04T13:39:44.553Z" }, - { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303, upload-time = "2025-11-04T13:39:46.238Z" }, - { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355, upload-time = "2025-11-04T13:39:48.002Z" }, - { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875, upload-time = "2025-11-04T13:39:49.705Z" }, - { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549, upload-time = "2025-11-04T13:39:51.842Z" }, - { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305, upload-time = "2025-11-04T13:39:53.485Z" }, - { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902, upload-time = "2025-11-04T13:39:56.488Z" }, - { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990, upload-time = "2025-11-04T13:39:58.079Z" }, - { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003, upload-time = "2025-11-04T13:39:59.956Z" }, - { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200, upload-time = "2025-11-04T13:40:02.241Z" }, - { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578, upload-time = "2025-11-04T13:40:04.401Z" }, - { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504, upload-time = "2025-11-04T13:40:06.072Z" }, - { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816, upload-time = "2025-11-04T13:40:07.835Z" }, - { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366, upload-time = "2025-11-04T13:40:09.804Z" }, - { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698, upload-time = "2025-11-04T13:40:12.004Z" }, - { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603, upload-time = "2025-11-04T13:40:13.868Z" }, - { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591, upload-time = "2025-11-04T13:40:15.672Z" }, - { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068, upload-time = "2025-11-04T13:40:17.532Z" }, - { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908, upload-time = "2025-11-04T13:40:19.309Z" }, - { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145, upload-time = "2025-11-04T13:40:21.548Z" }, - { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179, upload-time = "2025-11-04T13:40:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403, upload-time = "2025-11-04T13:40:25.248Z" }, - { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206, upload-time = "2025-11-04T13:40:27.099Z" }, - { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307, upload-time = "2025-11-04T13:40:29.806Z" }, - { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258, upload-time = "2025-11-04T13:40:33.544Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917, upload-time = "2025-11-04T13:40:35.479Z" }, - { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186, upload-time = "2025-11-04T13:40:37.436Z" }, - { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164, upload-time = "2025-11-04T13:40:40.289Z" }, - { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146, upload-time = "2025-11-04T13:40:42.809Z" }, - { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788, upload-time = "2025-11-04T13:40:44.752Z" }, - { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133, upload-time = "2025-11-04T13:40:46.66Z" }, - { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852, upload-time = "2025-11-04T13:40:48.575Z" }, - { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679, upload-time = "2025-11-04T13:40:50.619Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766, upload-time = "2025-11-04T13:40:52.631Z" }, - { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005, upload-time = "2025-11-04T13:40:54.734Z" }, - { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622, upload-time = "2025-11-04T13:40:56.68Z" }, - { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725, upload-time = "2025-11-04T13:40:58.807Z" }, - { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040, upload-time = "2025-11-04T13:41:00.853Z" }, - { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691, upload-time = "2025-11-04T13:41:03.504Z" }, - { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897, upload-time = "2025-11-04T13:41:05.804Z" }, - { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302, upload-time = "2025-11-04T13:41:07.809Z" }, - { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877, upload-time = "2025-11-04T13:41:09.827Z" }, - { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680, upload-time = "2025-11-04T13:41:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960, upload-time = "2025-11-04T13:41:14.627Z" }, - { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102, upload-time = "2025-11-04T13:41:16.868Z" }, - { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039, upload-time = "2025-11-04T13:41:18.934Z" }, - { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126, upload-time = "2025-11-04T13:41:21.418Z" }, - { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489, upload-time = "2025-11-04T13:41:24.076Z" }, - { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288, upload-time = "2025-11-04T13:41:26.33Z" }, - { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255, upload-time = "2025-11-04T13:41:28.569Z" }, - { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760, upload-time = "2025-11-04T13:41:31.055Z" }, - { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092, upload-time = "2025-11-04T13:41:33.21Z" }, - { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385, upload-time = "2025-11-04T13:41:35.508Z" }, - { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832, upload-time = "2025-11-04T13:41:37.732Z" }, - { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585, upload-time = "2025-11-04T13:41:40Z" }, - { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078, upload-time = "2025-11-04T13:41:42.323Z" }, - { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914, upload-time = "2025-11-04T13:41:45.221Z" }, - { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560, upload-time = "2025-11-04T13:41:47.474Z" }, - { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244, upload-time = "2025-11-04T13:41:49.992Z" }, - { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955, upload-time = "2025-11-04T13:41:54.079Z" }, - { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906, upload-time = "2025-11-04T13:41:56.606Z" }, - { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607, upload-time = "2025-11-04T13:41:58.889Z" }, - { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769, upload-time = "2025-11-04T13:42:01.186Z" }, - { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441, upload-time = "2025-11-04T13:42:39.557Z" }, - { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291, upload-time = "2025-11-04T13:42:42.169Z" }, - { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632, upload-time = "2025-11-04T13:42:44.564Z" }, - { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905, upload-time = "2025-11-04T13:42:47.156Z" }, - { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495, upload-time = "2025-11-04T13:42:49.689Z" }, - { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388, upload-time = "2025-11-04T13:42:52.215Z" }, - { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879, upload-time = "2025-11-04T13:42:56.483Z" }, - { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017, upload-time = "2025-11-04T13:42:59.471Z" }, - { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351, upload-time = "2025-11-04T13:43:02.058Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363, upload-time = "2025-11-04T13:43:05.159Z" }, - { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615, upload-time = "2025-11-04T13:43:08.116Z" }, - { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369, upload-time = "2025-11-04T13:43:12.49Z" }, - { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218, upload-time = "2025-11-04T13:43:15.431Z" }, - { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951, upload-time = "2025-11-04T13:43:18.062Z" }, - { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428, upload-time = "2025-11-04T13:43:20.679Z" }, - { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009, upload-time = "2025-11-04T13:43:23.286Z" }, - { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980, upload-time = "2025-11-04T13:43:25.97Z" }, - { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865, upload-time = "2025-11-04T13:43:28.763Z" }, - { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256, upload-time = "2025-11-04T13:43:31.71Z" }, - { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762, upload-time = "2025-11-04T13:43:34.744Z" }, - { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141, upload-time = "2025-11-04T13:43:37.701Z" }, - { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317, upload-time = "2025-11-04T13:43:40.406Z" }, - { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992, upload-time = "2025-11-04T13:43:43.602Z" }, - { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302, upload-time = "2025-11-04T13:43:46.64Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/71/70/23b021c950c2addd24ec408e9ab05d59b035b39d97cdc1130e1bce647bb6/pydantic_core-2.41.5.tar.gz", hash = "sha256:08daa51ea16ad373ffd5e7606252cc32f07bc72b28284b6bc9c6df804816476e", size = 460952 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c6/90/32c9941e728d564b411d574d8ee0cf09b12ec978cb22b294995bae5549a5/pydantic_core-2.41.5-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77b63866ca88d804225eaa4af3e664c5faf3568cea95360d21f4725ab6e07146", size = 2107298 }, + { url = "https://files.pythonhosted.org/packages/fb/a8/61c96a77fe28993d9a6fb0f4127e05430a267b235a124545d79fea46dd65/pydantic_core-2.41.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dfa8a0c812ac681395907e71e1274819dec685fec28273a28905df579ef137e2", size = 1901475 }, + { url = "https://files.pythonhosted.org/packages/5d/b6/338abf60225acc18cdc08b4faef592d0310923d19a87fba1faf05af5346e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5921a4d3ca3aee735d9fd163808f5e8dd6c6972101e4adbda9a4667908849b97", size = 1918815 }, + { url = "https://files.pythonhosted.org/packages/d1/1c/2ed0433e682983d8e8cba9c8d8ef274d4791ec6a6f24c58935b90e780e0a/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e25c479382d26a2a41b7ebea1043564a937db462816ea07afa8a44c0866d52f9", size = 2065567 }, + { url = "https://files.pythonhosted.org/packages/b3/24/cf84974ee7d6eae06b9e63289b7b8f6549d416b5c199ca2d7ce13bbcf619/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f547144f2966e1e16ae626d8ce72b4cfa0caedc7fa28052001c94fb2fcaa1c52", size = 2230442 }, + { url = "https://files.pythonhosted.org/packages/fd/21/4e287865504b3edc0136c89c9c09431be326168b1eb7841911cbc877a995/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f52298fbd394f9ed112d56f3d11aabd0d5bd27beb3084cc3d8ad069483b8941", size = 2350956 }, + { url = "https://files.pythonhosted.org/packages/a8/76/7727ef2ffa4b62fcab916686a68a0426b9b790139720e1934e8ba797e238/pydantic_core-2.41.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:100baa204bb412b74fe285fb0f3a385256dad1d1879f0a5cb1499ed2e83d132a", size = 2068253 }, + { url = "https://files.pythonhosted.org/packages/d5/8c/a4abfc79604bcb4c748e18975c44f94f756f08fb04218d5cb87eb0d3a63e/pydantic_core-2.41.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:05a2c8852530ad2812cb7914dc61a1125dc4e06252ee98e5638a12da6cc6fb6c", size = 2177050 }, + { url = "https://files.pythonhosted.org/packages/67/b1/de2e9a9a79b480f9cb0b6e8b6ba4c50b18d4e89852426364c66aa82bb7b3/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:29452c56df2ed968d18d7e21f4ab0ac55e71dc59524872f6fc57dcf4a3249ed2", size = 2147178 }, + { url = "https://files.pythonhosted.org/packages/16/c1/dfb33f837a47b20417500efaa0378adc6635b3c79e8369ff7a03c494b4ac/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:d5160812ea7a8a2ffbe233d8da666880cad0cbaf5d4de74ae15c313213d62556", size = 2341833 }, + { url = "https://files.pythonhosted.org/packages/47/36/00f398642a0f4b815a9a558c4f1dca1b4020a7d49562807d7bc9ff279a6c/pydantic_core-2.41.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:df3959765b553b9440adfd3c795617c352154e497a4eaf3752555cfb5da8fc49", size = 2321156 }, + { url = "https://files.pythonhosted.org/packages/7e/70/cad3acd89fde2010807354d978725ae111ddf6d0ea46d1ea1775b5c1bd0c/pydantic_core-2.41.5-cp310-cp310-win32.whl", hash = "sha256:1f8d33a7f4d5a7889e60dc39856d76d09333d8a6ed0f5f1190635cbec70ec4ba", size = 1989378 }, + { url = "https://files.pythonhosted.org/packages/76/92/d338652464c6c367e5608e4488201702cd1cbb0f33f7b6a85a60fe5f3720/pydantic_core-2.41.5-cp310-cp310-win_amd64.whl", hash = "sha256:62de39db01b8d593e45871af2af9e497295db8d73b085f6bfd0b18c83c70a8f9", size = 2013622 }, + { url = "https://files.pythonhosted.org/packages/e8/72/74a989dd9f2084b3d9530b0915fdda64ac48831c30dbf7c72a41a5232db8/pydantic_core-2.41.5-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a3a52f6156e73e7ccb0f8cced536adccb7042be67cb45f9562e12b319c119da6", size = 2105873 }, + { url = "https://files.pythonhosted.org/packages/12/44/37e403fd9455708b3b942949e1d7febc02167662bf1a7da5b78ee1ea2842/pydantic_core-2.41.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7f3bf998340c6d4b0c9a2f02d6a400e51f123b59565d74dc60d252ce888c260b", size = 1899826 }, + { url = "https://files.pythonhosted.org/packages/33/7f/1d5cab3ccf44c1935a359d51a8a2a9e1a654b744b5e7f80d41b88d501eec/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:378bec5c66998815d224c9ca994f1e14c0c21cb95d2f52b6021cc0b2a58f2a5a", size = 1917869 }, + { url = "https://files.pythonhosted.org/packages/6e/6a/30d94a9674a7fe4f4744052ed6c5e083424510be1e93da5bc47569d11810/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e7b576130c69225432866fe2f4a469a85a54ade141d96fd396dffcf607b558f8", size = 2063890 }, + { url = "https://files.pythonhosted.org/packages/50/be/76e5d46203fcb2750e542f32e6c371ffa9b8ad17364cf94bb0818dbfb50c/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6cb58b9c66f7e4179a2d5e0f849c48eff5c1fca560994d6eb6543abf955a149e", size = 2229740 }, + { url = "https://files.pythonhosted.org/packages/d3/ee/fed784df0144793489f87db310a6bbf8118d7b630ed07aa180d6067e653a/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:88942d3a3dff3afc8288c21e565e476fc278902ae4d6d134f1eeda118cc830b1", size = 2350021 }, + { url = "https://files.pythonhosted.org/packages/c8/be/8fed28dd0a180dca19e72c233cbf58efa36df055e5b9d90d64fd1740b828/pydantic_core-2.41.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f31d95a179f8d64d90f6831d71fa93290893a33148d890ba15de25642c5d075b", size = 2066378 }, + { url = "https://files.pythonhosted.org/packages/b0/3b/698cf8ae1d536a010e05121b4958b1257f0b5522085e335360e53a6b1c8b/pydantic_core-2.41.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c1df3d34aced70add6f867a8cf413e299177e0c22660cc767218373d0779487b", size = 2175761 }, + { url = "https://files.pythonhosted.org/packages/b8/ba/15d537423939553116dea94ce02f9c31be0fa9d0b806d427e0308ec17145/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4009935984bd36bd2c774e13f9a09563ce8de4abaa7226f5108262fa3e637284", size = 2146303 }, + { url = "https://files.pythonhosted.org/packages/58/7f/0de669bf37d206723795f9c90c82966726a2ab06c336deba4735b55af431/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:34a64bc3441dc1213096a20fe27e8e128bd3ff89921706e83c0b1ac971276594", size = 2340355 }, + { url = "https://files.pythonhosted.org/packages/e5/de/e7482c435b83d7e3c3ee5ee4451f6e8973cff0eb6007d2872ce6383f6398/pydantic_core-2.41.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:c9e19dd6e28fdcaa5a1de679aec4141f691023916427ef9bae8584f9c2fb3b0e", size = 2319875 }, + { url = "https://files.pythonhosted.org/packages/fe/e6/8c9e81bb6dd7560e33b9053351c29f30c8194b72f2d6932888581f503482/pydantic_core-2.41.5-cp311-cp311-win32.whl", hash = "sha256:2c010c6ded393148374c0f6f0bf89d206bf3217f201faa0635dcd56bd1520f6b", size = 1987549 }, + { url = "https://files.pythonhosted.org/packages/11/66/f14d1d978ea94d1bc21fc98fcf570f9542fe55bfcc40269d4e1a21c19bf7/pydantic_core-2.41.5-cp311-cp311-win_amd64.whl", hash = "sha256:76ee27c6e9c7f16f47db7a94157112a2f3a00e958bc626e2f4ee8bec5c328fbe", size = 2011305 }, + { url = "https://files.pythonhosted.org/packages/56/d8/0e271434e8efd03186c5386671328154ee349ff0354d83c74f5caaf096ed/pydantic_core-2.41.5-cp311-cp311-win_arm64.whl", hash = "sha256:4bc36bbc0b7584de96561184ad7f012478987882ebf9f9c389b23f432ea3d90f", size = 1972902 }, + { url = "https://files.pythonhosted.org/packages/5f/5d/5f6c63eebb5afee93bcaae4ce9a898f3373ca23df3ccaef086d0233a35a7/pydantic_core-2.41.5-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f41a7489d32336dbf2199c8c0a215390a751c5b014c2c1c5366e817202e9cdf7", size = 2110990 }, + { url = "https://files.pythonhosted.org/packages/aa/32/9c2e8ccb57c01111e0fd091f236c7b371c1bccea0fa85247ac55b1e2b6b6/pydantic_core-2.41.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:070259a8818988b9a84a449a2a7337c7f430a22acc0859c6b110aa7212a6d9c0", size = 1896003 }, + { url = "https://files.pythonhosted.org/packages/68/b8/a01b53cb0e59139fbc9e4fda3e9724ede8de279097179be4ff31f1abb65a/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e96cea19e34778f8d59fe40775a7a574d95816eb150850a85a7a4c8f4b94ac69", size = 1919200 }, + { url = "https://files.pythonhosted.org/packages/38/de/8c36b5198a29bdaade07b5985e80a233a5ac27137846f3bc2d3b40a47360/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ed2e99c456e3fadd05c991f8f437ef902e00eedf34320ba2b0842bd1c3ca3a75", size = 2052578 }, + { url = "https://files.pythonhosted.org/packages/00/b5/0e8e4b5b081eac6cb3dbb7e60a65907549a1ce035a724368c330112adfdd/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:65840751b72fbfd82c3c640cff9284545342a4f1eb1586ad0636955b261b0b05", size = 2208504 }, + { url = "https://files.pythonhosted.org/packages/77/56/87a61aad59c7c5b9dc8caad5a41a5545cba3810c3e828708b3d7404f6cef/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e536c98a7626a98feb2d3eaf75944ef6f3dbee447e1f841eae16f2f0a72d8ddc", size = 2335816 }, + { url = "https://files.pythonhosted.org/packages/0d/76/941cc9f73529988688a665a5c0ecff1112b3d95ab48f81db5f7606f522d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eceb81a8d74f9267ef4081e246ffd6d129da5d87e37a77c9bde550cb04870c1c", size = 2075366 }, + { url = "https://files.pythonhosted.org/packages/d3/43/ebef01f69baa07a482844faaa0a591bad1ef129253ffd0cdaa9d8a7f72d3/pydantic_core-2.41.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d38548150c39b74aeeb0ce8ee1d8e82696f4a4e16ddc6de7b1d8823f7de4b9b5", size = 2171698 }, + { url = "https://files.pythonhosted.org/packages/b1/87/41f3202e4193e3bacfc2c065fab7706ebe81af46a83d3e27605029c1f5a6/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c23e27686783f60290e36827f9c626e63154b82b116d7fe9adba1fda36da706c", size = 2132603 }, + { url = "https://files.pythonhosted.org/packages/49/7d/4c00df99cb12070b6bccdef4a195255e6020a550d572768d92cc54dba91a/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:482c982f814460eabe1d3bb0adfdc583387bd4691ef00b90575ca0d2b6fe2294", size = 2329591 }, + { url = "https://files.pythonhosted.org/packages/cc/6a/ebf4b1d65d458f3cda6a7335d141305dfa19bdc61140a884d165a8a1bbc7/pydantic_core-2.41.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:bfea2a5f0b4d8d43adf9d7b8bf019fb46fdd10a2e5cde477fbcb9d1fa08c68e1", size = 2319068 }, + { url = "https://files.pythonhosted.org/packages/49/3b/774f2b5cd4192d5ab75870ce4381fd89cf218af999515baf07e7206753f0/pydantic_core-2.41.5-cp312-cp312-win32.whl", hash = "sha256:b74557b16e390ec12dca509bce9264c3bbd128f8a2c376eaa68003d7f327276d", size = 1985908 }, + { url = "https://files.pythonhosted.org/packages/86/45/00173a033c801cacf67c190fef088789394feaf88a98a7035b0e40d53dc9/pydantic_core-2.41.5-cp312-cp312-win_amd64.whl", hash = "sha256:1962293292865bca8e54702b08a4f26da73adc83dd1fcf26fbc875b35d81c815", size = 2020145 }, + { url = "https://files.pythonhosted.org/packages/f9/22/91fbc821fa6d261b376a3f73809f907cec5ca6025642c463d3488aad22fb/pydantic_core-2.41.5-cp312-cp312-win_arm64.whl", hash = "sha256:1746d4a3d9a794cacae06a5eaaccb4b8643a131d45fbc9af23e353dc0a5ba5c3", size = 1976179 }, + { url = "https://files.pythonhosted.org/packages/87/06/8806241ff1f70d9939f9af039c6c35f2360cf16e93c2ca76f184e76b1564/pydantic_core-2.41.5-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:941103c9be18ac8daf7b7adca8228f8ed6bb7a1849020f643b3a14d15b1924d9", size = 2120403 }, + { url = "https://files.pythonhosted.org/packages/94/02/abfa0e0bda67faa65fef1c84971c7e45928e108fe24333c81f3bfe35d5f5/pydantic_core-2.41.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:112e305c3314f40c93998e567879e887a3160bb8689ef3d2c04b6cc62c33ac34", size = 1896206 }, + { url = "https://files.pythonhosted.org/packages/15/df/a4c740c0943e93e6500f9eb23f4ca7ec9bf71b19e608ae5b579678c8d02f/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbaad15cb0c90aa221d43c00e77bb33c93e8d36e0bf74760cd00e732d10a6a0", size = 1919307 }, + { url = "https://files.pythonhosted.org/packages/9a/e3/6324802931ae1d123528988e0e86587c2072ac2e5394b4bc2bc34b61ff6e/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:03ca43e12fab6023fc79d28ca6b39b05f794ad08ec2feccc59a339b02f2b3d33", size = 2063258 }, + { url = "https://files.pythonhosted.org/packages/c9/d4/2230d7151d4957dd79c3044ea26346c148c98fbf0ee6ebd41056f2d62ab5/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:dc799088c08fa04e43144b164feb0c13f9a0bc40503f8df3e9fde58a3c0c101e", size = 2214917 }, + { url = "https://files.pythonhosted.org/packages/e6/9f/eaac5df17a3672fef0081b6c1bb0b82b33ee89aa5cec0d7b05f52fd4a1fa/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:97aeba56665b4c3235a0e52b2c2f5ae9cd071b8a8310ad27bddb3f7fb30e9aa2", size = 2332186 }, + { url = "https://files.pythonhosted.org/packages/cf/4e/35a80cae583a37cf15604b44240e45c05e04e86f9cfd766623149297e971/pydantic_core-2.41.5-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:406bf18d345822d6c21366031003612b9c77b3e29ffdb0f612367352aab7d586", size = 2073164 }, + { url = "https://files.pythonhosted.org/packages/bf/e3/f6e262673c6140dd3305d144d032f7bd5f7497d3871c1428521f19f9efa2/pydantic_core-2.41.5-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b93590ae81f7010dbe380cdeab6f515902ebcbefe0b9327cc4804d74e93ae69d", size = 2179146 }, + { url = "https://files.pythonhosted.org/packages/75/c7/20bd7fc05f0c6ea2056a4565c6f36f8968c0924f19b7d97bbfea55780e73/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:01a3d0ab748ee531f4ea6c3e48ad9dac84ddba4b0d82291f87248f2f9de8d740", size = 2137788 }, + { url = "https://files.pythonhosted.org/packages/3a/8d/34318ef985c45196e004bc46c6eab2eda437e744c124ef0dbe1ff2c9d06b/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_armv7l.whl", hash = "sha256:6561e94ba9dacc9c61bce40e2d6bdc3bfaa0259d3ff36ace3b1e6901936d2e3e", size = 2340133 }, + { url = "https://files.pythonhosted.org/packages/9c/59/013626bf8c78a5a5d9350d12e7697d3d4de951a75565496abd40ccd46bee/pydantic_core-2.41.5-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:915c3d10f81bec3a74fbd4faebe8391013ba61e5a1a8d48c4455b923bdda7858", size = 2324852 }, + { url = "https://files.pythonhosted.org/packages/1a/d9/c248c103856f807ef70c18a4f986693a46a8ffe1602e5d361485da502d20/pydantic_core-2.41.5-cp313-cp313-win32.whl", hash = "sha256:650ae77860b45cfa6e2cdafc42618ceafab3a2d9a3811fcfbd3bbf8ac3c40d36", size = 1994679 }, + { url = "https://files.pythonhosted.org/packages/9e/8b/341991b158ddab181cff136acd2552c9f35bd30380422a639c0671e99a91/pydantic_core-2.41.5-cp313-cp313-win_amd64.whl", hash = "sha256:79ec52ec461e99e13791ec6508c722742ad745571f234ea6255bed38c6480f11", size = 2019766 }, + { url = "https://files.pythonhosted.org/packages/73/7d/f2f9db34af103bea3e09735bb40b021788a5e834c81eedb541991badf8f5/pydantic_core-2.41.5-cp313-cp313-win_arm64.whl", hash = "sha256:3f84d5c1b4ab906093bdc1ff10484838aca54ef08de4afa9de0f5f14d69639cd", size = 1981005 }, + { url = "https://files.pythonhosted.org/packages/ea/28/46b7c5c9635ae96ea0fbb779e271a38129df2550f763937659ee6c5dbc65/pydantic_core-2.41.5-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:3f37a19d7ebcdd20b96485056ba9e8b304e27d9904d233d7b1015db320e51f0a", size = 2119622 }, + { url = "https://files.pythonhosted.org/packages/74/1a/145646e5687e8d9a1e8d09acb278c8535ebe9e972e1f162ed338a622f193/pydantic_core-2.41.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1d1d9764366c73f996edd17abb6d9d7649a7eb690006ab6adbda117717099b14", size = 1891725 }, + { url = "https://files.pythonhosted.org/packages/23/04/e89c29e267b8060b40dca97bfc64a19b2a3cf99018167ea1677d96368273/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:25e1c2af0fce638d5f1988b686f3b3ea8cd7de5f244ca147c777769e798a9cd1", size = 1915040 }, + { url = "https://files.pythonhosted.org/packages/84/a3/15a82ac7bd97992a82257f777b3583d3e84bdb06ba6858f745daa2ec8a85/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:506d766a8727beef16b7adaeb8ee6217c64fc813646b424d0804d67c16eddb66", size = 2063691 }, + { url = "https://files.pythonhosted.org/packages/74/9b/0046701313c6ef08c0c1cf0e028c67c770a4e1275ca73131563c5f2a310a/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4819fa52133c9aa3c387b3328f25c1facc356491e6135b459f1de698ff64d869", size = 2213897 }, + { url = "https://files.pythonhosted.org/packages/8a/cd/6bac76ecd1b27e75a95ca3a9a559c643b3afcd2dd62086d4b7a32a18b169/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2b761d210c9ea91feda40d25b4efe82a1707da2ef62901466a42492c028553a2", size = 2333302 }, + { url = "https://files.pythonhosted.org/packages/4c/d2/ef2074dc020dd6e109611a8be4449b98cd25e1b9b8a303c2f0fca2f2bcf7/pydantic_core-2.41.5-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22f0fb8c1c583a3b6f24df2470833b40207e907b90c928cc8d3594b76f874375", size = 2064877 }, + { url = "https://files.pythonhosted.org/packages/18/66/e9db17a9a763d72f03de903883c057b2592c09509ccfe468187f2a2eef29/pydantic_core-2.41.5-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:2782c870e99878c634505236d81e5443092fba820f0373997ff75f90f68cd553", size = 2180680 }, + { url = "https://files.pythonhosted.org/packages/d3/9e/3ce66cebb929f3ced22be85d4c2399b8e85b622db77dad36b73c5387f8f8/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_aarch64.whl", hash = "sha256:0177272f88ab8312479336e1d777f6b124537d47f2123f89cb37e0accea97f90", size = 2138960 }, + { url = "https://files.pythonhosted.org/packages/a6/62/205a998f4327d2079326b01abee48e502ea739d174f0a89295c481a2272e/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_armv7l.whl", hash = "sha256:63510af5e38f8955b8ee5687740d6ebf7c2a0886d15a6d65c32814613681bc07", size = 2339102 }, + { url = "https://files.pythonhosted.org/packages/3c/0d/f05e79471e889d74d3d88f5bd20d0ed189ad94c2423d81ff8d0000aab4ff/pydantic_core-2.41.5-cp314-cp314-musllinux_1_1_x86_64.whl", hash = "sha256:e56ba91f47764cc14f1daacd723e3e82d1a89d783f0f5afe9c364b8bb491ccdb", size = 2326039 }, + { url = "https://files.pythonhosted.org/packages/ec/e1/e08a6208bb100da7e0c4b288eed624a703f4d129bde2da475721a80cab32/pydantic_core-2.41.5-cp314-cp314-win32.whl", hash = "sha256:aec5cf2fd867b4ff45b9959f8b20ea3993fc93e63c7363fe6851424c8a7e7c23", size = 1995126 }, + { url = "https://files.pythonhosted.org/packages/48/5d/56ba7b24e9557f99c9237e29f5c09913c81eeb2f3217e40e922353668092/pydantic_core-2.41.5-cp314-cp314-win_amd64.whl", hash = "sha256:8e7c86f27c585ef37c35e56a96363ab8de4e549a95512445b85c96d3e2f7c1bf", size = 2015489 }, + { url = "https://files.pythonhosted.org/packages/4e/bb/f7a190991ec9e3e0ba22e4993d8755bbc4a32925c0b5b42775c03e8148f9/pydantic_core-2.41.5-cp314-cp314-win_arm64.whl", hash = "sha256:e672ba74fbc2dc8eea59fb6d4aed6845e6905fc2a8afe93175d94a83ba2a01a0", size = 1977288 }, + { url = "https://files.pythonhosted.org/packages/92/ed/77542d0c51538e32e15afe7899d79efce4b81eee631d99850edc2f5e9349/pydantic_core-2.41.5-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:8566def80554c3faa0e65ac30ab0932b9e3a5cd7f8323764303d468e5c37595a", size = 2120255 }, + { url = "https://files.pythonhosted.org/packages/bb/3d/6913dde84d5be21e284439676168b28d8bbba5600d838b9dca99de0fad71/pydantic_core-2.41.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b80aa5095cd3109962a298ce14110ae16b8c1aece8b72f9dafe81cf597ad80b3", size = 1863760 }, + { url = "https://files.pythonhosted.org/packages/5a/f0/e5e6b99d4191da102f2b0eb9687aaa7f5bea5d9964071a84effc3e40f997/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3006c3dd9ba34b0c094c544c6006cc79e87d8612999f1a5d43b769b89181f23c", size = 1878092 }, + { url = "https://files.pythonhosted.org/packages/71/48/36fb760642d568925953bcc8116455513d6e34c4beaa37544118c36aba6d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72f6c8b11857a856bcfa48c86f5368439f74453563f951e473514579d44aa612", size = 2053385 }, + { url = "https://files.pythonhosted.org/packages/20/25/92dc684dd8eb75a234bc1c764b4210cf2646479d54b47bf46061657292a8/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5cb1b2f9742240e4bb26b652a5aeb840aa4b417c7748b6f8387927bc6e45e40d", size = 2218832 }, + { url = "https://files.pythonhosted.org/packages/e2/09/f53e0b05023d3e30357d82eb35835d0f6340ca344720a4599cd663dca599/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:bd3d54f38609ff308209bd43acea66061494157703364ae40c951f83ba99a1a9", size = 2327585 }, + { url = "https://files.pythonhosted.org/packages/aa/4e/2ae1aa85d6af35a39b236b1b1641de73f5a6ac4d5a7509f77b814885760c/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2ff4321e56e879ee8d2a879501c8e469414d948f4aba74a2d4593184eb326660", size = 2041078 }, + { url = "https://files.pythonhosted.org/packages/cd/13/2e215f17f0ef326fc72afe94776edb77525142c693767fc347ed6288728d/pydantic_core-2.41.5-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d0d2568a8c11bf8225044aa94409e21da0cb09dcdafe9ecd10250b2baad531a9", size = 2173914 }, + { url = "https://files.pythonhosted.org/packages/02/7a/f999a6dcbcd0e5660bc348a3991c8915ce6599f4f2c6ac22f01d7a10816c/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_aarch64.whl", hash = "sha256:a39455728aabd58ceabb03c90e12f71fd30fa69615760a075b9fec596456ccc3", size = 2129560 }, + { url = "https://files.pythonhosted.org/packages/3a/b1/6c990ac65e3b4c079a4fb9f5b05f5b013afa0f4ed6780a3dd236d2cbdc64/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_armv7l.whl", hash = "sha256:239edca560d05757817c13dc17c50766136d21f7cd0fac50295499ae24f90fdf", size = 2329244 }, + { url = "https://files.pythonhosted.org/packages/d9/02/3c562f3a51afd4d88fff8dffb1771b30cfdfd79befd9883ee094f5b6c0d8/pydantic_core-2.41.5-cp314-cp314t-musllinux_1_1_x86_64.whl", hash = "sha256:2a5e06546e19f24c6a96a129142a75cee553cc018ffee48a460059b1185f4470", size = 2331955 }, + { url = "https://files.pythonhosted.org/packages/5c/96/5fb7d8c3c17bc8c62fdb031c47d77a1af698f1d7a406b0f79aaa1338f9ad/pydantic_core-2.41.5-cp314-cp314t-win32.whl", hash = "sha256:b4ececa40ac28afa90871c2cc2b9ffd2ff0bf749380fbdf57d165fd23da353aa", size = 1988906 }, + { url = "https://files.pythonhosted.org/packages/22/ed/182129d83032702912c2e2d8bbe33c036f342cc735737064668585dac28f/pydantic_core-2.41.5-cp314-cp314t-win_amd64.whl", hash = "sha256:80aa89cad80b32a912a65332f64a4450ed00966111b6615ca6816153d3585a8c", size = 1981607 }, + { url = "https://files.pythonhosted.org/packages/9f/ed/068e41660b832bb0b1aa5b58011dea2a3fe0ba7861ff38c4d4904c1c1a99/pydantic_core-2.41.5-cp314-cp314t-win_arm64.whl", hash = "sha256:35b44f37a3199f771c3eaa53051bc8a70cd7b54f333531c59e29fd4db5d15008", size = 1974769 }, + { url = "https://files.pythonhosted.org/packages/11/72/90fda5ee3b97e51c494938a4a44c3a35a9c96c19bba12372fb9c634d6f57/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:b96d5f26b05d03cc60f11a7761a5ded1741da411e7fe0909e27a5e6a0cb7b034", size = 2115441 }, + { url = "https://files.pythonhosted.org/packages/1f/53/8942f884fa33f50794f119012dc6a1a02ac43a56407adaac20463df8e98f/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:634e8609e89ceecea15e2d61bc9ac3718caaaa71963717bf3c8f38bfde64242c", size = 1930291 }, + { url = "https://files.pythonhosted.org/packages/79/c8/ecb9ed9cd942bce09fc888ee960b52654fbdbede4ba6c2d6e0d3b1d8b49c/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93e8740d7503eb008aa2df04d3b9735f845d43ae845e6dcd2be0b55a2da43cd2", size = 1948632 }, + { url = "https://files.pythonhosted.org/packages/2e/1b/687711069de7efa6af934e74f601e2a4307365e8fdc404703afc453eab26/pydantic_core-2.41.5-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f15489ba13d61f670dcc96772e733aad1a6f9c429cc27574c6cdaed82d0146ad", size = 2138905 }, + { url = "https://files.pythonhosted.org/packages/09/32/59b0c7e63e277fa7911c2fc70ccfb45ce4b98991e7ef37110663437005af/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:7da7087d756b19037bc2c06edc6c170eeef3c3bafcb8f532ff17d64dc427adfd", size = 2110495 }, + { url = "https://files.pythonhosted.org/packages/aa/81/05e400037eaf55ad400bcd318c05bb345b57e708887f07ddb2d20e3f0e98/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:aabf5777b5c8ca26f7824cb4a120a740c9588ed58df9b2d196ce92fba42ff8dc", size = 1915388 }, + { url = "https://files.pythonhosted.org/packages/6e/0d/e3549b2399f71d56476b77dbf3cf8937cec5cd70536bdc0e374a421d0599/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c007fe8a43d43b3969e8469004e9845944f1a80e6acd47c150856bb87f230c56", size = 1942879 }, + { url = "https://files.pythonhosted.org/packages/f7/07/34573da085946b6a313d7c42f82f16e8920bfd730665de2d11c0c37a74b5/pydantic_core-2.41.5-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:76d0819de158cd855d1cbb8fcafdf6f5cf1eb8e470abe056d5d161106e38062b", size = 2139017 }, + { url = "https://files.pythonhosted.org/packages/e6/b0/1a2aa41e3b5a4ba11420aba2d091b2d17959c8d1519ece3627c371951e73/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b5819cd790dbf0c5eb9f82c73c16b39a65dd6dd4d1439dcdea7816ec9adddab8", size = 2103351 }, + { url = "https://files.pythonhosted.org/packages/a4/ee/31b1f0020baaf6d091c87900ae05c6aeae101fa4e188e1613c80e4f1ea31/pydantic_core-2.41.5-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:5a4e67afbc95fa5c34cf27d9089bca7fcab4e51e57278d710320a70b956d1b9a", size = 1925363 }, + { url = "https://files.pythonhosted.org/packages/e1/89/ab8e86208467e467a80deaca4e434adac37b10a9d134cd2f99b28a01e483/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ece5c59f0ce7d001e017643d8d24da587ea1f74f6993467d85ae8a5ef9d4f42b", size = 2135615 }, + { url = "https://files.pythonhosted.org/packages/99/0a/99a53d06dd0348b2008f2f30884b34719c323f16c3be4e6cc1203b74a91d/pydantic_core-2.41.5-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16f80f7abe3351f8ea6858914ddc8c77e02578544a0ebc15b4c2e1a0e813b0b2", size = 2175369 }, + { url = "https://files.pythonhosted.org/packages/6d/94/30ca3b73c6d485b9bb0bc66e611cff4a7138ff9736b7e66bcf0852151636/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:33cb885e759a705b426baada1fe68cbb0a2e68e34c5d0d0289a364cf01709093", size = 2144218 }, + { url = "https://files.pythonhosted.org/packages/87/57/31b4f8e12680b739a91f472b5671294236b82586889ef764b5fbc6669238/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:c8d8b4eb992936023be7dee581270af5c6e0697a8559895f527f5b7105ecd36a", size = 2329951 }, + { url = "https://files.pythonhosted.org/packages/7d/73/3c2c8edef77b8f7310e6fb012dbc4b8551386ed575b9eb6fb2506e28a7eb/pydantic_core-2.41.5-pp310-pypy310_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:242a206cd0318f95cd21bdacff3fcc3aab23e79bba5cac3db5a841c9ef9c6963", size = 2318428 }, + { url = "https://files.pythonhosted.org/packages/2f/02/8559b1f26ee0d502c74f9cca5c0d2fd97e967e083e006bbbb4e97f3a043a/pydantic_core-2.41.5-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d3a978c4f57a597908b7e697229d996d77a6d3c94901e9edee593adada95ce1a", size = 2147009 }, + { url = "https://files.pythonhosted.org/packages/5f/9b/1b3f0e9f9305839d7e84912f9e8bfbd191ed1b1ef48083609f0dabde978c/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:b2379fa7ed44ddecb5bfe4e48577d752db9fc10be00a6b7446e9663ba143de26", size = 2101980 }, + { url = "https://files.pythonhosted.org/packages/a4/ed/d71fefcb4263df0da6a85b5d8a7508360f2f2e9b3bf5814be9c8bccdccc1/pydantic_core-2.41.5-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:266fb4cbf5e3cbd0b53669a6d1b039c45e3ce651fd5442eff4d07c2cc8d66808", size = 1923865 }, + { url = "https://files.pythonhosted.org/packages/ce/3a/626b38db460d675f873e4444b4bb030453bbe7b4ba55df821d026a0493c4/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58133647260ea01e4d0500089a8c4f07bd7aa6ce109682b1426394988d8aaacc", size = 2134256 }, + { url = "https://files.pythonhosted.org/packages/83/d9/8412d7f06f616bbc053d30cb4e5f76786af3221462ad5eee1f202021eb4e/pydantic_core-2.41.5-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:287dad91cfb551c363dc62899a80e9e14da1f0e2b6ebde82c806612ca2a13ef1", size = 2174762 }, + { url = "https://files.pythonhosted.org/packages/55/4c/162d906b8e3ba3a99354e20faa1b49a85206c47de97a639510a0e673f5da/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:03b77d184b9eb40240ae9fd676ca364ce1085f203e1b1256f8ab9984dca80a84", size = 2143141 }, + { url = "https://files.pythonhosted.org/packages/1f/f2/f11dd73284122713f5f89fc940f370d035fa8e1e078d446b3313955157fe/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:a668ce24de96165bb239160b3d854943128f4334822900534f2fe947930e5770", size = 2330317 }, + { url = "https://files.pythonhosted.org/packages/88/9d/b06ca6acfe4abb296110fb1273a4d848a0bfb2ff65f3ee92127b3244e16b/pydantic_core-2.41.5-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:f14f8f046c14563f8eb3f45f499cc658ab8d10072961e07225e507adb700e93f", size = 2316992 }, + { url = "https://files.pythonhosted.org/packages/36/c7/cfc8e811f061c841d7990b0201912c3556bfeb99cdcb7ed24adc8d6f8704/pydantic_core-2.41.5-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:56121965f7a4dc965bff783d70b907ddf3d57f6eba29b6d2e5dabfaf07799c51", size = 2145302 }, ] [[package]] name = "pydub" version = "0.25.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326, upload-time = "2021-03-10T02:09:54.659Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/9a/e6bca0eed82db26562c73b5076539a4a08d3cffd19c3cc5913a3e61145fd/pydub-0.25.1.tar.gz", hash = "sha256:980a33ce9949cab2a569606b65674d748ecbca4f0796887fd6f46173a7b0d30f", size = 38326 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327, upload-time = "2021-03-10T02:09:53.503Z" }, + { url = "https://files.pythonhosted.org/packages/a6/53/d78dc063216e62fc55f6b2eebb447f6a4b0a59f55c8406376f76bf959b08/pydub-0.25.1-py2.py3-none-any.whl", hash = "sha256:65617e33033874b59d87db603aa1ed450633288aefead953b30bded59cb599a6", size = 32327 }, ] [[package]] name = "pygments" version = "2.19.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631, upload-time = "2025-06-21T13:39:12.283Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217, upload-time = "2025-06-21T13:39:07.939Z" }, + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, ] [[package]] name = "python-dateutil" version = "2.9.0.post0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "six" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, -] - -[[package]] -name = "python-dotenv" -version = "1.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f0/26/19cadc79a718c5edbec86fd4919a6b6d3f681039a2f6d66d14be94e75fb9/python_dotenv-1.2.1.tar.gz", hash = "sha256:42667e897e16ab0d66954af0e60a9caa94f0fd4ecf3aaf6d2d260eec1aa36ad6", size = 44221, upload-time = "2025-10-26T15:12:10.434Z" } +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } wheels = [ - { url = "https://files.pythonhosted.org/packages/14/1b/a298b06749107c305e1fe0f814c6c74aea7b2f1e10989cb30f544a1b3253/python_dotenv-1.2.1-py3-none-any.whl", hash = "sha256:b81ee9561e9ca4004139c6cbba3a238c32b03e4894671e181b671e8cb8425d61", size = 21230, upload-time = "2025-10-26T15:12:09.109Z" }, + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, ] [[package]] name = "python-multipart" version = "0.0.22" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612, upload-time = "2026-01-25T10:15:56.219Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/94/01/979e98d542a70714b0cb2b6728ed0b7c46792b695e3eaec3e20711271ca3/python_multipart-0.0.22.tar.gz", hash = "sha256:7340bef99a7e0032613f56dc36027b959fd3b30a787ed62d310e951f7c3a3a58", size = 37612 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579, upload-time = "2026-01-25T10:15:54.811Z" }, + { url = "https://files.pythonhosted.org/packages/1b/d0/397f9626e711ff749a95d96b7af99b9c566a9bb5129b8e4c10fc4d100304/python_multipart-0.0.22-py3-none-any.whl", hash = "sha256:2b2cd894c83d21bf49d702499531c7bafd057d730c201782048f7945d82de155", size = 24579 }, ] [[package]] name = "pytz" version = "2025.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884, upload-time = "2025-03-25T02:25:00.538Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } wheels = [ - { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225, upload-time = "2025-03-25T02:24:58.468Z" }, + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, ] [[package]] name = "pyyaml" version = "6.0.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, - { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, - { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, - { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, - { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, - { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, - { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, - { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, - { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, - { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, - { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, - { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, - { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, - { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, - { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, - { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, - { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, - { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, - { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, - { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, - { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, - { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, - { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, - { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, - { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, - { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, - { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, - { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, - { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, - { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, - { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, - { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, - { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, - { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, - { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, - { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, - { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, - { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, - { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, - { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, - { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, - { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, - { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, - { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, - { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, - { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, - { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, - { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, - { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, - { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, - { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227 }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019 }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646 }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793 }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293 }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872 }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828 }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415 }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561 }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826 }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577 }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556 }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114 }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638 }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463 }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986 }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543 }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763 }, + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063 }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973 }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116 }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011 }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870 }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089 }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181 }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658 }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003 }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344 }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669 }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252 }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081 }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159 }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626 }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613 }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115 }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427 }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090 }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246 }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814 }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809 }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454 }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355 }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175 }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228 }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194 }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429 }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912 }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108 }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641 }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901 }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132 }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261 }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272 }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923 }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062 }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341 }, ] [[package]] @@ -2881,11 +2411,11 @@ source = { virtual = "." } dependencies = [ { name = "accelerate" }, { name = "datasets" }, - { name = "dspy-ai" }, { name = "gguf" }, { name = "huggingface-hub" }, { name = "nvidia-ml-py" }, { name = "peft" }, + { name = "pydantic" }, { name = "pyyaml" }, { name = "sentencepiece" }, { name = "torch" }, @@ -2898,11 +2428,11 @@ dependencies = [ requires-dist = [ { name = "accelerate", specifier = ">=0.24.0" }, { name = "datasets" }, - { name = "dspy-ai", specifier = ">=3.1.2" }, { name = "gguf" }, { name = "huggingface-hub", specifier = ">=0.20.0" }, { name = "nvidia-ml-py" }, { name = "peft", specifier = ">=0.7.0" }, + { name = "pydantic", specifier = ">=2.0" }, { name = "pyyaml" }, { name = "sentencepiece" }, { name = "torch" }, @@ -2914,693 +2444,422 @@ requires-dist = [ [package.metadata.requires-dev] dev = [] -[[package]] -name = "referencing" -version = "0.37.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "attrs" }, - { name = "rpds-py" }, - { name = "typing-extensions", marker = "python_full_version < '3.13'" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, -] - [[package]] name = "regex" version = "2026.1.15" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0b/86/07d5056945f9ec4590b518171c4254a5925832eb727b56d3c38a7476f316/regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5", size = 414811, upload-time = "2026-01-14T23:18:02.775Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/ea/d2/e6ee96b7dff201a83f650241c52db8e5bd080967cb93211f57aa448dc9d6/regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e", size = 488166, upload-time = "2026-01-14T23:13:46.408Z" }, - { url = "https://files.pythonhosted.org/packages/23/8a/819e9ce14c9f87af026d0690901b3931f3101160833e5d4c8061fa3a1b67/regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f", size = 290632, upload-time = "2026-01-14T23:13:48.688Z" }, - { url = "https://files.pythonhosted.org/packages/d5/c3/23dfe15af25d1d45b07dfd4caa6003ad710dcdcb4c4b279909bdfe7a2de8/regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b", size = 288500, upload-time = "2026-01-14T23:13:50.503Z" }, - { url = "https://files.pythonhosted.org/packages/c6/31/1adc33e2f717df30d2f4d973f8776d2ba6ecf939301efab29fca57505c95/regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c", size = 781670, upload-time = "2026-01-14T23:13:52.453Z" }, - { url = "https://files.pythonhosted.org/packages/23/ce/21a8a22d13bc4adcb927c27b840c948f15fc973e21ed2346c1bd0eae22dc/regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9", size = 850820, upload-time = "2026-01-14T23:13:54.894Z" }, - { url = "https://files.pythonhosted.org/packages/6c/4f/3eeacdf587a4705a44484cd0b30e9230a0e602811fb3e2cc32268c70d509/regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c", size = 898777, upload-time = "2026-01-14T23:13:56.908Z" }, - { url = "https://files.pythonhosted.org/packages/79/a9/1898a077e2965c35fc22796488141a22676eed2d73701e37c73ad7c0b459/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106", size = 791750, upload-time = "2026-01-14T23:13:58.527Z" }, - { url = "https://files.pythonhosted.org/packages/4c/84/e31f9d149a178889b3817212827f5e0e8c827a049ff31b4b381e76b26e2d/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618", size = 782674, upload-time = "2026-01-14T23:13:59.874Z" }, - { url = "https://files.pythonhosted.org/packages/d2/ff/adf60063db24532add6a1676943754a5654dcac8237af024ede38244fd12/regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4", size = 767906, upload-time = "2026-01-14T23:14:01.298Z" }, - { url = "https://files.pythonhosted.org/packages/af/3e/e6a216cee1e2780fec11afe7fc47b6f3925d7264e8149c607ac389fd9b1a/regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79", size = 774798, upload-time = "2026-01-14T23:14:02.715Z" }, - { url = "https://files.pythonhosted.org/packages/0f/98/23a4a8378a9208514ed3efc7e7850c27fa01e00ed8557c958df0335edc4a/regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9", size = 845861, upload-time = "2026-01-14T23:14:04.824Z" }, - { url = "https://files.pythonhosted.org/packages/f8/57/d7605a9d53bd07421a8785d349cd29677fe660e13674fa4c6cbd624ae354/regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220", size = 755648, upload-time = "2026-01-14T23:14:06.371Z" }, - { url = "https://files.pythonhosted.org/packages/6f/76/6f2e24aa192da1e299cc1101674a60579d3912391867ce0b946ba83e2194/regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13", size = 836250, upload-time = "2026-01-14T23:14:08.343Z" }, - { url = "https://files.pythonhosted.org/packages/11/3a/1f2a1d29453299a7858eab7759045fc3d9d1b429b088dec2dc85b6fa16a2/regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3", size = 779919, upload-time = "2026-01-14T23:14:09.954Z" }, - { url = "https://files.pythonhosted.org/packages/c0/67/eab9bc955c9dcc58e9b222c801e39cff7ca0b04261792a2149166ce7e792/regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218", size = 265888, upload-time = "2026-01-14T23:14:11.35Z" }, - { url = "https://files.pythonhosted.org/packages/1d/62/31d16ae24e1f8803bddb0885508acecaec997fcdcde9c243787103119ae4/regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a", size = 277830, upload-time = "2026-01-14T23:14:12.908Z" }, - { url = "https://files.pythonhosted.org/packages/e5/36/5d9972bccd6417ecd5a8be319cebfd80b296875e7f116c37fb2a2deecebf/regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3", size = 270376, upload-time = "2026-01-14T23:14:14.782Z" }, - { url = "https://files.pythonhosted.org/packages/d0/c9/0c80c96eab96948363d270143138d671d5731c3a692b417629bf3492a9d6/regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a", size = 488168, upload-time = "2026-01-14T23:14:16.129Z" }, - { url = "https://files.pythonhosted.org/packages/17/f0/271c92f5389a552494c429e5cc38d76d1322eb142fb5db3c8ccc47751468/regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f", size = 290636, upload-time = "2026-01-14T23:14:17.715Z" }, - { url = "https://files.pythonhosted.org/packages/a0/f9/5f1fd077d106ca5655a0f9ff8f25a1ab55b92128b5713a91ed7134ff688e/regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1", size = 288496, upload-time = "2026-01-14T23:14:19.326Z" }, - { url = "https://files.pythonhosted.org/packages/b5/e1/8f43b03a4968c748858ec77f746c286d81f896c2e437ccf050ebc5d3128c/regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b", size = 793503, upload-time = "2026-01-14T23:14:20.922Z" }, - { url = "https://files.pythonhosted.org/packages/8d/4e/a39a5e8edc5377a46a7c875c2f9a626ed3338cb3bb06931be461c3e1a34a/regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8", size = 860535, upload-time = "2026-01-14T23:14:22.405Z" }, - { url = "https://files.pythonhosted.org/packages/dc/1c/9dce667a32a9477f7a2869c1c767dc00727284a9fa3ff5c09a5c6c03575e/regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413", size = 907225, upload-time = "2026-01-14T23:14:23.897Z" }, - { url = "https://files.pythonhosted.org/packages/a4/3c/87ca0a02736d16b6262921425e84b48984e77d8e4e572c9072ce96e66c30/regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026", size = 800526, upload-time = "2026-01-14T23:14:26.039Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ff/647d5715aeea7c87bdcbd2f578f47b415f55c24e361e639fe8c0cc88878f/regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785", size = 773446, upload-time = "2026-01-14T23:14:28.109Z" }, - { url = "https://files.pythonhosted.org/packages/af/89/bf22cac25cb4ba0fe6bff52ebedbb65b77a179052a9d6037136ae93f42f4/regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e", size = 783051, upload-time = "2026-01-14T23:14:29.929Z" }, - { url = "https://files.pythonhosted.org/packages/1e/f4/6ed03e71dca6348a5188363a34f5e26ffd5db1404780288ff0d79513bce4/regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763", size = 854485, upload-time = "2026-01-14T23:14:31.366Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9a/8e8560bd78caded8eb137e3e47612430a05b9a772caf60876435192d670a/regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb", size = 762195, upload-time = "2026-01-14T23:14:32.802Z" }, - { url = "https://files.pythonhosted.org/packages/38/6b/61fc710f9aa8dfcd764fe27d37edfaa023b1a23305a0d84fccd5adb346ea/regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2", size = 845986, upload-time = "2026-01-14T23:14:34.898Z" }, - { url = "https://files.pythonhosted.org/packages/fd/2e/fbee4cb93f9d686901a7ca8d94285b80405e8c34fe4107f63ffcbfb56379/regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1", size = 788992, upload-time = "2026-01-14T23:14:37.116Z" }, - { url = "https://files.pythonhosted.org/packages/ed/14/3076348f3f586de64b1ab75a3fbabdaab7684af7f308ad43be7ef1849e55/regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569", size = 265893, upload-time = "2026-01-14T23:14:38.426Z" }, - { url = "https://files.pythonhosted.org/packages/0f/19/772cf8b5fc803f5c89ba85d8b1870a1ca580dc482aa030383a9289c82e44/regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7", size = 277840, upload-time = "2026-01-14T23:14:39.785Z" }, - { url = "https://files.pythonhosted.org/packages/78/84/d05f61142709474da3c0853222d91086d3e1372bcdab516c6fd8d80f3297/regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec", size = 270374, upload-time = "2026-01-14T23:14:41.592Z" }, - { url = "https://files.pythonhosted.org/packages/92/81/10d8cf43c807d0326efe874c1b79f22bfb0fb226027b0b19ebc26d301408/regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1", size = 489398, upload-time = "2026-01-14T23:14:43.741Z" }, - { url = "https://files.pythonhosted.org/packages/90/b0/7c2a74e74ef2a7c32de724658a69a862880e3e4155cba992ba04d1c70400/regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681", size = 291339, upload-time = "2026-01-14T23:14:45.183Z" }, - { url = "https://files.pythonhosted.org/packages/19/4d/16d0773d0c818417f4cc20aa0da90064b966d22cd62a8c46765b5bd2d643/regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f", size = 289003, upload-time = "2026-01-14T23:14:47.25Z" }, - { url = "https://files.pythonhosted.org/packages/c6/e4/1fc4599450c9f0863d9406e944592d968b8d6dfd0d552a7d569e43bceada/regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa", size = 798656, upload-time = "2026-01-14T23:14:48.77Z" }, - { url = "https://files.pythonhosted.org/packages/b2/e6/59650d73a73fa8a60b3a590545bfcf1172b4384a7df2e7fe7b9aab4e2da9/regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804", size = 864252, upload-time = "2026-01-14T23:14:50.528Z" }, - { url = "https://files.pythonhosted.org/packages/6e/ab/1d0f4d50a1638849a97d731364c9a80fa304fec46325e48330c170ee8e80/regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c", size = 912268, upload-time = "2026-01-14T23:14:52.952Z" }, - { url = "https://files.pythonhosted.org/packages/dd/df/0d722c030c82faa1d331d1921ee268a4e8fb55ca8b9042c9341c352f17fa/regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5", size = 803589, upload-time = "2026-01-14T23:14:55.182Z" }, - { url = "https://files.pythonhosted.org/packages/66/23/33289beba7ccb8b805c6610a8913d0131f834928afc555b241caabd422a9/regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3", size = 775700, upload-time = "2026-01-14T23:14:56.707Z" }, - { url = "https://files.pythonhosted.org/packages/e7/65/bf3a42fa6897a0d3afa81acb25c42f4b71c274f698ceabd75523259f6688/regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb", size = 787928, upload-time = "2026-01-14T23:14:58.312Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f5/13bf65864fc314f68cdd6d8ca94adcab064d4d39dbd0b10fef29a9da48fc/regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410", size = 858607, upload-time = "2026-01-14T23:15:00.657Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/040e589834d7a439ee43fb0e1e902bc81bd58a5ba81acffe586bb3321d35/regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4", size = 763729, upload-time = "2026-01-14T23:15:02.248Z" }, - { url = "https://files.pythonhosted.org/packages/9b/84/6921e8129687a427edf25a34a5594b588b6d88f491320b9de5b6339a4fcb/regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d", size = 850697, upload-time = "2026-01-14T23:15:03.878Z" }, - { url = "https://files.pythonhosted.org/packages/8a/87/3d06143d4b128f4229158f2de5de6c8f2485170c7221e61bf381313314b2/regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22", size = 789849, upload-time = "2026-01-14T23:15:06.102Z" }, - { url = "https://files.pythonhosted.org/packages/77/69/c50a63842b6bd48850ebc7ab22d46e7a2a32d824ad6c605b218441814639/regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913", size = 266279, upload-time = "2026-01-14T23:15:07.678Z" }, - { url = "https://files.pythonhosted.org/packages/f2/36/39d0b29d087e2b11fd8191e15e81cce1b635fcc845297c67f11d0d19274d/regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a", size = 277166, upload-time = "2026-01-14T23:15:09.257Z" }, - { url = "https://files.pythonhosted.org/packages/28/32/5b8e476a12262748851fa8ab1b0be540360692325975b094e594dfebbb52/regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056", size = 270415, upload-time = "2026-01-14T23:15:10.743Z" }, - { url = "https://files.pythonhosted.org/packages/f8/2e/6870bb16e982669b674cce3ee9ff2d1d46ab80528ee6bcc20fb2292efb60/regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e", size = 489164, upload-time = "2026-01-14T23:15:13.962Z" }, - { url = "https://files.pythonhosted.org/packages/dc/67/9774542e203849b0286badf67199970a44ebdb0cc5fb739f06e47ada72f8/regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10", size = 291218, upload-time = "2026-01-14T23:15:15.647Z" }, - { url = "https://files.pythonhosted.org/packages/b2/87/b0cda79f22b8dee05f774922a214da109f9a4c0eca5da2c9d72d77ea062c/regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc", size = 288895, upload-time = "2026-01-14T23:15:17.788Z" }, - { url = "https://files.pythonhosted.org/packages/3b/6a/0041f0a2170d32be01ab981d6346c83a8934277d82c780d60b127331f264/regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599", size = 798680, upload-time = "2026-01-14T23:15:19.342Z" }, - { url = "https://files.pythonhosted.org/packages/58/de/30e1cfcdbe3e891324aa7568b7c968771f82190df5524fabc1138cb2d45a/regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae", size = 864210, upload-time = "2026-01-14T23:15:22.005Z" }, - { url = "https://files.pythonhosted.org/packages/64/44/4db2f5c5ca0ccd40ff052ae7b1e9731352fcdad946c2b812285a7505ca75/regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5", size = 912358, upload-time = "2026-01-14T23:15:24.569Z" }, - { url = "https://files.pythonhosted.org/packages/79/b6/e6a5665d43a7c42467138c8a2549be432bad22cbd206f5ec87162de74bd7/regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6", size = 803583, upload-time = "2026-01-14T23:15:26.526Z" }, - { url = "https://files.pythonhosted.org/packages/e7/53/7cd478222169d85d74d7437e74750005e993f52f335f7c04ff7adfda3310/regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788", size = 775782, upload-time = "2026-01-14T23:15:29.352Z" }, - { url = "https://files.pythonhosted.org/packages/ca/b5/75f9a9ee4b03a7c009fe60500fe550b45df94f0955ca29af16333ef557c5/regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714", size = 787978, upload-time = "2026-01-14T23:15:31.295Z" }, - { url = "https://files.pythonhosted.org/packages/72/b3/79821c826245bbe9ccbb54f6eadb7879c722fd3e0248c17bfc90bf54e123/regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d", size = 858550, upload-time = "2026-01-14T23:15:33.558Z" }, - { url = "https://files.pythonhosted.org/packages/4a/85/2ab5f77a1c465745bfbfcb3ad63178a58337ae8d5274315e2cc623a822fa/regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3", size = 763747, upload-time = "2026-01-14T23:15:35.206Z" }, - { url = "https://files.pythonhosted.org/packages/6d/84/c27df502d4bfe2873a3e3a7cf1bdb2b9cc10284d1a44797cf38bed790470/regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31", size = 850615, upload-time = "2026-01-14T23:15:37.523Z" }, - { url = "https://files.pythonhosted.org/packages/7d/b7/658a9782fb253680aa8ecb5ccbb51f69e088ed48142c46d9f0c99b46c575/regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3", size = 789951, upload-time = "2026-01-14T23:15:39.582Z" }, - { url = "https://files.pythonhosted.org/packages/fc/2a/5928af114441e059f15b2f63e188bd00c6529b3051c974ade7444b85fcda/regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f", size = 266275, upload-time = "2026-01-14T23:15:42.108Z" }, - { url = "https://files.pythonhosted.org/packages/4f/16/5bfbb89e435897bff28cf0352a992ca719d9e55ebf8b629203c96b6ce4f7/regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e", size = 277145, upload-time = "2026-01-14T23:15:44.244Z" }, - { url = "https://files.pythonhosted.org/packages/56/c1/a09ff7392ef4233296e821aec5f78c51be5e91ffde0d163059e50fd75835/regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337", size = 270411, upload-time = "2026-01-14T23:15:45.858Z" }, - { url = "https://files.pythonhosted.org/packages/3c/38/0cfd5a78e5c6db00e6782fdae70458f89850ce95baa5e8694ab91d89744f/regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be", size = 492068, upload-time = "2026-01-14T23:15:47.616Z" }, - { url = "https://files.pythonhosted.org/packages/50/72/6c86acff16cb7c959c4355826bbf06aad670682d07c8f3998d9ef4fee7cd/regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8", size = 292756, upload-time = "2026-01-14T23:15:49.307Z" }, - { url = "https://files.pythonhosted.org/packages/4e/58/df7fb69eadfe76526ddfce28abdc0af09ffe65f20c2c90932e89d705153f/regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd", size = 291114, upload-time = "2026-01-14T23:15:51.484Z" }, - { url = "https://files.pythonhosted.org/packages/ed/6c/a4011cd1cf96b90d2cdc7e156f91efbd26531e822a7fbb82a43c1016678e/regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a", size = 807524, upload-time = "2026-01-14T23:15:53.102Z" }, - { url = "https://files.pythonhosted.org/packages/1d/25/a53ffb73183f69c3e9f4355c4922b76d2840aee160af6af5fac229b6201d/regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93", size = 873455, upload-time = "2026-01-14T23:15:54.956Z" }, - { url = "https://files.pythonhosted.org/packages/66/0b/8b47fc2e8f97d9b4a851736f3890a5f786443aa8901061c55f24c955f45b/regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af", size = 915007, upload-time = "2026-01-14T23:15:57.041Z" }, - { url = "https://files.pythonhosted.org/packages/c2/fa/97de0d681e6d26fabe71968dbee06dd52819e9a22fdce5dac7256c31ed84/regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09", size = 812794, upload-time = "2026-01-14T23:15:58.916Z" }, - { url = "https://files.pythonhosted.org/packages/22/38/e752f94e860d429654aa2b1c51880bff8dfe8f084268258adf9151cf1f53/regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5", size = 781159, upload-time = "2026-01-14T23:16:00.817Z" }, - { url = "https://files.pythonhosted.org/packages/e9/a7/d739ffaef33c378fc888302a018d7f81080393d96c476b058b8c64fd2b0d/regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794", size = 795558, upload-time = "2026-01-14T23:16:03.267Z" }, - { url = "https://files.pythonhosted.org/packages/3e/c4/542876f9a0ac576100fc73e9c75b779f5c31e3527576cfc9cb3009dcc58a/regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a", size = 868427, upload-time = "2026-01-14T23:16:05.646Z" }, - { url = "https://files.pythonhosted.org/packages/fc/0f/d5655bea5b22069e32ae85a947aa564912f23758e112cdb74212848a1a1b/regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80", size = 769939, upload-time = "2026-01-14T23:16:07.542Z" }, - { url = "https://files.pythonhosted.org/packages/20/06/7e18a4fa9d326daeda46d471a44ef94201c46eaa26dbbb780b5d92cbfdda/regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2", size = 854753, upload-time = "2026-01-14T23:16:10.395Z" }, - { url = "https://files.pythonhosted.org/packages/3b/67/dc8946ef3965e166f558ef3b47f492bc364e96a265eb4a2bb3ca765c8e46/regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60", size = 799559, upload-time = "2026-01-14T23:16:12.347Z" }, - { url = "https://files.pythonhosted.org/packages/a5/61/1bba81ff6d50c86c65d9fd84ce9699dd106438ee4cdb105bf60374ee8412/regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952", size = 268879, upload-time = "2026-01-14T23:16:14.049Z" }, - { url = "https://files.pythonhosted.org/packages/e9/5e/cef7d4c5fb0ea3ac5c775fd37db5747f7378b29526cc83f572198924ff47/regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10", size = 280317, upload-time = "2026-01-14T23:16:15.718Z" }, - { url = "https://files.pythonhosted.org/packages/b4/52/4317f7a5988544e34ab57b4bde0f04944c4786128c933fb09825924d3e82/regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829", size = 271551, upload-time = "2026-01-14T23:16:17.533Z" }, - { url = "https://files.pythonhosted.org/packages/52/0a/47fa888ec7cbbc7d62c5f2a6a888878e76169170ead271a35239edd8f0e8/regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac", size = 489170, upload-time = "2026-01-14T23:16:19.835Z" }, - { url = "https://files.pythonhosted.org/packages/ac/c4/d000e9b7296c15737c9301708e9e7fbdea009f8e93541b6b43bdb8219646/regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6", size = 291146, upload-time = "2026-01-14T23:16:21.541Z" }, - { url = "https://files.pythonhosted.org/packages/f9/b6/921cc61982e538682bdf3bdf5b2c6ab6b34368da1f8e98a6c1ddc503c9cf/regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2", size = 288986, upload-time = "2026-01-14T23:16:23.381Z" }, - { url = "https://files.pythonhosted.org/packages/ca/33/eb7383dde0bbc93f4fb9d03453aab97e18ad4024ac7e26cef8d1f0a2cff0/regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846", size = 799098, upload-time = "2026-01-14T23:16:25.088Z" }, - { url = "https://files.pythonhosted.org/packages/27/56/b664dccae898fc8d8b4c23accd853f723bde0f026c747b6f6262b688029c/regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b", size = 864980, upload-time = "2026-01-14T23:16:27.297Z" }, - { url = "https://files.pythonhosted.org/packages/16/40/0999e064a170eddd237bae9ccfcd8f28b3aa98a38bf727a086425542a4fc/regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e", size = 911607, upload-time = "2026-01-14T23:16:29.235Z" }, - { url = "https://files.pythonhosted.org/packages/07/78/c77f644b68ab054e5a674fb4da40ff7bffb2c88df58afa82dbf86573092d/regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde", size = 803358, upload-time = "2026-01-14T23:16:31.369Z" }, - { url = "https://files.pythonhosted.org/packages/27/31/d4292ea8566eaa551fafc07797961c5963cf5235c797cc2ae19b85dfd04d/regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5", size = 775833, upload-time = "2026-01-14T23:16:33.141Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b2/cff3bf2fea4133aa6fb0d1e370b37544d18c8350a2fa118c7e11d1db0e14/regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34", size = 788045, upload-time = "2026-01-14T23:16:35.005Z" }, - { url = "https://files.pythonhosted.org/packages/8d/99/2cb9b69045372ec877b6f5124bda4eb4253bc58b8fe5848c973f752bc52c/regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75", size = 859374, upload-time = "2026-01-14T23:16:36.919Z" }, - { url = "https://files.pythonhosted.org/packages/09/16/710b0a5abe8e077b1729a562d2f297224ad079f3a66dce46844c193416c8/regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e", size = 763940, upload-time = "2026-01-14T23:16:38.685Z" }, - { url = "https://files.pythonhosted.org/packages/dd/d1/7585c8e744e40eb3d32f119191969b91de04c073fca98ec14299041f6e7e/regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160", size = 850112, upload-time = "2026-01-14T23:16:40.646Z" }, - { url = "https://files.pythonhosted.org/packages/af/d6/43e1dd85df86c49a347aa57c1f69d12c652c7b60e37ec162e3096194a278/regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1", size = 789586, upload-time = "2026-01-14T23:16:42.799Z" }, - { url = "https://files.pythonhosted.org/packages/93/38/77142422f631e013f316aaae83234c629555729a9fbc952b8a63ac91462a/regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1", size = 271691, upload-time = "2026-01-14T23:16:44.671Z" }, - { url = "https://files.pythonhosted.org/packages/4a/a9/ab16b4649524ca9e05213c1cdbb7faa85cc2aa90a0230d2f796cbaf22736/regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903", size = 280422, upload-time = "2026-01-14T23:16:46.607Z" }, - { url = "https://files.pythonhosted.org/packages/be/2a/20fd057bf3521cb4791f69f869635f73e0aaf2b9ad2d260f728144f9047c/regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705", size = 273467, upload-time = "2026-01-14T23:16:48.967Z" }, - { url = "https://files.pythonhosted.org/packages/ad/77/0b1e81857060b92b9cad239104c46507dd481b3ff1fa79f8e7f865aae38a/regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8", size = 492073, upload-time = "2026-01-14T23:16:51.154Z" }, - { url = "https://files.pythonhosted.org/packages/70/f3/f8302b0c208b22c1e4f423147e1913fd475ddd6230565b299925353de644/regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf", size = 292757, upload-time = "2026-01-14T23:16:53.08Z" }, - { url = "https://files.pythonhosted.org/packages/bf/f0/ef55de2460f3b4a6da9d9e7daacd0cb79d4ef75c64a2af316e68447f0df0/regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d", size = 291122, upload-time = "2026-01-14T23:16:55.383Z" }, - { url = "https://files.pythonhosted.org/packages/cf/55/bb8ccbacabbc3a11d863ee62a9f18b160a83084ea95cdfc5d207bfc3dd75/regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84", size = 807761, upload-time = "2026-01-14T23:16:57.251Z" }, - { url = "https://files.pythonhosted.org/packages/8f/84/f75d937f17f81e55679a0509e86176e29caa7298c38bd1db7ce9c0bf6075/regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df", size = 873538, upload-time = "2026-01-14T23:16:59.349Z" }, - { url = "https://files.pythonhosted.org/packages/b8/d9/0da86327df70349aa8d86390da91171bd3ca4f0e7c1d1d453a9c10344da3/regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434", size = 915066, upload-time = "2026-01-14T23:17:01.607Z" }, - { url = "https://files.pythonhosted.org/packages/2a/5e/f660fb23fc77baa2a61aa1f1fe3a4eea2bbb8a286ddec148030672e18834/regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a", size = 812938, upload-time = "2026-01-14T23:17:04.366Z" }, - { url = "https://files.pythonhosted.org/packages/69/33/a47a29bfecebbbfd1e5cd3f26b28020a97e4820f1c5148e66e3b7d4b4992/regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10", size = 781314, upload-time = "2026-01-14T23:17:06.378Z" }, - { url = "https://files.pythonhosted.org/packages/65/ec/7ec2bbfd4c3f4e494a24dec4c6943a668e2030426b1b8b949a6462d2c17b/regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac", size = 795652, upload-time = "2026-01-14T23:17:08.521Z" }, - { url = "https://files.pythonhosted.org/packages/46/79/a5d8651ae131fe27d7c521ad300aa7f1c7be1dbeee4d446498af5411b8a9/regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea", size = 868550, upload-time = "2026-01-14T23:17:10.573Z" }, - { url = "https://files.pythonhosted.org/packages/06/b7/25635d2809664b79f183070786a5552dd4e627e5aedb0065f4e3cf8ee37d/regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e", size = 769981, upload-time = "2026-01-14T23:17:12.871Z" }, - { url = "https://files.pythonhosted.org/packages/16/8b/fc3fcbb2393dcfa4a6c5ffad92dc498e842df4581ea9d14309fcd3c55fb9/regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521", size = 854780, upload-time = "2026-01-14T23:17:14.837Z" }, - { url = "https://files.pythonhosted.org/packages/d0/38/dde117c76c624713c8a2842530be9c93ca8b606c0f6102d86e8cd1ce8bea/regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db", size = 799778, upload-time = "2026-01-14T23:17:17.369Z" }, - { url = "https://files.pythonhosted.org/packages/e3/0d/3a6cfa9ae99606afb612d8fb7a66b245a9d5ff0f29bb347c8a30b6ad561b/regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e", size = 274667, upload-time = "2026-01-14T23:17:19.301Z" }, - { url = "https://files.pythonhosted.org/packages/5b/b2/297293bb0742fd06b8d8e2572db41a855cdf1cae0bf009b1cb74fe07e196/regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf", size = 284386, upload-time = "2026-01-14T23:17:21.231Z" }, - { url = "https://files.pythonhosted.org/packages/95/e4/a3b9480c78cf8ee86626cb06f8d931d74d775897d44201ccb813097ae697/regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70", size = 274837, upload-time = "2026-01-14T23:17:23.146Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/86/07d5056945f9ec4590b518171c4254a5925832eb727b56d3c38a7476f316/regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5", size = 414811 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/d2/e6ee96b7dff201a83f650241c52db8e5bd080967cb93211f57aa448dc9d6/regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e", size = 488166 }, + { url = "https://files.pythonhosted.org/packages/23/8a/819e9ce14c9f87af026d0690901b3931f3101160833e5d4c8061fa3a1b67/regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f", size = 290632 }, + { url = "https://files.pythonhosted.org/packages/d5/c3/23dfe15af25d1d45b07dfd4caa6003ad710dcdcb4c4b279909bdfe7a2de8/regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b", size = 288500 }, + { url = "https://files.pythonhosted.org/packages/c6/31/1adc33e2f717df30d2f4d973f8776d2ba6ecf939301efab29fca57505c95/regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c", size = 781670 }, + { url = "https://files.pythonhosted.org/packages/23/ce/21a8a22d13bc4adcb927c27b840c948f15fc973e21ed2346c1bd0eae22dc/regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9", size = 850820 }, + { url = "https://files.pythonhosted.org/packages/6c/4f/3eeacdf587a4705a44484cd0b30e9230a0e602811fb3e2cc32268c70d509/regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c", size = 898777 }, + { url = "https://files.pythonhosted.org/packages/79/a9/1898a077e2965c35fc22796488141a22676eed2d73701e37c73ad7c0b459/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106", size = 791750 }, + { url = "https://files.pythonhosted.org/packages/4c/84/e31f9d149a178889b3817212827f5e0e8c827a049ff31b4b381e76b26e2d/regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618", size = 782674 }, + { url = "https://files.pythonhosted.org/packages/d2/ff/adf60063db24532add6a1676943754a5654dcac8237af024ede38244fd12/regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4", size = 767906 }, + { url = "https://files.pythonhosted.org/packages/af/3e/e6a216cee1e2780fec11afe7fc47b6f3925d7264e8149c607ac389fd9b1a/regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79", size = 774798 }, + { url = "https://files.pythonhosted.org/packages/0f/98/23a4a8378a9208514ed3efc7e7850c27fa01e00ed8557c958df0335edc4a/regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9", size = 845861 }, + { url = "https://files.pythonhosted.org/packages/f8/57/d7605a9d53bd07421a8785d349cd29677fe660e13674fa4c6cbd624ae354/regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220", size = 755648 }, + { url = "https://files.pythonhosted.org/packages/6f/76/6f2e24aa192da1e299cc1101674a60579d3912391867ce0b946ba83e2194/regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13", size = 836250 }, + { url = "https://files.pythonhosted.org/packages/11/3a/1f2a1d29453299a7858eab7759045fc3d9d1b429b088dec2dc85b6fa16a2/regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3", size = 779919 }, + { url = "https://files.pythonhosted.org/packages/c0/67/eab9bc955c9dcc58e9b222c801e39cff7ca0b04261792a2149166ce7e792/regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218", size = 265888 }, + { url = "https://files.pythonhosted.org/packages/1d/62/31d16ae24e1f8803bddb0885508acecaec997fcdcde9c243787103119ae4/regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a", size = 277830 }, + { url = "https://files.pythonhosted.org/packages/e5/36/5d9972bccd6417ecd5a8be319cebfd80b296875e7f116c37fb2a2deecebf/regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3", size = 270376 }, + { url = "https://files.pythonhosted.org/packages/d0/c9/0c80c96eab96948363d270143138d671d5731c3a692b417629bf3492a9d6/regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a", size = 488168 }, + { url = "https://files.pythonhosted.org/packages/17/f0/271c92f5389a552494c429e5cc38d76d1322eb142fb5db3c8ccc47751468/regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f", size = 290636 }, + { url = "https://files.pythonhosted.org/packages/a0/f9/5f1fd077d106ca5655a0f9ff8f25a1ab55b92128b5713a91ed7134ff688e/regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1", size = 288496 }, + { url = "https://files.pythonhosted.org/packages/b5/e1/8f43b03a4968c748858ec77f746c286d81f896c2e437ccf050ebc5d3128c/regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b", size = 793503 }, + { url = "https://files.pythonhosted.org/packages/8d/4e/a39a5e8edc5377a46a7c875c2f9a626ed3338cb3bb06931be461c3e1a34a/regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8", size = 860535 }, + { url = "https://files.pythonhosted.org/packages/dc/1c/9dce667a32a9477f7a2869c1c767dc00727284a9fa3ff5c09a5c6c03575e/regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413", size = 907225 }, + { url = "https://files.pythonhosted.org/packages/a4/3c/87ca0a02736d16b6262921425e84b48984e77d8e4e572c9072ce96e66c30/regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026", size = 800526 }, + { url = "https://files.pythonhosted.org/packages/4b/ff/647d5715aeea7c87bdcbd2f578f47b415f55c24e361e639fe8c0cc88878f/regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785", size = 773446 }, + { url = "https://files.pythonhosted.org/packages/af/89/bf22cac25cb4ba0fe6bff52ebedbb65b77a179052a9d6037136ae93f42f4/regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e", size = 783051 }, + { url = "https://files.pythonhosted.org/packages/1e/f4/6ed03e71dca6348a5188363a34f5e26ffd5db1404780288ff0d79513bce4/regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763", size = 854485 }, + { url = "https://files.pythonhosted.org/packages/d9/9a/8e8560bd78caded8eb137e3e47612430a05b9a772caf60876435192d670a/regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb", size = 762195 }, + { url = "https://files.pythonhosted.org/packages/38/6b/61fc710f9aa8dfcd764fe27d37edfaa023b1a23305a0d84fccd5adb346ea/regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2", size = 845986 }, + { url = "https://files.pythonhosted.org/packages/fd/2e/fbee4cb93f9d686901a7ca8d94285b80405e8c34fe4107f63ffcbfb56379/regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1", size = 788992 }, + { url = "https://files.pythonhosted.org/packages/ed/14/3076348f3f586de64b1ab75a3fbabdaab7684af7f308ad43be7ef1849e55/regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569", size = 265893 }, + { url = "https://files.pythonhosted.org/packages/0f/19/772cf8b5fc803f5c89ba85d8b1870a1ca580dc482aa030383a9289c82e44/regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7", size = 277840 }, + { url = "https://files.pythonhosted.org/packages/78/84/d05f61142709474da3c0853222d91086d3e1372bcdab516c6fd8d80f3297/regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec", size = 270374 }, + { url = "https://files.pythonhosted.org/packages/92/81/10d8cf43c807d0326efe874c1b79f22bfb0fb226027b0b19ebc26d301408/regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1", size = 489398 }, + { url = "https://files.pythonhosted.org/packages/90/b0/7c2a74e74ef2a7c32de724658a69a862880e3e4155cba992ba04d1c70400/regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681", size = 291339 }, + { url = "https://files.pythonhosted.org/packages/19/4d/16d0773d0c818417f4cc20aa0da90064b966d22cd62a8c46765b5bd2d643/regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f", size = 289003 }, + { url = "https://files.pythonhosted.org/packages/c6/e4/1fc4599450c9f0863d9406e944592d968b8d6dfd0d552a7d569e43bceada/regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa", size = 798656 }, + { url = "https://files.pythonhosted.org/packages/b2/e6/59650d73a73fa8a60b3a590545bfcf1172b4384a7df2e7fe7b9aab4e2da9/regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804", size = 864252 }, + { url = "https://files.pythonhosted.org/packages/6e/ab/1d0f4d50a1638849a97d731364c9a80fa304fec46325e48330c170ee8e80/regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c", size = 912268 }, + { url = "https://files.pythonhosted.org/packages/dd/df/0d722c030c82faa1d331d1921ee268a4e8fb55ca8b9042c9341c352f17fa/regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5", size = 803589 }, + { url = "https://files.pythonhosted.org/packages/66/23/33289beba7ccb8b805c6610a8913d0131f834928afc555b241caabd422a9/regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3", size = 775700 }, + { url = "https://files.pythonhosted.org/packages/e7/65/bf3a42fa6897a0d3afa81acb25c42f4b71c274f698ceabd75523259f6688/regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb", size = 787928 }, + { url = "https://files.pythonhosted.org/packages/f4/f5/13bf65864fc314f68cdd6d8ca94adcab064d4d39dbd0b10fef29a9da48fc/regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410", size = 858607 }, + { url = "https://files.pythonhosted.org/packages/a3/31/040e589834d7a439ee43fb0e1e902bc81bd58a5ba81acffe586bb3321d35/regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4", size = 763729 }, + { url = "https://files.pythonhosted.org/packages/9b/84/6921e8129687a427edf25a34a5594b588b6d88f491320b9de5b6339a4fcb/regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d", size = 850697 }, + { url = "https://files.pythonhosted.org/packages/8a/87/3d06143d4b128f4229158f2de5de6c8f2485170c7221e61bf381313314b2/regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22", size = 789849 }, + { url = "https://files.pythonhosted.org/packages/77/69/c50a63842b6bd48850ebc7ab22d46e7a2a32d824ad6c605b218441814639/regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913", size = 266279 }, + { url = "https://files.pythonhosted.org/packages/f2/36/39d0b29d087e2b11fd8191e15e81cce1b635fcc845297c67f11d0d19274d/regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a", size = 277166 }, + { url = "https://files.pythonhosted.org/packages/28/32/5b8e476a12262748851fa8ab1b0be540360692325975b094e594dfebbb52/regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056", size = 270415 }, + { url = "https://files.pythonhosted.org/packages/f8/2e/6870bb16e982669b674cce3ee9ff2d1d46ab80528ee6bcc20fb2292efb60/regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e", size = 489164 }, + { url = "https://files.pythonhosted.org/packages/dc/67/9774542e203849b0286badf67199970a44ebdb0cc5fb739f06e47ada72f8/regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10", size = 291218 }, + { url = "https://files.pythonhosted.org/packages/b2/87/b0cda79f22b8dee05f774922a214da109f9a4c0eca5da2c9d72d77ea062c/regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc", size = 288895 }, + { url = "https://files.pythonhosted.org/packages/3b/6a/0041f0a2170d32be01ab981d6346c83a8934277d82c780d60b127331f264/regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599", size = 798680 }, + { url = "https://files.pythonhosted.org/packages/58/de/30e1cfcdbe3e891324aa7568b7c968771f82190df5524fabc1138cb2d45a/regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae", size = 864210 }, + { url = "https://files.pythonhosted.org/packages/64/44/4db2f5c5ca0ccd40ff052ae7b1e9731352fcdad946c2b812285a7505ca75/regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5", size = 912358 }, + { url = "https://files.pythonhosted.org/packages/79/b6/e6a5665d43a7c42467138c8a2549be432bad22cbd206f5ec87162de74bd7/regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6", size = 803583 }, + { url = "https://files.pythonhosted.org/packages/e7/53/7cd478222169d85d74d7437e74750005e993f52f335f7c04ff7adfda3310/regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788", size = 775782 }, + { url = "https://files.pythonhosted.org/packages/ca/b5/75f9a9ee4b03a7c009fe60500fe550b45df94f0955ca29af16333ef557c5/regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714", size = 787978 }, + { url = "https://files.pythonhosted.org/packages/72/b3/79821c826245bbe9ccbb54f6eadb7879c722fd3e0248c17bfc90bf54e123/regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d", size = 858550 }, + { url = "https://files.pythonhosted.org/packages/4a/85/2ab5f77a1c465745bfbfcb3ad63178a58337ae8d5274315e2cc623a822fa/regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3", size = 763747 }, + { url = "https://files.pythonhosted.org/packages/6d/84/c27df502d4bfe2873a3e3a7cf1bdb2b9cc10284d1a44797cf38bed790470/regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31", size = 850615 }, + { url = "https://files.pythonhosted.org/packages/7d/b7/658a9782fb253680aa8ecb5ccbb51f69e088ed48142c46d9f0c99b46c575/regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3", size = 789951 }, + { url = "https://files.pythonhosted.org/packages/fc/2a/5928af114441e059f15b2f63e188bd00c6529b3051c974ade7444b85fcda/regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f", size = 266275 }, + { url = "https://files.pythonhosted.org/packages/4f/16/5bfbb89e435897bff28cf0352a992ca719d9e55ebf8b629203c96b6ce4f7/regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e", size = 277145 }, + { url = "https://files.pythonhosted.org/packages/56/c1/a09ff7392ef4233296e821aec5f78c51be5e91ffde0d163059e50fd75835/regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337", size = 270411 }, + { url = "https://files.pythonhosted.org/packages/3c/38/0cfd5a78e5c6db00e6782fdae70458f89850ce95baa5e8694ab91d89744f/regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be", size = 492068 }, + { url = "https://files.pythonhosted.org/packages/50/72/6c86acff16cb7c959c4355826bbf06aad670682d07c8f3998d9ef4fee7cd/regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8", size = 292756 }, + { url = "https://files.pythonhosted.org/packages/4e/58/df7fb69eadfe76526ddfce28abdc0af09ffe65f20c2c90932e89d705153f/regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd", size = 291114 }, + { url = "https://files.pythonhosted.org/packages/ed/6c/a4011cd1cf96b90d2cdc7e156f91efbd26531e822a7fbb82a43c1016678e/regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a", size = 807524 }, + { url = "https://files.pythonhosted.org/packages/1d/25/a53ffb73183f69c3e9f4355c4922b76d2840aee160af6af5fac229b6201d/regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93", size = 873455 }, + { url = "https://files.pythonhosted.org/packages/66/0b/8b47fc2e8f97d9b4a851736f3890a5f786443aa8901061c55f24c955f45b/regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af", size = 915007 }, + { url = "https://files.pythonhosted.org/packages/c2/fa/97de0d681e6d26fabe71968dbee06dd52819e9a22fdce5dac7256c31ed84/regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09", size = 812794 }, + { url = "https://files.pythonhosted.org/packages/22/38/e752f94e860d429654aa2b1c51880bff8dfe8f084268258adf9151cf1f53/regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5", size = 781159 }, + { url = "https://files.pythonhosted.org/packages/e9/a7/d739ffaef33c378fc888302a018d7f81080393d96c476b058b8c64fd2b0d/regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794", size = 795558 }, + { url = "https://files.pythonhosted.org/packages/3e/c4/542876f9a0ac576100fc73e9c75b779f5c31e3527576cfc9cb3009dcc58a/regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a", size = 868427 }, + { url = "https://files.pythonhosted.org/packages/fc/0f/d5655bea5b22069e32ae85a947aa564912f23758e112cdb74212848a1a1b/regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80", size = 769939 }, + { url = "https://files.pythonhosted.org/packages/20/06/7e18a4fa9d326daeda46d471a44ef94201c46eaa26dbbb780b5d92cbfdda/regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2", size = 854753 }, + { url = "https://files.pythonhosted.org/packages/3b/67/dc8946ef3965e166f558ef3b47f492bc364e96a265eb4a2bb3ca765c8e46/regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60", size = 799559 }, + { url = "https://files.pythonhosted.org/packages/a5/61/1bba81ff6d50c86c65d9fd84ce9699dd106438ee4cdb105bf60374ee8412/regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952", size = 268879 }, + { url = "https://files.pythonhosted.org/packages/e9/5e/cef7d4c5fb0ea3ac5c775fd37db5747f7378b29526cc83f572198924ff47/regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10", size = 280317 }, + { url = "https://files.pythonhosted.org/packages/b4/52/4317f7a5988544e34ab57b4bde0f04944c4786128c933fb09825924d3e82/regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829", size = 271551 }, + { url = "https://files.pythonhosted.org/packages/52/0a/47fa888ec7cbbc7d62c5f2a6a888878e76169170ead271a35239edd8f0e8/regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac", size = 489170 }, + { url = "https://files.pythonhosted.org/packages/ac/c4/d000e9b7296c15737c9301708e9e7fbdea009f8e93541b6b43bdb8219646/regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6", size = 291146 }, + { url = "https://files.pythonhosted.org/packages/f9/b6/921cc61982e538682bdf3bdf5b2c6ab6b34368da1f8e98a6c1ddc503c9cf/regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2", size = 288986 }, + { url = "https://files.pythonhosted.org/packages/ca/33/eb7383dde0bbc93f4fb9d03453aab97e18ad4024ac7e26cef8d1f0a2cff0/regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846", size = 799098 }, + { url = "https://files.pythonhosted.org/packages/27/56/b664dccae898fc8d8b4c23accd853f723bde0f026c747b6f6262b688029c/regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b", size = 864980 }, + { url = "https://files.pythonhosted.org/packages/16/40/0999e064a170eddd237bae9ccfcd8f28b3aa98a38bf727a086425542a4fc/regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e", size = 911607 }, + { url = "https://files.pythonhosted.org/packages/07/78/c77f644b68ab054e5a674fb4da40ff7bffb2c88df58afa82dbf86573092d/regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde", size = 803358 }, + { url = "https://files.pythonhosted.org/packages/27/31/d4292ea8566eaa551fafc07797961c5963cf5235c797cc2ae19b85dfd04d/regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5", size = 775833 }, + { url = "https://files.pythonhosted.org/packages/ce/b2/cff3bf2fea4133aa6fb0d1e370b37544d18c8350a2fa118c7e11d1db0e14/regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34", size = 788045 }, + { url = "https://files.pythonhosted.org/packages/8d/99/2cb9b69045372ec877b6f5124bda4eb4253bc58b8fe5848c973f752bc52c/regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75", size = 859374 }, + { url = "https://files.pythonhosted.org/packages/09/16/710b0a5abe8e077b1729a562d2f297224ad079f3a66dce46844c193416c8/regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e", size = 763940 }, + { url = "https://files.pythonhosted.org/packages/dd/d1/7585c8e744e40eb3d32f119191969b91de04c073fca98ec14299041f6e7e/regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160", size = 850112 }, + { url = "https://files.pythonhosted.org/packages/af/d6/43e1dd85df86c49a347aa57c1f69d12c652c7b60e37ec162e3096194a278/regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1", size = 789586 }, + { url = "https://files.pythonhosted.org/packages/93/38/77142422f631e013f316aaae83234c629555729a9fbc952b8a63ac91462a/regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1", size = 271691 }, + { url = "https://files.pythonhosted.org/packages/4a/a9/ab16b4649524ca9e05213c1cdbb7faa85cc2aa90a0230d2f796cbaf22736/regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903", size = 280422 }, + { url = "https://files.pythonhosted.org/packages/be/2a/20fd057bf3521cb4791f69f869635f73e0aaf2b9ad2d260f728144f9047c/regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705", size = 273467 }, + { url = "https://files.pythonhosted.org/packages/ad/77/0b1e81857060b92b9cad239104c46507dd481b3ff1fa79f8e7f865aae38a/regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8", size = 492073 }, + { url = "https://files.pythonhosted.org/packages/70/f3/f8302b0c208b22c1e4f423147e1913fd475ddd6230565b299925353de644/regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf", size = 292757 }, + { url = "https://files.pythonhosted.org/packages/bf/f0/ef55de2460f3b4a6da9d9e7daacd0cb79d4ef75c64a2af316e68447f0df0/regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d", size = 291122 }, + { url = "https://files.pythonhosted.org/packages/cf/55/bb8ccbacabbc3a11d863ee62a9f18b160a83084ea95cdfc5d207bfc3dd75/regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84", size = 807761 }, + { url = "https://files.pythonhosted.org/packages/8f/84/f75d937f17f81e55679a0509e86176e29caa7298c38bd1db7ce9c0bf6075/regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df", size = 873538 }, + { url = "https://files.pythonhosted.org/packages/b8/d9/0da86327df70349aa8d86390da91171bd3ca4f0e7c1d1d453a9c10344da3/regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434", size = 915066 }, + { url = "https://files.pythonhosted.org/packages/2a/5e/f660fb23fc77baa2a61aa1f1fe3a4eea2bbb8a286ddec148030672e18834/regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a", size = 812938 }, + { url = "https://files.pythonhosted.org/packages/69/33/a47a29bfecebbbfd1e5cd3f26b28020a97e4820f1c5148e66e3b7d4b4992/regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10", size = 781314 }, + { url = "https://files.pythonhosted.org/packages/65/ec/7ec2bbfd4c3f4e494a24dec4c6943a668e2030426b1b8b949a6462d2c17b/regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac", size = 795652 }, + { url = "https://files.pythonhosted.org/packages/46/79/a5d8651ae131fe27d7c521ad300aa7f1c7be1dbeee4d446498af5411b8a9/regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea", size = 868550 }, + { url = "https://files.pythonhosted.org/packages/06/b7/25635d2809664b79f183070786a5552dd4e627e5aedb0065f4e3cf8ee37d/regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e", size = 769981 }, + { url = "https://files.pythonhosted.org/packages/16/8b/fc3fcbb2393dcfa4a6c5ffad92dc498e842df4581ea9d14309fcd3c55fb9/regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521", size = 854780 }, + { url = "https://files.pythonhosted.org/packages/d0/38/dde117c76c624713c8a2842530be9c93ca8b606c0f6102d86e8cd1ce8bea/regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db", size = 799778 }, + { url = "https://files.pythonhosted.org/packages/e3/0d/3a6cfa9ae99606afb612d8fb7a66b245a9d5ff0f29bb347c8a30b6ad561b/regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e", size = 274667 }, + { url = "https://files.pythonhosted.org/packages/5b/b2/297293bb0742fd06b8d8e2572db41a855cdf1cae0bf009b1cb74fe07e196/regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf", size = 284386 }, + { url = "https://files.pythonhosted.org/packages/95/e4/a3b9480c78cf8ee86626cb06f8d931d74d775897d44201ccb813097ae697/regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70", size = 274837 }, ] [[package]] name = "requests" version = "2.32.5" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "certifi" }, { name = "charset-normalizer" }, { name = "idna" }, { name = "urllib3" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } wheels = [ - { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, ] [[package]] name = "rich" version = "14.3.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "markdown-it-py" }, { name = "pygments" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125, upload-time = "2026-01-24T21:40:44.847Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952, upload-time = "2026-01-24T21:40:42.969Z" }, -] - -[[package]] -name = "rpds-py" -version = "0.30.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, - { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, - { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, - { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, - { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, - { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, - { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, - { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, - { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, - { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, - { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, - { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, - { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, - { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, - { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, - { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, - { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, - { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, - { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, - { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, - { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, - { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, - { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, - { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, - { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, - { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, - { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, - { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, - { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, - { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, - { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, - { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, - { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, - { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, - { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, - { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, - { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, - { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, - { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, - { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, - { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, - { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, - { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, - { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, - { url = "https://files.pythonhosted.org/packages/ed/dc/d61221eb88ff410de3c49143407f6f3147acf2538c86f2ab7ce65ae7d5f9/rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2", size = 374887, upload-time = "2025-11-30T20:22:41.812Z" }, - { url = "https://files.pythonhosted.org/packages/fd/32/55fb50ae104061dbc564ef15cc43c013dc4a9f4527a1f4d99baddf56fe5f/rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8", size = 358904, upload-time = "2025-11-30T20:22:43.479Z" }, - { url = "https://files.pythonhosted.org/packages/58/70/faed8186300e3b9bdd138d0273109784eea2396c68458ed580f885dfe7ad/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4", size = 389945, upload-time = "2025-11-30T20:22:44.819Z" }, - { url = "https://files.pythonhosted.org/packages/bd/a8/073cac3ed2c6387df38f71296d002ab43496a96b92c823e76f46b8af0543/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136", size = 407783, upload-time = "2025-11-30T20:22:46.103Z" }, - { url = "https://files.pythonhosted.org/packages/77/57/5999eb8c58671f1c11eba084115e77a8899d6e694d2a18f69f0ba471ec8b/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7", size = 515021, upload-time = "2025-11-30T20:22:47.458Z" }, - { url = "https://files.pythonhosted.org/packages/e0/af/5ab4833eadc36c0a8ed2bc5c0de0493c04f6c06de223170bd0798ff98ced/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2", size = 414589, upload-time = "2025-11-30T20:22:48.872Z" }, - { url = "https://files.pythonhosted.org/packages/b7/de/f7192e12b21b9e9a68a6d0f249b4af3fdcdff8418be0767a627564afa1f1/rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6", size = 394025, upload-time = "2025-11-30T20:22:50.196Z" }, - { url = "https://files.pythonhosted.org/packages/91/c4/fc70cd0249496493500e7cc2de87504f5aa6509de1e88623431fec76d4b6/rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e", size = 408895, upload-time = "2025-11-30T20:22:51.87Z" }, - { url = "https://files.pythonhosted.org/packages/58/95/d9275b05ab96556fefff73a385813eb66032e4c99f411d0795372d9abcea/rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d", size = 422799, upload-time = "2025-11-30T20:22:53.341Z" }, - { url = "https://files.pythonhosted.org/packages/06/c1/3088fc04b6624eb12a57eb814f0d4997a44b0d208d6cace713033ff1a6ba/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7", size = 572731, upload-time = "2025-11-30T20:22:54.778Z" }, - { url = "https://files.pythonhosted.org/packages/d8/42/c612a833183b39774e8ac8fecae81263a68b9583ee343db33ab571a7ce55/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31", size = 599027, upload-time = "2025-11-30T20:22:56.212Z" }, - { url = "https://files.pythonhosted.org/packages/5f/60/525a50f45b01d70005403ae0e25f43c0384369ad24ffe46e8d9068b50086/rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95", size = 563020, upload-time = "2025-11-30T20:22:58.2Z" }, - { url = "https://files.pythonhosted.org/packages/0b/5d/47c4655e9bcd5ca907148535c10e7d489044243cc9941c16ed7cd53be91d/rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d", size = 223139, upload-time = "2025-11-30T20:23:00.209Z" }, - { url = "https://files.pythonhosted.org/packages/f2/e1/485132437d20aa4d3e1d8b3fb5a5e65aa8139f1e097080c2a8443201742c/rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15", size = 240224, upload-time = "2025-11-30T20:23:02.008Z" }, - { url = "https://files.pythonhosted.org/packages/24/95/ffd128ed1146a153d928617b0ef673960130be0009c77d8fbf0abe306713/rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1", size = 230645, upload-time = "2025-11-30T20:23:03.43Z" }, - { url = "https://files.pythonhosted.org/packages/ff/1b/b10de890a0def2a319a2626334a7f0ae388215eb60914dbac8a3bae54435/rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a", size = 364443, upload-time = "2025-11-30T20:23:04.878Z" }, - { url = "https://files.pythonhosted.org/packages/0d/bf/27e39f5971dc4f305a4fb9c672ca06f290f7c4e261c568f3dea16a410d47/rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e", size = 353375, upload-time = "2025-11-30T20:23:06.342Z" }, - { url = "https://files.pythonhosted.org/packages/40/58/442ada3bba6e8e6615fc00483135c14a7538d2ffac30e2d933ccf6852232/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000", size = 383850, upload-time = "2025-11-30T20:23:07.825Z" }, - { url = "https://files.pythonhosted.org/packages/14/14/f59b0127409a33c6ef6f5c1ebd5ad8e32d7861c9c7adfa9a624fc3889f6c/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db", size = 392812, upload-time = "2025-11-30T20:23:09.228Z" }, - { url = "https://files.pythonhosted.org/packages/b3/66/e0be3e162ac299b3a22527e8913767d869e6cc75c46bd844aa43fb81ab62/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2", size = 517841, upload-time = "2025-11-30T20:23:11.186Z" }, - { url = "https://files.pythonhosted.org/packages/3d/55/fa3b9cf31d0c963ecf1ba777f7cf4b2a2c976795ac430d24a1f43d25a6ba/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa", size = 408149, upload-time = "2025-11-30T20:23:12.864Z" }, - { url = "https://files.pythonhosted.org/packages/60/ca/780cf3b1a32b18c0f05c441958d3758f02544f1d613abf9488cd78876378/rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083", size = 383843, upload-time = "2025-11-30T20:23:14.638Z" }, - { url = "https://files.pythonhosted.org/packages/82/86/d5f2e04f2aa6247c613da0c1dd87fcd08fa17107e858193566048a1e2f0a/rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9", size = 396507, upload-time = "2025-11-30T20:23:16.105Z" }, - { url = "https://files.pythonhosted.org/packages/4b/9a/453255d2f769fe44e07ea9785c8347edaf867f7026872e76c1ad9f7bed92/rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0", size = 414949, upload-time = "2025-11-30T20:23:17.539Z" }, - { url = "https://files.pythonhosted.org/packages/a3/31/622a86cdc0c45d6df0e9ccb6becdba5074735e7033c20e401a6d9d0e2ca0/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94", size = 565790, upload-time = "2025-11-30T20:23:19.029Z" }, - { url = "https://files.pythonhosted.org/packages/1c/5d/15bbf0fb4a3f58a3b1c67855ec1efcc4ceaef4e86644665fff03e1b66d8d/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08", size = 590217, upload-time = "2025-11-30T20:23:20.885Z" }, - { url = "https://files.pythonhosted.org/packages/6d/61/21b8c41f68e60c8cc3b2e25644f0e3681926020f11d06ab0b78e3c6bbff1/rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27", size = 555806, upload-time = "2025-11-30T20:23:22.488Z" }, - { url = "https://files.pythonhosted.org/packages/f9/39/7e067bb06c31de48de3eb200f9fc7c58982a4d3db44b07e73963e10d3be9/rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6", size = 211341, upload-time = "2025-11-30T20:23:24.449Z" }, - { url = "https://files.pythonhosted.org/packages/0a/4d/222ef0b46443cf4cf46764d9c630f3fe4abaa7245be9417e56e9f52b8f65/rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d", size = 225768, upload-time = "2025-11-30T20:23:25.908Z" }, - { url = "https://files.pythonhosted.org/packages/86/81/dad16382ebbd3d0e0328776d8fd7ca94220e4fa0798d1dc5e7da48cb3201/rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0", size = 362099, upload-time = "2025-11-30T20:23:27.316Z" }, - { url = "https://files.pythonhosted.org/packages/2b/60/19f7884db5d5603edf3c6bce35408f45ad3e97e10007df0e17dd57af18f8/rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be", size = 353192, upload-time = "2025-11-30T20:23:29.151Z" }, - { url = "https://files.pythonhosted.org/packages/bf/c4/76eb0e1e72d1a9c4703c69607cec123c29028bff28ce41588792417098ac/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f", size = 384080, upload-time = "2025-11-30T20:23:30.785Z" }, - { url = "https://files.pythonhosted.org/packages/72/87/87ea665e92f3298d1b26d78814721dc39ed8d2c74b86e83348d6b48a6f31/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f", size = 394841, upload-time = "2025-11-30T20:23:32.209Z" }, - { url = "https://files.pythonhosted.org/packages/77/ad/7783a89ca0587c15dcbf139b4a8364a872a25f861bdb88ed99f9b0dec985/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87", size = 516670, upload-time = "2025-11-30T20:23:33.742Z" }, - { url = "https://files.pythonhosted.org/packages/5b/3c/2882bdac942bd2172f3da574eab16f309ae10a3925644e969536553cb4ee/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18", size = 408005, upload-time = "2025-11-30T20:23:35.253Z" }, - { url = "https://files.pythonhosted.org/packages/ce/81/9a91c0111ce1758c92516a3e44776920b579d9a7c09b2b06b642d4de3f0f/rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad", size = 382112, upload-time = "2025-11-30T20:23:36.842Z" }, - { url = "https://files.pythonhosted.org/packages/cf/8e/1da49d4a107027e5fbc64daeab96a0706361a2918da10cb41769244b805d/rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07", size = 399049, upload-time = "2025-11-30T20:23:38.343Z" }, - { url = "https://files.pythonhosted.org/packages/df/5a/7ee239b1aa48a127570ec03becbb29c9d5a9eb092febbd1699d567cae859/rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f", size = 415661, upload-time = "2025-11-30T20:23:40.263Z" }, - { url = "https://files.pythonhosted.org/packages/70/ea/caa143cf6b772f823bc7929a45da1fa83569ee49b11d18d0ada7f5ee6fd6/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65", size = 565606, upload-time = "2025-11-30T20:23:42.186Z" }, - { url = "https://files.pythonhosted.org/packages/64/91/ac20ba2d69303f961ad8cf55bf7dbdb4763f627291ba3d0d7d67333cced9/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f", size = 591126, upload-time = "2025-11-30T20:23:44.086Z" }, - { url = "https://files.pythonhosted.org/packages/21/20/7ff5f3c8b00c8a95f75985128c26ba44503fb35b8e0259d812766ea966c7/rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53", size = 553371, upload-time = "2025-11-30T20:23:46.004Z" }, - { url = "https://files.pythonhosted.org/packages/72/c7/81dadd7b27c8ee391c132a6b192111ca58d866577ce2d9b0ca157552cce0/rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed", size = 215298, upload-time = "2025-11-30T20:23:47.696Z" }, - { url = "https://files.pythonhosted.org/packages/3e/d2/1aaac33287e8cfb07aab2e6b8ac1deca62f6f65411344f1433c55e6f3eb8/rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950", size = 228604, upload-time = "2025-11-30T20:23:49.501Z" }, - { url = "https://files.pythonhosted.org/packages/e8/95/ab005315818cc519ad074cb7784dae60d939163108bd2b394e60dc7b5461/rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6", size = 222391, upload-time = "2025-11-30T20:23:50.96Z" }, - { url = "https://files.pythonhosted.org/packages/9e/68/154fe0194d83b973cdedcdcc88947a2752411165930182ae41d983dcefa6/rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb", size = 364868, upload-time = "2025-11-30T20:23:52.494Z" }, - { url = "https://files.pythonhosted.org/packages/83/69/8bbc8b07ec854d92a8b75668c24d2abcb1719ebf890f5604c61c9369a16f/rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8", size = 353747, upload-time = "2025-11-30T20:23:54.036Z" }, - { url = "https://files.pythonhosted.org/packages/ab/00/ba2e50183dbd9abcce9497fa5149c62b4ff3e22d338a30d690f9af970561/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7", size = 383795, upload-time = "2025-11-30T20:23:55.556Z" }, - { url = "https://files.pythonhosted.org/packages/05/6f/86f0272b84926bcb0e4c972262f54223e8ecc556b3224d281e6598fc9268/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898", size = 393330, upload-time = "2025-11-30T20:23:57.033Z" }, - { url = "https://files.pythonhosted.org/packages/cb/e9/0e02bb2e6dc63d212641da45df2b0bf29699d01715913e0d0f017ee29438/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e", size = 518194, upload-time = "2025-11-30T20:23:58.637Z" }, - { url = "https://files.pythonhosted.org/packages/ee/ca/be7bca14cf21513bdf9c0606aba17d1f389ea2b6987035eb4f62bd923f25/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419", size = 408340, upload-time = "2025-11-30T20:24:00.2Z" }, - { url = "https://files.pythonhosted.org/packages/c2/c7/736e00ebf39ed81d75544c0da6ef7b0998f8201b369acf842f9a90dc8fce/rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551", size = 383765, upload-time = "2025-11-30T20:24:01.759Z" }, - { url = "https://files.pythonhosted.org/packages/4a/3f/da50dfde9956aaf365c4adc9533b100008ed31aea635f2b8d7b627e25b49/rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8", size = 396834, upload-time = "2025-11-30T20:24:03.687Z" }, - { url = "https://files.pythonhosted.org/packages/4e/00/34bcc2565b6020eab2623349efbdec810676ad571995911f1abdae62a3a0/rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5", size = 415470, upload-time = "2025-11-30T20:24:05.232Z" }, - { url = "https://files.pythonhosted.org/packages/8c/28/882e72b5b3e6f718d5453bd4d0d9cf8df36fddeb4ddbbab17869d5868616/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404", size = 565630, upload-time = "2025-11-30T20:24:06.878Z" }, - { url = "https://files.pythonhosted.org/packages/3b/97/04a65539c17692de5b85c6e293520fd01317fd878ea1995f0367d4532fb1/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856", size = 591148, upload-time = "2025-11-30T20:24:08.445Z" }, - { url = "https://files.pythonhosted.org/packages/85/70/92482ccffb96f5441aab93e26c4d66489eb599efdcf96fad90c14bbfb976/rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40", size = 556030, upload-time = "2025-11-30T20:24:10.956Z" }, - { url = "https://files.pythonhosted.org/packages/20/53/7c7e784abfa500a2b6b583b147ee4bb5a2b3747a9166bab52fec4b5b5e7d/rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0", size = 211570, upload-time = "2025-11-30T20:24:12.735Z" }, - { url = "https://files.pythonhosted.org/packages/d0/02/fa464cdfbe6b26e0600b62c528b72d8608f5cc49f96b8d6e38c95d60c676/rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3", size = 226532, upload-time = "2025-11-30T20:24:14.634Z" }, - { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, - { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, - { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, - { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, - { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, - { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, - { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, - { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, - { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, - { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, - { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/a1/84/4831f881aa6ff3c976f6d6809b58cdfa350593ffc0dc3c58f5f6586780fb/rich-14.3.1.tar.gz", hash = "sha256:b8c5f568a3a749f9290ec6bddedf835cec33696bfc1e48bcfecb276c7386e4b8", size = 230125 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/2a/a1810c8627b9ec8c57ec5ec325d306701ae7be50235e8fd81266e002a3cc/rich-14.3.1-py3-none-any.whl", hash = "sha256:da750b1aebbff0b372557426fb3f35ba56de8ef954b3190315eb64076d6fb54e", size = 309952 }, ] [[package]] name = "safehttpx" version = "0.1.7" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "httpx" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/89/d1/4282284d9cf1ee873607a46442da977fc3c985059315ab23610be31d5885/safehttpx-0.1.7.tar.gz", hash = "sha256:db201c0978c41eddb8bb480f3eee59dd67304fdd91646035e9d9a720049a9d23", size = 10385, upload-time = "2025-10-24T18:30:09.783Z" } +sdist = { url = "https://files.pythonhosted.org/packages/89/d1/4282284d9cf1ee873607a46442da977fc3c985059315ab23610be31d5885/safehttpx-0.1.7.tar.gz", hash = "sha256:db201c0978c41eddb8bb480f3eee59dd67304fdd91646035e9d9a720049a9d23", size = 10385 } wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/a3/0f0b7d78e2f1eb9e8e1afbff1d2bff8d60144aee17aca51c065b516743dd/safehttpx-0.1.7-py3-none-any.whl", hash = "sha256:c4f4a162db6993464d7ca3d7cc4af0ffc6515a606dfd220b9f82c6945d869cde", size = 8959, upload-time = "2025-10-24T18:30:08.733Z" }, + { url = "https://files.pythonhosted.org/packages/2e/a3/0f0b7d78e2f1eb9e8e1afbff1d2bff8d60144aee17aca51c065b516743dd/safehttpx-0.1.7-py3-none-any.whl", hash = "sha256:c4f4a162db6993464d7ca3d7cc4af0ffc6515a606dfd220b9f82c6945d869cde", size = 8959 }, ] [[package]] name = "safetensors" version = "0.7.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878, upload-time = "2025-11-19T15:18:43.199Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781, upload-time = "2025-11-19T15:18:35.84Z" }, - { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058, upload-time = "2025-11-19T15:18:34.416Z" }, - { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748, upload-time = "2025-11-19T15:18:09.79Z" }, - { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881, upload-time = "2025-11-19T15:18:16.145Z" }, - { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463, upload-time = "2025-11-19T15:18:21.11Z" }, - { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855, upload-time = "2025-11-19T15:18:25.719Z" }, - { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152, upload-time = "2025-11-19T15:18:33.023Z" }, - { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856, upload-time = "2025-11-19T15:18:31.075Z" }, - { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060, upload-time = "2025-11-19T15:18:37.211Z" }, - { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715, upload-time = "2025-11-19T15:18:38.689Z" }, - { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377, upload-time = "2025-11-19T15:18:40.162Z" }, - { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368, upload-time = "2025-11-19T15:18:41.627Z" }, - { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423, upload-time = "2025-11-19T15:18:45.74Z" }, - { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380, upload-time = "2025-11-19T15:18:44.427Z" }, - { url = "https://files.pythonhosted.org/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", size = 492430, upload-time = "2025-11-19T15:18:11.884Z" }, - { url = "https://files.pythonhosted.org/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", size = 503977, upload-time = "2025-11-19T15:18:17.523Z" }, - { url = "https://files.pythonhosted.org/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", size = 623890, upload-time = "2025-11-19T15:18:22.666Z" }, - { url = "https://files.pythonhosted.org/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", size = 531885, upload-time = "2025-11-19T15:18:27.146Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/29/9c/6e74567782559a63bd040a236edca26fd71bc7ba88de2ef35d75df3bca5e/safetensors-0.7.0.tar.gz", hash = "sha256:07663963b67e8bd9f0b8ad15bb9163606cd27cc5a1b96235a50d8369803b96b0", size = 200878 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fa/47/aef6c06649039accf914afef490268e1067ed82be62bcfa5b7e886ad15e8/safetensors-0.7.0-cp38-abi3-macosx_10_12_x86_64.whl", hash = "sha256:c82f4d474cf725255d9e6acf17252991c3c8aac038d6ef363a4bf8be2f6db517", size = 467781 }, + { url = "https://files.pythonhosted.org/packages/e8/00/374c0c068e30cd31f1e1b46b4b5738168ec79e7689ca82ee93ddfea05109/safetensors-0.7.0-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:94fd4858284736bb67a897a41608b5b0c2496c9bdb3bf2af1fa3409127f20d57", size = 447058 }, + { url = "https://files.pythonhosted.org/packages/f1/06/578ffed52c2296f93d7fd2d844cabfa92be51a587c38c8afbb8ae449ca89/safetensors-0.7.0-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e07d91d0c92a31200f25351f4acb2bc6aff7f48094e13ebb1d0fb995b54b6542", size = 491748 }, + { url = "https://files.pythonhosted.org/packages/ae/33/1debbbb70e4791dde185edb9413d1fe01619255abb64b300157d7f15dddd/safetensors-0.7.0-cp38-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:8469155f4cb518bafb4acf4865e8bb9d6804110d2d9bdcaa78564b9fd841e104", size = 503881 }, + { url = "https://files.pythonhosted.org/packages/8e/1c/40c2ca924d60792c3be509833df711b553c60effbd91da6f5284a83f7122/safetensors-0.7.0-cp38-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:54bef08bf00a2bff599982f6b08e8770e09cc012d7bba00783fc7ea38f1fb37d", size = 623463 }, + { url = "https://files.pythonhosted.org/packages/9b/3a/13784a9364bd43b0d61eef4bea2845039bc2030458b16594a1bd787ae26e/safetensors-0.7.0-cp38-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:42cb091236206bb2016d245c377ed383aa7f78691748f3bb6ee1bfa51ae2ce6a", size = 532855 }, + { url = "https://files.pythonhosted.org/packages/a0/60/429e9b1cb3fc651937727befe258ea24122d9663e4d5709a48c9cbfceecb/safetensors-0.7.0-cp38-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dac7252938f0696ddea46f5e855dd3138444e82236e3be475f54929f0c510d48", size = 507152 }, + { url = "https://files.pythonhosted.org/packages/3c/a8/4b45e4e059270d17af60359713ffd83f97900d45a6afa73aaa0d737d48b6/safetensors-0.7.0-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1d060c70284127fa805085d8f10fbd0962792aed71879d00864acda69dbab981", size = 541856 }, + { url = "https://files.pythonhosted.org/packages/06/87/d26d8407c44175d8ae164a95b5a62707fcc445f3c0c56108e37d98070a3d/safetensors-0.7.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:cdab83a366799fa730f90a4ebb563e494f28e9e92c4819e556152ad55e43591b", size = 674060 }, + { url = "https://files.pythonhosted.org/packages/11/f5/57644a2ff08dc6325816ba7217e5095f17269dada2554b658442c66aed51/safetensors-0.7.0-cp38-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:672132907fcad9f2aedcb705b2d7b3b93354a2aec1b2f706c4db852abe338f85", size = 771715 }, + { url = "https://files.pythonhosted.org/packages/86/31/17883e13a814bd278ae6e266b13282a01049b0c81341da7fd0e3e71a80a3/safetensors-0.7.0-cp38-abi3-musllinux_1_2_i686.whl", hash = "sha256:5d72abdb8a4d56d4020713724ba81dac065fedb7f3667151c4a637f1d3fb26c0", size = 714377 }, + { url = "https://files.pythonhosted.org/packages/4a/d8/0c8a7dc9b41dcac53c4cbf9df2b9c83e0e0097203de8b37a712b345c0be5/safetensors-0.7.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b0f6d66c1c538d5a94a73aa9ddca8ccc4227e6c9ff555322ea40bdd142391dd4", size = 677368 }, + { url = "https://files.pythonhosted.org/packages/05/e5/cb4b713c8a93469e3c5be7c3f8d77d307e65fe89673e731f5c2bfd0a9237/safetensors-0.7.0-cp38-abi3-win32.whl", hash = "sha256:c74af94bf3ac15ac4d0f2a7c7b4663a15f8c2ab15ed0fc7531ca61d0835eccba", size = 326423 }, + { url = "https://files.pythonhosted.org/packages/5d/e6/ec8471c8072382cb91233ba7267fd931219753bb43814cbc71757bfd4dab/safetensors-0.7.0-cp38-abi3-win_amd64.whl", hash = "sha256:d1239932053f56f3456f32eb9625590cc7582e905021f94636202a864d470755", size = 341380 }, + { url = "https://files.pythonhosted.org/packages/a7/6a/4d08d89a6fcbe905c5ae68b8b34f0791850882fc19782d0d02c65abbdf3b/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f4729811a6640d019a4b7ba8638ee2fd21fa5ca8c7e7bdf0fed62068fcaac737", size = 492430 }, + { url = "https://files.pythonhosted.org/packages/dd/29/59ed8152b30f72c42d00d241e58eaca558ae9dbfa5695206e2e0f54c7063/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:12f49080303fa6bb424b362149a12949dfbbf1e06811a88f2307276b0c131afd", size = 503977 }, + { url = "https://files.pythonhosted.org/packages/d3/0b/4811bfec67fa260e791369b16dab105e4bae82686120554cc484064e22b4/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0071bffba4150c2f46cae1432d31995d77acfd9f8db598b5d1a2ce67e8440ad2", size = 623890 }, + { url = "https://files.pythonhosted.org/packages/58/5b/632a58724221ef03d78ab65062e82a1010e1bef8e8e0b9d7c6d7b8044841/safetensors-0.7.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:473b32699f4200e69801bf5abf93f1a4ecd432a70984df164fc22ccf39c4a6f3", size = 531885 }, ] [[package]] name = "semantic-version" version = "2.10.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289, upload-time = "2022-05-26T13:35:23.454Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/31/f2289ce78b9b473d582568c234e104d2a342fd658cc288a7553d83bb8595/semantic_version-2.10.0.tar.gz", hash = "sha256:bdabb6d336998cbb378d4b9db3a4b56a1e3235701dc05ea2690d9a997ed5041c", size = 52289 } wheels = [ - { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552, upload-time = "2022-05-26T13:35:21.206Z" }, + { url = "https://files.pythonhosted.org/packages/6a/23/8146aad7d88f4fcb3a6218f41a60f6c2d4e3a72de72da1825dc7c8f7877c/semantic_version-2.10.0-py2.py3-none-any.whl", hash = "sha256:de78a3b8e0feda74cabc54aab2da702113e33ac9d9eb9d2389bcf1f58b7d9177", size = 15552 }, ] [[package]] name = "sentencepiece" version = "0.2.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515, upload-time = "2025-08-12T07:00:51.718Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/af/31/5b7cccb307b485db1a2372d6d2980b0a65d067f8be5ca943a103b4acd5b3/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e10fa50bdbaa5e2445dbd387979980d391760faf0ec99a09bd7780ff37eaec44", size = 1942557, upload-time = "2025-08-12T06:59:12.379Z" }, - { url = "https://files.pythonhosted.org/packages/1f/41/0ac923a8e685ad290c5afc8ae55c5844977b8d75076fcc04302b9a324274/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f27ae6deea72efdb6f361750c92f6c21fd0ad087445082770cc34015213c526", size = 1325384, upload-time = "2025-08-12T06:59:14.334Z" }, - { url = "https://files.pythonhosted.org/packages/fc/ef/3751555d67daf9003384978f169d31c775cb5c7baf28633caaf1eb2b2b4d/sentencepiece-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60937c959e6f44159fdd9f56fbdd302501f96114a5ba436829496d5f32d8de3f", size = 1253317, upload-time = "2025-08-12T06:59:16.247Z" }, - { url = "https://files.pythonhosted.org/packages/46/a5/742c69b7bd144eb32b6e5fd50dbd8abbbc7a95fce2fe16e50156fa400e3b/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8b1d91545578852f128650b8cce4ec20f93d39b378ff554ebe66290f2dabb92", size = 1316379, upload-time = "2025-08-12T06:59:17.825Z" }, - { url = "https://files.pythonhosted.org/packages/c8/89/8deeafbba2871e8fa10f20f17447786f4ac38085925335728d360eaf4cae/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27e38eee653abc3d387862e67bc5c8b6f428cd604e688b85d29170b7e725c26c", size = 1387926, upload-time = "2025-08-12T06:59:19.395Z" }, - { url = "https://files.pythonhosted.org/packages/c3/ca/67fe73005f0ab617c6a970b199754e28e524b6873aa7025224fad3cda252/sentencepiece-0.2.1-cp310-cp310-win32.whl", hash = "sha256:251874d720ac7f28024a168501f3c7bb15d1802245f6e66de565f18bbb9b5eaa", size = 999550, upload-time = "2025-08-12T06:59:20.844Z" }, - { url = "https://files.pythonhosted.org/packages/6d/33/dc5b54042050d2dda4229c3ce1f862541c99966390b6aa20f54d520d2dc2/sentencepiece-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:e52144670738b4b477fade6c2a9b6af71a8d0094514c9853ac9f6fc1fcfabae7", size = 1054613, upload-time = "2025-08-12T06:59:22.255Z" }, - { url = "https://files.pythonhosted.org/packages/fa/19/1ea47f46ff97fe04422b78997da1a37cd632f414aae042d27a9009c5b733/sentencepiece-0.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:9076430ac25dfa7147d9d05751dbc66a04bc1aaac371c07f84952979ea59f0d0", size = 1033884, upload-time = "2025-08-12T06:59:24.194Z" }, - { url = "https://files.pythonhosted.org/packages/d8/15/46afbab00733d81788b64be430ca1b93011bb9388527958e26cc31832de5/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6356d0986b8b8dc351b943150fcd81a1c6e6e4d439772e8584c64230e58ca987", size = 1942560, upload-time = "2025-08-12T06:59:25.82Z" }, - { url = "https://files.pythonhosted.org/packages/fa/79/7c01b8ef98a0567e9d84a4e7a910f8e7074fcbf398a5cd76f93f4b9316f9/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f8ba89a3acb3dc1ae90f65ec1894b0b9596fdb98ab003ff38e058f898b39bc7", size = 1325385, upload-time = "2025-08-12T06:59:27.722Z" }, - { url = "https://files.pythonhosted.org/packages/bb/88/2b41e07bd24f33dcf2f18ec3b74247aa4af3526bad8907b8727ea3caba03/sentencepiece-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02593eca45440ef39247cee8c47322a34bdcc1d8ae83ad28ba5a899a2cf8d79a", size = 1253319, upload-time = "2025-08-12T06:59:29.306Z" }, - { url = "https://files.pythonhosted.org/packages/a0/54/38a1af0c6210a3c6f95aa46d23d6640636d020fba7135cd0d9a84ada05a7/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a0d15781a171d188b661ae4bde1d998c303f6bd8621498c50c671bd45a4798e", size = 1316162, upload-time = "2025-08-12T06:59:30.914Z" }, - { url = "https://files.pythonhosted.org/packages/ef/66/fb191403ade791ad2c3c1e72fe8413e63781b08cfa3aa4c9dfc536d6e795/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f5a3e0d9f445ed9d66c0fec47d4b23d12cfc858b407a03c194c1b26c2ac2a63", size = 1387785, upload-time = "2025-08-12T06:59:32.491Z" }, - { url = "https://files.pythonhosted.org/packages/a9/2d/3bd9b08e70067b2124518b308db6a84a4f8901cc8a4317e2e4288cdd9b4d/sentencepiece-0.2.1-cp311-cp311-win32.whl", hash = "sha256:6d297a1748d429ba8534eebe5535448d78b8acc32d00a29b49acf28102eeb094", size = 999555, upload-time = "2025-08-12T06:59:34.475Z" }, - { url = "https://files.pythonhosted.org/packages/32/b8/f709977f5fda195ae1ea24f24e7c581163b6f142b1005bc3d0bbfe4d7082/sentencepiece-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:82d9ead6591015f009cb1be1cb1c015d5e6f04046dbb8c9588b931e869a29728", size = 1054617, upload-time = "2025-08-12T06:59:36.461Z" }, - { url = "https://files.pythonhosted.org/packages/7a/40/a1fc23be23067da0f703709797b464e8a30a1c78cc8a687120cd58d4d509/sentencepiece-0.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:39f8651bd10974eafb9834ce30d9bcf5b73e1fc798a7f7d2528f9820ca86e119", size = 1033877, upload-time = "2025-08-12T06:59:38.391Z" }, - { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152, upload-time = "2025-08-12T06:59:40.048Z" }, - { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651, upload-time = "2025-08-12T06:59:41.536Z" }, - { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645, upload-time = "2025-08-12T06:59:42.903Z" }, - { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273, upload-time = "2025-08-12T06:59:44.476Z" }, - { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881, upload-time = "2025-08-12T06:59:46.09Z" }, - { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540, upload-time = "2025-08-12T06:59:48.023Z" }, - { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671, upload-time = "2025-08-12T06:59:49.895Z" }, - { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923, upload-time = "2025-08-12T06:59:51.952Z" }, - { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150, upload-time = "2025-08-12T06:59:53.588Z" }, - { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651, upload-time = "2025-08-12T06:59:55.073Z" }, - { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641, upload-time = "2025-08-12T06:59:56.562Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271, upload-time = "2025-08-12T06:59:58.109Z" }, - { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882, upload-time = "2025-08-12T07:00:00.701Z" }, - { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541, upload-time = "2025-08-12T07:00:02.709Z" }, - { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669, upload-time = "2025-08-12T07:00:04.915Z" }, - { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922, upload-time = "2025-08-12T07:00:06.496Z" }, - { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052, upload-time = "2025-08-12T07:00:08.136Z" }, - { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408, upload-time = "2025-08-12T07:00:09.572Z" }, - { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857, upload-time = "2025-08-12T07:00:11.021Z" }, - { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722, upload-time = "2025-08-12T07:00:12.989Z" }, - { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452, upload-time = "2025-08-12T07:00:15.088Z" }, - { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501, upload-time = "2025-08-12T07:00:16.966Z" }, - { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555, upload-time = "2025-08-12T07:00:18.573Z" }, - { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042, upload-time = "2025-08-12T07:00:20.209Z" }, - { url = "https://files.pythonhosted.org/packages/24/9c/89eb8b2052f720a612478baf11c8227dcf1dc28cd4ea4c0c19506b5af2a2/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5d0350b686c320068702116276cfb26c066dc7e65cfef173980b11bb4d606719", size = 1943147, upload-time = "2025-08-12T07:00:21.809Z" }, - { url = "https://files.pythonhosted.org/packages/82/0b/a1432bc87f97c2ace36386ca23e8bd3b91fb40581b5e6148d24b24186419/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c7f54a31cde6fa5cb030370566f68152a742f433f8d2be458463d06c208aef33", size = 1325624, upload-time = "2025-08-12T07:00:23.289Z" }, - { url = "https://files.pythonhosted.org/packages/ea/99/bbe054ebb5a5039457c590e0a4156ed073fb0fe9ce4f7523404dd5b37463/sentencepiece-0.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c83b85ab2d6576607f31df77ff86f28182be4a8de6d175d2c33ca609925f5da1", size = 1253670, upload-time = "2025-08-12T07:00:24.69Z" }, - { url = "https://files.pythonhosted.org/packages/19/ad/d5c7075f701bd97971d7c2ac2904f227566f51ef0838dfbdfdccb58cd212/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1855f57db07b51fb51ed6c9c452f570624d2b169b36f0f79ef71a6e6c618cd8b", size = 1316247, upload-time = "2025-08-12T07:00:26.435Z" }, - { url = "https://files.pythonhosted.org/packages/fb/03/35fbe5f3d9a7435eebd0b473e09584bd3cc354ce118b960445b060d33781/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01e6912125cb45d3792f530a4d38f8e21bf884d6b4d4ade1b2de5cf7a8d2a52b", size = 1387894, upload-time = "2025-08-12T07:00:28.339Z" }, - { url = "https://files.pythonhosted.org/packages/dc/aa/956ef729aafb6c8f9c443104c9636489093bb5c61d6b90fc27aa1a865574/sentencepiece-0.2.1-cp314-cp314-win32.whl", hash = "sha256:c415c9de1447e0a74ae3fdb2e52f967cb544113a3a5ce3a194df185cbc1f962f", size = 1096698, upload-time = "2025-08-12T07:00:29.764Z" }, - { url = "https://files.pythonhosted.org/packages/b8/cb/fe400d8836952cc535c81a0ce47dc6875160e5fedb71d2d9ff0e9894c2a6/sentencepiece-0.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:881b2e44b14fc19feade3cbed314be37de639fc415375cefaa5bc81a4be137fd", size = 1155115, upload-time = "2025-08-12T07:00:32.865Z" }, - { url = "https://files.pythonhosted.org/packages/32/89/047921cf70f36c7b6b6390876b2399b3633ab73b8d0cb857e5a964238941/sentencepiece-0.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:2005242a16d2dc3ac5fe18aa7667549134d37854823df4c4db244752453b78a8", size = 1133890, upload-time = "2025-08-12T07:00:34.763Z" }, - { url = "https://files.pythonhosted.org/packages/a1/11/5b414b9fae6255b5fb1e22e2ed3dc3a72d3a694e5703910e640ac78346bb/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a19adcec27c524cb7069a1c741060add95f942d1cbf7ad0d104dffa0a7d28a2b", size = 1946081, upload-time = "2025-08-12T07:00:36.97Z" }, - { url = "https://files.pythonhosted.org/packages/77/eb/7a5682bb25824db8545f8e5662e7f3e32d72a508fdce086029d89695106b/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e37e4b4c4a11662b5db521def4e44d4d30ae69a1743241412a93ae40fdcab4bb", size = 1327406, upload-time = "2025-08-12T07:00:38.669Z" }, - { url = "https://files.pythonhosted.org/packages/03/b0/811dae8fb9f2784e138785d481469788f2e0d0c109c5737372454415f55f/sentencepiece-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:477c81505db072b3ab627e7eab972ea1025331bd3a92bacbf798df2b75ea86ec", size = 1254846, upload-time = "2025-08-12T07:00:40.611Z" }, - { url = "https://files.pythonhosted.org/packages/ef/23/195b2e7ec85ebb6a547969f60b723c7aca5a75800ece6cc3f41da872d14e/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:010f025a544ef770bb395091d57cb94deb9652d8972e0d09f71d85d5a0816c8c", size = 1315721, upload-time = "2025-08-12T07:00:42.914Z" }, - { url = "https://files.pythonhosted.org/packages/7e/aa/553dbe4178b5f23eb28e59393dddd64186178b56b81d9b8d5c3ff1c28395/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:733e59ff1794d26db706cd41fc2d7ca5f6c64a820709cb801dc0ea31780d64ab", size = 1387458, upload-time = "2025-08-12T07:00:44.56Z" }, - { url = "https://files.pythonhosted.org/packages/66/7c/08ff0012507297a4dd74a5420fdc0eb9e3e80f4e88cab1538d7f28db303d/sentencepiece-0.2.1-cp314-cp314t-win32.whl", hash = "sha256:d3233770f78e637dc8b1fda2cd7c3b99ec77e7505041934188a4e7fe751de3b0", size = 1099765, upload-time = "2025-08-12T07:00:46.058Z" }, - { url = "https://files.pythonhosted.org/packages/91/d5/2a69e1ce15881beb9ddfc7e3f998322f5cedcd5e4d244cb74dade9441663/sentencepiece-0.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e4366c97b68218fd30ea72d70c525e6e78a6c0a88650f57ac4c43c63b234a9d", size = 1157807, upload-time = "2025-08-12T07:00:47.673Z" }, - { url = "https://files.pythonhosted.org/packages/f3/16/54f611fcfc2d1c46cbe3ec4169780b2cfa7cf63708ef2b71611136db7513/sentencepiece-0.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:105e36e75cbac1292642045458e8da677b2342dcd33df503e640f0b457cb6751", size = 1136264, upload-time = "2025-08-12T07:00:49.485Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/15/15/2e7a025fc62d764b151ae6d0f2a92f8081755ebe8d4a64099accc6f77ba6/sentencepiece-0.2.1.tar.gz", hash = "sha256:8138cec27c2f2282f4a34d9a016e3374cd40e5c6e9cb335063db66a0a3b71fad", size = 3228515 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/31/5b7cccb307b485db1a2372d6d2980b0a65d067f8be5ca943a103b4acd5b3/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e10fa50bdbaa5e2445dbd387979980d391760faf0ec99a09bd7780ff37eaec44", size = 1942557 }, + { url = "https://files.pythonhosted.org/packages/1f/41/0ac923a8e685ad290c5afc8ae55c5844977b8d75076fcc04302b9a324274/sentencepiece-0.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f27ae6deea72efdb6f361750c92f6c21fd0ad087445082770cc34015213c526", size = 1325384 }, + { url = "https://files.pythonhosted.org/packages/fc/ef/3751555d67daf9003384978f169d31c775cb5c7baf28633caaf1eb2b2b4d/sentencepiece-0.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:60937c959e6f44159fdd9f56fbdd302501f96114a5ba436829496d5f32d8de3f", size = 1253317 }, + { url = "https://files.pythonhosted.org/packages/46/a5/742c69b7bd144eb32b6e5fd50dbd8abbbc7a95fce2fe16e50156fa400e3b/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8b1d91545578852f128650b8cce4ec20f93d39b378ff554ebe66290f2dabb92", size = 1316379 }, + { url = "https://files.pythonhosted.org/packages/c8/89/8deeafbba2871e8fa10f20f17447786f4ac38085925335728d360eaf4cae/sentencepiece-0.2.1-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27e38eee653abc3d387862e67bc5c8b6f428cd604e688b85d29170b7e725c26c", size = 1387926 }, + { url = "https://files.pythonhosted.org/packages/c3/ca/67fe73005f0ab617c6a970b199754e28e524b6873aa7025224fad3cda252/sentencepiece-0.2.1-cp310-cp310-win32.whl", hash = "sha256:251874d720ac7f28024a168501f3c7bb15d1802245f6e66de565f18bbb9b5eaa", size = 999550 }, + { url = "https://files.pythonhosted.org/packages/6d/33/dc5b54042050d2dda4229c3ce1f862541c99966390b6aa20f54d520d2dc2/sentencepiece-0.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:e52144670738b4b477fade6c2a9b6af71a8d0094514c9853ac9f6fc1fcfabae7", size = 1054613 }, + { url = "https://files.pythonhosted.org/packages/fa/19/1ea47f46ff97fe04422b78997da1a37cd632f414aae042d27a9009c5b733/sentencepiece-0.2.1-cp310-cp310-win_arm64.whl", hash = "sha256:9076430ac25dfa7147d9d05751dbc66a04bc1aaac371c07f84952979ea59f0d0", size = 1033884 }, + { url = "https://files.pythonhosted.org/packages/d8/15/46afbab00733d81788b64be430ca1b93011bb9388527958e26cc31832de5/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6356d0986b8b8dc351b943150fcd81a1c6e6e4d439772e8584c64230e58ca987", size = 1942560 }, + { url = "https://files.pythonhosted.org/packages/fa/79/7c01b8ef98a0567e9d84a4e7a910f8e7074fcbf398a5cd76f93f4b9316f9/sentencepiece-0.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:8f8ba89a3acb3dc1ae90f65ec1894b0b9596fdb98ab003ff38e058f898b39bc7", size = 1325385 }, + { url = "https://files.pythonhosted.org/packages/bb/88/2b41e07bd24f33dcf2f18ec3b74247aa4af3526bad8907b8727ea3caba03/sentencepiece-0.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:02593eca45440ef39247cee8c47322a34bdcc1d8ae83ad28ba5a899a2cf8d79a", size = 1253319 }, + { url = "https://files.pythonhosted.org/packages/a0/54/38a1af0c6210a3c6f95aa46d23d6640636d020fba7135cd0d9a84ada05a7/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a0d15781a171d188b661ae4bde1d998c303f6bd8621498c50c671bd45a4798e", size = 1316162 }, + { url = "https://files.pythonhosted.org/packages/ef/66/fb191403ade791ad2c3c1e72fe8413e63781b08cfa3aa4c9dfc536d6e795/sentencepiece-0.2.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f5a3e0d9f445ed9d66c0fec47d4b23d12cfc858b407a03c194c1b26c2ac2a63", size = 1387785 }, + { url = "https://files.pythonhosted.org/packages/a9/2d/3bd9b08e70067b2124518b308db6a84a4f8901cc8a4317e2e4288cdd9b4d/sentencepiece-0.2.1-cp311-cp311-win32.whl", hash = "sha256:6d297a1748d429ba8534eebe5535448d78b8acc32d00a29b49acf28102eeb094", size = 999555 }, + { url = "https://files.pythonhosted.org/packages/32/b8/f709977f5fda195ae1ea24f24e7c581163b6f142b1005bc3d0bbfe4d7082/sentencepiece-0.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:82d9ead6591015f009cb1be1cb1c015d5e6f04046dbb8c9588b931e869a29728", size = 1054617 }, + { url = "https://files.pythonhosted.org/packages/7a/40/a1fc23be23067da0f703709797b464e8a30a1c78cc8a687120cd58d4d509/sentencepiece-0.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:39f8651bd10974eafb9834ce30d9bcf5b73e1fc798a7f7d2528f9820ca86e119", size = 1033877 }, + { url = "https://files.pythonhosted.org/packages/4a/be/32ce495aa1d0e0c323dcb1ba87096037358edee539cac5baf8755a6bd396/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:57cae326c8727de58c85977b175af132a7138d84c764635d7e71bbee7e774133", size = 1943152 }, + { url = "https://files.pythonhosted.org/packages/88/7e/ff23008899a58678e98c6ff592bf4d368eee5a71af96d0df6b38a039dd4f/sentencepiece-0.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:56dd39a3c4d6493db3cdca7e8cc68c6b633f0d4195495cbadfcf5af8a22d05a6", size = 1325651 }, + { url = "https://files.pythonhosted.org/packages/19/84/42eb3ce4796777a1b5d3699dfd4dca85113e68b637f194a6c8d786f16a04/sentencepiece-0.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d9381351182ff9888cc80e41c632e7e274b106f450de33d67a9e8f6043da6f76", size = 1253645 }, + { url = "https://files.pythonhosted.org/packages/89/fa/d3d5ebcba3cb9e6d3775a096251860c41a6bc53a1b9461151df83fe93255/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99f955df238021bf11f0fc37cdb54fd5e5b5f7fd30ecc3d93fb48b6815437167", size = 1316273 }, + { url = "https://files.pythonhosted.org/packages/04/88/14f2f4a2b922d8b39be45bf63d79e6cd3a9b2f248b2fcb98a69b12af12f5/sentencepiece-0.2.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cdfecef430d985f1c2bcbfff3defd1d95dae876fbd0173376012d2d7d24044b", size = 1387881 }, + { url = "https://files.pythonhosted.org/packages/fd/b8/903e5ccb77b4ef140605d5d71b4f9e0ad95d456d6184688073ed11712809/sentencepiece-0.2.1-cp312-cp312-win32.whl", hash = "sha256:a483fd29a34c3e34c39ac5556b0a90942bec253d260235729e50976f5dba1068", size = 999540 }, + { url = "https://files.pythonhosted.org/packages/2d/81/92df5673c067148c2545b1bfe49adfd775bcc3a169a047f5a0e6575ddaca/sentencepiece-0.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:4cdc7c36234fda305e85c32949c5211faaf8dd886096c7cea289ddc12a2d02de", size = 1054671 }, + { url = "https://files.pythonhosted.org/packages/fe/02/c5e3bc518655d714622bec87d83db9cdba1cd0619a4a04e2109751c4f47f/sentencepiece-0.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:daeb5e9e9fcad012324807856113708614d534f596d5008638eb9b40112cd9e4", size = 1033923 }, + { url = "https://files.pythonhosted.org/packages/ba/4a/85fbe1706d4d04a7e826b53f327c4b80f849cf1c7b7c5e31a20a97d8f28b/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:dcd8161eee7b41aae57ded06272905dbd680a0a04b91edd0f64790c796b2f706", size = 1943150 }, + { url = "https://files.pythonhosted.org/packages/c2/83/4cfb393e287509fc2155480b9d184706ef8d9fa8cbf5505d02a5792bf220/sentencepiece-0.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c6c8f42949f419ff8c7e9960dbadcfbc982d7b5efc2f6748210d3dd53a7de062", size = 1325651 }, + { url = "https://files.pythonhosted.org/packages/8d/de/5a007fb53b1ab0aafc69d11a5a3dd72a289d5a3e78dcf2c3a3d9b14ffe93/sentencepiece-0.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:097f3394e99456e9e4efba1737c3749d7e23563dd1588ce71a3d007f25475fff", size = 1253641 }, + { url = "https://files.pythonhosted.org/packages/2c/d2/f552be5928105588f4f4d66ee37dd4c61460d8097e62d0e2e0eec41bc61d/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d7b670879c370d350557edabadbad1f6561a9e6968126e6debca4029e5547820", size = 1316271 }, + { url = "https://files.pythonhosted.org/packages/96/df/0cfe748ace5485be740fed9476dee7877f109da32ed0d280312c94ec259f/sentencepiece-0.2.1-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c7f0fd2f2693309e6628aeeb2e2faf6edd221134dfccac3308ca0de01f8dab47", size = 1387882 }, + { url = "https://files.pythonhosted.org/packages/ac/dd/f7774d42a881ced8e1739f393ab1e82ece39fc9abd4779e28050c2e975b5/sentencepiece-0.2.1-cp313-cp313-win32.whl", hash = "sha256:92b3816aa2339355fda2c8c4e021a5de92180b00aaccaf5e2808972e77a4b22f", size = 999541 }, + { url = "https://files.pythonhosted.org/packages/dd/e9/932b9eae6fd7019548321eee1ab8d5e3b3d1294df9d9a0c9ac517c7b636d/sentencepiece-0.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:10ed3dab2044c47f7a2e7b4969b0c430420cdd45735d78c8f853191fa0e3148b", size = 1054669 }, + { url = "https://files.pythonhosted.org/packages/c9/3a/76488a00ea7d6931689cda28726a1447d66bf1a4837943489314593d5596/sentencepiece-0.2.1-cp313-cp313-win_arm64.whl", hash = "sha256:ac650534e2251083c5f75dde4ff28896ce7c8904133dc8fef42780f4d5588fcd", size = 1033922 }, + { url = "https://files.pythonhosted.org/packages/4a/b6/08fe2ce819e02ccb0296f4843e3f195764ce9829cbda61b7513f29b95718/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:8dd4b477a7b069648d19363aad0cab9bad2f4e83b2d179be668efa672500dc94", size = 1946052 }, + { url = "https://files.pythonhosted.org/packages/ab/d9/1ea0e740591ff4c6fc2b6eb1d7510d02f3fb885093f19b2f3abd1363b402/sentencepiece-0.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0c0f672da370cc490e4c59d89e12289778310a0e71d176c541e4834759e1ae07", size = 1327408 }, + { url = "https://files.pythonhosted.org/packages/99/7e/1fb26e8a21613f6200e1ab88824d5d203714162cf2883248b517deb500b7/sentencepiece-0.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:ad8493bea8432dae8d6830365352350f3b4144415a1d09c4c8cb8d30cf3b6c3c", size = 1254857 }, + { url = "https://files.pythonhosted.org/packages/bc/85/c72fd1f3c7a6010544d6ae07f8ddb38b5e2a7e33bd4318f87266c0bbafbf/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b81a24733726e3678d2db63619acc5a8dccd074f7aa7a54ecd5ca33ca6d2d596", size = 1315722 }, + { url = "https://files.pythonhosted.org/packages/4a/e8/661e5bd82a8aa641fd6c1020bd0e890ef73230a2b7215ddf9c8cd8e941c2/sentencepiece-0.2.1-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a81799d0a68d618e89063fb423c3001a034c893069135ffe51fee439ae474d6", size = 1387452 }, + { url = "https://files.pythonhosted.org/packages/99/5e/ae66c361023a470afcbc1fbb8da722c72ea678a2fcd9a18f1a12598c7501/sentencepiece-0.2.1-cp313-cp313t-win32.whl", hash = "sha256:89a3ea015517c42c0341d0d962f3e6aaf2cf10d71b1932d475c44ba48d00aa2b", size = 1002501 }, + { url = "https://files.pythonhosted.org/packages/c1/03/d332828c4ff764e16c1b56c2c8f9a33488bbe796b53fb6b9c4205ddbf167/sentencepiece-0.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:33f068c9382dc2e7c228eedfd8163b52baa86bb92f50d0488bf2b7da7032e484", size = 1057555 }, + { url = "https://files.pythonhosted.org/packages/88/14/5aee0bf0864df9bd82bd59e7711362908e4935e3f9cdc1f57246b5d5c9b9/sentencepiece-0.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:b3616ad246f360e52c85781e47682d31abfb6554c779e42b65333d4b5f44ecc0", size = 1036042 }, + { url = "https://files.pythonhosted.org/packages/24/9c/89eb8b2052f720a612478baf11c8227dcf1dc28cd4ea4c0c19506b5af2a2/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5d0350b686c320068702116276cfb26c066dc7e65cfef173980b11bb4d606719", size = 1943147 }, + { url = "https://files.pythonhosted.org/packages/82/0b/a1432bc87f97c2ace36386ca23e8bd3b91fb40581b5e6148d24b24186419/sentencepiece-0.2.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:c7f54a31cde6fa5cb030370566f68152a742f433f8d2be458463d06c208aef33", size = 1325624 }, + { url = "https://files.pythonhosted.org/packages/ea/99/bbe054ebb5a5039457c590e0a4156ed073fb0fe9ce4f7523404dd5b37463/sentencepiece-0.2.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c83b85ab2d6576607f31df77ff86f28182be4a8de6d175d2c33ca609925f5da1", size = 1253670 }, + { url = "https://files.pythonhosted.org/packages/19/ad/d5c7075f701bd97971d7c2ac2904f227566f51ef0838dfbdfdccb58cd212/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1855f57db07b51fb51ed6c9c452f570624d2b169b36f0f79ef71a6e6c618cd8b", size = 1316247 }, + { url = "https://files.pythonhosted.org/packages/fb/03/35fbe5f3d9a7435eebd0b473e09584bd3cc354ce118b960445b060d33781/sentencepiece-0.2.1-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01e6912125cb45d3792f530a4d38f8e21bf884d6b4d4ade1b2de5cf7a8d2a52b", size = 1387894 }, + { url = "https://files.pythonhosted.org/packages/dc/aa/956ef729aafb6c8f9c443104c9636489093bb5c61d6b90fc27aa1a865574/sentencepiece-0.2.1-cp314-cp314-win32.whl", hash = "sha256:c415c9de1447e0a74ae3fdb2e52f967cb544113a3a5ce3a194df185cbc1f962f", size = 1096698 }, + { url = "https://files.pythonhosted.org/packages/b8/cb/fe400d8836952cc535c81a0ce47dc6875160e5fedb71d2d9ff0e9894c2a6/sentencepiece-0.2.1-cp314-cp314-win_amd64.whl", hash = "sha256:881b2e44b14fc19feade3cbed314be37de639fc415375cefaa5bc81a4be137fd", size = 1155115 }, + { url = "https://files.pythonhosted.org/packages/32/89/047921cf70f36c7b6b6390876b2399b3633ab73b8d0cb857e5a964238941/sentencepiece-0.2.1-cp314-cp314-win_arm64.whl", hash = "sha256:2005242a16d2dc3ac5fe18aa7667549134d37854823df4c4db244752453b78a8", size = 1133890 }, + { url = "https://files.pythonhosted.org/packages/a1/11/5b414b9fae6255b5fb1e22e2ed3dc3a72d3a694e5703910e640ac78346bb/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:a19adcec27c524cb7069a1c741060add95f942d1cbf7ad0d104dffa0a7d28a2b", size = 1946081 }, + { url = "https://files.pythonhosted.org/packages/77/eb/7a5682bb25824db8545f8e5662e7f3e32d72a508fdce086029d89695106b/sentencepiece-0.2.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:e37e4b4c4a11662b5db521def4e44d4d30ae69a1743241412a93ae40fdcab4bb", size = 1327406 }, + { url = "https://files.pythonhosted.org/packages/03/b0/811dae8fb9f2784e138785d481469788f2e0d0c109c5737372454415f55f/sentencepiece-0.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:477c81505db072b3ab627e7eab972ea1025331bd3a92bacbf798df2b75ea86ec", size = 1254846 }, + { url = "https://files.pythonhosted.org/packages/ef/23/195b2e7ec85ebb6a547969f60b723c7aca5a75800ece6cc3f41da872d14e/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:010f025a544ef770bb395091d57cb94deb9652d8972e0d09f71d85d5a0816c8c", size = 1315721 }, + { url = "https://files.pythonhosted.org/packages/7e/aa/553dbe4178b5f23eb28e59393dddd64186178b56b81d9b8d5c3ff1c28395/sentencepiece-0.2.1-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:733e59ff1794d26db706cd41fc2d7ca5f6c64a820709cb801dc0ea31780d64ab", size = 1387458 }, + { url = "https://files.pythonhosted.org/packages/66/7c/08ff0012507297a4dd74a5420fdc0eb9e3e80f4e88cab1538d7f28db303d/sentencepiece-0.2.1-cp314-cp314t-win32.whl", hash = "sha256:d3233770f78e637dc8b1fda2cd7c3b99ec77e7505041934188a4e7fe751de3b0", size = 1099765 }, + { url = "https://files.pythonhosted.org/packages/91/d5/2a69e1ce15881beb9ddfc7e3f998322f5cedcd5e4d244cb74dade9441663/sentencepiece-0.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:5e4366c97b68218fd30ea72d70c525e6e78a6c0a88650f57ac4c43c63b234a9d", size = 1157807 }, + { url = "https://files.pythonhosted.org/packages/f3/16/54f611fcfc2d1c46cbe3ec4169780b2cfa7cf63708ef2b71611136db7513/sentencepiece-0.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:105e36e75cbac1292642045458e8da677b2342dcd33df503e640f0b457cb6751", size = 1136264 }, ] [[package]] name = "setuptools" version = "80.10.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343, upload-time = "2026-01-25T22:38:17.252Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/76/95/faf61eb8363f26aa7e1d762267a8d602a1b26d4f3a1e758e92cb3cb8b054/setuptools-80.10.2.tar.gz", hash = "sha256:8b0e9d10c784bf7d262c4e5ec5d4ec94127ce206e8738f29a437945fbc219b70", size = 1200343 } wheels = [ - { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234, upload-time = "2026-01-25T22:38:15.216Z" }, + { url = "https://files.pythonhosted.org/packages/94/b8/f1f62a5e3c0ad2ff1d189590bfa4c46b4f3b6e49cef6f26c6ee4e575394d/setuptools-80.10.2-py3-none-any.whl", hash = "sha256:95b30ddfb717250edb492926c92b5221f7ef3fbcc2b07579bcd4a27da21d0173", size = 1064234 }, ] [[package]] name = "shellingham" version = "1.5.4" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310, upload-time = "2023-10-24T04:13:40.426Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/58/15/8b3609fd3830ef7b27b655beb4b4e9c62313a4e8da8c676e142cc210d58e/shellingham-1.5.4.tar.gz", hash = "sha256:8dbca0739d487e5bd35ab3ca4b36e11c4078f3a234bfce294b0a0291363404de", size = 10310 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755, upload-time = "2023-10-24T04:13:38.866Z" }, + { url = "https://files.pythonhosted.org/packages/e0/f9/0595336914c5619e5f28a1fb793285925a8cd4b432c9da0a987836c7f822/shellingham-1.5.4-py2.py3-none-any.whl", hash = "sha256:7ecfff8f2fd72616f7481040475a65b2bf8af90a56c89140852d1120324e8686", size = 9755 }, ] [[package]] name = "six" version = "1.17.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } wheels = [ - { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, -] - -[[package]] -name = "sniffio" -version = "1.3.1" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372, upload-time = "2024-02-25T23:20:04.057Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235, upload-time = "2024-02-25T23:20:01.196Z" }, -] - -[[package]] -name = "sqlalchemy" -version = "2.0.46" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, - { name = "typing-extensions" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/06/aa/9ce0f3e7a9829ead5c8ce549392f33a12c4555a6c0609bb27d882e9c7ddf/sqlalchemy-2.0.46.tar.gz", hash = "sha256:cf36851ee7219c170bb0793dbc3da3e80c582e04a5437bc601bfe8c85c9216d7", size = 9865393, upload-time = "2026-01-21T18:03:45.119Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/40/26/66ba59328dc25e523bfcb0f8db48bdebe2035e0159d600e1f01c0fc93967/sqlalchemy-2.0.46-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:895296687ad06dc9b11a024cf68e8d9d3943aa0b4964278d2553b86f1b267735", size = 2155051, upload-time = "2026-01-21T18:27:28.965Z" }, - { url = "https://files.pythonhosted.org/packages/21/cd/9336732941df972fbbfa394db9caa8bb0cf9fe03656ec728d12e9cbd6edc/sqlalchemy-2.0.46-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab65cb2885a9f80f979b85aa4e9c9165a31381ca322cbde7c638fe6eefd1ec39", size = 3234666, upload-time = "2026-01-21T18:32:28.72Z" }, - { url = "https://files.pythonhosted.org/packages/38/62/865ae8b739930ec433cd4123760bee7f8dafdc10abefd725a025604fb0de/sqlalchemy-2.0.46-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:52fe29b3817bd191cc20bad564237c808967972c97fa683c04b28ec8979ae36f", size = 3232917, upload-time = "2026-01-21T18:44:54.064Z" }, - { url = "https://files.pythonhosted.org/packages/24/38/805904b911857f2b5e00fdea44e9570df62110f834378706939825579296/sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:09168817d6c19954d3b7655da6ba87fcb3a62bb575fb396a81a8b6a9fadfe8b5", size = 3185790, upload-time = "2026-01-21T18:32:30.581Z" }, - { url = "https://files.pythonhosted.org/packages/69/4f/3260bb53aabd2d274856337456ea52f6a7eccf6cce208e558f870cec766b/sqlalchemy-2.0.46-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:be6c0466b4c25b44c5d82b0426b5501de3c424d7a3220e86cd32f319ba56798e", size = 3207206, upload-time = "2026-01-21T18:44:55.93Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b3/67c432d7f9d88bb1a61909b67e29f6354d59186c168fb5d381cf438d3b73/sqlalchemy-2.0.46-cp310-cp310-win32.whl", hash = "sha256:1bc3f601f0a818d27bfe139f6766487d9c88502062a2cd3a7ee6c342e81d5047", size = 2115296, upload-time = "2026-01-21T18:33:12.498Z" }, - { url = "https://files.pythonhosted.org/packages/4a/8c/25fb284f570f9d48e6c240f0269a50cec9cf009a7e08be4c0aaaf0654972/sqlalchemy-2.0.46-cp310-cp310-win_amd64.whl", hash = "sha256:e0c05aff5c6b1bb5fb46a87e0f9d2f733f83ef6cbbbcd5c642b6c01678268061", size = 2138540, upload-time = "2026-01-21T18:33:14.22Z" }, - { url = "https://files.pythonhosted.org/packages/69/ac/b42ad16800d0885105b59380ad69aad0cce5a65276e269ce2729a2343b6a/sqlalchemy-2.0.46-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:261c4b1f101b4a411154f1da2b76497d73abbfc42740029205d4d01fa1052684", size = 2154851, upload-time = "2026-01-21T18:27:30.54Z" }, - { url = "https://files.pythonhosted.org/packages/a0/60/d8710068cb79f64d002ebed62a7263c00c8fd95f4ebd4b5be8f7ca93f2bc/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:181903fe8c1b9082995325f1b2e84ac078b1189e2819380c2303a5f90e114a62", size = 3311241, upload-time = "2026-01-21T18:32:33.45Z" }, - { url = "https://files.pythonhosted.org/packages/2b/0f/20c71487c7219ab3aa7421c7c62d93824c97c1460f2e8bb72404b0192d13/sqlalchemy-2.0.46-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:590be24e20e2424a4c3c1b0835e9405fa3d0af5823a1a9fc02e5dff56471515f", size = 3310741, upload-time = "2026-01-21T18:44:57.887Z" }, - { url = "https://files.pythonhosted.org/packages/65/80/d26d00b3b249ae000eee4db206fcfc564bf6ca5030e4747adf451f4b5108/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7568fe771f974abadce52669ef3a03150ff03186d8eb82613bc8adc435a03f01", size = 3263116, upload-time = "2026-01-21T18:32:35.044Z" }, - { url = "https://files.pythonhosted.org/packages/da/ee/74dda7506640923821340541e8e45bd3edd8df78664f1f2e0aae8077192b/sqlalchemy-2.0.46-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf7e1e78af38047e08836d33502c7a278915698b7c2145d045f780201679999", size = 3285327, upload-time = "2026-01-21T18:44:59.254Z" }, - { url = "https://files.pythonhosted.org/packages/9f/25/6dcf8abafff1389a21c7185364de145107b7394ecdcb05233815b236330d/sqlalchemy-2.0.46-cp311-cp311-win32.whl", hash = "sha256:9d80ea2ac519c364a7286e8d765d6cd08648f5b21ca855a8017d9871f075542d", size = 2114564, upload-time = "2026-01-21T18:33:15.85Z" }, - { url = "https://files.pythonhosted.org/packages/93/5f/e081490f8523adc0088f777e4ebad3cac21e498ec8a3d4067074e21447a1/sqlalchemy-2.0.46-cp311-cp311-win_amd64.whl", hash = "sha256:585af6afe518732d9ccd3aea33af2edaae4a7aa881af5d8f6f4fe3a368699597", size = 2139233, upload-time = "2026-01-21T18:33:17.528Z" }, - { url = "https://files.pythonhosted.org/packages/b6/35/d16bfa235c8b7caba3730bba43e20b1e376d2224f407c178fbf59559f23e/sqlalchemy-2.0.46-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a9a72b0da8387f15d5810f1facca8f879de9b85af8c645138cba61ea147968c", size = 2153405, upload-time = "2026-01-21T19:05:54.143Z" }, - { url = "https://files.pythonhosted.org/packages/06/6c/3192e24486749862f495ddc6584ed730c0c994a67550ec395d872a2ad650/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2347c3f0efc4de367ba00218e0ae5c4ba2306e47216ef80d6e31761ac97cb0b9", size = 3334702, upload-time = "2026-01-21T18:46:45.384Z" }, - { url = "https://files.pythonhosted.org/packages/ea/a2/b9f33c8d68a3747d972a0bb758c6b63691f8fb8a49014bc3379ba15d4274/sqlalchemy-2.0.46-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9094c8b3197db12aa6f05c51c05daaad0a92b8c9af5388569847b03b1007fb1b", size = 3347664, upload-time = "2026-01-21T18:40:09.979Z" }, - { url = "https://files.pythonhosted.org/packages/aa/d2/3e59e2a91eaec9db7e8dc6b37b91489b5caeb054f670f32c95bcba98940f/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37fee2164cf21417478b6a906adc1a91d69ae9aba8f9533e67ce882f4bb1de53", size = 3277372, upload-time = "2026-01-21T18:46:47.168Z" }, - { url = "https://files.pythonhosted.org/packages/dd/dd/67bc2e368b524e2192c3927b423798deda72c003e73a1e94c21e74b20a85/sqlalchemy-2.0.46-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b1e14b2f6965a685c7128bd315e27387205429c2e339eeec55cb75ca4ab0ea2e", size = 3312425, upload-time = "2026-01-21T18:40:11.548Z" }, - { url = "https://files.pythonhosted.org/packages/43/82/0ecd68e172bfe62247e96cb47867c2d68752566811a4e8c9d8f6e7c38a65/sqlalchemy-2.0.46-cp312-cp312-win32.whl", hash = "sha256:412f26bb4ba942d52016edc8d12fb15d91d3cd46b0047ba46e424213ad407bcb", size = 2113155, upload-time = "2026-01-21T18:42:49.748Z" }, - { url = "https://files.pythonhosted.org/packages/bc/2a/2821a45742073fc0331dc132552b30de68ba9563230853437cac54b2b53e/sqlalchemy-2.0.46-cp312-cp312-win_amd64.whl", hash = "sha256:ea3cd46b6713a10216323cda3333514944e510aa691c945334713fca6b5279ff", size = 2140078, upload-time = "2026-01-21T18:42:51.197Z" }, - { url = "https://files.pythonhosted.org/packages/b3/4b/fa7838fe20bb752810feed60e45625a9a8b0102c0c09971e2d1d95362992/sqlalchemy-2.0.46-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:93a12da97cca70cea10d4b4fc602589c4511f96c1f8f6c11817620c021d21d00", size = 2150268, upload-time = "2026-01-21T19:05:56.621Z" }, - { url = "https://files.pythonhosted.org/packages/46/c1/b34dccd712e8ea846edf396e00973dda82d598cb93762e55e43e6835eba9/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:af865c18752d416798dae13f83f38927c52f085c52e2f32b8ab0fef46fdd02c2", size = 3276511, upload-time = "2026-01-21T18:46:49.022Z" }, - { url = "https://files.pythonhosted.org/packages/96/48/a04d9c94753e5d5d096c628c82a98c4793b9c08ca0e7155c3eb7d7db9f24/sqlalchemy-2.0.46-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8d679b5f318423eacb61f933a9a0f75535bfca7056daeadbf6bd5bcee6183aee", size = 3292881, upload-time = "2026-01-21T18:40:13.089Z" }, - { url = "https://files.pythonhosted.org/packages/be/f4/06eda6e91476f90a7d8058f74311cb65a2fb68d988171aced81707189131/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:64901e08c33462acc9ec3bad27fc7a5c2b6491665f2aa57564e57a4f5d7c52ad", size = 3224559, upload-time = "2026-01-21T18:46:50.974Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a2/d2af04095412ca6345ac22b33b89fe8d6f32a481e613ffcb2377d931d8d0/sqlalchemy-2.0.46-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e8ac45e8f4eaac0f9f8043ea0e224158855c6a4329fd4ee37c45c61e3beb518e", size = 3262728, upload-time = "2026-01-21T18:40:14.883Z" }, - { url = "https://files.pythonhosted.org/packages/31/48/1980c7caa5978a3b8225b4d230e69a2a6538a3562b8b31cea679b6933c83/sqlalchemy-2.0.46-cp313-cp313-win32.whl", hash = "sha256:8d3b44b3d0ab2f1319d71d9863d76eeb46766f8cf9e921ac293511804d39813f", size = 2111295, upload-time = "2026-01-21T18:42:52.366Z" }, - { url = "https://files.pythonhosted.org/packages/2d/54/f8d65bbde3d877617c4720f3c9f60e99bb7266df0d5d78b6e25e7c149f35/sqlalchemy-2.0.46-cp313-cp313-win_amd64.whl", hash = "sha256:77f8071d8fbcbb2dd11b7fd40dedd04e8ebe2eb80497916efedba844298065ef", size = 2137076, upload-time = "2026-01-21T18:42:53.924Z" }, - { url = "https://files.pythonhosted.org/packages/56/ba/9be4f97c7eb2b9d5544f2624adfc2853e796ed51d2bb8aec90bc94b7137e/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1e8cc6cc01da346dc92d9509a63033b9b1bda4fed7a7a7807ed385c7dccdc10", size = 3556533, upload-time = "2026-01-21T18:33:06.636Z" }, - { url = "https://files.pythonhosted.org/packages/20/a6/b1fc6634564dbb4415b7ed6419cdfeaadefd2c39cdab1e3aa07a5f2474c2/sqlalchemy-2.0.46-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96c7cca1a4babaaf3bfff3e4e606e38578856917e52f0384635a95b226c87764", size = 3523208, upload-time = "2026-01-21T18:45:08.436Z" }, - { url = "https://files.pythonhosted.org/packages/a1/d8/41e0bdfc0f930ff236f86fccd12962d8fa03713f17ed57332d38af6a3782/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b2a9f9aee38039cf4755891a1e50e1effcc42ea6ba053743f452c372c3152b1b", size = 3464292, upload-time = "2026-01-21T18:33:08.208Z" }, - { url = "https://files.pythonhosted.org/packages/f0/8b/9dcbec62d95bea85f5ecad9b8d65b78cc30fb0ffceeb3597961f3712549b/sqlalchemy-2.0.46-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:db23b1bf8cfe1f7fda19018e7207b20cdb5168f83c437ff7e95d19e39289c447", size = 3473497, upload-time = "2026-01-21T18:45:10.552Z" }, - { url = "https://files.pythonhosted.org/packages/e9/f8/5ecdfc73383ec496de038ed1614de9e740a82db9ad67e6e4514ebc0708a3/sqlalchemy-2.0.46-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:56bdd261bfd0895452006d5316cbf35739c53b9bb71a170a331fa0ea560b2ada", size = 2152079, upload-time = "2026-01-21T19:05:58.477Z" }, - { url = "https://files.pythonhosted.org/packages/e5/bf/eba3036be7663ce4d9c050bc3d63794dc29fbe01691f2bf5ccb64e048d20/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:33e462154edb9493f6c3ad2125931e273bbd0be8ae53f3ecd1c161ea9a1dd366", size = 3272216, upload-time = "2026-01-21T18:46:52.634Z" }, - { url = "https://files.pythonhosted.org/packages/05/45/1256fb597bb83b58a01ddb600c59fe6fdf0e5afe333f0456ed75c0f8d7bd/sqlalchemy-2.0.46-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcdce05f056622a632f1d44bb47dbdb677f58cad393612280406ce37530eb6d", size = 3277208, upload-time = "2026-01-21T18:40:16.38Z" }, - { url = "https://files.pythonhosted.org/packages/d9/a0/2053b39e4e63b5d7ceb3372cface0859a067c1ddbd575ea7e9985716f771/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8e84b09a9b0f19accedcbeff5c2caf36e0dd537341a33aad8d680336152dc34e", size = 3221994, upload-time = "2026-01-21T18:46:54.622Z" }, - { url = "https://files.pythonhosted.org/packages/1e/87/97713497d9502553c68f105a1cb62786ba1ee91dea3852ae4067ed956a50/sqlalchemy-2.0.46-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4f52f7291a92381e9b4de9050b0a65ce5d6a763333406861e33906b8aa4906bf", size = 3243990, upload-time = "2026-01-21T18:40:18.253Z" }, - { url = "https://files.pythonhosted.org/packages/a8/87/5d1b23548f420ff823c236f8bea36b1a997250fd2f892e44a3838ca424f4/sqlalchemy-2.0.46-cp314-cp314-win32.whl", hash = "sha256:70ed2830b169a9960193f4d4322d22be5c0925357d82cbf485b3369893350908", size = 2114215, upload-time = "2026-01-21T18:42:55.232Z" }, - { url = "https://files.pythonhosted.org/packages/3a/20/555f39cbcf0c10cf452988b6a93c2a12495035f68b3dbd1a408531049d31/sqlalchemy-2.0.46-cp314-cp314-win_amd64.whl", hash = "sha256:3c32e993bc57be6d177f7d5d31edb93f30726d798ad86ff9066d75d9bf2e0b6b", size = 2139867, upload-time = "2026-01-21T18:42:56.474Z" }, - { url = "https://files.pythonhosted.org/packages/3e/f0/f96c8057c982d9d8a7a68f45d69c674bc6f78cad401099692fe16521640a/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4dafb537740eef640c4d6a7c254611dca2df87eaf6d14d6a5fca9d1f4c3fc0fa", size = 3561202, upload-time = "2026-01-21T18:33:10.337Z" }, - { url = "https://files.pythonhosted.org/packages/d7/53/3b37dda0a5b137f21ef608d8dfc77b08477bab0fe2ac9d3e0a66eaeab6fc/sqlalchemy-2.0.46-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42a1643dc5427b69aca967dae540a90b0fbf57eaf248f13a90ea5930e0966863", size = 3526296, upload-time = "2026-01-21T18:45:12.657Z" }, - { url = "https://files.pythonhosted.org/packages/33/75/f28622ba6dde79cd545055ea7bd4062dc934e0621f7b3be2891f8563f8de/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ff33c6e6ad006bbc0f34f5faf941cfc62c45841c64c0a058ac38c799f15b5ede", size = 3470008, upload-time = "2026-01-21T18:33:11.725Z" }, - { url = "https://files.pythonhosted.org/packages/a9/42/4afecbbc38d5e99b18acef446453c76eec6fbd03db0a457a12a056836e22/sqlalchemy-2.0.46-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:82ec52100ec1e6ec671563bbd02d7c7c8d0b9e71a0723c72f22ecf52d1755330", size = 3476137, upload-time = "2026-01-21T18:45:15.001Z" }, - { url = "https://files.pythonhosted.org/packages/fc/a1/9c4efa03300926601c19c18582531b45aededfb961ab3c3585f1e24f120b/sqlalchemy-2.0.46-py3-none-any.whl", hash = "sha256:f9c11766e7e7c0a2767dda5acb006a118640c9fc0a4104214b96269bfb78399e", size = 1937882, upload-time = "2026-01-21T18:22:10.456Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, ] [[package]] name = "starlette" version = "0.50.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "anyio" }, { name = "typing-extensions", marker = "python_full_version < '3.13'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985, upload-time = "2025-11-01T15:25:27.516Z" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985 } wheels = [ - { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033, upload-time = "2025-11-01T15:25:25.461Z" }, + { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033 }, ] [[package]] name = "sympy" version = "1.14.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "mpmath" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921, upload-time = "2025-04-27T18:05:01.611Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353, upload-time = "2025-04-27T18:04:59.103Z" }, -] - -[[package]] -name = "tenacity" -version = "9.1.2" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036, upload-time = "2025-04-02T08:25:09.966Z" } +sdist = { url = "https://files.pythonhosted.org/packages/83/d3/803453b36afefb7c2bb238361cd4ae6125a569b4db67cd9e79846ba2d68c/sympy-1.14.0.tar.gz", hash = "sha256:d3d3fe8df1e5a0b42f0e7bdf50541697dbe7d23746e894990c030e2b05e72517", size = 7793921 } wheels = [ - { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248, upload-time = "2025-04-02T08:25:07.678Z" }, -] - -[[package]] -name = "tiktoken" -version = "0.12.0" -source = { registry = "https://pypi.org/simple" } -dependencies = [ - { name = "regex" }, - { name = "requests" }, -] -sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/4d017d0f76ec3171d469d80fc03dfbb4e48a4bcaddaa831b31d526f05edc/tiktoken-0.12.0.tar.gz", hash = "sha256:b18ba7ee2b093863978fcb14f74b3707cdc8d4d4d3836853ce7ec60772139931", size = 37806, upload-time = "2025-10-06T20:22:45.419Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/89/b3/2cb7c17b6c4cf8ca983204255d3f1d95eda7213e247e6947a0ee2c747a2c/tiktoken-0.12.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:3de02f5a491cfd179aec916eddb70331814bd6bf764075d39e21d5862e533970", size = 1051991, upload-time = "2025-10-06T20:21:34.098Z" }, - { url = "https://files.pythonhosted.org/packages/27/0f/df139f1df5f6167194ee5ab24634582ba9a1b62c6b996472b0277ec80f66/tiktoken-0.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b6cfb6d9b7b54d20af21a912bfe63a2727d9cfa8fbda642fd8322c70340aad16", size = 995798, upload-time = "2025-10-06T20:21:35.579Z" }, - { url = "https://files.pythonhosted.org/packages/ef/5d/26a691f28ab220d5edc09b9b787399b130f24327ef824de15e5d85ef21aa/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:cde24cdb1b8a08368f709124f15b36ab5524aac5fa830cc3fdce9c03d4fb8030", size = 1129865, upload-time = "2025-10-06T20:21:36.675Z" }, - { url = "https://files.pythonhosted.org/packages/b2/94/443fab3d4e5ebecac895712abd3849b8da93b7b7dec61c7db5c9c7ebe40c/tiktoken-0.12.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:6de0da39f605992649b9cfa6f84071e3f9ef2cec458d08c5feb1b6f0ff62e134", size = 1152856, upload-time = "2025-10-06T20:21:37.873Z" }, - { url = "https://files.pythonhosted.org/packages/54/35/388f941251b2521c70dd4c5958e598ea6d2c88e28445d2fb8189eecc1dfc/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6faa0534e0eefbcafaccb75927a4a380463a2eaa7e26000f0173b920e98b720a", size = 1195308, upload-time = "2025-10-06T20:21:39.577Z" }, - { url = "https://files.pythonhosted.org/packages/f8/00/c6681c7f833dd410576183715a530437a9873fa910265817081f65f9105f/tiktoken-0.12.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:82991e04fc860afb933efb63957affc7ad54f83e2216fe7d319007dab1ba5892", size = 1255697, upload-time = "2025-10-06T20:21:41.154Z" }, - { url = "https://files.pythonhosted.org/packages/5f/d2/82e795a6a9bafa034bf26a58e68fe9a89eeaaa610d51dbeb22106ba04f0a/tiktoken-0.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:6fb2995b487c2e31acf0a9e17647e3b242235a20832642bb7a9d1a181c0c1bb1", size = 879375, upload-time = "2025-10-06T20:21:43.201Z" }, - { url = "https://files.pythonhosted.org/packages/de/46/21ea696b21f1d6d1efec8639c204bdf20fde8bafb351e1355c72c5d7de52/tiktoken-0.12.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6e227c7f96925003487c33b1b32265fad2fbcec2b7cf4817afb76d416f40f6bb", size = 1051565, upload-time = "2025-10-06T20:21:44.566Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d9/35c5d2d9e22bb2a5f74ba48266fb56c63d76ae6f66e02feb628671c0283e/tiktoken-0.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c06cf0fcc24c2cb2adb5e185c7082a82cba29c17575e828518c2f11a01f445aa", size = 995284, upload-time = "2025-10-06T20:21:45.622Z" }, - { url = "https://files.pythonhosted.org/packages/01/84/961106c37b8e49b9fdcf33fe007bb3a8fdcc380c528b20cc7fbba80578b8/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:f18f249b041851954217e9fd8e5c00b024ab2315ffda5ed77665a05fa91f42dc", size = 1129201, upload-time = "2025-10-06T20:21:47.074Z" }, - { url = "https://files.pythonhosted.org/packages/6a/d0/3d9275198e067f8b65076a68894bb52fd253875f3644f0a321a720277b8a/tiktoken-0.12.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:47a5bc270b8c3db00bb46ece01ef34ad050e364b51d406b6f9730b64ac28eded", size = 1152444, upload-time = "2025-10-06T20:21:48.139Z" }, - { url = "https://files.pythonhosted.org/packages/78/db/a58e09687c1698a7c592e1038e01c206569b86a0377828d51635561f8ebf/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:508fa71810c0efdcd1b898fda574889ee62852989f7c1667414736bcb2b9a4bd", size = 1195080, upload-time = "2025-10-06T20:21:49.246Z" }, - { url = "https://files.pythonhosted.org/packages/9e/1b/a9e4d2bf91d515c0f74afc526fd773a812232dd6cda33ebea7f531202325/tiktoken-0.12.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a1af81a6c44f008cba48494089dd98cccb8b313f55e961a52f5b222d1e507967", size = 1255240, upload-time = "2025-10-06T20:21:50.274Z" }, - { url = "https://files.pythonhosted.org/packages/9d/15/963819345f1b1fb0809070a79e9dd96938d4ca41297367d471733e79c76c/tiktoken-0.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:3e68e3e593637b53e56f7237be560f7a394451cb8c11079755e80ae64b9e6def", size = 879422, upload-time = "2025-10-06T20:21:51.734Z" }, - { url = "https://files.pythonhosted.org/packages/a4/85/be65d39d6b647c79800fd9d29241d081d4eeb06271f383bb87200d74cf76/tiktoken-0.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b97f74aca0d78a1ff21b8cd9e9925714c15a9236d6ceacf5c7327c117e6e21e8", size = 1050728, upload-time = "2025-10-06T20:21:52.756Z" }, - { url = "https://files.pythonhosted.org/packages/4a/42/6573e9129bc55c9bf7300b3a35bef2c6b9117018acca0dc760ac2d93dffe/tiktoken-0.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2b90f5ad190a4bb7c3eb30c5fa32e1e182ca1ca79f05e49b448438c3e225a49b", size = 994049, upload-time = "2025-10-06T20:21:53.782Z" }, - { url = "https://files.pythonhosted.org/packages/66/c5/ed88504d2f4a5fd6856990b230b56d85a777feab84e6129af0822f5d0f70/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:65b26c7a780e2139e73acc193e5c63ac754021f160df919add909c1492c0fb37", size = 1129008, upload-time = "2025-10-06T20:21:54.832Z" }, - { url = "https://files.pythonhosted.org/packages/f4/90/3dae6cc5436137ebd38944d396b5849e167896fc2073da643a49f372dc4f/tiktoken-0.12.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:edde1ec917dfd21c1f2f8046b86348b0f54a2c0547f68149d8600859598769ad", size = 1152665, upload-time = "2025-10-06T20:21:56.129Z" }, - { url = "https://files.pythonhosted.org/packages/a3/fe/26df24ce53ffde419a42f5f53d755b995c9318908288c17ec3f3448313a3/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:35a2f8ddd3824608b3d650a000c1ef71f730d0c56486845705a8248da00f9fe5", size = 1194230, upload-time = "2025-10-06T20:21:57.546Z" }, - { url = "https://files.pythonhosted.org/packages/20/cc/b064cae1a0e9fac84b0d2c46b89f4e57051a5f41324e385d10225a984c24/tiktoken-0.12.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:83d16643edb7fa2c99eff2ab7733508aae1eebb03d5dfc46f5565862810f24e3", size = 1254688, upload-time = "2025-10-06T20:21:58.619Z" }, - { url = "https://files.pythonhosted.org/packages/81/10/b8523105c590c5b8349f2587e2fdfe51a69544bd5a76295fc20f2374f470/tiktoken-0.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:ffc5288f34a8bc02e1ea7047b8d041104791d2ddbf42d1e5fa07822cbffe16bd", size = 878694, upload-time = "2025-10-06T20:21:59.876Z" }, - { url = "https://files.pythonhosted.org/packages/00/61/441588ee21e6b5cdf59d6870f86beb9789e532ee9718c251b391b70c68d6/tiktoken-0.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:775c2c55de2310cc1bc9a3ad8826761cbdc87770e586fd7b6da7d4589e13dab3", size = 1050802, upload-time = "2025-10-06T20:22:00.96Z" }, - { url = "https://files.pythonhosted.org/packages/1f/05/dcf94486d5c5c8d34496abe271ac76c5b785507c8eae71b3708f1ad9b45a/tiktoken-0.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a01b12f69052fbe4b080a2cfb867c4de12c704b56178edf1d1d7b273561db160", size = 993995, upload-time = "2025-10-06T20:22:02.788Z" }, - { url = "https://files.pythonhosted.org/packages/a0/70/5163fe5359b943f8db9946b62f19be2305de8c3d78a16f629d4165e2f40e/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:01d99484dc93b129cd0964f9d34eee953f2737301f18b3c7257bf368d7615baa", size = 1128948, upload-time = "2025-10-06T20:22:03.814Z" }, - { url = "https://files.pythonhosted.org/packages/0c/da/c028aa0babf77315e1cef357d4d768800c5f8a6de04d0eac0f377cb619fa/tiktoken-0.12.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:4a1a4fcd021f022bfc81904a911d3df0f6543b9e7627b51411da75ff2fe7a1be", size = 1151986, upload-time = "2025-10-06T20:22:05.173Z" }, - { url = "https://files.pythonhosted.org/packages/a0/5a/886b108b766aa53e295f7216b509be95eb7d60b166049ce2c58416b25f2a/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:981a81e39812d57031efdc9ec59fa32b2a5a5524d20d4776574c4b4bd2e9014a", size = 1194222, upload-time = "2025-10-06T20:22:06.265Z" }, - { url = "https://files.pythonhosted.org/packages/f4/f8/4db272048397636ac7a078d22773dd2795b1becee7bc4922fe6207288d57/tiktoken-0.12.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9baf52f84a3f42eef3ff4e754a0db79a13a27921b457ca9832cf944c6be4f8f3", size = 1255097, upload-time = "2025-10-06T20:22:07.403Z" }, - { url = "https://files.pythonhosted.org/packages/8e/32/45d02e2e0ea2be3a9ed22afc47d93741247e75018aac967b713b2941f8ea/tiktoken-0.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:b8a0cd0c789a61f31bf44851defbd609e8dd1e2c8589c614cc1060940ef1f697", size = 879117, upload-time = "2025-10-06T20:22:08.418Z" }, - { url = "https://files.pythonhosted.org/packages/ce/76/994fc868f88e016e6d05b0da5ac24582a14c47893f4474c3e9744283f1d5/tiktoken-0.12.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d5f89ea5680066b68bcb797ae85219c72916c922ef0fcdd3480c7d2315ffff16", size = 1050309, upload-time = "2025-10-06T20:22:10.939Z" }, - { url = "https://files.pythonhosted.org/packages/f6/b8/57ef1456504c43a849821920d582a738a461b76a047f352f18c0b26c6516/tiktoken-0.12.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:b4e7ed1c6a7a8a60a3230965bdedba8cc58f68926b835e519341413370e0399a", size = 993712, upload-time = "2025-10-06T20:22:12.115Z" }, - { url = "https://files.pythonhosted.org/packages/72/90/13da56f664286ffbae9dbcfadcc625439142675845baa62715e49b87b68b/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:fc530a28591a2d74bce821d10b418b26a094bf33839e69042a6e86ddb7a7fb27", size = 1128725, upload-time = "2025-10-06T20:22:13.541Z" }, - { url = "https://files.pythonhosted.org/packages/05/df/4f80030d44682235bdaecd7346c90f67ae87ec8f3df4a3442cb53834f7e4/tiktoken-0.12.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:06a9f4f49884139013b138920a4c393aa6556b2f8f536345f11819389c703ebb", size = 1151875, upload-time = "2025-10-06T20:22:14.559Z" }, - { url = "https://files.pythonhosted.org/packages/22/1f/ae535223a8c4ef4c0c1192e3f9b82da660be9eb66b9279e95c99288e9dab/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:04f0e6a985d95913cabc96a741c5ffec525a2c72e9df086ff17ebe35985c800e", size = 1194451, upload-time = "2025-10-06T20:22:15.545Z" }, - { url = "https://files.pythonhosted.org/packages/78/a7/f8ead382fce0243cb625c4f266e66c27f65ae65ee9e77f59ea1653b6d730/tiktoken-0.12.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0ee8f9ae00c41770b5f9b0bb1235474768884ae157de3beb5439ca0fd70f3e25", size = 1253794, upload-time = "2025-10-06T20:22:16.624Z" }, - { url = "https://files.pythonhosted.org/packages/93/e0/6cc82a562bc6365785a3ff0af27a2a092d57c47d7a81d9e2295d8c36f011/tiktoken-0.12.0-cp313-cp313t-win_amd64.whl", hash = "sha256:dc2dd125a62cb2b3d858484d6c614d136b5b848976794edfb63688d539b8b93f", size = 878777, upload-time = "2025-10-06T20:22:18.036Z" }, - { url = "https://files.pythonhosted.org/packages/72/05/3abc1db5d2c9aadc4d2c76fa5640134e475e58d9fbb82b5c535dc0de9b01/tiktoken-0.12.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a90388128df3b3abeb2bfd1895b0681412a8d7dc644142519e6f0a97c2111646", size = 1050188, upload-time = "2025-10-06T20:22:19.563Z" }, - { url = "https://files.pythonhosted.org/packages/e3/7b/50c2f060412202d6c95f32b20755c7a6273543b125c0985d6fa9465105af/tiktoken-0.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:da900aa0ad52247d8794e307d6446bd3cdea8e192769b56276695d34d2c9aa88", size = 993978, upload-time = "2025-10-06T20:22:20.702Z" }, - { url = "https://files.pythonhosted.org/packages/14/27/bf795595a2b897e271771cd31cb847d479073497344c637966bdf2853da1/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:285ba9d73ea0d6171e7f9407039a290ca77efcdb026be7769dccc01d2c8d7fff", size = 1129271, upload-time = "2025-10-06T20:22:22.06Z" }, - { url = "https://files.pythonhosted.org/packages/f5/de/9341a6d7a8f1b448573bbf3425fa57669ac58258a667eb48a25dfe916d70/tiktoken-0.12.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:d186a5c60c6a0213f04a7a802264083dea1bbde92a2d4c7069e1a56630aef830", size = 1151216, upload-time = "2025-10-06T20:22:23.085Z" }, - { url = "https://files.pythonhosted.org/packages/75/0d/881866647b8d1be4d67cb24e50d0c26f9f807f994aa1510cb9ba2fe5f612/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:604831189bd05480f2b885ecd2d1986dc7686f609de48208ebbbddeea071fc0b", size = 1194860, upload-time = "2025-10-06T20:22:24.602Z" }, - { url = "https://files.pythonhosted.org/packages/b3/1e/b651ec3059474dab649b8d5b69f5c65cd8fcd8918568c1935bd4136c9392/tiktoken-0.12.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8f317e8530bb3a222547b85a58583238c8f74fd7a7408305f9f63246d1a0958b", size = 1254567, upload-time = "2025-10-06T20:22:25.671Z" }, - { url = "https://files.pythonhosted.org/packages/80/57/ce64fd16ac390fafde001268c364d559447ba09b509181b2808622420eec/tiktoken-0.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:399c3dd672a6406719d84442299a490420b458c44d3ae65516302a99675888f3", size = 921067, upload-time = "2025-10-06T20:22:26.753Z" }, - { url = "https://files.pythonhosted.org/packages/ac/a4/72eed53e8976a099539cdd5eb36f241987212c29629d0a52c305173e0a68/tiktoken-0.12.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c2c714c72bc00a38ca969dae79e8266ddec999c7ceccd603cc4f0d04ccd76365", size = 1050473, upload-time = "2025-10-06T20:22:27.775Z" }, - { url = "https://files.pythonhosted.org/packages/e6/d7/0110b8f54c008466b19672c615f2168896b83706a6611ba6e47313dbc6e9/tiktoken-0.12.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:cbb9a3ba275165a2cb0f9a83f5d7025afe6b9d0ab01a22b50f0e74fee2ad253e", size = 993855, upload-time = "2025-10-06T20:22:28.799Z" }, - { url = "https://files.pythonhosted.org/packages/5f/77/4f268c41a3957c418b084dd576ea2fad2e95da0d8e1ab705372892c2ca22/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:dfdfaa5ffff8993a3af94d1125870b1d27aed7cb97aa7eb8c1cefdbc87dbee63", size = 1129022, upload-time = "2025-10-06T20:22:29.981Z" }, - { url = "https://files.pythonhosted.org/packages/4e/2b/fc46c90fe5028bd094cd6ee25a7db321cb91d45dc87531e2bdbb26b4867a/tiktoken-0.12.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:584c3ad3d0c74f5269906eb8a659c8bfc6144a52895d9261cdaf90a0ae5f4de0", size = 1150736, upload-time = "2025-10-06T20:22:30.996Z" }, - { url = "https://files.pythonhosted.org/packages/28/c0/3c7a39ff68022ddfd7d93f3337ad90389a342f761c4d71de99a3ccc57857/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:54c891b416a0e36b8e2045b12b33dd66fb34a4fe7965565f1b482da50da3e86a", size = 1194908, upload-time = "2025-10-06T20:22:32.073Z" }, - { url = "https://files.pythonhosted.org/packages/ab/0d/c1ad6f4016a3968c048545f5d9b8ffebf577774b2ede3e2e352553b685fe/tiktoken-0.12.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5edb8743b88d5be814b1a8a8854494719080c28faaa1ccbef02e87354fe71ef0", size = 1253706, upload-time = "2025-10-06T20:22:33.385Z" }, - { url = "https://files.pythonhosted.org/packages/af/df/c7891ef9d2712ad774777271d39fdef63941ffba0a9d59b7ad1fd2765e57/tiktoken-0.12.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f61c0aea5565ac82e2ec50a05e02a6c44734e91b51c10510b084ea1b8e633a71", size = 920667, upload-time = "2025-10-06T20:22:34.444Z" }, + { url = "https://files.pythonhosted.org/packages/a2/09/77d55d46fd61b4a135c444fc97158ef34a095e5681d0a6c10b75bf356191/sympy-1.14.0-py3-none-any.whl", hash = "sha256:e091cc3e99d2141a0ba2847328f5479b05d94a6635cb96148ccb3f34671bd8f5", size = 6299353 }, ] [[package]] name = "tokenizers" version = "0.22.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "huggingface-hub" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115, upload-time = "2026-01-05T10:45:15.988Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275, upload-time = "2026-01-05T10:41:02.158Z" }, - { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472, upload-time = "2026-01-05T10:41:00.276Z" }, - { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736, upload-time = "2026-01-05T10:40:32.165Z" }, - { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835, upload-time = "2026-01-05T10:40:38.847Z" }, - { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673, upload-time = "2026-01-05T10:40:56.614Z" }, - { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818, upload-time = "2026-01-05T10:40:44.507Z" }, - { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195, upload-time = "2026-01-05T10:40:51.139Z" }, - { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982, upload-time = "2026-01-05T10:40:58.331Z" }, - { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245, upload-time = "2026-01-05T10:41:04.053Z" }, - { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069, upload-time = "2026-01-05T10:45:10.673Z" }, - { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263, upload-time = "2026-01-05T10:45:12.559Z" }, - { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429, upload-time = "2026-01-05T10:45:14.333Z" }, - { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363, upload-time = "2026-01-05T10:45:20.593Z" }, - { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786, upload-time = "2026-01-05T10:45:18.411Z" }, - { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133, upload-time = "2026-01-05T10:45:17.232Z" }, - { url = "https://files.pythonhosted.org/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", size = 3282301, upload-time = "2026-01-05T10:40:34.858Z" }, - { url = "https://files.pythonhosted.org/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", size = 3161308, upload-time = "2026-01-05T10:40:40.737Z" }, - { url = "https://files.pythonhosted.org/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", size = 3718964, upload-time = "2026-01-05T10:40:46.56Z" }, - { url = "https://files.pythonhosted.org/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", size = 3373542, upload-time = "2026-01-05T10:40:52.803Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/73/6f/f80cfef4a312e1fb34baf7d85c72d4411afde10978d4657f8cdd811d3ccc/tokenizers-0.22.2.tar.gz", hash = "sha256:473b83b915e547aa366d1eee11806deaf419e17be16310ac0a14077f1e28f917", size = 372115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/97/5dbfabf04c7e348e655e907ed27913e03db0923abb5dfdd120d7b25630e1/tokenizers-0.22.2-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:544dd704ae7238755d790de45ba8da072e9af3eea688f698b137915ae959281c", size = 3100275 }, + { url = "https://files.pythonhosted.org/packages/2e/47/174dca0502ef88b28f1c9e06b73ce33500eedfac7a7692108aec220464e7/tokenizers-0.22.2-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:1e418a55456beedca4621dbab65a318981467a2b188e982a23e117f115ce5001", size = 2981472 }, + { url = "https://files.pythonhosted.org/packages/d6/84/7990e799f1309a8b87af6b948f31edaa12a3ed22d11b352eaf4f4b2e5753/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2249487018adec45d6e3554c71d46eb39fa8ea67156c640f7513eb26f318cec7", size = 3290736 }, + { url = "https://files.pythonhosted.org/packages/78/59/09d0d9ba94dcd5f4f1368d4858d24546b4bdc0231c2354aa31d6199f0399/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:25b85325d0815e86e0bac263506dd114578953b7b53d7de09a6485e4a160a7dd", size = 3168835 }, + { url = "https://files.pythonhosted.org/packages/47/50/b3ebb4243e7160bda8d34b731e54dd8ab8b133e50775872e7a434e524c28/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bfb88f22a209ff7b40a576d5324bf8286b519d7358663db21d6246fb17eea2d5", size = 3521673 }, + { url = "https://files.pythonhosted.org/packages/e0/fa/89f4cb9e08df770b57adb96f8cbb7e22695a4cb6c2bd5f0c4f0ebcf33b66/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1c774b1276f71e1ef716e5486f21e76333464f47bece56bbd554485982a9e03e", size = 3724818 }, + { url = "https://files.pythonhosted.org/packages/64/04/ca2363f0bfbe3b3d36e95bf67e56a4c88c8e3362b658e616d1ac185d47f2/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df6c4265b289083bf710dff49bc51ef252f9d5be33a45ee2bed151114a56207b", size = 3379195 }, + { url = "https://files.pythonhosted.org/packages/2e/76/932be4b50ef6ccedf9d3c6639b056a967a86258c6d9200643f01269211ca/tokenizers-0.22.2-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:369cc9fc8cc10cb24143873a0d95438bb8ee257bb80c71989e3ee290e8d72c67", size = 3274982 }, + { url = "https://files.pythonhosted.org/packages/1d/28/5f9f5a4cc211b69e89420980e483831bcc29dade307955cc9dc858a40f01/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:29c30b83d8dcd061078b05ae0cb94d3c710555fbb44861139f9f83dcca3dc3e4", size = 9478245 }, + { url = "https://files.pythonhosted.org/packages/6c/fb/66e2da4704d6aadebf8cb39f1d6d1957df667ab24cff2326b77cda0dcb85/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:37ae80a28c1d3265bb1f22464c856bd23c02a05bb211e56d0c5301a435be6c1a", size = 9560069 }, + { url = "https://files.pythonhosted.org/packages/16/04/fed398b05caa87ce9b1a1bb5166645e38196081b225059a6edaff6440fac/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:791135ee325f2336f498590eb2f11dc5c295232f288e75c99a36c5dbce63088a", size = 9899263 }, + { url = "https://files.pythonhosted.org/packages/05/a1/d62dfe7376beaaf1394917e0f8e93ee5f67fea8fcf4107501db35996586b/tokenizers-0.22.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:38337540fbbddff8e999d59970f3c6f35a82de10053206a7562f1ea02d046fa5", size = 10033429 }, + { url = "https://files.pythonhosted.org/packages/fd/18/a545c4ea42af3df6effd7d13d250ba77a0a86fb20393143bbb9a92e434d4/tokenizers-0.22.2-cp39-abi3-win32.whl", hash = "sha256:a6bf3f88c554a2b653af81f3204491c818ae2ac6fbc09e76ef4773351292bc92", size = 2502363 }, + { url = "https://files.pythonhosted.org/packages/65/71/0670843133a43d43070abeb1949abfdef12a86d490bea9cd9e18e37c5ff7/tokenizers-0.22.2-cp39-abi3-win_amd64.whl", hash = "sha256:c9ea31edff2968b44a88f97d784c2f16dc0729b8b143ed004699ebca91f05c48", size = 2747786 }, + { url = "https://files.pythonhosted.org/packages/72/f4/0de46cfa12cdcbcd464cc59fde36912af405696f687e53a091fb432f694c/tokenizers-0.22.2-cp39-abi3-win_arm64.whl", hash = "sha256:9ce725d22864a1e965217204946f830c37876eee3b2ba6fc6255e8e903d5fcbc", size = 2612133 }, + { url = "https://files.pythonhosted.org/packages/84/04/655b79dbcc9b3ac5f1479f18e931a344af67e5b7d3b251d2dcdcd7558592/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:753d47ebd4542742ef9261d9da92cd545b2cacbb48349a1225466745bb866ec4", size = 3282301 }, + { url = "https://files.pythonhosted.org/packages/46/cd/e4851401f3d8f6f45d8480262ab6a5c8cb9c4302a790a35aa14eeed6d2fd/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e10bf9113d209be7cd046d40fbabbaf3278ff6d18eb4da4c500443185dc1896c", size = 3161308 }, + { url = "https://files.pythonhosted.org/packages/6f/6e/55553992a89982cd12d4a66dddb5e02126c58677ea3931efcbe601d419db/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:64d94e84f6660764e64e7e0b22baa72f6cd942279fdbb21d46abd70d179f0195", size = 3718964 }, + { url = "https://files.pythonhosted.org/packages/59/8c/b1c87148aa15e099243ec9f0cf9d0e970cc2234c3257d558c25a2c5304e6/tokenizers-0.22.2-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f01a9c019878532f98927d2bacb79bbb404b43d3437455522a00a30718cdedb5", size = 3373542 }, ] [[package]] name = "tomli" version = "2.4.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477, upload-time = "2026-01-11T11:22:38.165Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663, upload-time = "2026-01-11T11:21:45.27Z" }, - { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469, upload-time = "2026-01-11T11:21:46.873Z" }, - { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039, upload-time = "2026-01-11T11:21:48.503Z" }, - { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007, upload-time = "2026-01-11T11:21:49.456Z" }, - { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875, upload-time = "2026-01-11T11:21:50.755Z" }, - { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271, upload-time = "2026-01-11T11:21:51.81Z" }, - { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770, upload-time = "2026-01-11T11:21:52.647Z" }, - { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626, upload-time = "2026-01-11T11:21:53.459Z" }, - { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842, upload-time = "2026-01-11T11:21:54.831Z" }, - { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894, upload-time = "2026-01-11T11:21:56.07Z" }, - { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053, upload-time = "2026-01-11T11:21:57.467Z" }, - { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481, upload-time = "2026-01-11T11:21:58.661Z" }, - { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720, upload-time = "2026-01-11T11:22:00.178Z" }, - { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014, upload-time = "2026-01-11T11:22:01.238Z" }, - { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820, upload-time = "2026-01-11T11:22:02.727Z" }, - { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712, upload-time = "2026-01-11T11:22:03.777Z" }, - { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296, upload-time = "2026-01-11T11:22:04.86Z" }, - { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553, upload-time = "2026-01-11T11:22:05.854Z" }, - { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915, upload-time = "2026-01-11T11:22:06.703Z" }, - { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038, upload-time = "2026-01-11T11:22:07.56Z" }, - { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245, upload-time = "2026-01-11T11:22:08.344Z" }, - { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335, upload-time = "2026-01-11T11:22:09.951Z" }, - { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962, upload-time = "2026-01-11T11:22:11.27Z" }, - { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396, upload-time = "2026-01-11T11:22:12.325Z" }, - { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530, upload-time = "2026-01-11T11:22:13.865Z" }, - { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227, upload-time = "2026-01-11T11:22:15.224Z" }, - { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748, upload-time = "2026-01-11T11:22:16.009Z" }, - { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725, upload-time = "2026-01-11T11:22:17.269Z" }, - { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901, upload-time = "2026-01-11T11:22:18.287Z" }, - { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375, upload-time = "2026-01-11T11:22:19.154Z" }, - { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639, upload-time = "2026-01-11T11:22:20.168Z" }, - { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897, upload-time = "2026-01-11T11:22:21.544Z" }, - { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697, upload-time = "2026-01-11T11:22:23.058Z" }, - { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567, upload-time = "2026-01-11T11:22:24.033Z" }, - { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556, upload-time = "2026-01-11T11:22:25.378Z" }, - { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014, upload-time = "2026-01-11T11:22:26.138Z" }, - { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339, upload-time = "2026-01-11T11:22:27.143Z" }, - { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490, upload-time = "2026-01-11T11:22:28.399Z" }, - { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398, upload-time = "2026-01-11T11:22:29.345Z" }, - { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515, upload-time = "2026-01-11T11:22:30.327Z" }, - { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806, upload-time = "2026-01-11T11:22:32.56Z" }, - { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340, upload-time = "2026-01-11T11:22:33.505Z" }, - { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106, upload-time = "2026-01-11T11:22:34.451Z" }, - { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504, upload-time = "2026-01-11T11:22:35.764Z" }, - { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561, upload-time = "2026-01-11T11:22:36.624Z" }, - { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477, upload-time = "2026-01-11T11:22:37.446Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/82/30/31573e9457673ab10aa432461bee537ce6cef177667deca369efb79df071/tomli-2.4.0.tar.gz", hash = "sha256:aa89c3f6c277dd275d8e243ad24f3b5e701491a860d5121f2cdd399fbb31fc9c", size = 17477 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/d9/3dc2289e1f3b32eb19b9785b6a006b28ee99acb37d1d47f78d4c10e28bf8/tomli-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b5ef256a3fd497d4973c11bf142e9ed78b150d36f5773f1ca6088c230ffc5867", size = 153663 }, + { url = "https://files.pythonhosted.org/packages/51/32/ef9f6845e6b9ca392cd3f64f9ec185cc6f09f0a2df3db08cbe8809d1d435/tomli-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5572e41282d5268eb09a697c89a7bee84fae66511f87533a6f88bd2f7b652da9", size = 148469 }, + { url = "https://files.pythonhosted.org/packages/d6/c2/506e44cce89a8b1b1e047d64bd495c22c9f71f21e05f380f1a950dd9c217/tomli-2.4.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:551e321c6ba03b55676970b47cb1b73f14a0a4dce6a3e1a9458fd6d921d72e95", size = 236039 }, + { url = "https://files.pythonhosted.org/packages/b3/40/e1b65986dbc861b7e986e8ec394598187fa8aee85b1650b01dd925ca0be8/tomli-2.4.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e3f639a7a8f10069d0e15408c0b96a2a828cfdec6fca05296ebcdcc28ca7c76", size = 243007 }, + { url = "https://files.pythonhosted.org/packages/9c/6f/6e39ce66b58a5b7ae572a0f4352ff40c71e8573633deda43f6a379d56b3e/tomli-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1b168f2731796b045128c45982d3a4874057626da0e2ef1fdd722848b741361d", size = 240875 }, + { url = "https://files.pythonhosted.org/packages/aa/ad/cb089cb190487caa80204d503c7fd0f4d443f90b95cf4ef5cf5aa0f439b0/tomli-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:133e93646ec4300d651839d382d63edff11d8978be23da4cc106f5a18b7d0576", size = 246271 }, + { url = "https://files.pythonhosted.org/packages/0b/63/69125220e47fd7a3a27fd0de0c6398c89432fec41bc739823bcc66506af6/tomli-2.4.0-cp311-cp311-win32.whl", hash = "sha256:b6c78bdf37764092d369722d9946cb65b8767bfa4110f902a1b2542d8d173c8a", size = 96770 }, + { url = "https://files.pythonhosted.org/packages/1e/0d/a22bb6c83f83386b0008425a6cd1fa1c14b5f3dd4bad05e98cf3dbbf4a64/tomli-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:d3d1654e11d724760cdb37a3d7691f0be9db5fbdaef59c9f532aabf87006dbaa", size = 107626 }, + { url = "https://files.pythonhosted.org/packages/2f/6d/77be674a3485e75cacbf2ddba2b146911477bd887dda9d8c9dfb2f15e871/tomli-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:cae9c19ed12d4e8f3ebf46d1a75090e4c0dc16271c5bce1c833ac168f08fb614", size = 94842 }, + { url = "https://files.pythonhosted.org/packages/3c/43/7389a1869f2f26dba52404e1ef13b4784b6b37dac93bac53457e3ff24ca3/tomli-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:920b1de295e72887bafa3ad9f7a792f811847d57ea6b1215154030cf131f16b1", size = 154894 }, + { url = "https://files.pythonhosted.org/packages/e9/05/2f9bf110b5294132b2edf13fe6ca6ae456204f3d749f623307cbb7a946f2/tomli-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d6d9a4aee98fac3eab4952ad1d73aee87359452d1c086b5ceb43ed02ddb16b8", size = 149053 }, + { url = "https://files.pythonhosted.org/packages/e8/41/1eda3ca1abc6f6154a8db4d714a4d35c4ad90adc0bcf700657291593fbf3/tomli-2.4.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36b9d05b51e65b254ea6c2585b59d2c4cb91c8a3d91d0ed0f17591a29aaea54a", size = 243481 }, + { url = "https://files.pythonhosted.org/packages/d2/6d/02ff5ab6c8868b41e7d4b987ce2b5f6a51d3335a70aa144edd999e055a01/tomli-2.4.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1c8a885b370751837c029ef9bc014f27d80840e48bac415f3412e6593bbc18c1", size = 251720 }, + { url = "https://files.pythonhosted.org/packages/7b/57/0405c59a909c45d5b6f146107c6d997825aa87568b042042f7a9c0afed34/tomli-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8768715ffc41f0008abe25d808c20c3d990f42b6e2e58305d5da280ae7d1fa3b", size = 247014 }, + { url = "https://files.pythonhosted.org/packages/2c/0e/2e37568edd944b4165735687cbaf2fe3648129e440c26d02223672ee0630/tomli-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b438885858efd5be02a9a133caf5812b8776ee0c969fea02c45e8e3f296ba51", size = 251820 }, + { url = "https://files.pythonhosted.org/packages/5a/1c/ee3b707fdac82aeeb92d1a113f803cf6d0f37bdca0849cb489553e1f417a/tomli-2.4.0-cp312-cp312-win32.whl", hash = "sha256:0408e3de5ec77cc7f81960c362543cbbd91ef883e3138e81b729fc3eea5b9729", size = 97712 }, + { url = "https://files.pythonhosted.org/packages/69/13/c07a9177d0b3bab7913299b9278845fc6eaaca14a02667c6be0b0a2270c8/tomli-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:685306e2cc7da35be4ee914fd34ab801a6acacb061b6a7abca922aaf9ad368da", size = 108296 }, + { url = "https://files.pythonhosted.org/packages/18/27/e267a60bbeeee343bcc279bb9e8fbed0cbe224bc7b2a3dc2975f22809a09/tomli-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:5aa48d7c2356055feef06a43611fc401a07337d5b006be13a30f6c58f869e3c3", size = 94553 }, + { url = "https://files.pythonhosted.org/packages/34/91/7f65f9809f2936e1f4ce6268ae1903074563603b2a2bd969ebbda802744f/tomli-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:84d081fbc252d1b6a982e1870660e7330fb8f90f676f6e78b052ad4e64714bf0", size = 154915 }, + { url = "https://files.pythonhosted.org/packages/20/aa/64dd73a5a849c2e8f216b755599c511badde80e91e9bc2271baa7b2cdbb1/tomli-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9a08144fa4cba33db5255f9b74f0b89888622109bd2776148f2597447f92a94e", size = 149038 }, + { url = "https://files.pythonhosted.org/packages/9e/8a/6d38870bd3d52c8d1505ce054469a73f73a0fe62c0eaf5dddf61447e32fa/tomli-2.4.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c73add4bb52a206fd0c0723432db123c0c75c280cbd67174dd9d2db228ebb1b4", size = 242245 }, + { url = "https://files.pythonhosted.org/packages/59/bb/8002fadefb64ab2669e5b977df3f5e444febea60e717e755b38bb7c41029/tomli-2.4.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fb2945cbe303b1419e2706e711b7113da57b7db31ee378d08712d678a34e51e", size = 250335 }, + { url = "https://files.pythonhosted.org/packages/a5/3d/4cdb6f791682b2ea916af2de96121b3cb1284d7c203d97d92d6003e91c8d/tomli-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:bbb1b10aa643d973366dc2cb1ad94f99c1726a02343d43cbc011edbfac579e7c", size = 245962 }, + { url = "https://files.pythonhosted.org/packages/f2/4a/5f25789f9a460bd858ba9756ff52d0830d825b458e13f754952dd15fb7bb/tomli-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4cbcb367d44a1f0c2be408758b43e1ffb5308abe0ea222897d6bfc8e8281ef2f", size = 250396 }, + { url = "https://files.pythonhosted.org/packages/aa/2f/b73a36fea58dfa08e8b3a268750e6853a6aac2a349241a905ebd86f3047a/tomli-2.4.0-cp313-cp313-win32.whl", hash = "sha256:7d49c66a7d5e56ac959cb6fc583aff0651094ec071ba9ad43df785abc2320d86", size = 97530 }, + { url = "https://files.pythonhosted.org/packages/3b/af/ca18c134b5d75de7e8dc551c5234eaba2e8e951f6b30139599b53de9c187/tomli-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:3cf226acb51d8f1c394c1b310e0e0e61fecdd7adcb78d01e294ac297dd2e7f87", size = 108227 }, + { url = "https://files.pythonhosted.org/packages/22/c3/b386b832f209fee8073c8138ec50f27b4460db2fdae9ffe022df89a57f9b/tomli-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:d20b797a5c1ad80c516e41bc1fb0443ddb5006e9aaa7bda2d71978346aeb9132", size = 94748 }, + { url = "https://files.pythonhosted.org/packages/f3/c4/84047a97eb1004418bc10bdbcfebda209fca6338002eba2dc27cc6d13563/tomli-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:26ab906a1eb794cd4e103691daa23d95c6919cc2fa9160000ac02370cc9dd3f6", size = 154725 }, + { url = "https://files.pythonhosted.org/packages/a8/5d/d39038e646060b9d76274078cddf146ced86dc2b9e8bbf737ad5983609a0/tomli-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:20cedb4ee43278bc4f2fee6cb50daec836959aadaf948db5172e776dd3d993fc", size = 148901 }, + { url = "https://files.pythonhosted.org/packages/73/e5/383be1724cb30f4ce44983d249645684a48c435e1cd4f8b5cded8a816d3c/tomli-2.4.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:39b0b5d1b6dd03684b3fb276407ebed7090bbec989fa55838c98560c01113b66", size = 243375 }, + { url = "https://files.pythonhosted.org/packages/31/f0/bea80c17971c8d16d3cc109dc3585b0f2ce1036b5f4a8a183789023574f2/tomli-2.4.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a26d7ff68dfdb9f87a016ecfd1e1c2bacbe3108f4e0f8bcd2228ef9a766c787d", size = 250639 }, + { url = "https://files.pythonhosted.org/packages/2c/8f/2853c36abbb7608e3f945d8a74e32ed3a74ee3a1f468f1ffc7d1cb3abba6/tomli-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:20ffd184fb1df76a66e34bd1b36b4a4641bd2b82954befa32fe8163e79f1a702", size = 246897 }, + { url = "https://files.pythonhosted.org/packages/49/f0/6c05e3196ed5337b9fe7ea003e95fd3819a840b7a0f2bf5a408ef1dad8ed/tomli-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:75c2f8bbddf170e8effc98f5e9084a8751f8174ea6ccf4fca5398436e0320bc8", size = 254697 }, + { url = "https://files.pythonhosted.org/packages/f3/f5/2922ef29c9f2951883525def7429967fc4d8208494e5ab524234f06b688b/tomli-2.4.0-cp314-cp314-win32.whl", hash = "sha256:31d556d079d72db7c584c0627ff3a24c5d3fb4f730221d3444f3efb1b2514776", size = 98567 }, + { url = "https://files.pythonhosted.org/packages/7b/31/22b52e2e06dd2a5fdbc3ee73226d763b184ff21fc24e20316a44ccc4d96b/tomli-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:43e685b9b2341681907759cf3a04e14d7104b3580f808cfde1dfdb60ada85475", size = 108556 }, + { url = "https://files.pythonhosted.org/packages/48/3d/5058dff3255a3d01b705413f64f4306a141a8fd7a251e5a495e3f192a998/tomli-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:3d895d56bd3f82ddd6faaff993c275efc2ff38e52322ea264122d72729dca2b2", size = 96014 }, + { url = "https://files.pythonhosted.org/packages/b8/4e/75dab8586e268424202d3a1997ef6014919c941b50642a1682df43204c22/tomli-2.4.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:5b5807f3999fb66776dbce568cc9a828544244a8eb84b84b9bafc080c99597b9", size = 163339 }, + { url = "https://files.pythonhosted.org/packages/06/e3/b904d9ab1016829a776d97f163f183a48be6a4deb87304d1e0116a349519/tomli-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c084ad935abe686bd9c898e62a02a19abfc9760b5a79bc29644463eaf2840cb0", size = 159490 }, + { url = "https://files.pythonhosted.org/packages/e3/5a/fc3622c8b1ad823e8ea98a35e3c632ee316d48f66f80f9708ceb4f2a0322/tomli-2.4.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f2e3955efea4d1cfbcb87bc321e00dc08d2bcb737fd1d5e398af111d86db5df", size = 269398 }, + { url = "https://files.pythonhosted.org/packages/fd/33/62bd6152c8bdd4c305ad9faca48f51d3acb2df1f8791b1477d46ff86e7f8/tomli-2.4.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e0fe8a0b8312acf3a88077a0802565cb09ee34107813bba1c7cd591fa6cfc8d", size = 276515 }, + { url = "https://files.pythonhosted.org/packages/4b/ff/ae53619499f5235ee4211e62a8d7982ba9e439a0fb4f2f351a93d67c1dd2/tomli-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:413540dce94673591859c4c6f794dfeaa845e98bf35d72ed59636f869ef9f86f", size = 273806 }, + { url = "https://files.pythonhosted.org/packages/47/71/cbca7787fa68d4d0a9f7072821980b39fbb1b6faeb5f5cf02f4a5559fa28/tomli-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:0dc56fef0e2c1c470aeac5b6ca8cc7b640bb93e92d9803ddaf9ea03e198f5b0b", size = 281340 }, + { url = "https://files.pythonhosted.org/packages/f5/00/d595c120963ad42474cf6ee7771ad0d0e8a49d0f01e29576ee9195d9ecdf/tomli-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:d878f2a6707cc9d53a1be1414bbb419e629c3d6e67f69230217bb663e76b5087", size = 108106 }, + { url = "https://files.pythonhosted.org/packages/de/69/9aa0c6a505c2f80e519b43764f8b4ba93b5a0bbd2d9a9de6e2b24271b9a5/tomli-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2add28aacc7425117ff6364fe9e06a183bb0251b03f986df0e78e974047571fd", size = 120504 }, + { url = "https://files.pythonhosted.org/packages/b3/9f/f1668c281c58cfae01482f7114a4b88d345e4c140386241a1a24dcc9e7bc/tomli-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:2b1e3b80e1d5e52e40e9b924ec43d81570f0e7d09d11081b797bc4692765a3d4", size = 99561 }, + { url = "https://files.pythonhosted.org/packages/23/d1/136eb2cb77520a31e1f64cbae9d33ec6df0d78bdf4160398e86eec8a8754/tomli-2.4.0-py3-none-any.whl", hash = "sha256:1f776e7d669ebceb01dee46484485f43a4048746235e683bcdffacdf1fb4785a", size = 14477 }, ] [[package]] name = "tomlkit" version = "0.13.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207, upload-time = "2025-06-05T07:13:44.947Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } wheels = [ - { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901, upload-time = "2025-06-05T07:13:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, ] [[package]] name = "torch" version = "2.10.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "cuda-bindings", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "filelock" }, { name = "fsspec" }, { name = "jinja2" }, - { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, @@ -3622,57 +2881,61 @@ dependencies = [ { name = "typing-extensions" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/0c/1a/c61f36cfd446170ec27b3a4984f072fd06dab6b5d7ce27e11adb35d6c838/torch-2.10.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5276fa790a666ee8becaffff8acb711922252521b28fbce5db7db5cf9cb2026d", size = 145992962, upload-time = "2026-01-21T16:24:14.04Z" }, - { url = "https://files.pythonhosted.org/packages/b5/60/6662535354191e2d1555296045b63e4279e5a9dbad49acf55a5d38655a39/torch-2.10.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:aaf663927bcd490ae971469a624c322202a2a1e68936eb952535ca4cd3b90444", size = 915599237, upload-time = "2026-01-21T16:23:25.497Z" }, - { url = "https://files.pythonhosted.org/packages/40/b8/66bbe96f0d79be2b5c697b2e0b187ed792a15c6c4b8904613454651db848/torch-2.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4be6a2a190b32ff5c8002a0977a25ea60e64f7ba46b1be37093c141d9c49aeb", size = 113720931, upload-time = "2026-01-21T16:24:23.743Z" }, - { url = "https://files.pythonhosted.org/packages/76/bb/d820f90e69cda6c8169b32a0c6a3ab7b17bf7990b8f2c680077c24a3c14c/torch-2.10.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:35e407430795c8d3edb07a1d711c41cc1f9eaddc8b2f1cc0a165a6767a8fb73d", size = 79411450, upload-time = "2026-01-21T16:25:30.692Z" }, - { url = "https://files.pythonhosted.org/packages/78/89/f5554b13ebd71e05c0b002f95148033e730d3f7067f67423026cc9c69410/torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4", size = 145992610, upload-time = "2026-01-21T16:25:26.327Z" }, - { url = "https://files.pythonhosted.org/packages/ae/30/a3a2120621bf9c17779b169fc17e3dc29b230c29d0f8222f499f5e159aa8/torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763", size = 915607863, upload-time = "2026-01-21T16:25:06.696Z" }, - { url = "https://files.pythonhosted.org/packages/6f/3d/c87b33c5f260a2a8ad68da7147e105f05868c281c63d65ed85aa4da98c66/torch-2.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:29b7009dba4b7a1c960260fc8ac85022c784250af43af9fb0ebafc9883782ebd", size = 113723116, upload-time = "2026-01-21T16:25:21.916Z" }, - { url = "https://files.pythonhosted.org/packages/61/d8/15b9d9d3a6b0c01b883787bd056acbe5cc321090d4b216d3ea89a8fcfdf3/torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:b7bd80f3477b830dd166c707c5b0b82a898e7b16f59a7d9d42778dd058272e8b", size = 79423461, upload-time = "2026-01-21T16:24:50.266Z" }, - { url = "https://files.pythonhosted.org/packages/cc/af/758e242e9102e9988969b5e621d41f36b8f258bb4a099109b7a4b4b50ea4/torch-2.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5fd4117d89ffd47e3dcc71e71a22efac24828ad781c7e46aaaf56bf7f2796acf", size = 145996088, upload-time = "2026-01-21T16:24:44.171Z" }, - { url = "https://files.pythonhosted.org/packages/23/8e/3c74db5e53bff7ed9e34c8123e6a8bfef718b2450c35eefab85bb4a7e270/torch-2.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:787124e7db3b379d4f1ed54dd12ae7c741c16a4d29b49c0226a89bea50923ffb", size = 915711952, upload-time = "2026-01-21T16:23:53.503Z" }, - { url = "https://files.pythonhosted.org/packages/6e/01/624c4324ca01f66ae4c7cd1b74eb16fb52596dce66dbe51eff95ef9e7a4c/torch-2.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c66c61f44c5f903046cc696d088e21062644cbe541c7f1c4eaae88b2ad23547", size = 113757972, upload-time = "2026-01-21T16:24:39.516Z" }, - { url = "https://files.pythonhosted.org/packages/c9/5c/dee910b87c4d5c0fcb41b50839ae04df87c1cfc663cf1b5fca7ea565eeaa/torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6d3707a61863d1c4d6ebba7be4ca320f42b869ee657e9b2c21c736bf17000294", size = 79498198, upload-time = "2026-01-21T16:24:34.704Z" }, - { url = "https://files.pythonhosted.org/packages/c9/6f/f2e91e34e3fcba2e3fc8d8f74e7d6c22e74e480bbd1db7bc8900fdf3e95c/torch-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5c4d217b14741e40776dd7074d9006fd28b8a97ef5654db959d8635b2fe5f29b", size = 146004247, upload-time = "2026-01-21T16:24:29.335Z" }, - { url = "https://files.pythonhosted.org/packages/98/fb/5160261aeb5e1ee12ee95fe599d0541f7c976c3701d607d8fc29e623229f/torch-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6b71486353fce0f9714ca0c9ef1c850a2ae766b409808acd58e9678a3edb7738", size = 915716445, upload-time = "2026-01-21T16:22:45.353Z" }, - { url = "https://files.pythonhosted.org/packages/6a/16/502fb1b41e6d868e8deb5b0e3ae926bbb36dab8ceb0d1b769b266ad7b0c3/torch-2.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2ee399c644dc92ef7bc0d4f7e74b5360c37cdbe7c5ba11318dda49ffac2bc57", size = 113757050, upload-time = "2026-01-21T16:24:19.204Z" }, - { url = "https://files.pythonhosted.org/packages/1a/0b/39929b148f4824bc3ad6f9f72a29d4ad865bcf7ebfc2fa67584773e083d2/torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:3202429f58309b9fa96a614885eace4b7995729f44beb54d3e4a47773649d382", size = 79851305, upload-time = "2026-01-21T16:24:09.209Z" }, - { url = "https://files.pythonhosted.org/packages/d8/14/21fbce63bc452381ba5f74a2c0a959fdf5ad5803ccc0c654e752e0dbe91a/torch-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:aae1b29cd68e50a9397f5ee897b9c24742e9e306f88a807a27d617f07adb3bd8", size = 146005472, upload-time = "2026-01-21T16:22:29.022Z" }, - { url = "https://files.pythonhosted.org/packages/54/fd/b207d1c525cb570ef47f3e9f836b154685011fce11a2f444ba8a4084d042/torch-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6021db85958db2f07ec94e1bc77212721ba4920c12a18dc552d2ae36a3eb163f", size = 915612644, upload-time = "2026-01-21T16:21:47.019Z" }, - { url = "https://files.pythonhosted.org/packages/36/53/0197f868c75f1050b199fe58f9bf3bf3aecac9b4e85cc9c964383d745403/torch-2.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff43db38af76fda183156153983c9a096fc4c78d0cd1e07b14a2314c7f01c2c8", size = 113997015, upload-time = "2026-01-21T16:23:00.767Z" }, - { url = "https://files.pythonhosted.org/packages/0e/13/e76b4d9c160e89fff48bf16b449ea324bda84745d2ab30294c37c2434c0d/torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:cdf2a523d699b70d613243211ecaac14fe9c5df8a0b0a9c02add60fb2a413e0f", size = 79498248, upload-time = "2026-01-21T16:23:09.315Z" }, - { url = "https://files.pythonhosted.org/packages/4f/93/716b5ac0155f1be70ed81bacc21269c3ece8dba0c249b9994094110bfc51/torch-2.10.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:bf0d9ff448b0218e0433aeb198805192346c4fd659c852370d5cc245f602a06a", size = 79464992, upload-time = "2026-01-21T16:23:05.162Z" }, - { url = "https://files.pythonhosted.org/packages/69/2b/51e663ff190c9d16d4a8271203b71bc73a16aa7619b9f271a69b9d4a936b/torch-2.10.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:233aed0659a2503b831d8a67e9da66a62c996204c0bba4f4c442ccc0c68a3f60", size = 146018567, upload-time = "2026-01-21T16:22:23.393Z" }, - { url = "https://files.pythonhosted.org/packages/5e/cd/4b95ef7f293b927c283db0b136c42be91c8ec6845c44de0238c8c23bdc80/torch-2.10.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:682497e16bdfa6efeec8cde66531bc8d1fbbbb4d8788ec6173c089ed3cc2bfe5", size = 915721646, upload-time = "2026-01-21T16:21:16.983Z" }, - { url = "https://files.pythonhosted.org/packages/56/97/078a007208f8056d88ae43198833469e61a0a355abc0b070edd2c085eb9a/torch-2.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:6528f13d2a8593a1a412ea07a99812495bec07e9224c28b2a25c0a30c7da025c", size = 113752373, upload-time = "2026-01-21T16:22:13.471Z" }, - { url = "https://files.pythonhosted.org/packages/d8/94/71994e7d0d5238393df9732fdab607e37e2b56d26a746cb59fdb415f8966/torch-2.10.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f5ab4ba32383061be0fb74bda772d470140a12c1c3b58a0cfbf3dae94d164c28", size = 79850324, upload-time = "2026-01-21T16:22:09.494Z" }, - { url = "https://files.pythonhosted.org/packages/e2/65/1a05346b418ea8ccd10360eef4b3e0ce688fba544e76edec26913a8d0ee0/torch-2.10.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:716b01a176c2a5659c98f6b01bf868244abdd896526f1c692712ab36dbaf9b63", size = 146006482, upload-time = "2026-01-21T16:22:18.42Z" }, - { url = "https://files.pythonhosted.org/packages/1d/b9/5f6f9d9e859fc3235f60578fa64f52c9c6e9b4327f0fe0defb6de5c0de31/torch-2.10.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d8f5912ba938233f86361e891789595ff35ca4b4e2ac8fe3670895e5976731d6", size = 915613050, upload-time = "2026-01-21T16:20:49.035Z" }, - { url = "https://files.pythonhosted.org/packages/66/4d/35352043ee0eaffdeff154fad67cd4a31dbed7ff8e3be1cc4549717d6d51/torch-2.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:71283a373f0ee2c89e0f0d5f446039bdabe8dbc3c9ccf35f0f784908b0acd185", size = 113995816, upload-time = "2026-01-21T16:22:05.312Z" }, + { url = "https://files.pythonhosted.org/packages/5b/30/bfebdd8ec77db9a79775121789992d6b3b75ee5494971294d7b4b7c999bc/torch-2.10.0-2-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:2b980edd8d7c0a68c4e951ee1856334a43193f98730d97408fbd148c1a933313", size = 79411457 }, + { url = "https://files.pythonhosted.org/packages/0f/8b/4b61d6e13f7108f36910df9ab4b58fd389cc2520d54d81b88660804aad99/torch-2.10.0-2-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:418997cb02d0a0f1497cf6a09f63166f9f5df9f3e16c8a716ab76a72127c714f", size = 79423467 }, + { url = "https://files.pythonhosted.org/packages/d3/54/a2ba279afcca44bbd320d4e73675b282fcee3d81400ea1b53934efca6462/torch-2.10.0-2-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:13ec4add8c3faaed8d13e0574f5cd4a323c11655546f91fbe6afa77b57423574", size = 79498202 }, + { url = "https://files.pythonhosted.org/packages/ec/23/2c9fe0c9c27f7f6cb865abcea8a4568f29f00acaeadfc6a37f6801f84cb4/torch-2.10.0-2-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:e521c9f030a3774ed770a9c011751fb47c4d12029a3d6522116e48431f2ff89e", size = 79498254 }, + { url = "https://files.pythonhosted.org/packages/0c/1a/c61f36cfd446170ec27b3a4984f072fd06dab6b5d7ce27e11adb35d6c838/torch-2.10.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:5276fa790a666ee8becaffff8acb711922252521b28fbce5db7db5cf9cb2026d", size = 145992962 }, + { url = "https://files.pythonhosted.org/packages/b5/60/6662535354191e2d1555296045b63e4279e5a9dbad49acf55a5d38655a39/torch-2.10.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:aaf663927bcd490ae971469a624c322202a2a1e68936eb952535ca4cd3b90444", size = 915599237 }, + { url = "https://files.pythonhosted.org/packages/40/b8/66bbe96f0d79be2b5c697b2e0b187ed792a15c6c4b8904613454651db848/torch-2.10.0-cp310-cp310-win_amd64.whl", hash = "sha256:a4be6a2a190b32ff5c8002a0977a25ea60e64f7ba46b1be37093c141d9c49aeb", size = 113720931 }, + { url = "https://files.pythonhosted.org/packages/76/bb/d820f90e69cda6c8169b32a0c6a3ab7b17bf7990b8f2c680077c24a3c14c/torch-2.10.0-cp310-none-macosx_11_0_arm64.whl", hash = "sha256:35e407430795c8d3edb07a1d711c41cc1f9eaddc8b2f1cc0a165a6767a8fb73d", size = 79411450 }, + { url = "https://files.pythonhosted.org/packages/78/89/f5554b13ebd71e05c0b002f95148033e730d3f7067f67423026cc9c69410/torch-2.10.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3282d9febd1e4e476630a099692b44fdc214ee9bf8ee5377732d9d9dfe5712e4", size = 145992610 }, + { url = "https://files.pythonhosted.org/packages/ae/30/a3a2120621bf9c17779b169fc17e3dc29b230c29d0f8222f499f5e159aa8/torch-2.10.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:a2f9edd8dbc99f62bc4dfb78af7bf89499bca3d753423ac1b4e06592e467b763", size = 915607863 }, + { url = "https://files.pythonhosted.org/packages/6f/3d/c87b33c5f260a2a8ad68da7147e105f05868c281c63d65ed85aa4da98c66/torch-2.10.0-cp311-cp311-win_amd64.whl", hash = "sha256:29b7009dba4b7a1c960260fc8ac85022c784250af43af9fb0ebafc9883782ebd", size = 113723116 }, + { url = "https://files.pythonhosted.org/packages/61/d8/15b9d9d3a6b0c01b883787bd056acbe5cc321090d4b216d3ea89a8fcfdf3/torch-2.10.0-cp311-none-macosx_11_0_arm64.whl", hash = "sha256:b7bd80f3477b830dd166c707c5b0b82a898e7b16f59a7d9d42778dd058272e8b", size = 79423461 }, + { url = "https://files.pythonhosted.org/packages/cc/af/758e242e9102e9988969b5e621d41f36b8f258bb4a099109b7a4b4b50ea4/torch-2.10.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:5fd4117d89ffd47e3dcc71e71a22efac24828ad781c7e46aaaf56bf7f2796acf", size = 145996088 }, + { url = "https://files.pythonhosted.org/packages/23/8e/3c74db5e53bff7ed9e34c8123e6a8bfef718b2450c35eefab85bb4a7e270/torch-2.10.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:787124e7db3b379d4f1ed54dd12ae7c741c16a4d29b49c0226a89bea50923ffb", size = 915711952 }, + { url = "https://files.pythonhosted.org/packages/6e/01/624c4324ca01f66ae4c7cd1b74eb16fb52596dce66dbe51eff95ef9e7a4c/torch-2.10.0-cp312-cp312-win_amd64.whl", hash = "sha256:2c66c61f44c5f903046cc696d088e21062644cbe541c7f1c4eaae88b2ad23547", size = 113757972 }, + { url = "https://files.pythonhosted.org/packages/c9/5c/dee910b87c4d5c0fcb41b50839ae04df87c1cfc663cf1b5fca7ea565eeaa/torch-2.10.0-cp312-none-macosx_11_0_arm64.whl", hash = "sha256:6d3707a61863d1c4d6ebba7be4ca320f42b869ee657e9b2c21c736bf17000294", size = 79498198 }, + { url = "https://files.pythonhosted.org/packages/c9/6f/f2e91e34e3fcba2e3fc8d8f74e7d6c22e74e480bbd1db7bc8900fdf3e95c/torch-2.10.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5c4d217b14741e40776dd7074d9006fd28b8a97ef5654db959d8635b2fe5f29b", size = 146004247 }, + { url = "https://files.pythonhosted.org/packages/98/fb/5160261aeb5e1ee12ee95fe599d0541f7c976c3701d607d8fc29e623229f/torch-2.10.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:6b71486353fce0f9714ca0c9ef1c850a2ae766b409808acd58e9678a3edb7738", size = 915716445 }, + { url = "https://files.pythonhosted.org/packages/6a/16/502fb1b41e6d868e8deb5b0e3ae926bbb36dab8ceb0d1b769b266ad7b0c3/torch-2.10.0-cp313-cp313-win_amd64.whl", hash = "sha256:c2ee399c644dc92ef7bc0d4f7e74b5360c37cdbe7c5ba11318dda49ffac2bc57", size = 113757050 }, + { url = "https://files.pythonhosted.org/packages/1a/0b/39929b148f4824bc3ad6f9f72a29d4ad865bcf7ebfc2fa67584773e083d2/torch-2.10.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:3202429f58309b9fa96a614885eace4b7995729f44beb54d3e4a47773649d382", size = 79851305 }, + { url = "https://files.pythonhosted.org/packages/d8/14/21fbce63bc452381ba5f74a2c0a959fdf5ad5803ccc0c654e752e0dbe91a/torch-2.10.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:aae1b29cd68e50a9397f5ee897b9c24742e9e306f88a807a27d617f07adb3bd8", size = 146005472 }, + { url = "https://files.pythonhosted.org/packages/54/fd/b207d1c525cb570ef47f3e9f836b154685011fce11a2f444ba8a4084d042/torch-2.10.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:6021db85958db2f07ec94e1bc77212721ba4920c12a18dc552d2ae36a3eb163f", size = 915612644 }, + { url = "https://files.pythonhosted.org/packages/36/53/0197f868c75f1050b199fe58f9bf3bf3aecac9b4e85cc9c964383d745403/torch-2.10.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff43db38af76fda183156153983c9a096fc4c78d0cd1e07b14a2314c7f01c2c8", size = 113997015 }, + { url = "https://files.pythonhosted.org/packages/0e/13/e76b4d9c160e89fff48bf16b449ea324bda84745d2ab30294c37c2434c0d/torch-2.10.0-cp313-none-macosx_11_0_arm64.whl", hash = "sha256:cdf2a523d699b70d613243211ecaac14fe9c5df8a0b0a9c02add60fb2a413e0f", size = 79498248 }, + { url = "https://files.pythonhosted.org/packages/4f/93/716b5ac0155f1be70ed81bacc21269c3ece8dba0c249b9994094110bfc51/torch-2.10.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:bf0d9ff448b0218e0433aeb198805192346c4fd659c852370d5cc245f602a06a", size = 79464992 }, + { url = "https://files.pythonhosted.org/packages/69/2b/51e663ff190c9d16d4a8271203b71bc73a16aa7619b9f271a69b9d4a936b/torch-2.10.0-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:233aed0659a2503b831d8a67e9da66a62c996204c0bba4f4c442ccc0c68a3f60", size = 146018567 }, + { url = "https://files.pythonhosted.org/packages/5e/cd/4b95ef7f293b927c283db0b136c42be91c8ec6845c44de0238c8c23bdc80/torch-2.10.0-cp314-cp314-manylinux_2_28_x86_64.whl", hash = "sha256:682497e16bdfa6efeec8cde66531bc8d1fbbbb4d8788ec6173c089ed3cc2bfe5", size = 915721646 }, + { url = "https://files.pythonhosted.org/packages/56/97/078a007208f8056d88ae43198833469e61a0a355abc0b070edd2c085eb9a/torch-2.10.0-cp314-cp314-win_amd64.whl", hash = "sha256:6528f13d2a8593a1a412ea07a99812495bec07e9224c28b2a25c0a30c7da025c", size = 113752373 }, + { url = "https://files.pythonhosted.org/packages/d8/94/71994e7d0d5238393df9732fdab607e37e2b56d26a746cb59fdb415f8966/torch-2.10.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:f5ab4ba32383061be0fb74bda772d470140a12c1c3b58a0cfbf3dae94d164c28", size = 79850324 }, + { url = "https://files.pythonhosted.org/packages/e2/65/1a05346b418ea8ccd10360eef4b3e0ce688fba544e76edec26913a8d0ee0/torch-2.10.0-cp314-cp314t-manylinux_2_28_aarch64.whl", hash = "sha256:716b01a176c2a5659c98f6b01bf868244abdd896526f1c692712ab36dbaf9b63", size = 146006482 }, + { url = "https://files.pythonhosted.org/packages/1d/b9/5f6f9d9e859fc3235f60578fa64f52c9c6e9b4327f0fe0defb6de5c0de31/torch-2.10.0-cp314-cp314t-manylinux_2_28_x86_64.whl", hash = "sha256:d8f5912ba938233f86361e891789595ff35ca4b4e2ac8fe3670895e5976731d6", size = 915613050 }, + { url = "https://files.pythonhosted.org/packages/66/4d/35352043ee0eaffdeff154fad67cd4a31dbed7ff8e3be1cc4549717d6d51/torch-2.10.0-cp314-cp314t-win_amd64.whl", hash = "sha256:71283a373f0ee2c89e0f0d5f446039bdabe8dbc3c9ccf35f0f784908b0acd185", size = 113995816 }, ] [[package]] name = "tqdm" version = "4.67.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "colorama", marker = "sys_platform == 'win32'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/27/89/4b0001b2dab8df0a5ee2787dcbe771de75ded01f18f1f8d53dedeea2882b/tqdm-4.67.2.tar.gz", hash = "sha256:649aac53964b2cb8dec76a14b405a4c0d13612cb8933aae547dd144eacc99653", size = 169514, upload-time = "2026-01-30T23:12:06.555Z" } +sdist = { url = "https://files.pythonhosted.org/packages/27/89/4b0001b2dab8df0a5ee2787dcbe771de75ded01f18f1f8d53dedeea2882b/tqdm-4.67.2.tar.gz", hash = "sha256:649aac53964b2cb8dec76a14b405a4c0d13612cb8933aae547dd144eacc99653", size = 169514 } wheels = [ - { url = "https://files.pythonhosted.org/packages/f5/e2/31eac96de2915cf20ccaed0225035db149dfb9165a9ed28d4b252ef3f7f7/tqdm-4.67.2-py3-none-any.whl", hash = "sha256:9a12abcbbff58b6036b2167d9d3853042b9d436fe7330f06ae047867f2f8e0a7", size = 78354, upload-time = "2026-01-30T23:12:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/f5/e2/31eac96de2915cf20ccaed0225035db149dfb9165a9ed28d4b252ef3f7f7/tqdm-4.67.2-py3-none-any.whl", hash = "sha256:9a12abcbbff58b6036b2167d9d3853042b9d436fe7330f06ae047867f2f8e0a7", size = 78354 }, ] [[package]] name = "trackio" version = "0.15.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "gradio", extra = ["oauth"] }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "orjson" }, { name = "pandas" }, { name = "pillow" }, @@ -3681,18 +2944,18 @@ dependencies = [ { name = "tomli", marker = "python_full_version < '3.11'" }, ] wheels = [ - { url = "https://files.pythonhosted.org/packages/93/2a/347164380721757777fb776a83ee6192e92e8e92d9e860b9f00f97e47454/trackio-0.15.0-py3-none-any.whl", hash = "sha256:f5177d89e9034c27f4784a6874d5c4e4af2214dfa2f7ecff978b0bf4bbdfbf5a", size = 1004543, upload-time = "2026-01-13T18:24:30.519Z" }, + { url = "https://files.pythonhosted.org/packages/93/2a/347164380721757777fb776a83ee6192e92e8e92d9e860b9f00f97e47454/trackio-0.15.0-py3-none-any.whl", hash = "sha256:f5177d89e9034c27f4784a6874d5c4e4af2214dfa2f7ecff978b0bf4bbdfbf5a", size = 1004543 }, ] [[package]] name = "transformers" version = "5.0.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "filelock" }, { name = "huggingface-hub" }, - { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, - { name = "numpy", version = "2.4.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.1", source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" }, marker = "python_full_version >= '3.11'" }, { name = "packaging" }, { name = "pyyaml" }, { name = "regex" }, @@ -3701,370 +2964,361 @@ dependencies = [ { name = "tqdm" }, { name = "typer-slim" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/bc/79/845941711811789c85fb7e2599cea425a14a07eda40f50896b9d3fda7492/transformers-5.0.0.tar.gz", hash = "sha256:5f5634efed6cf76ad068cc5834c7adbc32db78bbd6211fb70df2325a9c37dec8", size = 8424830, upload-time = "2026-01-26T10:46:46.813Z" } +sdist = { url = "https://files.pythonhosted.org/packages/bc/79/845941711811789c85fb7e2599cea425a14a07eda40f50896b9d3fda7492/transformers-5.0.0.tar.gz", hash = "sha256:5f5634efed6cf76ad068cc5834c7adbc32db78bbd6211fb70df2325a9c37dec8", size = 8424830 } wheels = [ - { url = "https://files.pythonhosted.org/packages/52/f3/ac976fa8e305c9e49772527e09fbdc27cc6831b8a2f6b6063406626be5dd/transformers-5.0.0-py3-none-any.whl", hash = "sha256:587086f249ce64c817213cf36afdb318d087f790723e9b3d4500b97832afd52d", size = 10142091, upload-time = "2026-01-26T10:46:43.88Z" }, + { url = "https://files.pythonhosted.org/packages/52/f3/ac976fa8e305c9e49772527e09fbdc27cc6831b8a2f6b6063406626be5dd/transformers-5.0.0-py3-none-any.whl", hash = "sha256:587086f249ce64c817213cf36afdb318d087f790723e9b3d4500b97832afd52d", size = 10142091 }, ] [[package]] name = "triton" version = "3.6.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } wheels = [ - { url = "https://files.pythonhosted.org/packages/8c/f7/f1c9d3424ab199ac53c2da567b859bcddbb9c9e7154805119f8bd95ec36f/triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6550fae429e0667e397e5de64b332d1e5695b73650ee75a6146e2e902770bea", size = 188105201, upload-time = "2026-01-20T16:00:29.272Z" }, - { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640, upload-time = "2026-01-20T16:00:35.869Z" }, - { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850, upload-time = "2026-01-20T16:00:43.041Z" }, - { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450, upload-time = "2026-01-20T16:00:49.136Z" }, - { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296, upload-time = "2026-01-20T16:00:56.042Z" }, - { url = "https://files.pythonhosted.org/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", size = 188273063, upload-time = "2026-01-20T16:01:07.278Z" }, - { url = "https://files.pythonhosted.org/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", size = 188397994, upload-time = "2026-01-20T16:01:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f7/f1c9d3424ab199ac53c2da567b859bcddbb9c9e7154805119f8bd95ec36f/triton-3.6.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a6550fae429e0667e397e5de64b332d1e5695b73650ee75a6146e2e902770bea", size = 188105201 }, + { url = "https://files.pythonhosted.org/packages/e0/12/b05ba554d2c623bffa59922b94b0775673de251f468a9609bc9e45de95e9/triton-3.6.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8e323d608e3a9bfcc2d9efcc90ceefb764a82b99dea12a86d643c72539ad5d3", size = 188214640 }, + { url = "https://files.pythonhosted.org/packages/ab/a8/cdf8b3e4c98132f965f88c2313a4b493266832ad47fb52f23d14d4f86bb5/triton-3.6.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74caf5e34b66d9f3a429af689c1c7128daba1d8208df60e81106b115c00d6fca", size = 188266850 }, + { url = "https://files.pythonhosted.org/packages/f9/0b/37d991d8c130ce81a8728ae3c25b6e60935838e9be1b58791f5997b24a54/triton-3.6.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10c7f76c6e72d2ef08df639e3d0d30729112f47a56b0c81672edc05ee5116ac9", size = 188289450 }, + { url = "https://files.pythonhosted.org/packages/35/f8/9c66bfc55361ec6d0e4040a0337fb5924ceb23de4648b8a81ae9d33b2b38/triton-3.6.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d002e07d7180fd65e622134fbd980c9a3d4211fb85224b56a0a0efbd422ab72f", size = 188400296 }, + { url = "https://files.pythonhosted.org/packages/df/3d/9e7eee57b37c80cec63322c0231bb6da3cfe535a91d7a4d64896fcb89357/triton-3.6.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a17a5d5985f0ac494ed8a8e54568f092f7057ef60e1b0fa09d3fd1512064e803", size = 188273063 }, + { url = "https://files.pythonhosted.org/packages/f6/56/6113c23ff46c00aae423333eb58b3e60bdfe9179d542781955a5e1514cb3/triton-3.6.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46bd1c1af4b6704e554cad2eeb3b0a6513a980d470ccfa63189737340c7746a7", size = 188397994 }, ] [[package]] name = "trl" version = "0.27.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "accelerate" }, { name = "datasets" }, { name = "packaging" }, { name = "transformers" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/2a/85/e0151f2bc006722c032fad942d442ac3cfe1e25b770fca3a6c50e599a89c/trl-0.27.1.tar.gz", hash = "sha256:9d502626c3ac1d32cdc7d8978c742de31bfc11135b4d15be1d83909632dcb75c", size = 449005, upload-time = "2026-01-24T03:33:56.977Z" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/85/e0151f2bc006722c032fad942d442ac3cfe1e25b770fca3a6c50e599a89c/trl-0.27.1.tar.gz", hash = "sha256:9d502626c3ac1d32cdc7d8978c742de31bfc11135b4d15be1d83909632dcb75c", size = 449005 } wheels = [ - { url = "https://files.pythonhosted.org/packages/08/49/6b03bdbb26c4f4f962624014fe7ae4ea91834286f4387ad0d3748bf21c6f/trl-0.27.1-py3-none-any.whl", hash = "sha256:641843c8556516c39896113b79c9b0b668236670b3eae3697107117c75cc65eb", size = 532873, upload-time = "2026-01-24T03:33:55.195Z" }, + { url = "https://files.pythonhosted.org/packages/08/49/6b03bdbb26c4f4f962624014fe7ae4ea91834286f4387ad0d3748bf21c6f/trl-0.27.1-py3-none-any.whl", hash = "sha256:641843c8556516c39896113b79c9b0b668236670b3eae3697107117c75cc65eb", size = 532873 }, ] [[package]] name = "typer" version = "0.21.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "click" }, { name = "rich" }, { name = "shellingham" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371, upload-time = "2026-01-06T11:21:10.989Z" } +sdist = { url = "https://files.pythonhosted.org/packages/36/bf/8825b5929afd84d0dabd606c67cd57b8388cb3ec385f7ef19c5cc2202069/typer-0.21.1.tar.gz", hash = "sha256:ea835607cd752343b6b2b7ce676893e5a0324082268b48f27aa058bdb7d2145d", size = 110371 } wheels = [ - { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381, upload-time = "2026-01-06T11:21:09.824Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/d9257dd49ff2ca23ea5f132edf1281a0c4f9de8a762b9ae399b670a59235/typer-0.21.1-py3-none-any.whl", hash = "sha256:7985e89081c636b88d172c2ee0cfe33c253160994d47bdfdc302defd7d1f1d01", size = 47381 }, ] [[package]] name = "typer-slim" version = "0.21.1" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "click" }, { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/17/d4/064570dec6358aa9049d4708e4a10407d74c99258f8b2136bb8702303f1a/typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd", size = 110478, upload-time = "2026-01-06T11:21:11.176Z" } +sdist = { url = "https://files.pythonhosted.org/packages/17/d4/064570dec6358aa9049d4708e4a10407d74c99258f8b2136bb8702303f1a/typer_slim-0.21.1.tar.gz", hash = "sha256:73495dd08c2d0940d611c5a8c04e91c2a0a98600cbd4ee19192255a233b6dbfd", size = 110478 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d", size = 47444, upload-time = "2026-01-06T11:21:12.441Z" }, + { url = "https://files.pythonhosted.org/packages/c8/0a/4aca634faf693e33004796b6cee0ae2e1dba375a800c16ab8d3eff4bb800/typer_slim-0.21.1-py3-none-any.whl", hash = "sha256:6e6c31047f171ac93cc5a973c9e617dbc5ab2bddc4d0a3135dc161b4e2020e0d", size = 47444 }, ] [[package]] name = "typing-extensions" version = "4.15.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } wheels = [ - { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, ] [[package]] name = "typing-inspection" version = "0.4.2" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "typing-extensions" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949 } wheels = [ - { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611 }, ] [[package]] name = "tzdata" version = "2025.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772, upload-time = "2025-12-13T17:45:35.667Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/5e/a7/c202b344c5ca7daf398f3b8a477eeb205cf3b6f32e7ec3a6bac0629ca975/tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7", size = 196772 } wheels = [ - { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521, upload-time = "2025-12-13T17:45:33.889Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b0/003792df09decd6849a5e39c28b513c06e84436a54440380862b5aeff25d/tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1", size = 348521 }, ] [[package]] name = "urllib3" version = "2.6.3" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556 } wheels = [ - { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584 }, ] [[package]] name = "uvicorn" version = "0.40.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "click" }, { name = "h11" }, { name = "typing-extensions", marker = "python_full_version < '3.11'" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761, upload-time = "2025-12-21T14:16:22.45Z" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/d1/8f3c683c9561a4e6689dd3b1d345c815f10f86acd044ee1fb9a4dcd0b8c5/uvicorn-0.40.0.tar.gz", hash = "sha256:839676675e87e73694518b5574fd0f24c9d97b46bea16df7b8c05ea1a51071ea", size = 81761 } wheels = [ - { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502, upload-time = "2025-12-21T14:16:21.041Z" }, + { url = "https://files.pythonhosted.org/packages/3d/d8/2083a1daa7439a66f3a48589a57d576aa117726762618f6bb09fe3798796/uvicorn-0.40.0-py3-none-any.whl", hash = "sha256:c6c8f55bc8bf13eb6fa9ff87ad62308bbbc33d0b67f84293151efe87e0d5f2ee", size = 68502 }, ] [[package]] name = "xxhash" version = "3.6.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160, upload-time = "2025-10-02T14:37:08.097Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/34/ee/f9f1d656ad168681bb0f6b092372c1e533c4416b8069b1896a175c46e484/xxhash-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71", size = 32845, upload-time = "2025-10-02T14:33:51.573Z" }, - { url = "https://files.pythonhosted.org/packages/a3/b1/93508d9460b292c74a09b83d16750c52a0ead89c51eea9951cb97a60d959/xxhash-3.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d", size = 30807, upload-time = "2025-10-02T14:33:52.964Z" }, - { url = "https://files.pythonhosted.org/packages/07/55/28c93a3662f2d200c70704efe74aab9640e824f8ce330d8d3943bf7c9b3c/xxhash-3.6.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8", size = 193786, upload-time = "2025-10-02T14:33:54.272Z" }, - { url = "https://files.pythonhosted.org/packages/c1/96/fec0be9bb4b8f5d9c57d76380a366f31a1781fb802f76fc7cda6c84893c7/xxhash-3.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058", size = 212830, upload-time = "2025-10-02T14:33:55.706Z" }, - { url = "https://files.pythonhosted.org/packages/c4/a0/c706845ba77b9611f81fd2e93fad9859346b026e8445e76f8c6fd057cc6d/xxhash-3.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2", size = 211606, upload-time = "2025-10-02T14:33:57.133Z" }, - { url = "https://files.pythonhosted.org/packages/67/1e/164126a2999e5045f04a69257eea946c0dc3e86541b400d4385d646b53d7/xxhash-3.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc", size = 444872, upload-time = "2025-10-02T14:33:58.446Z" }, - { url = "https://files.pythonhosted.org/packages/2d/4b/55ab404c56cd70a2cf5ecfe484838865d0fea5627365c6c8ca156bd09c8f/xxhash-3.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc", size = 193217, upload-time = "2025-10-02T14:33:59.724Z" }, - { url = "https://files.pythonhosted.org/packages/45/e6/52abf06bac316db33aa269091ae7311bd53cfc6f4b120ae77bac1b348091/xxhash-3.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07", size = 210139, upload-time = "2025-10-02T14:34:02.041Z" }, - { url = "https://files.pythonhosted.org/packages/34/37/db94d490b8691236d356bc249c08819cbcef9273a1a30acf1254ff9ce157/xxhash-3.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4", size = 197669, upload-time = "2025-10-02T14:34:03.664Z" }, - { url = "https://files.pythonhosted.org/packages/b7/36/c4f219ef4a17a4f7a64ed3569bc2b5a9c8311abdb22249ac96093625b1a4/xxhash-3.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06", size = 210018, upload-time = "2025-10-02T14:34:05.325Z" }, - { url = "https://files.pythonhosted.org/packages/fd/06/bfac889a374fc2fc439a69223d1750eed2e18a7db8514737ab630534fa08/xxhash-3.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4", size = 413058, upload-time = "2025-10-02T14:34:06.925Z" }, - { url = "https://files.pythonhosted.org/packages/c9/d1/555d8447e0dd32ad0930a249a522bb2e289f0d08b6b16204cfa42c1f5a0c/xxhash-3.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b", size = 190628, upload-time = "2025-10-02T14:34:08.669Z" }, - { url = "https://files.pythonhosted.org/packages/d1/15/8751330b5186cedc4ed4b597989882ea05e0408b53fa47bcb46a6125bfc6/xxhash-3.6.0-cp310-cp310-win32.whl", hash = "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b", size = 30577, upload-time = "2025-10-02T14:34:10.234Z" }, - { url = "https://files.pythonhosted.org/packages/bb/cc/53f87e8b5871a6eb2ff7e89c48c66093bda2be52315a8161ddc54ea550c4/xxhash-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb", size = 31487, upload-time = "2025-10-02T14:34:11.618Z" }, - { url = "https://files.pythonhosted.org/packages/9f/00/60f9ea3bb697667a14314d7269956f58bf56bb73864f8f8d52a3c2535e9a/xxhash-3.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d", size = 27863, upload-time = "2025-10-02T14:34:12.619Z" }, - { url = "https://files.pythonhosted.org/packages/17/d4/cc2f0400e9154df4b9964249da78ebd72f318e35ccc425e9f403c392f22a/xxhash-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a", size = 32844, upload-time = "2025-10-02T14:34:14.037Z" }, - { url = "https://files.pythonhosted.org/packages/5e/ec/1cc11cd13e26ea8bc3cb4af4eaadd8d46d5014aebb67be3f71fb0b68802a/xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa", size = 30809, upload-time = "2025-10-02T14:34:15.484Z" }, - { url = "https://files.pythonhosted.org/packages/04/5f/19fe357ea348d98ca22f456f75a30ac0916b51c753e1f8b2e0e6fb884cce/xxhash-3.6.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248", size = 194665, upload-time = "2025-10-02T14:34:16.541Z" }, - { url = "https://files.pythonhosted.org/packages/90/3b/d1f1a8f5442a5fd8beedae110c5af7604dc37349a8e16519c13c19a9a2de/xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62", size = 213550, upload-time = "2025-10-02T14:34:17.878Z" }, - { url = "https://files.pythonhosted.org/packages/c4/ef/3a9b05eb527457d5db13a135a2ae1a26c80fecd624d20f3e8dcc4cb170f3/xxhash-3.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f", size = 212384, upload-time = "2025-10-02T14:34:19.182Z" }, - { url = "https://files.pythonhosted.org/packages/0f/18/ccc194ee698c6c623acbf0f8c2969811a8a4b6185af5e824cd27b9e4fd3e/xxhash-3.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e", size = 445749, upload-time = "2025-10-02T14:34:20.659Z" }, - { url = "https://files.pythonhosted.org/packages/a5/86/cf2c0321dc3940a7aa73076f4fd677a0fb3e405cb297ead7d864fd90847e/xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8", size = 193880, upload-time = "2025-10-02T14:34:22.431Z" }, - { url = "https://files.pythonhosted.org/packages/82/fb/96213c8560e6f948a1ecc9a7613f8032b19ee45f747f4fca4eb31bb6d6ed/xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0", size = 210912, upload-time = "2025-10-02T14:34:23.937Z" }, - { url = "https://files.pythonhosted.org/packages/40/aa/4395e669b0606a096d6788f40dbdf2b819d6773aa290c19e6e83cbfc312f/xxhash-3.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77", size = 198654, upload-time = "2025-10-02T14:34:25.644Z" }, - { url = "https://files.pythonhosted.org/packages/67/74/b044fcd6b3d89e9b1b665924d85d3f400636c23590226feb1eb09e1176ce/xxhash-3.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c", size = 210867, upload-time = "2025-10-02T14:34:27.203Z" }, - { url = "https://files.pythonhosted.org/packages/bc/fd/3ce73bf753b08cb19daee1eb14aa0d7fe331f8da9c02dd95316ddfe5275e/xxhash-3.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b", size = 414012, upload-time = "2025-10-02T14:34:28.409Z" }, - { url = "https://files.pythonhosted.org/packages/ba/b3/5a4241309217c5c876f156b10778f3ab3af7ba7e3259e6d5f5c7d0129eb2/xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3", size = 191409, upload-time = "2025-10-02T14:34:29.696Z" }, - { url = "https://files.pythonhosted.org/packages/c0/01/99bfbc15fb9abb9a72b088c1d95219fc4782b7d01fc835bd5744d66dd0b8/xxhash-3.6.0-cp311-cp311-win32.whl", hash = "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd", size = 30574, upload-time = "2025-10-02T14:34:31.028Z" }, - { url = "https://files.pythonhosted.org/packages/65/79/9d24d7f53819fe301b231044ea362ce64e86c74f6e8c8e51320de248b3e5/xxhash-3.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef", size = 31481, upload-time = "2025-10-02T14:34:32.062Z" }, - { url = "https://files.pythonhosted.org/packages/30/4e/15cd0e3e8772071344eab2961ce83f6e485111fed8beb491a3f1ce100270/xxhash-3.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7", size = 27861, upload-time = "2025-10-02T14:34:33.555Z" }, - { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744, upload-time = "2025-10-02T14:34:34.622Z" }, - { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816, upload-time = "2025-10-02T14:34:36.043Z" }, - { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035, upload-time = "2025-10-02T14:34:37.354Z" }, - { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914, upload-time = "2025-10-02T14:34:38.6Z" }, - { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163, upload-time = "2025-10-02T14:34:39.872Z" }, - { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411, upload-time = "2025-10-02T14:34:41.569Z" }, - { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883, upload-time = "2025-10-02T14:34:43.249Z" }, - { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392, upload-time = "2025-10-02T14:34:45.042Z" }, - { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898, upload-time = "2025-10-02T14:34:46.302Z" }, - { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655, upload-time = "2025-10-02T14:34:47.571Z" }, - { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001, upload-time = "2025-10-02T14:34:49.273Z" }, - { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431, upload-time = "2025-10-02T14:34:50.798Z" }, - { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617, upload-time = "2025-10-02T14:34:51.954Z" }, - { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534, upload-time = "2025-10-02T14:34:53.276Z" }, - { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876, upload-time = "2025-10-02T14:34:54.371Z" }, - { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738, upload-time = "2025-10-02T14:34:55.839Z" }, - { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821, upload-time = "2025-10-02T14:34:57.219Z" }, - { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127, upload-time = "2025-10-02T14:34:59.21Z" }, - { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975, upload-time = "2025-10-02T14:35:00.816Z" }, - { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241, upload-time = "2025-10-02T14:35:02.207Z" }, - { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471, upload-time = "2025-10-02T14:35:03.61Z" }, - { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936, upload-time = "2025-10-02T14:35:05.013Z" }, - { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440, upload-time = "2025-10-02T14:35:06.239Z" }, - { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990, upload-time = "2025-10-02T14:35:07.735Z" }, - { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689, upload-time = "2025-10-02T14:35:09.438Z" }, - { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068, upload-time = "2025-10-02T14:35:11.162Z" }, - { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495, upload-time = "2025-10-02T14:35:12.971Z" }, - { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620, upload-time = "2025-10-02T14:35:14.129Z" }, - { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542, upload-time = "2025-10-02T14:35:15.21Z" }, - { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880, upload-time = "2025-10-02T14:35:16.315Z" }, - { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956, upload-time = "2025-10-02T14:35:17.413Z" }, - { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072, upload-time = "2025-10-02T14:35:18.844Z" }, - { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409, upload-time = "2025-10-02T14:35:20.31Z" }, - { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736, upload-time = "2025-10-02T14:35:21.616Z" }, - { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833, upload-time = "2025-10-02T14:35:23.32Z" }, - { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348, upload-time = "2025-10-02T14:35:25.111Z" }, - { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070, upload-time = "2025-10-02T14:35:26.586Z" }, - { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907, upload-time = "2025-10-02T14:35:28.087Z" }, - { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839, upload-time = "2025-10-02T14:35:29.857Z" }, - { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304, upload-time = "2025-10-02T14:35:31.222Z" }, - { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930, upload-time = "2025-10-02T14:35:32.517Z" }, - { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787, upload-time = "2025-10-02T14:35:33.827Z" }, - { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916, upload-time = "2025-10-02T14:35:35.107Z" }, - { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799, upload-time = "2025-10-02T14:35:36.165Z" }, - { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044, upload-time = "2025-10-02T14:35:37.195Z" }, - { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754, upload-time = "2025-10-02T14:35:38.245Z" }, - { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846, upload-time = "2025-10-02T14:35:39.6Z" }, - { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343, upload-time = "2025-10-02T14:35:40.69Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074, upload-time = "2025-10-02T14:35:42.29Z" }, - { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388, upload-time = "2025-10-02T14:35:43.929Z" }, - { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614, upload-time = "2025-10-02T14:35:45.216Z" }, - { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024, upload-time = "2025-10-02T14:35:46.959Z" }, - { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541, upload-time = "2025-10-02T14:35:48.301Z" }, - { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305, upload-time = "2025-10-02T14:35:49.584Z" }, - { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848, upload-time = "2025-10-02T14:35:50.877Z" }, - { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142, upload-time = "2025-10-02T14:35:52.15Z" }, - { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547, upload-time = "2025-10-02T14:35:53.547Z" }, - { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214, upload-time = "2025-10-02T14:35:54.746Z" }, - { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290, upload-time = "2025-10-02T14:35:55.791Z" }, - { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795, upload-time = "2025-10-02T14:35:57.162Z" }, - { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955, upload-time = "2025-10-02T14:35:58.267Z" }, - { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072, upload-time = "2025-10-02T14:35:59.382Z" }, - { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579, upload-time = "2025-10-02T14:36:00.838Z" }, - { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854, upload-time = "2025-10-02T14:36:02.207Z" }, - { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965, upload-time = "2025-10-02T14:36:03.507Z" }, - { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484, upload-time = "2025-10-02T14:36:04.828Z" }, - { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162, upload-time = "2025-10-02T14:36:06.182Z" }, - { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007, upload-time = "2025-10-02T14:36:07.733Z" }, - { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956, upload-time = "2025-10-02T14:36:09.106Z" }, - { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401, upload-time = "2025-10-02T14:36:10.585Z" }, - { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083, upload-time = "2025-10-02T14:36:12.276Z" }, - { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913, upload-time = "2025-10-02T14:36:14.025Z" }, - { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586, upload-time = "2025-10-02T14:36:15.603Z" }, - { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526, upload-time = "2025-10-02T14:36:16.708Z" }, - { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898, upload-time = "2025-10-02T14:36:17.843Z" }, - { url = "https://files.pythonhosted.org/packages/93/1e/8aec23647a34a249f62e2398c42955acd9b4c6ed5cf08cbea94dc46f78d2/xxhash-3.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0", size = 30662, upload-time = "2025-10-02T14:37:01.743Z" }, - { url = "https://files.pythonhosted.org/packages/b8/0b/b14510b38ba91caf43006209db846a696ceea6a847a0c9ba0a5b1adc53d6/xxhash-3.6.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296", size = 41056, upload-time = "2025-10-02T14:37:02.879Z" }, - { url = "https://files.pythonhosted.org/packages/50/55/15a7b8a56590e66ccd374bbfa3f9ffc45b810886c8c3b614e3f90bd2367c/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13", size = 36251, upload-time = "2025-10-02T14:37:04.44Z" }, - { url = "https://files.pythonhosted.org/packages/62/b2/5ac99a041a29e58e95f907876b04f7067a0242cb85b5f39e726153981503/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd", size = 32481, upload-time = "2025-10-02T14:37:05.869Z" }, - { url = "https://files.pythonhosted.org/packages/7b/d9/8d95e906764a386a3d3b596f3c68bb63687dfca806373509f51ce8eea81f/xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d", size = 31565, upload-time = "2025-10-02T14:37:06.966Z" }, +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } +sdist = { url = "https://files.pythonhosted.org/packages/02/84/30869e01909fb37a6cc7e18688ee8bf1e42d57e7e0777636bd47524c43c7/xxhash-3.6.0.tar.gz", hash = "sha256:f0162a78b13a0d7617b2845b90c763339d1f1d82bb04a4b07f4ab535cc5e05d6", size = 85160 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/ee/f9f1d656ad168681bb0f6b092372c1e533c4416b8069b1896a175c46e484/xxhash-3.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:87ff03d7e35c61435976554477a7f4cd1704c3596a89a8300d5ce7fc83874a71", size = 32845 }, + { url = "https://files.pythonhosted.org/packages/a3/b1/93508d9460b292c74a09b83d16750c52a0ead89c51eea9951cb97a60d959/xxhash-3.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f572dfd3d0e2eb1a57511831cf6341242f5a9f8298a45862d085f5b93394a27d", size = 30807 }, + { url = "https://files.pythonhosted.org/packages/07/55/28c93a3662f2d200c70704efe74aab9640e824f8ce330d8d3943bf7c9b3c/xxhash-3.6.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:89952ea539566b9fed2bbd94e589672794b4286f342254fad28b149f9615fef8", size = 193786 }, + { url = "https://files.pythonhosted.org/packages/c1/96/fec0be9bb4b8f5d9c57d76380a366f31a1781fb802f76fc7cda6c84893c7/xxhash-3.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:48e6f2ffb07a50b52465a1032c3cf1f4a5683f944acaca8a134a2f23674c2058", size = 212830 }, + { url = "https://files.pythonhosted.org/packages/c4/a0/c706845ba77b9611f81fd2e93fad9859346b026e8445e76f8c6fd057cc6d/xxhash-3.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b5b848ad6c16d308c3ac7ad4ba6bede80ed5df2ba8ed382f8932df63158dd4b2", size = 211606 }, + { url = "https://files.pythonhosted.org/packages/67/1e/164126a2999e5045f04a69257eea946c0dc3e86541b400d4385d646b53d7/xxhash-3.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a034590a727b44dd8ac5914236a7b8504144447a9682586c3327e935f33ec8cc", size = 444872 }, + { url = "https://files.pythonhosted.org/packages/2d/4b/55ab404c56cd70a2cf5ecfe484838865d0fea5627365c6c8ca156bd09c8f/xxhash-3.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a8f1972e75ebdd161d7896743122834fe87378160c20e97f8b09166213bf8cc", size = 193217 }, + { url = "https://files.pythonhosted.org/packages/45/e6/52abf06bac316db33aa269091ae7311bd53cfc6f4b120ae77bac1b348091/xxhash-3.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ee34327b187f002a596d7b167ebc59a1b729e963ce645964bbc050d2f1b73d07", size = 210139 }, + { url = "https://files.pythonhosted.org/packages/34/37/db94d490b8691236d356bc249c08819cbcef9273a1a30acf1254ff9ce157/xxhash-3.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:339f518c3c7a850dd033ab416ea25a692759dc7478a71131fe8869010d2b75e4", size = 197669 }, + { url = "https://files.pythonhosted.org/packages/b7/36/c4f219ef4a17a4f7a64ed3569bc2b5a9c8311abdb22249ac96093625b1a4/xxhash-3.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:bf48889c9630542d4709192578aebbd836177c9f7a4a2778a7d6340107c65f06", size = 210018 }, + { url = "https://files.pythonhosted.org/packages/fd/06/bfac889a374fc2fc439a69223d1750eed2e18a7db8514737ab630534fa08/xxhash-3.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:5576b002a56207f640636056b4160a378fe36a58db73ae5c27a7ec8db35f71d4", size = 413058 }, + { url = "https://files.pythonhosted.org/packages/c9/d1/555d8447e0dd32ad0930a249a522bb2e289f0d08b6b16204cfa42c1f5a0c/xxhash-3.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:af1f3278bd02814d6dedc5dec397993b549d6f16c19379721e5a1d31e132c49b", size = 190628 }, + { url = "https://files.pythonhosted.org/packages/d1/15/8751330b5186cedc4ed4b597989882ea05e0408b53fa47bcb46a6125bfc6/xxhash-3.6.0-cp310-cp310-win32.whl", hash = "sha256:aed058764db109dc9052720da65fafe84873b05eb8b07e5e653597951af57c3b", size = 30577 }, + { url = "https://files.pythonhosted.org/packages/bb/cc/53f87e8b5871a6eb2ff7e89c48c66093bda2be52315a8161ddc54ea550c4/xxhash-3.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:e82da5670f2d0d98950317f82a0e4a0197150ff19a6df2ba40399c2a3b9ae5fb", size = 31487 }, + { url = "https://files.pythonhosted.org/packages/9f/00/60f9ea3bb697667a14314d7269956f58bf56bb73864f8f8d52a3c2535e9a/xxhash-3.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:4a082ffff8c6ac07707fb6b671caf7c6e020c75226c561830b73d862060f281d", size = 27863 }, + { url = "https://files.pythonhosted.org/packages/17/d4/cc2f0400e9154df4b9964249da78ebd72f318e35ccc425e9f403c392f22a/xxhash-3.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b47bbd8cf2d72797f3c2772eaaac0ded3d3af26481a26d7d7d41dc2d3c46b04a", size = 32844 }, + { url = "https://files.pythonhosted.org/packages/5e/ec/1cc11cd13e26ea8bc3cb4af4eaadd8d46d5014aebb67be3f71fb0b68802a/xxhash-3.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2b6821e94346f96db75abaa6e255706fb06ebd530899ed76d32cd99f20dc52fa", size = 30809 }, + { url = "https://files.pythonhosted.org/packages/04/5f/19fe357ea348d98ca22f456f75a30ac0916b51c753e1f8b2e0e6fb884cce/xxhash-3.6.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d0a9751f71a1a65ce3584e9cae4467651c7e70c9d31017fa57574583a4540248", size = 194665 }, + { url = "https://files.pythonhosted.org/packages/90/3b/d1f1a8f5442a5fd8beedae110c5af7604dc37349a8e16519c13c19a9a2de/xxhash-3.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b29ee68625ab37b04c0b40c3fafdf24d2f75ccd778333cfb698f65f6c463f62", size = 213550 }, + { url = "https://files.pythonhosted.org/packages/c4/ef/3a9b05eb527457d5db13a135a2ae1a26c80fecd624d20f3e8dcc4cb170f3/xxhash-3.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6812c25fe0d6c36a46ccb002f40f27ac903bf18af9f6dd8f9669cb4d176ab18f", size = 212384 }, + { url = "https://files.pythonhosted.org/packages/0f/18/ccc194ee698c6c623acbf0f8c2969811a8a4b6185af5e824cd27b9e4fd3e/xxhash-3.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4ccbff013972390b51a18ef1255ef5ac125c92dc9143b2d1909f59abc765540e", size = 445749 }, + { url = "https://files.pythonhosted.org/packages/a5/86/cf2c0321dc3940a7aa73076f4fd677a0fb3e405cb297ead7d864fd90847e/xxhash-3.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:297b7fbf86c82c550e12e8fb71968b3f033d27b874276ba3624ea868c11165a8", size = 193880 }, + { url = "https://files.pythonhosted.org/packages/82/fb/96213c8560e6f948a1ecc9a7613f8032b19ee45f747f4fca4eb31bb6d6ed/xxhash-3.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dea26ae1eb293db089798d3973a5fc928a18fdd97cc8801226fae705b02b14b0", size = 210912 }, + { url = "https://files.pythonhosted.org/packages/40/aa/4395e669b0606a096d6788f40dbdf2b819d6773aa290c19e6e83cbfc312f/xxhash-3.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7a0b169aafb98f4284f73635a8e93f0735f9cbde17bd5ec332480484241aaa77", size = 198654 }, + { url = "https://files.pythonhosted.org/packages/67/74/b044fcd6b3d89e9b1b665924d85d3f400636c23590226feb1eb09e1176ce/xxhash-3.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:08d45aef063a4531b785cd72de4887766d01dc8f362a515693df349fdb825e0c", size = 210867 }, + { url = "https://files.pythonhosted.org/packages/bc/fd/3ce73bf753b08cb19daee1eb14aa0d7fe331f8da9c02dd95316ddfe5275e/xxhash-3.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:929142361a48ee07f09121fe9e96a84950e8d4df3bb298ca5d88061969f34d7b", size = 414012 }, + { url = "https://files.pythonhosted.org/packages/ba/b3/5a4241309217c5c876f156b10778f3ab3af7ba7e3259e6d5f5c7d0129eb2/xxhash-3.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:51312c768403d8540487dbbfb557454cfc55589bbde6424456951f7fcd4facb3", size = 191409 }, + { url = "https://files.pythonhosted.org/packages/c0/01/99bfbc15fb9abb9a72b088c1d95219fc4782b7d01fc835bd5744d66dd0b8/xxhash-3.6.0-cp311-cp311-win32.whl", hash = "sha256:d1927a69feddc24c987b337ce81ac15c4720955b667fe9b588e02254b80446fd", size = 30574 }, + { url = "https://files.pythonhosted.org/packages/65/79/9d24d7f53819fe301b231044ea362ce64e86c74f6e8c8e51320de248b3e5/xxhash-3.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:26734cdc2d4ffe449b41d186bbeac416f704a482ed835d375a5c0cb02bc63fef", size = 31481 }, + { url = "https://files.pythonhosted.org/packages/30/4e/15cd0e3e8772071344eab2961ce83f6e485111fed8beb491a3f1ce100270/xxhash-3.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:d72f67ef8bf36e05f5b6c65e8524f265bd61071471cd4cf1d36743ebeeeb06b7", size = 27861 }, + { url = "https://files.pythonhosted.org/packages/9a/07/d9412f3d7d462347e4511181dea65e47e0d0e16e26fbee2ea86a2aefb657/xxhash-3.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:01362c4331775398e7bb34e3ab403bc9ee9f7c497bc7dee6272114055277dd3c", size = 32744 }, + { url = "https://files.pythonhosted.org/packages/79/35/0429ee11d035fc33abe32dca1b2b69e8c18d236547b9a9b72c1929189b9a/xxhash-3.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b7b2df81a23f8cb99656378e72501b2cb41b1827c0f5a86f87d6b06b69f9f204", size = 30816 }, + { url = "https://files.pythonhosted.org/packages/b7/f2/57eb99aa0f7d98624c0932c5b9a170e1806406cdbcdb510546634a1359e0/xxhash-3.6.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:dc94790144e66b14f67b10ac8ed75b39ca47536bf8800eb7c24b50271ea0c490", size = 194035 }, + { url = "https://files.pythonhosted.org/packages/4c/ed/6224ba353690d73af7a3f1c7cdb1fc1b002e38f783cb991ae338e1eb3d79/xxhash-3.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:93f107c673bccf0d592cdba077dedaf52fe7f42dcd7676eba1f6d6f0c3efffd2", size = 212914 }, + { url = "https://files.pythonhosted.org/packages/38/86/fb6b6130d8dd6b8942cc17ab4d90e223653a89aa32ad2776f8af7064ed13/xxhash-3.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aa5ee3444c25b69813663c9f8067dcfaa2e126dc55e8dddf40f4d1c25d7effa", size = 212163 }, + { url = "https://files.pythonhosted.org/packages/ee/dc/e84875682b0593e884ad73b2d40767b5790d417bde603cceb6878901d647/xxhash-3.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f7f99123f0e1194fa59cc69ad46dbae2e07becec5df50a0509a808f90a0f03f0", size = 445411 }, + { url = "https://files.pythonhosted.org/packages/11/4f/426f91b96701ec2f37bb2b8cec664eff4f658a11f3fa9d94f0a887ea6d2b/xxhash-3.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49e03e6fe2cac4a1bc64952dd250cf0dbc5ef4ebb7b8d96bce82e2de163c82a2", size = 193883 }, + { url = "https://files.pythonhosted.org/packages/53/5a/ddbb83eee8e28b778eacfc5a85c969673e4023cdeedcfcef61f36731610b/xxhash-3.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bd17fede52a17a4f9a7bc4472a5867cb0b160deeb431795c0e4abe158bc784e9", size = 210392 }, + { url = "https://files.pythonhosted.org/packages/1e/c2/ff69efd07c8c074ccdf0a4f36fcdd3d27363665bcdf4ba399abebe643465/xxhash-3.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:6fb5f5476bef678f69db04f2bd1efbed3030d2aba305b0fc1773645f187d6a4e", size = 197898 }, + { url = "https://files.pythonhosted.org/packages/58/ca/faa05ac19b3b622c7c9317ac3e23954187516298a091eb02c976d0d3dd45/xxhash-3.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:843b52f6d88071f87eba1631b684fcb4b2068cd2180a0224122fe4ef011a9374", size = 210655 }, + { url = "https://files.pythonhosted.org/packages/d4/7a/06aa7482345480cc0cb597f5c875b11a82c3953f534394f620b0be2f700c/xxhash-3.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:7d14a6cfaf03b1b6f5f9790f76880601ccc7896aff7ab9cd8978a939c1eb7e0d", size = 414001 }, + { url = "https://files.pythonhosted.org/packages/23/07/63ffb386cd47029aa2916b3d2f454e6cc5b9f5c5ada3790377d5430084e7/xxhash-3.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:418daf3db71e1413cfe211c2f9a528456936645c17f46b5204705581a45390ae", size = 191431 }, + { url = "https://files.pythonhosted.org/packages/0f/93/14fde614cadb4ddf5e7cebf8918b7e8fac5ae7861c1875964f17e678205c/xxhash-3.6.0-cp312-cp312-win32.whl", hash = "sha256:50fc255f39428a27299c20e280d6193d8b63b8ef8028995323bf834a026b4fbb", size = 30617 }, + { url = "https://files.pythonhosted.org/packages/13/5d/0d125536cbe7565a83d06e43783389ecae0c0f2ed037b48ede185de477c0/xxhash-3.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:c0f2ab8c715630565ab8991b536ecded9416d615538be8ecddce43ccf26cbc7c", size = 31534 }, + { url = "https://files.pythonhosted.org/packages/54/85/6ec269b0952ec7e36ba019125982cf11d91256a778c7c3f98a4c5043d283/xxhash-3.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:eae5c13f3bc455a3bbb68bdc513912dc7356de7e2280363ea235f71f54064829", size = 27876 }, + { url = "https://files.pythonhosted.org/packages/33/76/35d05267ac82f53ae9b0e554da7c5e281ee61f3cad44c743f0fcd354f211/xxhash-3.6.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:599e64ba7f67472481ceb6ee80fa3bd828fd61ba59fb11475572cc5ee52b89ec", size = 32738 }, + { url = "https://files.pythonhosted.org/packages/31/a8/3fbce1cd96534a95e35d5120637bf29b0d7f5d8fa2f6374e31b4156dd419/xxhash-3.6.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7d8b8aaa30fca4f16f0c84a5c8d7ddee0e25250ec2796c973775373257dde8f1", size = 30821 }, + { url = "https://files.pythonhosted.org/packages/0c/ea/d387530ca7ecfa183cb358027f1833297c6ac6098223fd14f9782cd0015c/xxhash-3.6.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d597acf8506d6e7101a4a44a5e428977a51c0fadbbfd3c39650cca9253f6e5a6", size = 194127 }, + { url = "https://files.pythonhosted.org/packages/ba/0c/71435dcb99874b09a43b8d7c54071e600a7481e42b3e3ce1eb5226a5711a/xxhash-3.6.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:858dc935963a33bc33490128edc1c12b0c14d9c7ebaa4e387a7869ecc4f3e263", size = 212975 }, + { url = "https://files.pythonhosted.org/packages/84/7a/c2b3d071e4bb4a90b7057228a99b10d51744878f4a8a6dd643c8bd897620/xxhash-3.6.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba284920194615cb8edf73bf52236ce2e1664ccd4a38fdb543506413529cc546", size = 212241 }, + { url = "https://files.pythonhosted.org/packages/81/5f/640b6eac0128e215f177df99eadcd0f1b7c42c274ab6a394a05059694c5a/xxhash-3.6.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4b54219177f6c6674d5378bd862c6aedf64725f70dd29c472eaae154df1a2e89", size = 445471 }, + { url = "https://files.pythonhosted.org/packages/5e/1e/3c3d3ef071b051cc3abbe3721ffb8365033a172613c04af2da89d5548a87/xxhash-3.6.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:42c36dd7dbad2f5238950c377fcbf6811b1cdb1c444fab447960030cea60504d", size = 193936 }, + { url = "https://files.pythonhosted.org/packages/2c/bd/4a5f68381939219abfe1c22a9e3a5854a4f6f6f3c4983a87d255f21f2e5d/xxhash-3.6.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f22927652cba98c44639ffdc7aaf35828dccf679b10b31c4ad72a5b530a18eb7", size = 210440 }, + { url = "https://files.pythonhosted.org/packages/eb/37/b80fe3d5cfb9faff01a02121a0f4d565eb7237e9e5fc66e73017e74dcd36/xxhash-3.6.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b45fad44d9c5c119e9c6fbf2e1c656a46dc68e280275007bbfd3d572b21426db", size = 197990 }, + { url = "https://files.pythonhosted.org/packages/d7/fd/2c0a00c97b9e18f72e1f240ad4e8f8a90fd9d408289ba9c7c495ed7dc05c/xxhash-3.6.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:6f2580ffab1a8b68ef2b901cde7e55fa8da5e4be0977c68f78fc80f3c143de42", size = 210689 }, + { url = "https://files.pythonhosted.org/packages/93/86/5dd8076a926b9a95db3206aba20d89a7fc14dd5aac16e5c4de4b56033140/xxhash-3.6.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:40c391dd3cd041ebc3ffe6f2c862f402e306eb571422e0aa918d8070ba31da11", size = 414068 }, + { url = "https://files.pythonhosted.org/packages/af/3c/0bb129170ee8f3650f08e993baee550a09593462a5cddd8e44d0011102b1/xxhash-3.6.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f205badabde7aafd1a31e8ca2a3e5a763107a71c397c4481d6a804eb5063d8bd", size = 191495 }, + { url = "https://files.pythonhosted.org/packages/e9/3a/6797e0114c21d1725e2577508e24006fd7ff1d8c0c502d3b52e45c1771d8/xxhash-3.6.0-cp313-cp313-win32.whl", hash = "sha256:2577b276e060b73b73a53042ea5bd5203d3e6347ce0d09f98500f418a9fcf799", size = 30620 }, + { url = "https://files.pythonhosted.org/packages/86/15/9bc32671e9a38b413a76d24722a2bf8784a132c043063a8f5152d390b0f9/xxhash-3.6.0-cp313-cp313-win_amd64.whl", hash = "sha256:757320d45d2fbcce8f30c42a6b2f47862967aea7bf458b9625b4bbe7ee390392", size = 31542 }, + { url = "https://files.pythonhosted.org/packages/39/c5/cc01e4f6188656e56112d6a8e0dfe298a16934b8c47a247236549a3f7695/xxhash-3.6.0-cp313-cp313-win_arm64.whl", hash = "sha256:457b8f85dec5825eed7b69c11ae86834a018b8e3df5e77783c999663da2f96d6", size = 27880 }, + { url = "https://files.pythonhosted.org/packages/f3/30/25e5321c8732759e930c555176d37e24ab84365482d257c3b16362235212/xxhash-3.6.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a42e633d75cdad6d625434e3468126c73f13f7584545a9cf34e883aa1710e702", size = 32956 }, + { url = "https://files.pythonhosted.org/packages/9f/3c/0573299560d7d9f8ab1838f1efc021a280b5ae5ae2e849034ef3dee18810/xxhash-3.6.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:568a6d743219e717b07b4e03b0a828ce593833e498c3b64752e0f5df6bfe84db", size = 31072 }, + { url = "https://files.pythonhosted.org/packages/7a/1c/52d83a06e417cd9d4137722693424885cc9878249beb3a7c829e74bf7ce9/xxhash-3.6.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:bec91b562d8012dae276af8025a55811b875baace6af510412a5e58e3121bc54", size = 196409 }, + { url = "https://files.pythonhosted.org/packages/e3/8e/c6d158d12a79bbd0b878f8355432075fc82759e356ab5a111463422a239b/xxhash-3.6.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78e7f2f4c521c30ad5e786fdd6bae89d47a32672a80195467b5de0480aa97b1f", size = 215736 }, + { url = "https://files.pythonhosted.org/packages/bc/68/c4c80614716345d55071a396cf03d06e34b5f4917a467faf43083c995155/xxhash-3.6.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3ed0df1b11a79856df5ffcab572cbd6b9627034c1c748c5566fa79df9048a7c5", size = 214833 }, + { url = "https://files.pythonhosted.org/packages/7e/e9/ae27c8ffec8b953efa84c7c4a6c6802c263d587b9fc0d6e7cea64e08c3af/xxhash-3.6.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0e4edbfc7d420925b0dd5e792478ed393d6e75ff8fc219a6546fb446b6a417b1", size = 448348 }, + { url = "https://files.pythonhosted.org/packages/d7/6b/33e21afb1b5b3f46b74b6bd1913639066af218d704cc0941404ca717fc57/xxhash-3.6.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fba27a198363a7ef87f8c0f6b171ec36b674fe9053742c58dd7e3201c1ab30ee", size = 196070 }, + { url = "https://files.pythonhosted.org/packages/96/b6/fcabd337bc5fa624e7203aa0fa7d0c49eed22f72e93229431752bddc83d9/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:794fe9145fe60191c6532fa95063765529770edcdd67b3d537793e8004cabbfd", size = 212907 }, + { url = "https://files.pythonhosted.org/packages/4b/d3/9ee6160e644d660fcf176c5825e61411c7f62648728f69c79ba237250143/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:6105ef7e62b5ac73a837778efc331a591d8442f8ef5c7e102376506cb4ae2729", size = 200839 }, + { url = "https://files.pythonhosted.org/packages/0d/98/e8de5baa5109394baf5118f5e72ab21a86387c4f89b0e77ef3e2f6b0327b/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:f01375c0e55395b814a679b3eea205db7919ac2af213f4a6682e01220e5fe292", size = 213304 }, + { url = "https://files.pythonhosted.org/packages/7b/1d/71056535dec5c3177eeb53e38e3d367dd1d16e024e63b1cee208d572a033/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:d706dca2d24d834a4661619dcacf51a75c16d65985718d6a7d73c1eeeb903ddf", size = 416930 }, + { url = "https://files.pythonhosted.org/packages/dc/6c/5cbde9de2cd967c322e651c65c543700b19e7ae3e0aae8ece3469bf9683d/xxhash-3.6.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:5f059d9faeacd49c0215d66f4056e1326c80503f51a1532ca336a385edadd033", size = 193787 }, + { url = "https://files.pythonhosted.org/packages/19/fa/0172e350361d61febcea941b0cc541d6e6c8d65d153e85f850a7b256ff8a/xxhash-3.6.0-cp313-cp313t-win32.whl", hash = "sha256:1244460adc3a9be84731d72b8e80625788e5815b68da3da8b83f78115a40a7ec", size = 30916 }, + { url = "https://files.pythonhosted.org/packages/ad/e6/e8cf858a2b19d6d45820f072eff1bea413910592ff17157cabc5f1227a16/xxhash-3.6.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b1e420ef35c503869c4064f4a2f2b08ad6431ab7b229a05cce39d74268bca6b8", size = 31799 }, + { url = "https://files.pythonhosted.org/packages/56/15/064b197e855bfb7b343210e82490ae672f8bc7cdf3ddb02e92f64304ee8a/xxhash-3.6.0-cp313-cp313t-win_arm64.whl", hash = "sha256:ec44b73a4220623235f67a996c862049f375df3b1052d9899f40a6382c32d746", size = 28044 }, + { url = "https://files.pythonhosted.org/packages/7e/5e/0138bc4484ea9b897864d59fce9be9086030825bc778b76cb5a33a906d37/xxhash-3.6.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:a40a3d35b204b7cc7643cbcf8c9976d818cb47befcfac8bbefec8038ac363f3e", size = 32754 }, + { url = "https://files.pythonhosted.org/packages/18/d7/5dac2eb2ec75fd771957a13e5dda560efb2176d5203f39502a5fc571f899/xxhash-3.6.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a54844be970d3fc22630b32d515e79a90d0a3ddb2644d8d7402e3c4c8da61405", size = 30846 }, + { url = "https://files.pythonhosted.org/packages/fe/71/8bc5be2bb00deb5682e92e8da955ebe5fa982da13a69da5a40a4c8db12fb/xxhash-3.6.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:016e9190af8f0a4e3741343777710e3d5717427f175adfdc3e72508f59e2a7f3", size = 194343 }, + { url = "https://files.pythonhosted.org/packages/e7/3b/52badfb2aecec2c377ddf1ae75f55db3ba2d321c5e164f14461c90837ef3/xxhash-3.6.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f6f72232f849eb9d0141e2ebe2677ece15adfd0fa599bc058aad83c714bb2c6", size = 213074 }, + { url = "https://files.pythonhosted.org/packages/a2/2b/ae46b4e9b92e537fa30d03dbc19cdae57ed407e9c26d163895e968e3de85/xxhash-3.6.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:63275a8aba7865e44b1813d2177e0f5ea7eadad3dd063a21f7cf9afdc7054063", size = 212388 }, + { url = "https://files.pythonhosted.org/packages/f5/80/49f88d3afc724b4ac7fbd664c8452d6db51b49915be48c6982659e0e7942/xxhash-3.6.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cd01fa2aa00d8b017c97eb46b9a794fbdca53fc14f845f5a328c71254b0abb7", size = 445614 }, + { url = "https://files.pythonhosted.org/packages/ed/ba/603ce3961e339413543d8cd44f21f2c80e2a7c5cfe692a7b1f2cccf58f3c/xxhash-3.6.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0226aa89035b62b6a86d3c68df4d7c1f47a342b8683da2b60cedcddb46c4d95b", size = 194024 }, + { url = "https://files.pythonhosted.org/packages/78/d1/8e225ff7113bf81545cfdcd79eef124a7b7064a0bba53605ff39590b95c2/xxhash-3.6.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c6e193e9f56e4ca4923c61238cdaced324f0feac782544eb4c6d55ad5cc99ddd", size = 210541 }, + { url = "https://files.pythonhosted.org/packages/6f/58/0f89d149f0bad89def1a8dd38feb50ccdeb643d9797ec84707091d4cb494/xxhash-3.6.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:9176dcaddf4ca963d4deb93866d739a343c01c969231dbe21680e13a5d1a5bf0", size = 198305 }, + { url = "https://files.pythonhosted.org/packages/11/38/5eab81580703c4df93feb5f32ff8fa7fe1e2c51c1f183ee4e48d4bb9d3d7/xxhash-3.6.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:c1ce4009c97a752e682b897aa99aef84191077a9433eb237774689f14f8ec152", size = 210848 }, + { url = "https://files.pythonhosted.org/packages/5e/6b/953dc4b05c3ce678abca756416e4c130d2382f877a9c30a20d08ee6a77c0/xxhash-3.6.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:8cb2f4f679b01513b7adbb9b1b2f0f9cdc31b70007eaf9d59d0878809f385b11", size = 414142 }, + { url = "https://files.pythonhosted.org/packages/08/a9/238ec0d4e81a10eb5026d4a6972677cbc898ba6c8b9dbaec12ae001b1b35/xxhash-3.6.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:653a91d7c2ab54a92c19ccf43508b6a555440b9be1bc8be553376778be7f20b5", size = 191547 }, + { url = "https://files.pythonhosted.org/packages/f1/ee/3cf8589e06c2164ac77c3bf0aa127012801128f1feebf2a079272da5737c/xxhash-3.6.0-cp314-cp314-win32.whl", hash = "sha256:a756fe893389483ee8c394d06b5ab765d96e68fbbfe6fde7aa17e11f5720559f", size = 31214 }, + { url = "https://files.pythonhosted.org/packages/02/5d/a19552fbc6ad4cb54ff953c3908bbc095f4a921bc569433d791f755186f1/xxhash-3.6.0-cp314-cp314-win_amd64.whl", hash = "sha256:39be8e4e142550ef69629c9cd71b88c90e9a5db703fecbcf265546d9536ca4ad", size = 32290 }, + { url = "https://files.pythonhosted.org/packages/b1/11/dafa0643bc30442c887b55baf8e73353a344ee89c1901b5a5c54a6c17d39/xxhash-3.6.0-cp314-cp314-win_arm64.whl", hash = "sha256:25915e6000338999236f1eb68a02a32c3275ac338628a7eaa5a269c401995679", size = 28795 }, + { url = "https://files.pythonhosted.org/packages/2c/db/0e99732ed7f64182aef4a6fb145e1a295558deec2a746265dcdec12d191e/xxhash-3.6.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:c5294f596a9017ca5a3e3f8884c00b91ab2ad2933cf288f4923c3fd4346cf3d4", size = 32955 }, + { url = "https://files.pythonhosted.org/packages/55/f4/2a7c3c68e564a099becfa44bb3d398810cc0ff6749b0d3cb8ccb93f23c14/xxhash-3.6.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1cf9dcc4ab9cff01dfbba78544297a3a01dafd60f3bde4e2bfd016cf7e4ddc67", size = 31072 }, + { url = "https://files.pythonhosted.org/packages/c6/d9/72a29cddc7250e8a5819dad5d466facb5dc4c802ce120645630149127e73/xxhash-3.6.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:01262da8798422d0685f7cef03b2bd3f4f46511b02830861df548d7def4402ad", size = 196579 }, + { url = "https://files.pythonhosted.org/packages/63/93/b21590e1e381040e2ca305a884d89e1c345b347404f7780f07f2cdd47ef4/xxhash-3.6.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51a73fb7cb3a3ead9f7a8b583ffd9b8038e277cdb8cb87cf890e88b3456afa0b", size = 215854 }, + { url = "https://files.pythonhosted.org/packages/ce/b8/edab8a7d4fa14e924b29be877d54155dcbd8b80be85ea00d2be3413a9ed4/xxhash-3.6.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b9c6df83594f7df8f7f708ce5ebeacfc69f72c9fbaaababf6cf4758eaada0c9b", size = 214965 }, + { url = "https://files.pythonhosted.org/packages/27/67/dfa980ac7f0d509d54ea0d5a486d2bb4b80c3f1bb22b66e6a05d3efaf6c0/xxhash-3.6.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:627f0af069b0ea56f312fd5189001c24578868643203bca1abbc2c52d3a6f3ca", size = 448484 }, + { url = "https://files.pythonhosted.org/packages/8c/63/8ffc2cc97e811c0ca5d00ab36604b3ea6f4254f20b7bc658ca825ce6c954/xxhash-3.6.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aa912c62f842dfd013c5f21a642c9c10cd9f4c4e943e0af83618b4a404d9091a", size = 196162 }, + { url = "https://files.pythonhosted.org/packages/4b/77/07f0e7a3edd11a6097e990f6e5b815b6592459cb16dae990d967693e6ea9/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:b465afd7909db30168ab62afe40b2fcf79eedc0b89a6c0ab3123515dc0df8b99", size = 213007 }, + { url = "https://files.pythonhosted.org/packages/ae/d8/bc5fa0d152837117eb0bef6f83f956c509332ce133c91c63ce07ee7c4873/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:a881851cf38b0a70e7c4d3ce81fc7afd86fbc2a024f4cfb2a97cf49ce04b75d3", size = 200956 }, + { url = "https://files.pythonhosted.org/packages/26/a5/d749334130de9411783873e9b98ecc46688dad5db64ca6e04b02acc8b473/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9b3222c686a919a0f3253cfc12bb118b8b103506612253b5baeaac10d8027cf6", size = 213401 }, + { url = "https://files.pythonhosted.org/packages/89/72/abed959c956a4bfc72b58c0384bb7940663c678127538634d896b1195c10/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:c5aa639bc113e9286137cec8fadc20e9cd732b2cc385c0b7fa673b84fc1f2a93", size = 417083 }, + { url = "https://files.pythonhosted.org/packages/0c/b3/62fd2b586283b7d7d665fb98e266decadf31f058f1cf6c478741f68af0cb/xxhash-3.6.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5c1343d49ac102799905e115aee590183c3921d475356cb24b4de29a4bc56518", size = 193913 }, + { url = "https://files.pythonhosted.org/packages/9a/9a/c19c42c5b3f5a4aad748a6d5b4f23df3bed7ee5445accc65a0fb3ff03953/xxhash-3.6.0-cp314-cp314t-win32.whl", hash = "sha256:5851f033c3030dd95c086b4a36a2683c2ff4a799b23af60977188b057e467119", size = 31586 }, + { url = "https://files.pythonhosted.org/packages/03/d6/4cc450345be9924fd5dc8c590ceda1db5b43a0a889587b0ae81a95511360/xxhash-3.6.0-cp314-cp314t-win_amd64.whl", hash = "sha256:0444e7967dac37569052d2409b00a8860c2135cff05502df4da80267d384849f", size = 32526 }, + { url = "https://files.pythonhosted.org/packages/0f/c9/7243eb3f9eaabd1a88a5a5acadf06df2d83b100c62684b7425c6a11bcaa8/xxhash-3.6.0-cp314-cp314t-win_arm64.whl", hash = "sha256:bb79b1e63f6fd84ec778a4b1916dfe0a7c3fdb986c06addd5db3a0d413819d95", size = 28898 }, + { url = "https://files.pythonhosted.org/packages/93/1e/8aec23647a34a249f62e2398c42955acd9b4c6ed5cf08cbea94dc46f78d2/xxhash-3.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0f7b7e2ec26c1666ad5fc9dbfa426a6a3367ceaf79db5dd76264659d509d73b0", size = 30662 }, + { url = "https://files.pythonhosted.org/packages/b8/0b/b14510b38ba91caf43006209db846a696ceea6a847a0c9ba0a5b1adc53d6/xxhash-3.6.0-pp311-pypy311_pp73-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5dc1e14d14fa0f5789ec29a7062004b5933964bb9b02aae6622b8f530dc40296", size = 41056 }, + { url = "https://files.pythonhosted.org/packages/50/55/15a7b8a56590e66ccd374bbfa3f9ffc45b810886c8c3b614e3f90bd2367c/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:881b47fc47e051b37d94d13e7455131054b56749b91b508b0907eb07900d1c13", size = 36251 }, + { url = "https://files.pythonhosted.org/packages/62/b2/5ac99a041a29e58e95f907876b04f7067a0242cb85b5f39e726153981503/xxhash-3.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c6dc31591899f5e5666f04cc2e529e69b4072827085c1ef15294d91a004bc1bd", size = 32481 }, + { url = "https://files.pythonhosted.org/packages/7b/d9/8d95e906764a386a3d3b596f3c68bb63687dfca806373509f51ce8eea81f/xxhash-3.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:15e0dac10eb9309508bfc41f7f9deaa7755c69e35af835db9cb10751adebc35d", size = 31565 }, ] [[package]] name = "yarl" version = "1.22.0" -source = { registry = "https://pypi.org/simple" } +source = { registry = "https://pkgs.shopify.io/basic/data/python/simple/" } dependencies = [ { name = "idna" }, { name = "multidict" }, { name = "propcache" }, ] -sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169, upload-time = "2025-10-06T14:12:55.963Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517, upload-time = "2025-10-06T14:08:42.494Z" }, - { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495, upload-time = "2025-10-06T14:08:46.2Z" }, - { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400, upload-time = "2025-10-06T14:08:47.855Z" }, - { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545, upload-time = "2025-10-06T14:08:49.683Z" }, - { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598, upload-time = "2025-10-06T14:08:51.215Z" }, - { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893, upload-time = "2025-10-06T14:08:53.144Z" }, - { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240, upload-time = "2025-10-06T14:08:55.036Z" }, - { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965, upload-time = "2025-10-06T14:08:56.722Z" }, - { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026, upload-time = "2025-10-06T14:08:58.563Z" }, - { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637, upload-time = "2025-10-06T14:09:00.506Z" }, - { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082, upload-time = "2025-10-06T14:09:01.936Z" }, - { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811, upload-time = "2025-10-06T14:09:03.445Z" }, - { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223, upload-time = "2025-10-06T14:09:05.401Z" }, - { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118, upload-time = "2025-10-06T14:09:11.148Z" }, - { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852, upload-time = "2025-10-06T14:09:12.958Z" }, - { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012, upload-time = "2025-10-06T14:09:14.664Z" }, - { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607, upload-time = "2025-10-06T14:09:16.298Z" }, - { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027, upload-time = "2025-10-06T14:09:17.786Z" }, - { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963, upload-time = "2025-10-06T14:09:19.662Z" }, - { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406, upload-time = "2025-10-06T14:09:21.402Z" }, - { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581, upload-time = "2025-10-06T14:09:22.98Z" }, - { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924, upload-time = "2025-10-06T14:09:24.655Z" }, - { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890, upload-time = "2025-10-06T14:09:26.617Z" }, - { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819, upload-time = "2025-10-06T14:09:28.544Z" }, - { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601, upload-time = "2025-10-06T14:09:30.568Z" }, - { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072, upload-time = "2025-10-06T14:09:32.528Z" }, - { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311, upload-time = "2025-10-06T14:09:34.634Z" }, - { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094, upload-time = "2025-10-06T14:09:36.268Z" }, - { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944, upload-time = "2025-10-06T14:09:37.872Z" }, - { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804, upload-time = "2025-10-06T14:09:39.359Z" }, - { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858, upload-time = "2025-10-06T14:09:41.068Z" }, - { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637, upload-time = "2025-10-06T14:09:42.712Z" }, - { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000, upload-time = "2025-10-06T14:09:44.631Z" }, - { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338, upload-time = "2025-10-06T14:09:46.372Z" }, - { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909, upload-time = "2025-10-06T14:09:48.648Z" }, - { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940, upload-time = "2025-10-06T14:09:50.089Z" }, - { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825, upload-time = "2025-10-06T14:09:52.142Z" }, - { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705, upload-time = "2025-10-06T14:09:54.128Z" }, - { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518, upload-time = "2025-10-06T14:09:55.762Z" }, - { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267, upload-time = "2025-10-06T14:09:57.958Z" }, - { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797, upload-time = "2025-10-06T14:09:59.527Z" }, - { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535, upload-time = "2025-10-06T14:10:01.139Z" }, - { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324, upload-time = "2025-10-06T14:10:02.756Z" }, - { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803, upload-time = "2025-10-06T14:10:04.552Z" }, - { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220, upload-time = "2025-10-06T14:10:06.489Z" }, - { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589, upload-time = "2025-10-06T14:10:09.254Z" }, - { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213, upload-time = "2025-10-06T14:10:11.369Z" }, - { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330, upload-time = "2025-10-06T14:10:13.112Z" }, - { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980, upload-time = "2025-10-06T14:10:14.601Z" }, - { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424, upload-time = "2025-10-06T14:10:16.115Z" }, - { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821, upload-time = "2025-10-06T14:10:17.993Z" }, - { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243, upload-time = "2025-10-06T14:10:19.44Z" }, - { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361, upload-time = "2025-10-06T14:10:21.124Z" }, - { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036, upload-time = "2025-10-06T14:10:22.902Z" }, - { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671, upload-time = "2025-10-06T14:10:24.523Z" }, - { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059, upload-time = "2025-10-06T14:10:26.406Z" }, - { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356, upload-time = "2025-10-06T14:10:28.461Z" }, - { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331, upload-time = "2025-10-06T14:10:30.541Z" }, - { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590, upload-time = "2025-10-06T14:10:33.352Z" }, - { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316, upload-time = "2025-10-06T14:10:35.034Z" }, - { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431, upload-time = "2025-10-06T14:10:37.76Z" }, - { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555, upload-time = "2025-10-06T14:10:39.649Z" }, - { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965, upload-time = "2025-10-06T14:10:41.313Z" }, - { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205, upload-time = "2025-10-06T14:10:43.167Z" }, - { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209, upload-time = "2025-10-06T14:10:44.643Z" }, - { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966, upload-time = "2025-10-06T14:10:46.554Z" }, - { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312, upload-time = "2025-10-06T14:10:48.007Z" }, - { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967, upload-time = "2025-10-06T14:10:49.997Z" }, - { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949, upload-time = "2025-10-06T14:10:52.004Z" }, - { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818, upload-time = "2025-10-06T14:10:54.078Z" }, - { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626, upload-time = "2025-10-06T14:10:55.767Z" }, - { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129, upload-time = "2025-10-06T14:10:57.985Z" }, - { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776, upload-time = "2025-10-06T14:10:59.633Z" }, - { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879, upload-time = "2025-10-06T14:11:01.454Z" }, - { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996, upload-time = "2025-10-06T14:11:03.452Z" }, - { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047, upload-time = "2025-10-06T14:11:05.115Z" }, - { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947, upload-time = "2025-10-06T14:11:08.137Z" }, - { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943, upload-time = "2025-10-06T14:11:10.284Z" }, - { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715, upload-time = "2025-10-06T14:11:11.739Z" }, - { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857, upload-time = "2025-10-06T14:11:13.586Z" }, - { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520, upload-time = "2025-10-06T14:11:15.465Z" }, - { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504, upload-time = "2025-10-06T14:11:17.106Z" }, - { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282, upload-time = "2025-10-06T14:11:19.064Z" }, - { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080, upload-time = "2025-10-06T14:11:20.996Z" }, - { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696, upload-time = "2025-10-06T14:11:22.847Z" }, - { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121, upload-time = "2025-10-06T14:11:24.889Z" }, - { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080, upload-time = "2025-10-06T14:11:27.307Z" }, - { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661, upload-time = "2025-10-06T14:11:29.387Z" }, - { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645, upload-time = "2025-10-06T14:11:31.423Z" }, - { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361, upload-time = "2025-10-06T14:11:33.055Z" }, - { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451, upload-time = "2025-10-06T14:11:35.136Z" }, - { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814, upload-time = "2025-10-06T14:11:37.094Z" }, - { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799, upload-time = "2025-10-06T14:11:38.83Z" }, - { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990, upload-time = "2025-10-06T14:11:40.624Z" }, - { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292, upload-time = "2025-10-06T14:11:42.578Z" }, - { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888, upload-time = "2025-10-06T14:11:44.863Z" }, - { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223, upload-time = "2025-10-06T14:11:46.796Z" }, - { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981, upload-time = "2025-10-06T14:11:48.845Z" }, - { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303, upload-time = "2025-10-06T14:11:50.897Z" }, - { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820, upload-time = "2025-10-06T14:11:52.549Z" }, - { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203, upload-time = "2025-10-06T14:11:54.225Z" }, - { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173, upload-time = "2025-10-06T14:11:56.069Z" }, - { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562, upload-time = "2025-10-06T14:11:58.783Z" }, - { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828, upload-time = "2025-10-06T14:12:00.686Z" }, - { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551, upload-time = "2025-10-06T14:12:02.628Z" }, - { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512, upload-time = "2025-10-06T14:12:04.871Z" }, - { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400, upload-time = "2025-10-06T14:12:06.624Z" }, - { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140, upload-time = "2025-10-06T14:12:08.362Z" }, - { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473, upload-time = "2025-10-06T14:12:10.994Z" }, - { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056, upload-time = "2025-10-06T14:12:13.317Z" }, - { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292, upload-time = "2025-10-06T14:12:15.398Z" }, - { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171, upload-time = "2025-10-06T14:12:16.935Z" }, - { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814, upload-time = "2025-10-06T14:12:53.872Z" }, -] - -[[package]] -name = "zipp" -version = "3.23.0" -source = { registry = "https://pypi.org/simple" } -sdist = { url = "https://files.pythonhosted.org/packages/e3/02/0f2892c661036d50ede074e376733dca2ae7c6eb617489437771209d4180/zipp-3.23.0.tar.gz", hash = "sha256:a07157588a12518c9d4034df3fbbee09c814741a33ff63c05fa29d26a2404166", size = 25547, upload-time = "2025-06-08T17:06:39.4Z" } -wheels = [ - { url = "https://files.pythonhosted.org/packages/2e/54/647ade08bf0db230bfea292f893923872fd20be6ac6f53b2b936ba839d75/zipp-3.23.0-py3-none-any.whl", hash = "sha256:071652d6115ed432f5ce1d34c336c0adfd6a884660d1e9712a256d3d3bd4b14e", size = 10276, upload-time = "2025-06-08T17:06:38.034Z" }, +sdist = { url = "https://files.pythonhosted.org/packages/57/63/0c6ebca57330cd313f6102b16dd57ffaf3ec4c83403dcb45dbd15c6f3ea1/yarl-1.22.0.tar.gz", hash = "sha256:bebf8557577d4401ba8bd9ff33906f1376c877aa78d1fe216ad01b4d6745af71", size = 187169 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/43/a2204825342f37c337f5edb6637040fa14e365b2fcc2346960201d457579/yarl-1.22.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c7bd6683587567e5a49ee6e336e0612bec8329be1b7d4c8af5687dcdeb67ee1e", size = 140517 }, + { url = "https://files.pythonhosted.org/packages/44/6f/674f3e6f02266428c56f704cd2501c22f78e8b2eeb23f153117cc86fb28a/yarl-1.22.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5cdac20da754f3a723cceea5b3448e1a2074866406adeb4ef35b469d089adb8f", size = 93495 }, + { url = "https://files.pythonhosted.org/packages/b8/12/5b274d8a0f30c07b91b2f02cba69152600b47830fcfb465c108880fcee9c/yarl-1.22.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:07a524d84df0c10f41e3ee918846e1974aba4ec017f990dc735aad487a0bdfdf", size = 94400 }, + { url = "https://files.pythonhosted.org/packages/e2/7f/df1b6949b1fa1aa9ff6de6e2631876ad4b73c4437822026e85d8acb56bb1/yarl-1.22.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1b329cb8146d7b736677a2440e422eadd775d1806a81db2d4cded80a48efc1a", size = 347545 }, + { url = "https://files.pythonhosted.org/packages/84/09/f92ed93bd6cd77872ab6c3462df45ca45cd058d8f1d0c9b4f54c1704429f/yarl-1.22.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:75976c6945d85dbb9ee6308cd7ff7b1fb9409380c82d6119bd778d8fcfe2931c", size = 319598 }, + { url = "https://files.pythonhosted.org/packages/c3/97/ac3f3feae7d522cf7ccec3d340bb0b2b61c56cb9767923df62a135092c6b/yarl-1.22.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:80ddf7a5f8c86cb3eb4bc9028b07bbbf1f08a96c5c0bc1244be5e8fefcb94147", size = 363893 }, + { url = "https://files.pythonhosted.org/packages/06/49/f3219097403b9c84a4d079b1d7bda62dd9b86d0d6e4428c02d46ab2c77fc/yarl-1.22.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d332fc2e3c94dad927f2112395772a4e4fedbcf8f80efc21ed7cdfae4d574fdb", size = 371240 }, + { url = "https://files.pythonhosted.org/packages/35/9f/06b765d45c0e44e8ecf0fe15c9eacbbde342bb5b7561c46944f107bfb6c3/yarl-1.22.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0cf71bf877efeac18b38d3930594c0948c82b64547c1cf420ba48722fe5509f6", size = 346965 }, + { url = "https://files.pythonhosted.org/packages/c5/69/599e7cea8d0fcb1694323b0db0dda317fa3162f7b90166faddecf532166f/yarl-1.22.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:663e1cadaddae26be034a6ab6072449a8426ddb03d500f43daf952b74553bba0", size = 342026 }, + { url = "https://files.pythonhosted.org/packages/95/6f/9dfd12c8bc90fea9eab39832ee32ea48f8e53d1256252a77b710c065c89f/yarl-1.22.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:6dcbb0829c671f305be48a7227918cfcd11276c2d637a8033a99a02b67bf9eda", size = 335637 }, + { url = "https://files.pythonhosted.org/packages/57/2e/34c5b4eb9b07e16e873db5b182c71e5f06f9b5af388cdaa97736d79dd9a6/yarl-1.22.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:f0d97c18dfd9a9af4490631905a3f131a8e4c9e80a39353919e2cfed8f00aedc", size = 359082 }, + { url = "https://files.pythonhosted.org/packages/31/71/fa7e10fb772d273aa1f096ecb8ab8594117822f683bab7d2c5a89914c92a/yarl-1.22.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:437840083abe022c978470b942ff832c3940b2ad3734d424b7eaffcd07f76737", size = 357811 }, + { url = "https://files.pythonhosted.org/packages/26/da/11374c04e8e1184a6a03cf9c8f5688d3e5cec83ed6f31ad3481b3207f709/yarl-1.22.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a899cbd98dce6f5d8de1aad31cb712ec0a530abc0a86bd6edaa47c1090138467", size = 351223 }, + { url = "https://files.pythonhosted.org/packages/82/8f/e2d01f161b0c034a30410e375e191a5d27608c1f8693bab1a08b089ca096/yarl-1.22.0-cp310-cp310-win32.whl", hash = "sha256:595697f68bd1f0c1c159fcb97b661fc9c3f5db46498043555d04805430e79bea", size = 82118 }, + { url = "https://files.pythonhosted.org/packages/62/46/94c76196642dbeae634c7a61ba3da88cd77bed875bf6e4a8bed037505aa6/yarl-1.22.0-cp310-cp310-win_amd64.whl", hash = "sha256:cb95a9b1adaa48e41815a55ae740cfda005758104049a640a398120bf02515ca", size = 86852 }, + { url = "https://files.pythonhosted.org/packages/af/af/7df4f179d3b1a6dcb9a4bd2ffbc67642746fcafdb62580e66876ce83fff4/yarl-1.22.0-cp310-cp310-win_arm64.whl", hash = "sha256:b85b982afde6df99ecc996990d4ad7ccbdbb70e2a4ba4de0aecde5922ba98a0b", size = 82012 }, + { url = "https://files.pythonhosted.org/packages/4d/27/5ab13fc84c76a0250afd3d26d5936349a35be56ce5785447d6c423b26d92/yarl-1.22.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ab72135b1f2db3fed3997d7e7dc1b80573c67138023852b6efb336a5eae6511", size = 141607 }, + { url = "https://files.pythonhosted.org/packages/6a/a1/d065d51d02dc02ce81501d476b9ed2229d9a990818332242a882d5d60340/yarl-1.22.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:669930400e375570189492dc8d8341301578e8493aec04aebc20d4717f899dd6", size = 94027 }, + { url = "https://files.pythonhosted.org/packages/c1/da/8da9f6a53f67b5106ffe902c6fa0164e10398d4e150d85838b82f424072a/yarl-1.22.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:792a2af6d58177ef7c19cbf0097aba92ca1b9cb3ffdd9c7470e156c8f9b5e028", size = 94963 }, + { url = "https://files.pythonhosted.org/packages/68/fe/2c1f674960c376e29cb0bec1249b117d11738db92a6ccc4a530b972648db/yarl-1.22.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3ea66b1c11c9150f1372f69afb6b8116f2dd7286f38e14ea71a44eee9ec51b9d", size = 368406 }, + { url = "https://files.pythonhosted.org/packages/95/26/812a540e1c3c6418fec60e9bbd38e871eaba9545e94fa5eff8f4a8e28e1e/yarl-1.22.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3e2daa88dc91870215961e96a039ec73e4937da13cf77ce17f9cad0c18df3503", size = 336581 }, + { url = "https://files.pythonhosted.org/packages/0b/f5/5777b19e26fdf98563985e481f8be3d8a39f8734147a6ebf459d0dab5a6b/yarl-1.22.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ba440ae430c00eee41509353628600212112cd5018d5def7e9b05ea7ac34eb65", size = 388924 }, + { url = "https://files.pythonhosted.org/packages/86/08/24bd2477bd59c0bbd994fe1d93b126e0472e4e3df5a96a277b0a55309e89/yarl-1.22.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e6438cc8f23a9c1478633d216b16104a586b9761db62bfacb6425bac0a36679e", size = 392890 }, + { url = "https://files.pythonhosted.org/packages/46/00/71b90ed48e895667ecfb1eaab27c1523ee2fa217433ed77a73b13205ca4b/yarl-1.22.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c52a6e78aef5cf47a98ef8e934755abf53953379b7d53e68b15ff4420e6683d", size = 365819 }, + { url = "https://files.pythonhosted.org/packages/30/2d/f715501cae832651d3282387c6a9236cd26bd00d0ff1e404b3dc52447884/yarl-1.22.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:3b06bcadaac49c70f4c88af4ffcfbe3dc155aab3163e75777818092478bcbbe7", size = 363601 }, + { url = "https://files.pythonhosted.org/packages/f8/f9/a678c992d78e394e7126ee0b0e4e71bd2775e4334d00a9278c06a6cce96a/yarl-1.22.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:6944b2dc72c4d7f7052683487e3677456050ff77fcf5e6204e98caf785ad1967", size = 358072 }, + { url = "https://files.pythonhosted.org/packages/2c/d1/b49454411a60edb6fefdcad4f8e6dbba7d8019e3a508a1c5836cba6d0781/yarl-1.22.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:d5372ca1df0f91a86b047d1277c2aaf1edb32d78bbcefffc81b40ffd18f027ed", size = 385311 }, + { url = "https://files.pythonhosted.org/packages/87/e5/40d7a94debb8448c7771a916d1861d6609dddf7958dc381117e7ba36d9e8/yarl-1.22.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:51af598701f5299012b8416486b40fceef8c26fc87dc6d7d1f6fc30609ea0aa6", size = 381094 }, + { url = "https://files.pythonhosted.org/packages/35/d8/611cc282502381ad855448643e1ad0538957fc82ae83dfe7762c14069e14/yarl-1.22.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b266bd01fedeffeeac01a79ae181719ff848a5a13ce10075adbefc8f1daee70e", size = 370944 }, + { url = "https://files.pythonhosted.org/packages/2d/df/fadd00fb1c90e1a5a8bd731fa3d3de2e165e5a3666a095b04e31b04d9cb6/yarl-1.22.0-cp311-cp311-win32.whl", hash = "sha256:a9b1ba5610a4e20f655258d5a1fdc7ebe3d837bb0e45b581398b99eb98b1f5ca", size = 81804 }, + { url = "https://files.pythonhosted.org/packages/b5/f7/149bb6f45f267cb5c074ac40c01c6b3ea6d8a620d34b337f6321928a1b4d/yarl-1.22.0-cp311-cp311-win_amd64.whl", hash = "sha256:078278b9b0b11568937d9509b589ee83ef98ed6d561dfe2020e24a9fd08eaa2b", size = 86858 }, + { url = "https://files.pythonhosted.org/packages/2b/13/88b78b93ad3f2f0b78e13bfaaa24d11cbc746e93fe76d8c06bf139615646/yarl-1.22.0-cp311-cp311-win_arm64.whl", hash = "sha256:b6a6f620cfe13ccec221fa312139135166e47ae169f8253f72a0abc0dae94376", size = 81637 }, + { url = "https://files.pythonhosted.org/packages/75/ff/46736024fee3429b80a165a732e38e5d5a238721e634ab41b040d49f8738/yarl-1.22.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e340382d1afa5d32b892b3ff062436d592ec3d692aeea3bef3a5cfe11bbf8c6f", size = 142000 }, + { url = "https://files.pythonhosted.org/packages/5a/9a/b312ed670df903145598914770eb12de1bac44599549b3360acc96878df8/yarl-1.22.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f1e09112a2c31ffe8d80be1b0988fa6a18c5d5cad92a9ffbb1c04c91bfe52ad2", size = 94338 }, + { url = "https://files.pythonhosted.org/packages/ba/f5/0601483296f09c3c65e303d60c070a5c19fcdbc72daa061e96170785bc7d/yarl-1.22.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:939fe60db294c786f6b7c2d2e121576628468f65453d86b0fe36cb52f987bd74", size = 94909 }, + { url = "https://files.pythonhosted.org/packages/60/41/9a1fe0b73dbcefce72e46cf149b0e0a67612d60bfc90fb59c2b2efdfbd86/yarl-1.22.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e1651bf8e0398574646744c1885a41198eba53dc8a9312b954073f845c90a8df", size = 372940 }, + { url = "https://files.pythonhosted.org/packages/17/7a/795cb6dfee561961c30b800f0ed616b923a2ec6258b5def2a00bf8231334/yarl-1.22.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:b8a0588521a26bf92a57a1705b77b8b59044cdceccac7151bd8d229e66b8dedb", size = 345825 }, + { url = "https://files.pythonhosted.org/packages/d7/93/a58f4d596d2be2ae7bab1a5846c4d270b894958845753b2c606d666744d3/yarl-1.22.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:42188e6a615c1a75bcaa6e150c3fe8f3e8680471a6b10150c5f7e83f47cc34d2", size = 386705 }, + { url = "https://files.pythonhosted.org/packages/61/92/682279d0e099d0e14d7fd2e176bd04f48de1484f56546a3e1313cd6c8e7c/yarl-1.22.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f6d2cb59377d99718913ad9a151030d6f83ef420a2b8f521d94609ecc106ee82", size = 396518 }, + { url = "https://files.pythonhosted.org/packages/db/0f/0d52c98b8a885aeda831224b78f3be7ec2e1aa4a62091f9f9188c3c65b56/yarl-1.22.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50678a3b71c751d58d7908edc96d332af328839eea883bb554a43f539101277a", size = 377267 }, + { url = "https://files.pythonhosted.org/packages/22/42/d2685e35908cbeaa6532c1fc73e89e7f2efb5d8a7df3959ea8e37177c5a3/yarl-1.22.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1e8fbaa7cec507aa24ea27a01456e8dd4b6fab829059b69844bd348f2d467124", size = 365797 }, + { url = "https://files.pythonhosted.org/packages/a2/83/cf8c7bcc6355631762f7d8bdab920ad09b82efa6b722999dfb05afa6cfac/yarl-1.22.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:433885ab5431bc3d3d4f2f9bd15bfa1614c522b0f1405d62c4f926ccd69d04fa", size = 365535 }, + { url = "https://files.pythonhosted.org/packages/25/e1/5302ff9b28f0c59cac913b91fe3f16c59a033887e57ce9ca5d41a3a94737/yarl-1.22.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b790b39c7e9a4192dc2e201a282109ed2985a1ddbd5ac08dc56d0e121400a8f7", size = 382324 }, + { url = "https://files.pythonhosted.org/packages/bf/cd/4617eb60f032f19ae3a688dc990d8f0d89ee0ea378b61cac81ede3e52fae/yarl-1.22.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:31f0b53913220599446872d757257be5898019c85e7971599065bc55065dc99d", size = 383803 }, + { url = "https://files.pythonhosted.org/packages/59/65/afc6e62bb506a319ea67b694551dab4a7e6fb7bf604e9bd9f3e11d575fec/yarl-1.22.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a49370e8f711daec68d09b821a34e1167792ee2d24d405cbc2387be4f158b520", size = 374220 }, + { url = "https://files.pythonhosted.org/packages/e7/3d/68bf18d50dc674b942daec86a9ba922d3113d8399b0e52b9897530442da2/yarl-1.22.0-cp312-cp312-win32.whl", hash = "sha256:70dfd4f241c04bd9239d53b17f11e6ab672b9f1420364af63e8531198e3f5fe8", size = 81589 }, + { url = "https://files.pythonhosted.org/packages/c8/9a/6ad1a9b37c2f72874f93e691b2e7ecb6137fb2b899983125db4204e47575/yarl-1.22.0-cp312-cp312-win_amd64.whl", hash = "sha256:8884d8b332a5e9b88e23f60bb166890009429391864c685e17bd73a9eda9105c", size = 87213 }, + { url = "https://files.pythonhosted.org/packages/44/c5/c21b562d1680a77634d748e30c653c3ca918beb35555cff24986fff54598/yarl-1.22.0-cp312-cp312-win_arm64.whl", hash = "sha256:ea70f61a47f3cc93bdf8b2f368ed359ef02a01ca6393916bc8ff877427181e74", size = 81330 }, + { url = "https://files.pythonhosted.org/packages/ea/f3/d67de7260456ee105dc1d162d43a019ecad6b91e2f51809d6cddaa56690e/yarl-1.22.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8dee9c25c74997f6a750cd317b8ca63545169c098faee42c84aa5e506c819b53", size = 139980 }, + { url = "https://files.pythonhosted.org/packages/01/88/04d98af0b47e0ef42597b9b28863b9060bb515524da0a65d5f4db160b2d5/yarl-1.22.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:01e73b85a5434f89fc4fe27dcda2aff08ddf35e4d47bbbea3bdcd25321af538a", size = 93424 }, + { url = "https://files.pythonhosted.org/packages/18/91/3274b215fd8442a03975ce6bee5fe6aa57a8326b29b9d3d56234a1dca244/yarl-1.22.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:22965c2af250d20c873cdbee8ff958fb809940aeb2e74ba5f20aaf6b7ac8c70c", size = 93821 }, + { url = "https://files.pythonhosted.org/packages/61/3a/caf4e25036db0f2da4ca22a353dfeb3c9d3c95d2761ebe9b14df8fc16eb0/yarl-1.22.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4f15793aa49793ec8d1c708ab7f9eded1aa72edc5174cae703651555ed1b601", size = 373243 }, + { url = "https://files.pythonhosted.org/packages/6e/9e/51a77ac7516e8e7803b06e01f74e78649c24ee1021eca3d6a739cb6ea49c/yarl-1.22.0-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e5542339dcf2747135c5c85f68680353d5cb9ffd741c0f2e8d832d054d41f35a", size = 342361 }, + { url = "https://files.pythonhosted.org/packages/d4/f8/33b92454789dde8407f156c00303e9a891f1f51a0330b0fad7c909f87692/yarl-1.22.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:5c401e05ad47a75869c3ab3e35137f8468b846770587e70d71e11de797d113df", size = 387036 }, + { url = "https://files.pythonhosted.org/packages/d9/9a/c5db84ea024f76838220280f732970aa4ee154015d7f5c1bfb60a267af6f/yarl-1.22.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:243dda95d901c733f5b59214d28b0120893d91777cb8aa043e6ef059d3cddfe2", size = 397671 }, + { url = "https://files.pythonhosted.org/packages/11/c9/cd8538dc2e7727095e0c1d867bad1e40c98f37763e6d995c1939f5fdc7b1/yarl-1.22.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bec03d0d388060058f5d291a813f21c011041938a441c593374da6077fe21b1b", size = 377059 }, + { url = "https://files.pythonhosted.org/packages/a1/b9/ab437b261702ced75122ed78a876a6dec0a1b0f5e17a4ac7a9a2482d8abe/yarl-1.22.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b0748275abb8c1e1e09301ee3cf90c8a99678a4e92e4373705f2a2570d581273", size = 365356 }, + { url = "https://files.pythonhosted.org/packages/b2/9d/8e1ae6d1d008a9567877b08f0ce4077a29974c04c062dabdb923ed98e6fe/yarl-1.22.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:47fdb18187e2a4e18fda2c25c05d8251a9e4a521edaed757fef033e7d8498d9a", size = 361331 }, + { url = "https://files.pythonhosted.org/packages/ca/5a/09b7be3905962f145b73beb468cdd53db8aa171cf18c80400a54c5b82846/yarl-1.22.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c7044802eec4524fde550afc28edda0dd5784c4c45f0be151a2d3ba017daca7d", size = 382590 }, + { url = "https://files.pythonhosted.org/packages/aa/7f/59ec509abf90eda5048b0bc3e2d7b5099dffdb3e6b127019895ab9d5ef44/yarl-1.22.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:139718f35149ff544caba20fce6e8a2f71f1e39b92c700d8438a0b1d2a631a02", size = 385316 }, + { url = "https://files.pythonhosted.org/packages/e5/84/891158426bc8036bfdfd862fabd0e0fa25df4176ec793e447f4b85cf1be4/yarl-1.22.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e1b51bebd221006d3d2f95fbe124b22b247136647ae5dcc8c7acafba66e5ee67", size = 374431 }, + { url = "https://files.pythonhosted.org/packages/bb/49/03da1580665baa8bef5e8ed34c6df2c2aca0a2f28bf397ed238cc1bbc6f2/yarl-1.22.0-cp313-cp313-win32.whl", hash = "sha256:d3e32536234a95f513bd374e93d717cf6b2231a791758de6c509e3653f234c95", size = 81555 }, + { url = "https://files.pythonhosted.org/packages/9a/ee/450914ae11b419eadd067c6183ae08381cfdfcb9798b90b2b713bbebddda/yarl-1.22.0-cp313-cp313-win_amd64.whl", hash = "sha256:47743b82b76d89a1d20b83e60d5c20314cbd5ba2befc9cda8f28300c4a08ed4d", size = 86965 }, + { url = "https://files.pythonhosted.org/packages/98/4d/264a01eae03b6cf629ad69bae94e3b0e5344741e929073678e84bf7a3e3b/yarl-1.22.0-cp313-cp313-win_arm64.whl", hash = "sha256:5d0fcda9608875f7d052eff120c7a5da474a6796fe4d83e152e0e4d42f6d1a9b", size = 81205 }, + { url = "https://files.pythonhosted.org/packages/88/fc/6908f062a2f77b5f9f6d69cecb1747260831ff206adcbc5b510aff88df91/yarl-1.22.0-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:719ae08b6972befcba4310e49edb1161a88cdd331e3a694b84466bd938a6ab10", size = 146209 }, + { url = "https://files.pythonhosted.org/packages/65/47/76594ae8eab26210b4867be6f49129861ad33da1f1ebdf7051e98492bf62/yarl-1.22.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:47d8a5c446df1c4db9d21b49619ffdba90e77c89ec6e283f453856c74b50b9e3", size = 95966 }, + { url = "https://files.pythonhosted.org/packages/ab/ce/05e9828a49271ba6b5b038b15b3934e996980dd78abdfeb52a04cfb9467e/yarl-1.22.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:cfebc0ac8333520d2d0423cbbe43ae43c8838862ddb898f5ca68565e395516e9", size = 97312 }, + { url = "https://files.pythonhosted.org/packages/d1/c5/7dffad5e4f2265b29c9d7ec869c369e4223166e4f9206fc2243ee9eea727/yarl-1.22.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4398557cbf484207df000309235979c79c4356518fd5c99158c7d38203c4da4f", size = 361967 }, + { url = "https://files.pythonhosted.org/packages/50/b2/375b933c93a54bff7fc041e1a6ad2c0f6f733ffb0c6e642ce56ee3b39970/yarl-1.22.0-cp313-cp313t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2ca6fd72a8cd803be290d42f2dec5cdcd5299eeb93c2d929bf060ad9efaf5de0", size = 323949 }, + { url = "https://files.pythonhosted.org/packages/66/50/bfc2a29a1d78644c5a7220ce2f304f38248dc94124a326794e677634b6cf/yarl-1.22.0-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca1f59c4e1ab6e72f0a23c13fca5430f889634166be85dbf1013683e49e3278e", size = 361818 }, + { url = "https://files.pythonhosted.org/packages/46/96/f3941a46af7d5d0f0498f86d71275696800ddcdd20426298e572b19b91ff/yarl-1.22.0-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c5010a52015e7c70f86eb967db0f37f3c8bd503a695a49f8d45700144667708", size = 372626 }, + { url = "https://files.pythonhosted.org/packages/c1/42/8b27c83bb875cd89448e42cd627e0fb971fa1675c9ec546393d18826cb50/yarl-1.22.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d7672ecf7557476642c88497c2f8d8542f8e36596e928e9bcba0e42e1e7d71f", size = 341129 }, + { url = "https://files.pythonhosted.org/packages/49/36/99ca3122201b382a3cf7cc937b95235b0ac944f7e9f2d5331d50821ed352/yarl-1.22.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:3b7c88eeef021579d600e50363e0b6ee4f7f6f728cd3486b9d0f3ee7b946398d", size = 346776 }, + { url = "https://files.pythonhosted.org/packages/85/b4/47328bf996acd01a4c16ef9dcd2f59c969f495073616586f78cd5f2efb99/yarl-1.22.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:f4afb5c34f2c6fecdcc182dfcfc6af6cccf1aa923eed4d6a12e9d96904e1a0d8", size = 334879 }, + { url = "https://files.pythonhosted.org/packages/c2/ad/b77d7b3f14a4283bffb8e92c6026496f6de49751c2f97d4352242bba3990/yarl-1.22.0-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:59c189e3e99a59cf8d83cbb31d4db02d66cda5a1a4374e8a012b51255341abf5", size = 350996 }, + { url = "https://files.pythonhosted.org/packages/81/c8/06e1d69295792ba54d556f06686cbd6a7ce39c22307100e3fb4a2c0b0a1d/yarl-1.22.0-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:5a3bf7f62a289fa90f1990422dc8dff5a458469ea71d1624585ec3a4c8d6960f", size = 356047 }, + { url = "https://files.pythonhosted.org/packages/4b/b8/4c0e9e9f597074b208d18cef227d83aac36184bfbc6eab204ea55783dbc5/yarl-1.22.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:de6b9a04c606978fdfe72666fa216ffcf2d1a9f6a381058d4378f8d7b1e5de62", size = 342947 }, + { url = "https://files.pythonhosted.org/packages/e0/e5/11f140a58bf4c6ad7aca69a892bff0ee638c31bea4206748fc0df4ebcb3a/yarl-1.22.0-cp313-cp313t-win32.whl", hash = "sha256:1834bb90991cc2999f10f97f5f01317f99b143284766d197e43cd5b45eb18d03", size = 86943 }, + { url = "https://files.pythonhosted.org/packages/31/74/8b74bae38ed7fe6793d0c15a0c8207bbb819cf287788459e5ed230996cdd/yarl-1.22.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff86011bd159a9d2dfc89c34cfd8aff12875980e3bd6a39ff097887520e60249", size = 93715 }, + { url = "https://files.pythonhosted.org/packages/69/66/991858aa4b5892d57aef7ee1ba6b4d01ec3b7eb3060795d34090a3ca3278/yarl-1.22.0-cp313-cp313t-win_arm64.whl", hash = "sha256:7861058d0582b847bc4e3a4a4c46828a410bca738673f35a29ba3ca5db0b473b", size = 83857 }, + { url = "https://files.pythonhosted.org/packages/46/b3/e20ef504049f1a1c54a814b4b9bed96d1ac0e0610c3b4da178f87209db05/yarl-1.22.0-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:34b36c2c57124530884d89d50ed2c1478697ad7473efd59cfd479945c95650e4", size = 140520 }, + { url = "https://files.pythonhosted.org/packages/e4/04/3532d990fdbab02e5ede063676b5c4260e7f3abea2151099c2aa745acc4c/yarl-1.22.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:0dd9a702591ca2e543631c2a017e4a547e38a5c0f29eece37d9097e04a7ac683", size = 93504 }, + { url = "https://files.pythonhosted.org/packages/11/63/ff458113c5c2dac9a9719ac68ee7c947cb621432bcf28c9972b1c0e83938/yarl-1.22.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:594fcab1032e2d2cc3321bb2e51271e7cd2b516c7d9aee780ece81b07ff8244b", size = 94282 }, + { url = "https://files.pythonhosted.org/packages/a7/bc/315a56aca762d44a6aaaf7ad253f04d996cb6b27bad34410f82d76ea8038/yarl-1.22.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f3d7a87a78d46a2e3d5b72587ac14b4c16952dd0887dbb051451eceac774411e", size = 372080 }, + { url = "https://files.pythonhosted.org/packages/3f/3f/08e9b826ec2e099ea6e7c69a61272f4f6da62cb5b1b63590bb80ca2e4a40/yarl-1.22.0-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:852863707010316c973162e703bddabec35e8757e67fcb8ad58829de1ebc8590", size = 338696 }, + { url = "https://files.pythonhosted.org/packages/e3/9f/90360108e3b32bd76789088e99538febfea24a102380ae73827f62073543/yarl-1.22.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:131a085a53bfe839a477c0845acf21efc77457ba2bcf5899618136d64f3303a2", size = 387121 }, + { url = "https://files.pythonhosted.org/packages/98/92/ab8d4657bd5b46a38094cfaea498f18bb70ce6b63508fd7e909bd1f93066/yarl-1.22.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:078a8aefd263f4d4f923a9677b942b445a2be970ca24548a8102689a3a8ab8da", size = 394080 }, + { url = "https://files.pythonhosted.org/packages/f5/e7/d8c5a7752fef68205296201f8ec2bf718f5c805a7a7e9880576c67600658/yarl-1.22.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bca03b91c323036913993ff5c738d0842fc9c60c4648e5c8d98331526df89784", size = 372661 }, + { url = "https://files.pythonhosted.org/packages/b6/2e/f4d26183c8db0bb82d491b072f3127fb8c381a6206a3a56332714b79b751/yarl-1.22.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:68986a61557d37bb90d3051a45b91fa3d5c516d177dfc6dd6f2f436a07ff2b6b", size = 364645 }, + { url = "https://files.pythonhosted.org/packages/80/7c/428e5812e6b87cd00ee8e898328a62c95825bf37c7fa87f0b6bb2ad31304/yarl-1.22.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:4792b262d585ff0dff6bcb787f8492e40698443ec982a3568c2096433660c694", size = 355361 }, + { url = "https://files.pythonhosted.org/packages/ec/2a/249405fd26776f8b13c067378ef4d7dd49c9098d1b6457cdd152a99e96a9/yarl-1.22.0-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ebd4549b108d732dba1d4ace67614b9545b21ece30937a63a65dd34efa19732d", size = 381451 }, + { url = "https://files.pythonhosted.org/packages/67/a8/fb6b1adbe98cf1e2dd9fad71003d3a63a1bc22459c6e15f5714eb9323b93/yarl-1.22.0-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:f87ac53513d22240c7d59203f25cc3beac1e574c6cd681bbfd321987b69f95fd", size = 383814 }, + { url = "https://files.pythonhosted.org/packages/d9/f9/3aa2c0e480fb73e872ae2814c43bc1e734740bb0d54e8cb2a95925f98131/yarl-1.22.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:22b029f2881599e2f1b06f8f1db2ee63bd309e2293ba2d566e008ba12778b8da", size = 370799 }, + { url = "https://files.pythonhosted.org/packages/50/3c/af9dba3b8b5eeb302f36f16f92791f3ea62e3f47763406abf6d5a4a3333b/yarl-1.22.0-cp314-cp314-win32.whl", hash = "sha256:6a635ea45ba4ea8238463b4f7d0e721bad669f80878b7bfd1f89266e2ae63da2", size = 82990 }, + { url = "https://files.pythonhosted.org/packages/ac/30/ac3a0c5bdc1d6efd1b41fa24d4897a4329b3b1e98de9449679dd327af4f0/yarl-1.22.0-cp314-cp314-win_amd64.whl", hash = "sha256:0d6e6885777af0f110b0e5d7e5dda8b704efed3894da26220b7f3d887b839a79", size = 88292 }, + { url = "https://files.pythonhosted.org/packages/df/0a/227ab4ff5b998a1b7410abc7b46c9b7a26b0ca9e86c34ba4b8d8bc7c63d5/yarl-1.22.0-cp314-cp314-win_arm64.whl", hash = "sha256:8218f4e98d3c10d683584cb40f0424f4b9fd6e95610232dd75e13743b070ee33", size = 82888 }, + { url = "https://files.pythonhosted.org/packages/06/5e/a15eb13db90abd87dfbefb9760c0f3f257ac42a5cac7e75dbc23bed97a9f/yarl-1.22.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:45c2842ff0e0d1b35a6bf1cd6c690939dacb617a70827f715232b2e0494d55d1", size = 146223 }, + { url = "https://files.pythonhosted.org/packages/18/82/9665c61910d4d84f41a5bf6837597c89e665fa88aa4941080704645932a9/yarl-1.22.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:d947071e6ebcf2e2bee8fce76e10faca8f7a14808ca36a910263acaacef08eca", size = 95981 }, + { url = "https://files.pythonhosted.org/packages/5d/9a/2f65743589809af4d0a6d3aa749343c4b5f4c380cc24a8e94a3c6625a808/yarl-1.22.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:334b8721303e61b00019474cc103bdac3d7b1f65e91f0bfedeec2d56dfe74b53", size = 97303 }, + { url = "https://files.pythonhosted.org/packages/b0/ab/5b13d3e157505c43c3b43b5a776cbf7b24a02bc4cccc40314771197e3508/yarl-1.22.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e7ce67c34138a058fd092f67d07a72b8e31ff0c9236e751957465a24b28910c", size = 361820 }, + { url = "https://files.pythonhosted.org/packages/fb/76/242a5ef4677615cf95330cfc1b4610e78184400699bdda0acb897ef5e49a/yarl-1.22.0-cp314-cp314t-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:d77e1b2c6d04711478cb1c4ab90db07f1609ccf06a287d5607fcd90dc9863acf", size = 323203 }, + { url = "https://files.pythonhosted.org/packages/8c/96/475509110d3f0153b43d06164cf4195c64d16999e0c7e2d8a099adcd6907/yarl-1.22.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4647674b6150d2cae088fc07de2738a84b8bcedebef29802cf0b0a82ab6face", size = 363173 }, + { url = "https://files.pythonhosted.org/packages/c9/66/59db471aecfbd559a1fd48aedd954435558cd98c7d0da8b03cc6c140a32c/yarl-1.22.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efb07073be061c8f79d03d04139a80ba33cbd390ca8f0297aae9cce6411e4c6b", size = 373562 }, + { url = "https://files.pythonhosted.org/packages/03/1f/c5d94abc91557384719da10ff166b916107c1b45e4d0423a88457071dd88/yarl-1.22.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e51ac5435758ba97ad69617e13233da53908beccc6cfcd6c34bbed8dcbede486", size = 339828 }, + { url = "https://files.pythonhosted.org/packages/5f/97/aa6a143d3afba17b6465733681c70cf175af89f76ec8d9286e08437a7454/yarl-1.22.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:33e32a0dd0c8205efa8e83d04fc9f19313772b78522d1bdc7d9aed706bfd6138", size = 347551 }, + { url = "https://files.pythonhosted.org/packages/43/3c/45a2b6d80195959239a7b2a8810506d4eea5487dce61c2a3393e7fc3c52e/yarl-1.22.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:bf4a21e58b9cde0e401e683ebd00f6ed30a06d14e93f7c8fd059f8b6e8f87b6a", size = 334512 }, + { url = "https://files.pythonhosted.org/packages/86/a0/c2ab48d74599c7c84cb104ebd799c5813de252bea0f360ffc29d270c2caa/yarl-1.22.0-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:e4b582bab49ac33c8deb97e058cd67c2c50dac0dd134874106d9c774fd272529", size = 352400 }, + { url = "https://files.pythonhosted.org/packages/32/75/f8919b2eafc929567d3d8411f72bdb1a2109c01caaab4ebfa5f8ffadc15b/yarl-1.22.0-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:0b5bcc1a9c4839e7e30b7b30dd47fe5e7e44fb7054ec29b5bb8d526aa1041093", size = 357140 }, + { url = "https://files.pythonhosted.org/packages/cf/72/6a85bba382f22cf78add705d8c3731748397d986e197e53ecc7835e76de7/yarl-1.22.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c0232bce2170103ec23c454e54a57008a9a72b5d1c3105dc2496750da8cfa47c", size = 341473 }, + { url = "https://files.pythonhosted.org/packages/35/18/55e6011f7c044dc80b98893060773cefcfdbf60dfefb8cb2f58b9bacbd83/yarl-1.22.0-cp314-cp314t-win32.whl", hash = "sha256:8009b3173bcd637be650922ac455946197d858b3630b6d8787aa9e5c4564533e", size = 89056 }, + { url = "https://files.pythonhosted.org/packages/f9/86/0f0dccb6e59a9e7f122c5afd43568b1d31b8ab7dda5f1b01fb5c7025c9a9/yarl-1.22.0-cp314-cp314t-win_amd64.whl", hash = "sha256:9fb17ea16e972c63d25d4a97f016d235c78dd2344820eb35bc034bc32012ee27", size = 96292 }, + { url = "https://files.pythonhosted.org/packages/48/b7/503c98092fb3b344a179579f55814b613c1fbb1c23b3ec14a7b008a66a6e/yarl-1.22.0-cp314-cp314t-win_arm64.whl", hash = "sha256:9f6d73c1436b934e3f01df1e1b21ff765cd1d28c77dfb9ace207f746d4610ee1", size = 85171 }, + { url = "https://files.pythonhosted.org/packages/73/ae/b48f95715333080afb75a4504487cbe142cae1268afc482d06692d605ae6/yarl-1.22.0-py3-none-any.whl", hash = "sha256:1380560bdba02b6b6c90de54133c81c9f2a453dee9912fe58c1dcced1edb7cff", size = 46814 }, ] diff --git a/flake.nix b/flake.nix index 0d8db982..f3a1fc15 100644 --- a/flake.nix +++ b/flake.nix @@ -24,7 +24,13 @@ src = ./.; - nativeBuildInputs = [ pkgs.bun pkgs.makeWrapper ]; + nativeBuildInputs = [ + pkgs.bun + pkgs.makeWrapper + pkgs.python3 # needed by node-gyp to compile better-sqlite3 + ] ++ pkgs.lib.optionals pkgs.stdenv.hostPlatform.isDarwin [ + pkgs.darwin.cctools # provides libtool needed by node-gyp on macOS + ]; buildInputs = [ pkgs.sqlite ]; diff --git a/package.json b/package.json index 4ac978a5..a47a93bc 100644 --- a/package.json +++ b/package.json @@ -1,25 +1,54 @@ { - "name": "qmd", - "version": "1.0.0", - "description": "Quick Markdown Search - Full-text and vector search for markdown files", + "name": "@tobilu/qmd", + "version": "1.1.6", + "description": "Query Markup Documents - On-device hybrid search for markdown files with BM25, vector search, and LLM reranking", "type": "module", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "exports": { + ".": { + "import": "./dist/index.js", + "types": "./dist/index.d.ts" + } + }, "bin": { - "qmd": "./qmd" + "qmd": "dist/qmd.js" }, + "files": [ + "dist/", + "LICENSE", + "CHANGELOG.md" + ], "scripts": { - "test": "bun test", - "qmd": "bun src/qmd.ts", - "index": "bun src/qmd.ts index", - "vector": "bun src/qmd.ts vector", - "search": "bun src/qmd.ts search", - "vsearch": "bun src/qmd.ts vsearch", - "rerank": "bun src/qmd.ts rerank", - "link": "bun link", - "inspector": "npx @modelcontextprotocol/inspector bun src/qmd.ts mcp" + "prepare": "[ -d .git ] && ./scripts/install-hooks.sh || true", + "build": "tsc -p tsconfig.build.json && printf '#!/usr/bin/env node\n' | cat - dist/qmd.js > dist/qmd.tmp && mv dist/qmd.tmp dist/qmd.js && chmod +x dist/qmd.js", + "test": "vitest run --reporter=verbose test/", + "qmd": "tsx src/qmd.ts", + "index": "tsx src/qmd.ts index", + "vector": "tsx src/qmd.ts vector", + "search": "tsx src/qmd.ts search", + "vsearch": "tsx src/qmd.ts vsearch", + "rerank": "tsx src/qmd.ts rerank", + "inspector": "npx @modelcontextprotocol/inspector tsx src/qmd.ts mcp", + "release": "./scripts/release.sh" + }, + "publishConfig": { + "access": "public" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/tobi/qmd.git" + }, + "homepage": "https://github.com/tobi/qmd#readme", + "bugs": { + "url": "https://github.com/tobi/qmd/issues" }, "dependencies": { "@modelcontextprotocol/sdk": "^1.25.1", - "node-llama-cpp": "^3.14.5", + "better-sqlite3": "^11.0.0", + "fast-glob": "^3.3.0", + "node-llama-cpp": "^3.17.1", + "picomatch": "^4.0.0", "sqlite-vec": "^0.1.7-alpha.2", "yaml": "^2.8.2", "zod": "^4.2.1" @@ -27,27 +56,38 @@ "optionalDependencies": { "sqlite-vec-darwin-arm64": "^0.1.7-alpha.2", "sqlite-vec-darwin-x64": "^0.1.7-alpha.2", + "sqlite-vec-linux-arm64": "^0.1.7-alpha.2", "sqlite-vec-linux-x64": "^0.1.7-alpha.2", - "sqlite-vec-win32-x64": "^0.1.7-alpha.2" + "sqlite-vec-windows-x64": "^0.1.7-alpha.2" }, "devDependencies": { - "@types/bun": "latest" + "@types/better-sqlite3": "^7.6.0", + "tsx": "^4.0.0", + "vitest": "^3.0.0" }, "peerDependencies": { "typescript": "^5.9.3" }, "engines": { - "bun": ">=1.0.0" + "node": ">=22.0.0" }, "keywords": [ "markdown", "search", "fts", + "full-text-search", "vector", + "semantic-search", "sqlite", "bm25", "embeddings", - "ollama" + "rag", + "mcp", + "reranking", + "knowledge-base", + "local-ai", + "llm" ], + "author": "Tobi Lutke ", "license": "MIT" } diff --git a/qmd b/qmd deleted file mode 100755 index 25e8e755..00000000 --- a/qmd +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env bash -# qmd - Quick Markdown Search -set -euo pipefail - -# Find bun - prefer PATH, fallback to known locations -find_bun() { - # First: check if bun is in PATH and modern enough - if command -v bun &>/dev/null; then - local ver=$(bun --version 2>/dev/null || echo "0") - if [[ "$ver" =~ ^1\. ]]; then - command -v bun - return 0 - fi - fi - - # Fallback: derive paths (need HOME) - : "${HOME:=$(eval echo ~)}" - - # If running from .bun tree, use that bun - if [[ "${BASH_SOURCE[0]}" == */.bun/* ]]; then - local bun_home="${BASH_SOURCE[0]%%/.bun/*}/.bun" - if [[ -x "$bun_home/bin/bun" ]]; then - echo "$bun_home/bin/bun" - return 0 - fi - fi - - # Check known locations - local candidates=( - "$HOME/.local/share/mise/installs/bun/latest/bin/bun" - "$HOME/.local/share/mise/shims/bun" - "$HOME/.asdf/shims/bun" - "/opt/homebrew/bin/bun" - "/usr/local/bin/bun" - "$HOME/.bun/bin/bun" - ) - for c in "${candidates[@]}"; do - [[ -x "$c" ]] && { echo "$c"; return 0; } - done - - return 1 -} - -BUN=$(find_bun) || { echo "Error: bun not found. Install from https://bun.sh" >&2; exit 1; } - -# Resolve symlinks to find script location -SOURCE="${BASH_SOURCE[0]}" -while [[ -L "$SOURCE" ]]; do - DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - SOURCE="$(readlink "$SOURCE")" - [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE" -done -SCRIPT_DIR="$(cd -P "$(dirname "$SOURCE")" && pwd)" - -exec "$BUN" "$SCRIPT_DIR/src/qmd.ts" "$@" diff --git a/scripts/extract-changelog.sh b/scripts/extract-changelog.sh new file mode 100755 index 00000000..f487f068 --- /dev/null +++ b/scripts/extract-changelog.sh @@ -0,0 +1,78 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Extract cumulative release notes from CHANGELOG.md. +# +# For a given version (e.g. 1.0.5), extracts all entries from the current +# minor series back to x.x.0 (e.g. 1.0.0 through 1.0.5). This means each +# GitHub release restates the full arc of changes for the minor series. +# +# The [Unreleased] section is included — it contains the content that will +# become [X.Y.Z] when the release script runs. If the version is already +# released, [Unreleased] may be empty and is omitted. +# +# Fails if neither [Unreleased] nor [X.Y.Z] has content in the changelog. +# +# Usage: scripts/extract-changelog.sh +# Example: scripts/extract-changelog.sh 1.0.5 +# -> extracts [Unreleased] + [1.0.5], [1.0.4], ..., [1.0.0] + +VERSION="${1:?Usage: extract-changelog.sh }" + +# Parse major.minor.patch from version +IFS='.' read -r MAJOR MINOR PATCH <<< "$VERSION" + +if [[ ! -f CHANGELOG.md ]]; then + echo "CHANGELOG.md not found" >&2 + exit 1 +fi + +# Extract [Unreleased] section and all [X.Y.Z] sections matching our minor series. +OUTPUT="" +CAPTURING=false +UNRELEASED_CONTENT="" +IN_UNRELEASED=false + +while IFS= read -r line; do + if [[ "$line" =~ ^##\ \[Unreleased\] ]]; then + CAPTURING=true + IN_UNRELEASED=true + elif [[ "$line" =~ ^##\ \[([0-9]+\.[0-9]+\.[0-9]+)\] ]]; then + IN_UNRELEASED=false + ENTRY_VERSION="${BASH_REMATCH[1]}" + IFS='.' read -r E_MAJOR E_MINOR E_PATCH <<< "$ENTRY_VERSION" + if [[ "$E_MAJOR" == "$MAJOR" && "$E_MINOR" == "$MINOR" ]]; then + CAPTURING=true + OUTPUT+="$line"$'\n' + else + CAPTURING=false + fi + elif [[ "$line" =~ ^##\ ]]; then + IN_UNRELEASED=false + CAPTURING=false + elif $CAPTURING; then + if $IN_UNRELEASED; then + UNRELEASED_CONTENT+="$line"$'\n' + else + OUTPUT+="$line"$'\n' + fi + fi +done < CHANGELOG.md + +# Only include [Unreleased] if it has non-blank content +TRIMMED=$(echo "$UNRELEASED_CONTENT" | sed '/^[[:space:]]*$/d') +if [[ -n "$TRIMMED" ]]; then + OUTPUT="## [Unreleased]"$'\n'"$UNRELEASED_CONTENT$OUTPUT" +fi + +# Fail if we got nothing +TRIMMED_OUTPUT=$(echo "$OUTPUT" | sed '/^[[:space:]]*$/d') +if [[ -z "$TRIMMED_OUTPUT" ]]; then + echo "error: no changelog content found for $VERSION" >&2 + echo "Expected either:" >&2 + echo " ## [Unreleased] (with content)" >&2 + echo " ## [$VERSION] - YYYY-MM-DD" >&2 + exit 1 +fi + +printf '%s' "$OUTPUT" diff --git a/scripts/install-hooks.sh b/scripts/install-hooks.sh new file mode 100755 index 00000000..a5a7ca4c --- /dev/null +++ b/scripts/install-hooks.sh @@ -0,0 +1,19 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Self-installing git hooks for qmd +# Called from package.json "prepare" script after bun install + +REPO_ROOT="$(cd "$(dirname "$0")/.." && pwd)" +HOOKS_DIR="$REPO_ROOT/.git/hooks" + +if [[ ! -d "$HOOKS_DIR" ]]; then + echo "Not a git repository, skipping hook install" + exit 0 +fi + +# Install pre-push hook +cp "$REPO_ROOT/scripts/pre-push" "$HOOKS_DIR/pre-push" +chmod +x "$HOOKS_DIR/pre-push" + +echo "Installed git hooks: pre-push" diff --git a/scripts/pre-push b/scripts/pre-push new file mode 100755 index 00000000..e971562a --- /dev/null +++ b/scripts/pre-push @@ -0,0 +1,93 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Pre-push hook: validates v* tag pushes before they reach the remote. +# +# Checks: +# 1. package.json version matches the tag +# 2. CHANGELOG.md has a "## [{version}] - {date}" entry +# 3. CI passed upstream on GitHub for the tagged commit +# +# All failures block the push and write to stderr. + +while read -r local_ref local_sha remote_ref remote_sha; do + # Only validate v* tag pushes + if [[ "$local_ref" != refs/tags/v* ]]; then + continue + fi + + # Skip tag deletions + if [[ "$local_sha" == "0000000000000000000000000000000000000000" ]]; then + continue + fi + + TAG="${local_ref#refs/tags/}" + VERSION="${TAG#v}" + + echo >&2 "Validating release $TAG..." + + # --- 1. package.json version must match the tag --- + PKG_VERSION=$(jq -r .version package.json) + if [[ "$PKG_VERSION" != "$VERSION" ]]; then + echo >&2 "ABORT: package.json version is $PKG_VERSION but tag is $TAG" + echo >&2 "Run: jq --arg v '$VERSION' '.version = \$v' package.json > tmp && mv tmp package.json" + exit 1 + fi + echo >&2 " package.json: $PKG_VERSION ✓" + + # --- 2. CHANGELOG.md must have an entry for this version --- + if [[ ! -f CHANGELOG.md ]]; then + echo >&2 "ABORT: CHANGELOG.md not found" + exit 1 + fi + + if ! grep -q "^## \[$VERSION\] - " CHANGELOG.md; then + echo >&2 "ABORT: CHANGELOG.md has no entry for [$VERSION]" + echo >&2 "Expected: ## [$VERSION] - $(date +%Y-%m-%d)" + exit 1 + fi + echo >&2 " CHANGELOG.md: [$VERSION] ✓" + + # --- 3. CI must have passed on GitHub for this commit --- + # Resolve annotated tag to its underlying commit + COMMIT=$(git rev-list -n 1 "$TAG" 2>/dev/null || git rev-parse HEAD) + + if ! command -v gh &>/dev/null; then + echo >&2 " CI: skipped (no gh CLI)" + continue + fi + + CHECK_JSON=$(gh api "repos/{owner}/{repo}/commits/$COMMIT/check-runs" 2>/dev/null || echo "") + + if [[ -z "$CHECK_JSON" ]]; then + echo >&2 " CI: skipped (GitHub API unreachable)" + continue + fi + + TOTAL=$(echo "$CHECK_JSON" | jq -r '.total_count // 0' 2>/dev/null || echo "0") + + if [[ "$TOTAL" -eq 0 ]] 2>/dev/null; then + echo >&2 " CI: no runs found (push commit to main first and wait for CI)" + else + FAILED=$(echo "$CHECK_JSON" | jq '[.check_runs // [] | .[] | select(.conclusion == "failure")] | length' 2>/dev/null || echo "0") + PENDING=$(echo "$CHECK_JSON" | jq '[.check_runs // [] | .[] | select(.status != "completed")] | length' 2>/dev/null || echo "0") + + if [[ "$FAILED" -gt 0 ]] 2>/dev/null; then + echo >&2 "ABORT: CI failed for $COMMIT" + echo >&2 "https://github.com/tobi/qmd/commit/$COMMIT" + exit 1 + fi + + if [[ "$PENDING" -gt 0 ]] 2>/dev/null; then + echo >&2 "ABORT: CI still running ($PENDING pending)" + echo >&2 "Wait for CI to finish, then push again." + exit 1 + fi + + echo >&2 " CI: passed ✓" + fi + + echo >&2 "All checks passed for $TAG ✓" +done + +exit 0 diff --git a/scripts/release.sh b/scripts/release.sh new file mode 100755 index 00000000..9e31ddc5 --- /dev/null +++ b/scripts/release.sh @@ -0,0 +1,112 @@ +#!/usr/bin/env bash +set -euo pipefail + +# QMD Release Script +# +# Renames the [Unreleased] section in CHANGELOG.md to the new version, +# bumps package.json, commits, and creates a tag. The actual publish +# happens via GitHub Actions when the tag is pushed. +# +# Usage: ./scripts/release.sh [patch|minor|major|] +# Examples: +# ./scripts/release.sh patch # 0.9.0 -> 0.9.1 +# ./scripts/release.sh minor # 0.9.0 -> 0.10.0 +# ./scripts/release.sh major # 0.9.0 -> 1.0.0 +# ./scripts/release.sh 1.0.0 # explicit version + +BUMP="${1:?Usage: release.sh [patch|minor|major|]}" + +# Ensure we're on main and clean +BRANCH=$(git branch --show-current) +if [[ "$BRANCH" != "main" ]]; then + echo "Error: must be on main branch (currently on $BRANCH)" >&2 + exit 1 +fi + +if [[ -n "$(git status --porcelain)" ]]; then + echo "Error: working directory not clean" >&2 + git status --short + exit 1 +fi + +# Read current version +CURRENT=$(jq -r .version package.json) +echo "Current version: $CURRENT" + +# Calculate new version +bump_version() { + local current="$1" type="$2" + IFS='.' read -r major minor patch <<< "$current" + case "$type" in + major) echo "$((major + 1)).0.0" ;; + minor) echo "$major.$((minor + 1)).0" ;; + patch) echo "$major.$minor.$((patch + 1))" ;; + *) echo "$type" ;; # explicit version + esac +} + +NEW=$(bump_version "$CURRENT" "$BUMP") +DATE=$(date +%Y-%m-%d) +echo "New version: $NEW" +echo "" + +# --- Validate CHANGELOG.md --- + +if [[ ! -f CHANGELOG.md ]]; then + echo "Error: CHANGELOG.md not found" >&2 + exit 1 +fi + +# The [Unreleased] section must have content +if ! grep -q "^## \[Unreleased\]" CHANGELOG.md; then + echo "Error: no [Unreleased] section in CHANGELOG.md" >&2 + echo "" >&2 + echo "Add your changes under an [Unreleased] heading first:" >&2 + echo "" >&2 + echo " ## [Unreleased]" >&2 + echo "" >&2 + echo " ### Changes" >&2 + echo " - Your change here" >&2 + exit 1 +fi + +# --- Preview release notes --- + +echo "--- Release notes (will appear on GitHub) ---" +./scripts/extract-changelog.sh "$NEW" +echo "--- End ---" +echo "" + +# --- Confirm --- + +read -p "Release v$NEW? [y/N] " -n 1 -r +echo "" +[[ $REPLY =~ ^[Yy]$ ]] || { echo "Aborted."; exit 1; } + +# --- Rename [Unreleased] -> [X.Y.Z] - date, add fresh [Unreleased] --- + +sed -i '' "s/^## \[Unreleased\].*/## [$NEW] - $DATE/" CHANGELOG.md + +# Insert a new empty [Unreleased] section after the header +awk ' + /^## \['"$NEW"'\]/ && !done { + print "## [Unreleased]\n" + done = 1 + } + { print } +' CHANGELOG.md > CHANGELOG.md.tmp && mv CHANGELOG.md.tmp CHANGELOG.md + +# --- Bump version and commit --- + +jq --arg v "$NEW" '.version = $v' package.json > package.json.tmp && mv package.json.tmp package.json + +git add package.json CHANGELOG.md +git commit -m "release: v$NEW" +git tag -a "v$NEW" -m "v$NEW" + +echo "" +echo "Created commit and tag v$NEW" +echo "" +echo "Next: push to trigger the publish workflow" +echo "" +echo " git push origin main --tags" diff --git a/skills/qmd/SKILL.md b/skills/qmd/SKILL.md index 398aa27c..c0db8975 100644 --- a/skills/qmd/SKILL.md +++ b/skills/qmd/SKILL.md @@ -1,151 +1,144 @@ --- name: qmd -description: Search personal markdown knowledge bases, notes, meeting transcripts, and documentation using QMD - a local hybrid search engine. Combines BM25 keyword search, vector semantic search, and LLM re-ranking. Use when users ask to search notes, find documents, look up information in their knowledge base, retrieve meeting notes, or search documentation. Triggers on "search markdown files", "search my notes", "find in docs", "look up", "what did I write about", "meeting notes about". +description: Search markdown knowledge bases, notes, and documentation using QMD. Use when users ask to search notes, find documents, or look up information. license: MIT -compatibility: Requires qmd CLI or MCP server. Install via `bun install -g https://github.com/tobi/qmd`. +compatibility: Requires qmd CLI or MCP server. Install via `npm install -g @tobilu/qmd`. metadata: author: tobi - version: "1.1.1" + version: "2.0.0" allowed-tools: Bash(qmd:*), mcp__qmd__* --- # QMD - Quick Markdown Search -QMD is a local, on-device search engine for markdown content. It indexes your notes, meeting transcripts, documentation, and knowledge bases for fast retrieval. +Local search engine for markdown content. -## QMD Status +## Status -!`qmd status 2>/dev/null || echo "Not installed. Run: bun install -g https://github.com/tobi/qmd"` +!`qmd status 2>/dev/null || echo "Not installed: npm install -g @tobilu/qmd"` -## When to Use This Skill +## MCP: `query` -- User asks to search their notes, documents, or knowledge base -- User needs to find information in their markdown files -- User wants to retrieve specific documents or search across collections -- User asks "what did I write about X" or "find my notes on Y" -- User needs semantic search (conceptual similarity) not just keyword matching -- User mentions meeting notes, transcripts, or documentation lookup +```json +{ + "searches": [ + { "type": "lex", "query": "CAP theorem consistency" }, + { "type": "vec", "query": "tradeoff between consistency and availability" } + ], + "collections": ["docs"], + "limit": 10 +} +``` -## Search Commands +### Query Types -Choose the right search mode for the task: +| Type | Method | Input | +|------|--------|-------| +| `lex` | BM25 | Keywords — exact terms, names, code | +| `vec` | Vector | Question — natural language | +| `hyde` | Vector | Answer — hypothetical result (50-100 words) | -| Command | Use When | Speed | -|---------|----------|-------| -| `qmd search` | Exact keyword matches needed | Fast | -| `qmd vsearch` | Keywords aren't working, need conceptual matches | Medium | -| `qmd query` | Best results needed, speed not critical | Slower | +### Writing Good Queries -```bash -# Fast keyword search (BM25) -qmd search "your query" +**lex (keyword)** +- 2-5 terms, no filler words +- Exact phrase: `"connection pool"` (quoted) +- Exclude terms: `performance -sports` (minus prefix) +- Code identifiers work: `handleError async` -# Semantic vector search (finds conceptually similar content) -qmd vsearch "your query" +**vec (semantic)** +- Full natural language question +- Be specific: `"how does the rate limiter handle burst traffic"` +- Include context: `"in the payment service, how are refunds processed"` -# Hybrid search with re-ranking (best quality) -qmd query "your query" -``` +**hyde (hypothetical document)** +- Write 50-100 words of what the *answer* looks like +- Use the vocabulary you expect in the result -## Common Options +**expand (auto-expand)** +- Use a single-line query (implicit) or `expand: question` on its own line +- Lets the local LLM generate lex/vec/hyde variations +- Do not mix `expand:` with other typed lines — it's either a standalone expand query or a full query document -```bash --n # Number of results (default: 5) --c, --collection # Restrict to specific collection ---all # Return all matches ---min-score # Minimum score threshold (0.0-1.0) ---full # Show full document content ---json # JSON output for processing ---files # List files with scores ---line-numbers # Add line numbers to output -``` +### Intent (Disambiguation) -## Document Retrieval +When a query term is ambiguous, add `intent` to steer results: -```bash -# Get document by path -qmd get "collection/path/to/doc.md" +```json +{ + "searches": [ + { "type": "lex", "query": "performance" } + ], + "intent": "web page load times and Core Web Vitals" +} +``` -# Get document by docid (shown in search results as #abc123) -qmd get "#abc123" +Intent affects expansion, reranking, chunk selection, and snippet extraction. It does not search on its own — it's a steering signal that disambiguates queries like "performance" (web-perf vs team health vs fitness). -# Get with line numbers for code review -qmd get "docs/api.md" --line-numbers +### Combining Types -# Get multiple documents by glob pattern -qmd multi-get "docs/*.md" +| Goal | Approach | +|------|----------| +| Know exact terms | `lex` only | +| Don't know vocabulary | Use a single-line query (implicit `expand:`) or `vec` | +| Best recall | `lex` + `vec` | +| Complex topic | `lex` + `vec` + `hyde` | +| Ambiguous query | Add `intent` to any combination above | -# Get multiple documents by list -qmd multi-get "doc1.md, doc2.md, #abc123" -``` +First query gets 2x weight in fusion — put your best guess first. -## Index Management +### Lex Query Syntax -```bash -# Check index status and available collections -qmd status +| Syntax | Meaning | Example | +|--------|---------|---------| +| `term` | Prefix match | `perf` matches "performance" | +| `"phrase"` | Exact phrase | `"rate limiter"` | +| `-term` | Exclude | `performance -sports` | -# List all collections -qmd collection list +Note: `-term` only works in lex queries, not vec/hyde. -# List files in a collection -qmd ls +### Collection Filtering -# Update index (re-scan files for changes) -qmd update +```json +{ "collections": ["docs"] } // Single +{ "collections": ["docs", "notes"] } // Multiple (OR) ``` -## Score Interpretation +Omit to search all collections. -| Score | Meaning | Action | -|-------|---------|--------| -| 0.8 - 1.0 | Highly relevant | Show to user | -| 0.5 - 0.8 | Moderately relevant | Include if few results | -| 0.2 - 0.5 | Somewhat relevant | Only if user wants more | -| 0.0 - 0.2 | Low relevance | Usually skip | +## Other MCP Tools -## Recommended Workflow +| Tool | Use | +|------|-----| +| `get` | Retrieve doc by path or `#docid` | +| `multi_get` | Retrieve multiple by glob/list | +| `status` | Collections and health | -1. **Check what's available**: `qmd status` -2. **Start with keyword search**: `qmd search "topic" -n 10` -3. **Try semantic if needed**: `qmd vsearch "describe the concept"` -4. **Use hybrid for best results**: `qmd query "question" --min-score 0.4` -5. **Retrieve full documents**: `qmd get "#docid" --full` - -## Example: Finding Meeting Notes +## CLI ```bash -# Search for meetings about a topic -qmd search "quarterly review" -c meetings -n 5 - -# Get semantic matches -qmd vsearch "performance discussion" -c meetings - -# Retrieve the full meeting notes -qmd get "#abc123" --full +qmd query "question" # Auto-expand + rerank +qmd query $'lex: X\nvec: Y' # Structured +qmd query $'expand: question' # Explicit expand +qmd query --json --explain "q" # Show score traces (RRF + rerank blend) +qmd search "keywords" # BM25 only (no LLM) +qmd get "#abc123" # By docid +qmd multi-get "journals/2026-*.md" -l 40 # Batch pull snippets by glob +qmd multi-get notes/foo.md,notes/bar.md # Comma-separated list, preserves order ``` -## Example: Research Across All Notes +## HTTP API ```bash -# Hybrid search for best results -qmd query "authentication implementation" --min-score 0.3 --json - -# Get all relevant files for deeper analysis -qmd query "auth flow" --all --files --min-score 0.4 +curl -X POST http://localhost:8181/query \ + -H "Content-Type: application/json" \ + -d '{"searches": [{"type": "lex", "query": "test"}]}' ``` -## MCP Server Integration +## Setup -This plugin configures the qmd MCP server automatically. When available, prefer MCP tools over Bash for tighter integration: - -| MCP Tool | Equivalent CLI | Purpose | -|----------|---------------|---------| -| `qmd_search` | `qmd search` | Fast BM25 keyword search | -| `qmd_vsearch` | `qmd vsearch` | Semantic vector search | -| `qmd_query` | `qmd query` | Hybrid search with reranking | -| `qmd_get` | `qmd get` | Retrieve document by path or docid | -| `qmd_multi_get` | `qmd multi-get` | Retrieve multiple documents | -| `qmd_status` | `qmd status` | Index health and collection info | - -For manual MCP setup without the plugin, see [references/mcp-setup.md](references/mcp-setup.md). +```bash +npm install -g @tobilu/qmd +qmd collection add ~/notes --name notes +qmd embed +``` diff --git a/skills/qmd/references/mcp-setup.md b/skills/qmd/references/mcp-setup.md index 8614d8f3..5d32a62a 100644 --- a/skills/qmd/references/mcp-setup.md +++ b/skills/qmd/references/mcp-setup.md @@ -1,112 +1,102 @@ # QMD MCP Server Setup -Manual MCP configuration for use without the qmd plugin. +## Install -> **Note**: If using the qmd plugin, MCP configuration is included automatically. This is only needed for manual setup. - -## Claude Code +```bash +npm install -g @tobilu/qmd +qmd collection add ~/path/to/markdown --name myknowledge +qmd embed +``` -Add to `~/.claude/settings.json`: +## Configure MCP Client +**Claude Code** (`~/.claude/settings.json`): ```json { "mcpServers": { - "qmd": { - "command": "qmd", - "args": ["mcp"] - } + "qmd": { "command": "qmd", "args": ["mcp"] } } } ``` -## Claude Desktop - -Add to `~/Library/Application Support/Claude/claude_desktop_config.json`: - +**Claude Desktop** (`~/Library/Application Support/Claude/claude_desktop_config.json`): ```json { "mcpServers": { - "qmd": { - "command": "qmd", - "args": ["mcp"] + "qmd": { "command": "qmd", "args": ["mcp"] } + } +} +``` + +**OpenClaw** (`~/.openclaw/openclaw.json`): +```json +{ + "mcp": { + "servers": { + "qmd": { "command": "qmd", "args": ["mcp"] } } } } ``` -## Available MCP Tools +## HTTP Mode + +```bash +qmd mcp --http # Port 8181 +qmd mcp --http --daemon # Background +qmd mcp stop # Stop daemon +``` -Once configured, these tools become available: +## Tools -### qmd_search -Fast BM25 keyword search. +### structured_search -**Parameters:** -- `query` (required): Search query string -- `collection` (optional): Restrict to specific collection -- `limit` (optional): Number of results (default: 5) -- `minScore` (optional): Minimum relevance score +Search with pre-expanded queries. -### qmd_vsearch -Semantic vector search for conceptual similarity. +```json +{ + "searches": [ + { "type": "lex", "query": "keyword phrases" }, + { "type": "vec", "query": "natural language question" }, + { "type": "hyde", "query": "hypothetical answer passage..." } + ], + "limit": 10, + "collection": "optional", + "minScore": 0.0 +} +``` -**Parameters:** -- `query` (required): Search query string -- `collection` (optional): Restrict to specific collection -- `limit` (optional): Number of results (default: 5) -- `minScore` (optional): Minimum relevance score +| Type | Method | Input | +|------|--------|-------| +| `lex` | BM25 | Keywords (2-5 terms) | +| `vec` | Vector | Question | +| `hyde` | Vector | Answer passage (50-100 words) | -### qmd_query -Hybrid search combining BM25, vector search, and LLM re-ranking. +### get -**Parameters:** -- `query` (required): Search query string -- `collection` (optional): Restrict to specific collection -- `limit` (optional): Number of results (default: 5) -- `minScore` (optional): Minimum relevance score +Retrieve document by path or `#docid`. -### qmd_get -Retrieve a document by path or docid. +| Param | Type | Description | +|-------|------|-------------| +| `path` | string | File path or `#docid` | +| `full` | bool? | Return full content | +| `lineNumbers` | bool? | Add line numbers | -**Parameters:** -- `path` (required): Document path or docid (e.g., `#abc123`) -- `full` (optional): Return full content (default: true) -- `lineNumbers` (optional): Include line numbers +### multi_get -### qmd_multi_get Retrieve multiple documents. -**Parameters:** -- `pattern` (required): Glob pattern or comma-separated list -- `maxBytes` (optional): Skip files larger than this (default: 10KB) +| Param | Type | Description | +|-------|------|-------------| +| `pattern` | string | Glob or comma-separated list | +| `maxBytes` | number? | Skip large files (default 10KB) | -### qmd_status -Get index health and collection information. +### status -**Parameters:** None +Index health and collections. No params. ## Troubleshooting -### MCP server not starting -- Ensure qmd is in your PATH: `which qmd` -- Try running `qmd mcp` manually to see errors -- Check that Bun is installed: `bun --version` - -### No results returned -- Verify collections exist: `qmd collection list` -- Check index status: `qmd status` -- Ensure embeddings are generated: `qmd embed` - -### Slow searches -- For faster results, use `qmd_search` instead of `qmd_query` -- The first search may be slow while models load (~3GB) -- Subsequent searches are much faster - -## Choosing Between CLI and MCP - -| Scenario | Recommendation | -|----------|---------------| -| MCP configured | Use `qmd_*` tools directly | -| No MCP | Use Bash with `qmd` commands | -| Complex pipelines | Bash may be more flexible | -| Simple lookups | MCP tools are cleaner | +- **Not starting**: `which qmd`, `qmd mcp` manually +- **No results**: `qmd collection list`, `qmd embed` +- **Slow first search**: Normal, models loading (~3GB) diff --git a/skills/release/SKILL.md b/skills/release/SKILL.md new file mode 100644 index 00000000..c4b2d820 --- /dev/null +++ b/skills/release/SKILL.md @@ -0,0 +1,126 @@ +--- +name: release +description: Manage releases for this project. Validates changelog, installs git hooks, and cuts releases. Use when user says "/release", "release 1.0.5", "cut a release", or asks about the release process. NOT auto-invoked by the model. +disable-model-invocation: true +--- + +# Release + +Cut a release, validate the changelog, and ensure git hooks are installed. + +## Usage + +`/release 1.0.5` or `/release patch` (bumps patch from current version). + +## Process + +When the user triggers `/release `: + +1. **Gather context** — run `skills/release/scripts/release-context.sh `. + This silently installs git hooks and prints everything needed: version info, + working directory status, commits since last release, files changed, current + `[Unreleased]` content, and the previous release entry for style reference. + +2. **Commit outstanding work** — if the context shows staged, modified, or + untracked files that belong in this release, commit them first. Use the + /commit skill or make well-formed commits directly. + +3. **Write the changelog** — if `[Unreleased]` is empty, write it now using + the commits and file changes from the context output. Follow the changelog + standard below. Re-run the context script after committing if needed. + +4. **Cut the release** — run `scripts/release.sh `. This renames + `[Unreleased]` → `[X.Y.Z] - date`, inserts a fresh `[Unreleased]`, + bumps `package.json`, commits, and tags. + +5. **Show the final changelog** — print the full `[Unreleased]` + + minor series rollup via `scripts/extract-changelog.sh `. + Ask the user to confirm before pushing. + +6. **Push** — after explicit confirmation, run `git push origin main --tags`. + +7. **Watch CI** — after the push, start a background dispatch to watch the + publish workflow. Use `interactive_shell` in dispatch mode with: + ``` + gh run watch $(gh run list --workflow=publish.yml --limit=1 --json databaseId --jq '.[0].databaseId') --exit-status + ``` + The agent will be notified when CI completes and should report the result. + +If any step fails, stop and explain. Never force-push or skip validation. + +## Changelog Standard + +The changelog lives in `CHANGELOG.md` and follows [Keep a Changelog](https://keepachangelog.com/) conventions. + +### Heading format + +- `## [Unreleased]` — accumulates entries between releases +- `## [X.Y.Z] - YYYY-MM-DD` — released versions + +### Structure of a release entry + +Each version entry has two parts: + +**1. Highlights (optional, 1-4 sentences of prose)** + +Immediately after the version heading, before any `###` section. The elevator +pitch — what would you tell someone in 30 seconds? Only for significant +releases; skip for small patches. + +```markdown +## [1.1.0] - 2026-03-01 + +QMD now runs on both Node.js and Bun, with up to 2.7x faster reranking +through parallel contexts. GPU auto-detection replaces the unreliable +`gpu: "auto"` with explicit CUDA/Metal/Vulkan probing. +``` + +**2. Detailed changelog (`### Changes` and `### Fixes`)** + +```markdown +### Changes + +- Runtime: support Node.js (>=22) alongside Bun. The `qmd` wrapper + auto-detects a suitable install via PATH. #149 (thanks @igrigorik) +- Performance: parallel embedding & reranking — up to 2.7x faster on + multi-core machines. + +### Fixes + +- Prevent VRAM waste from duplicate context creation during concurrent + `embedBatch` calls. #152 (thanks @jkrems) +``` + +### Writing guidelines + +- **Explain the why, not just the what.** The changelog is for users. +- **Include numbers.** "2.7x faster", "17x less memory". +- **Group by theme, not by file.** "Performance" not "Changes to llm.ts". +- **Don't list every commit.** Aggregate related changes. +- **Credit contributors:** end bullets with `#NNN (thanks @username)` for + external PRs. No need to credit the repo owner. + +### What not to include + +- Internal refactors with no user-visible effect +- Dependency bumps (unless fixing a user-facing bug) +- CI/tooling changes (unless affecting the release artifact) +- Test additions (unless validating a fix worth mentioning) + +## GitHub Release Notes + +Each GitHub release includes the full changelog for the **minor series** back +to x.x.0. The `scripts/extract-changelog.sh` script handles this, and the +publish workflow (`publish.yml`) calls it to populate the GitHub release. + +## Git Hooks + +The pre-push hook (`scripts/pre-push`) blocks `v*` tag pushes unless: + +1. `package.json` version matches the tag +2. `CHANGELOG.md` has a `## [X.Y.Z] - date` entry for the version +3. CI passed on GitHub (warns in non-interactive shells, blocks in terminals) + +Hooks are installed silently by the context script. They can also be installed +manually via `skills/release/scripts/install-hooks.sh` or automatically via +`bun install` (prepare script). diff --git a/skills/release/scripts/install-hooks.sh b/skills/release/scripts/install-hooks.sh new file mode 100755 index 00000000..29dee6c7 --- /dev/null +++ b/skills/release/scripts/install-hooks.sh @@ -0,0 +1,38 @@ +#!/usr/bin/env bash +set -euo pipefail + +# Install git hooks for release validation. +# Idempotent — safe to run multiple times. + +REPO_ROOT=$(git rev-parse --show-toplevel 2>/dev/null) +if [[ -z "$REPO_ROOT" ]]; then + echo "Error: not in a git repository" >&2 + exit 1 +fi + +HOOKS_DIR="$REPO_ROOT/.git/hooks" +SOURCE="$REPO_ROOT/scripts/pre-push" + +if [[ ! -f "$SOURCE" ]]; then + echo "Error: scripts/pre-push not found at $SOURCE" >&2 + exit 1 +fi + +# Install pre-push hook +if [[ -L "$HOOKS_DIR/pre-push" ]] && [[ "$(readlink "$HOOKS_DIR/pre-push")" == "$SOURCE" ]]; then + echo "pre-push hook: already installed (symlink)" +elif [[ -f "$HOOKS_DIR/pre-push" ]]; then + # Existing hook that isn't our symlink — back it up + BACKUP="$HOOKS_DIR/pre-push.backup.$(date +%s)" + echo "pre-push hook: backing up existing hook to $(basename "$BACKUP")" + mv "$HOOKS_DIR/pre-push" "$BACKUP" + ln -sf "$SOURCE" "$HOOKS_DIR/pre-push" + echo "pre-push hook: installed (symlink → scripts/pre-push)" +else + ln -sf "$SOURCE" "$HOOKS_DIR/pre-push" + echo "pre-push hook: installed (symlink → scripts/pre-push)" +fi + +# Ensure the source is executable +chmod +x "$SOURCE" +echo "Done." diff --git a/src/bench-rerank.ts b/src/bench-rerank.ts new file mode 100644 index 00000000..3460c3aa --- /dev/null +++ b/src/bench-rerank.ts @@ -0,0 +1,316 @@ +#!/usr/bin/env bun +/** + * QMD Reranker Benchmark + * + * Measures reranking performance across different configurations. + * Reports device, parallelism, memory, VRAM, and throughput. + * + * Usage: + * bun src/bench-rerank.ts # full benchmark + * bun src/bench-rerank.ts --quick # quick smoke test (10 docs, 1 iteration) + * bun src/bench-rerank.ts --docs 100 # custom doc count + */ + +import { + getLlama, + resolveModelFile, + LlamaLogLevel, + type Llama, + type LlamaModel, +} from "node-llama-cpp"; +import { homedir } from "os"; +import { join } from "path"; +import { cpus } from "os"; + +// ============================================================================ +// Config +// ============================================================================ + +const RERANK_MODEL = "hf:ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/qwen3-reranker-0.6b-q8_0.gguf"; +const MODEL_CACHE = join(homedir(), ".cache", "qmd", "models"); +const CONTEXT_SIZE = 2048; + +const args = process.argv.slice(2); +const quick = args.includes("--quick"); +const docsIdx = args.indexOf("--docs"); +const DOC_COUNT = docsIdx >= 0 ? parseInt(args[docsIdx + 1]!) : (quick ? 10 : 40); +const ITERATIONS = quick ? 1 : 3; +const PARALLEL_CONFIGS = quick ? [1, 4] : [1, 2, 4, 8]; + +// ============================================================================ +// Test data — realistic-ish chunks of varying length +// ============================================================================ + +const QUERY = "How do AI agents work and what are their limitations?"; + +function generateDocs(n: number): string[] { + const templates = [ + "Artificial intelligence agents are software systems that perceive their environment and take actions to achieve goals. They use techniques like reinforcement learning, planning, and natural language processing to operate autonomously.", + "The transformer architecture, introduced in 2017, revolutionized natural language processing. Self-attention mechanisms allow models to weigh the importance of different parts of input sequences when generating outputs.", + "Machine learning models require careful evaluation to avoid overfitting. Cross-validation, holdout sets, and metrics like precision, recall, and F1 score help assess generalization performance.", + "Retrieval-augmented generation combines information retrieval with language models. Documents are embedded into vector spaces, retrieved based on query similarity, and used as context for generation.", + "Neural network training involves forward propagation, loss computation, and backpropagation. Optimizers like Adam and SGD adjust weights to minimize the loss function over training iterations.", + "Large language models exhibit emergent capabilities at scale, including few-shot learning, chain-of-thought reasoning, and instruction following. These properties were not explicitly trained for.", + "Embedding models convert text into dense vector representations that capture semantic meaning. Similar texts produce similar vectors, enabling efficient similarity search and clustering.", + "Autonomous agents face challenges including hallucination, lack of grounding, limited planning horizons, and difficulty with multi-step reasoning. Safety and alignment remain open research problems.", + "The attention mechanism computes query-key-value interactions to determine which parts of the input are most relevant. Multi-head attention allows the model to attend to different representation subspaces.", + "Fine-tuning adapts a pre-trained model to specific tasks using domain-specific data. Techniques like LoRA reduce the number of trainable parameters while maintaining performance.", + ]; + return Array.from({ length: n }, (_, i) => templates[i % templates.length]!); +} + +// ============================================================================ +// Helpers +// ============================================================================ + +function formatBytes(bytes: number): string { + if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; + if (bytes < 1024 * 1024 * 1024) return `${(bytes / (1024 * 1024)).toFixed(1)} MB`; + return `${(bytes / (1024 * 1024 * 1024)).toFixed(2)} GB`; +} + +function getMemUsage(): { rss: number; heapUsed: number } { + const m = process.memoryUsage(); + return { rss: m.rss, heapUsed: m.heapUsed }; +} + +function median(arr: number[]): number { + const sorted = [...arr].sort((a, b) => a - b); + const mid = Math.floor(sorted.length / 2); + return sorted.length % 2 !== 0 ? sorted[mid]! : (sorted[mid - 1]! + sorted[mid]!) / 2; +} + +// ============================================================================ +// Benchmark runner +// ============================================================================ + +interface BenchResult { + parallelism: number; + contextSize: number; + flashAttention: boolean; + times: number[]; // ms per run + medianMs: number; + docsPerSec: number; + vramPerContext: number; // bytes + totalVram: number; // bytes + peakRss: number; // bytes +} + +async function benchmarkConfig( + model: LlamaModel, + llama: Llama, + docs: string[], + parallelism: number, + flash: boolean, +): Promise { + // Measure VRAM before + const vramBefore = llama.gpu ? await llama.getVramState() : null; + const rssBefore = getMemUsage().rss; + + // Create contexts. On CPU, split threads evenly across contexts. + const cpuThreads = !llama.gpu ? Math.floor(llama.cpuMathCores / parallelism) : 0; + const contexts = []; + for (let i = 0; i < parallelism; i++) { + try { + contexts.push(await model.createRankingContext({ + contextSize: CONTEXT_SIZE, + flashAttention: flash, + ...(cpuThreads > 0 ? { threads: cpuThreads } : {}), + })); + } catch { + if (contexts.length === 0) { + // Try without flash + contexts.push(await model.createRankingContext({ + contextSize: CONTEXT_SIZE, + ...(cpuThreads > 0 ? { threads: cpuThreads } : {}), + })); + } + break; + } + } + const actualParallelism = contexts.length; + + // Measure VRAM after context creation + const vramAfter = llama.gpu ? await llama.getVramState() : null; + const vramUsed = vramBefore && vramAfter ? vramAfter.used - vramBefore.used : 0; + const vramPerCtx = actualParallelism > 0 ? vramUsed / actualParallelism : 0; + + // Warm up + await contexts[0]!.rankAll(QUERY, docs.slice(0, 2)); + + // Benchmark iterations + const times: number[] = []; + let peakRss = getMemUsage().rss; + + for (let iter = 0; iter < ITERATIONS; iter++) { + const chunkSize = Math.ceil(docs.length / actualParallelism); + + const t0 = performance.now(); + const allScores = await Promise.all( + Array.from({ length: actualParallelism }, (_, i) => { + const chunk = docs.slice(i * chunkSize, (i + 1) * chunkSize); + return chunk.length > 0 ? contexts[i]!.rankAll(QUERY, chunk) : Promise.resolve([]); + }) + ); + const elapsed = performance.now() - t0; + times.push(elapsed); + + // Verify scores are valid + const flat = allScores.flat(); + if (flat.some(s => s < 0 || s > 1 || isNaN(s))) { + throw new Error("Invalid scores detected"); + } + + const currentRss = getMemUsage().rss; + if (currentRss > peakRss) peakRss = currentRss; + } + + // Cleanup + for (const ctx of contexts) await ctx.dispose(); + + const med = median(times); + return { + parallelism: actualParallelism, + contextSize: CONTEXT_SIZE, + flashAttention: flash, + times, + medianMs: med, + docsPerSec: (docs.length / med) * 1000, + vramPerContext: vramPerCtx, + totalVram: vramUsed, + peakRss, + }; +} + +// ============================================================================ +// Main +// ============================================================================ + +async function main() { + console.log("═══════════════════════════════════════════════════════════════"); + console.log(" QMD Reranker Benchmark"); + console.log("═══════════════════════════════════════════════════════════════\n"); + + const llama = await getLlama({ + // attempt to build + build: "autoAttempt", + logLevel: LlamaLogLevel.error + }); + let gpuLabel: string = llama.gpu === false + ? "cpu" + : llama.gpu; + + // System info + const cpuInfo = cpus(); + const cpuModel = cpuInfo[0]?.model || "unknown"; + const cpuCount = cpuInfo.length; + + console.log("System"); + console.log(` CPU: ${cpuModel}`); + console.log(` Cores: ${cpuCount} (${llama.cpuMathCores} math)`); + console.log(` Device: ${gpuLabel}`); + + if (llama.gpu) { + const gpuNames = await llama.getGpuDeviceNames(); + const counts = new Map(); + for (const name of gpuNames) counts.set(name, (counts.get(name) || 0) + 1); + const devStr = Array.from(counts.entries()) + .map(([name, n]) => n > 1 ? `${n}× ${name}` : name).join(", "); + console.log(` GPU: ${devStr}`); + const vram = await llama.getVramState(); + console.log(` VRAM: ${formatBytes(vram.total)} total, ${formatBytes(vram.free)} free`); + } + + console.log(` RAM: ${formatBytes(getMemUsage().rss)} RSS at start`); + + // Load model + console.log(`\nModel`); + console.log(` URI: ${RERANK_MODEL}`); + const modelPath = await resolveModelFile(RERANK_MODEL, MODEL_CACHE); + const vramPreModel = llama.gpu ? await llama.getVramState() : null; + const model = await llama.loadModel({ modelPath }); + const vramPostModel = llama.gpu ? await llama.getVramState() : null; + const modelVram = vramPreModel && vramPostModel ? vramPostModel.used - vramPreModel.used : 0; + console.log(` Params: ${model.trainContextSize} train ctx`); + if (modelVram > 0) console.log(` VRAM: ${formatBytes(modelVram)} (model weights)`); + + // Generate test docs + const docs = generateDocs(DOC_COUNT); + console.log(`\nBenchmark`); + console.log(` Documents: ${DOC_COUNT}`); + console.log(` Ctx size: ${CONTEXT_SIZE}`); + console.log(` Iterations:${ITERATIONS}`); + console.log(` Query: "${QUERY.slice(0, 50)}..."`); + + // Run benchmarks + const results: BenchResult[] = []; + + for (const p of PARALLEL_CONFIGS) { + if (!llama.gpu && p > 1) { + // CPU: only test if we have enough cores (at least 4 per context) + if (llama.cpuMathCores < p * 4) { + console.log(`\n [${p} ctx] skipped (need ${p * 4} cores, have ${llama.cpuMathCores})`); + continue; + } + } + + // Test with flash attention + process.stdout.write(`\n [${p} ctx, flash] running...`); + try { + const r = await benchmarkConfig(model, llama, docs, p, true); + results.push(r); + process.stdout.write(` ${r.medianMs.toFixed(0)}ms (${r.docsPerSec.toFixed(1)} docs/s)\n`); + } catch (e: any) { + process.stdout.write(` failed: ${e.message}\n`); + // Try without flash + process.stdout.write(` [${p} ctx, no flash] running...`); + try { + const r = await benchmarkConfig(model, llama, docs, p, false); + results.push(r); + process.stdout.write(` ${r.medianMs.toFixed(0)}ms (${r.docsPerSec.toFixed(1)} docs/s)\n`); + } catch (e2: any) { + process.stdout.write(` failed: ${e2.message}\n`); + } + } + } + + // Summary table + console.log("\n═══════════════════════════════════════════════════════════════"); + console.log(" Results"); + console.log("═══════════════════════════════════════════════════════════════\n"); + + const header = " Ctx Flash Median Docs/s VRAM/ctx Total VRAM Peak RSS"; + const sep = " ─── ───── ────── ────── ──────── ────────── ────────"; + console.log(header); + console.log(sep); + + const baseline = results[0]?.medianMs ?? 1; + for (const r of results) { + const speedup = baseline / r.medianMs; + const speedupStr = r === results[0] ? " " : `(${speedup.toFixed(1)}×)`; + console.log( + ` ${String(r.parallelism).padStart(3)} ` + + `${r.flashAttention ? " yes " : " no "} ` + + `${r.medianMs.toFixed(0).padStart(5)}ms ` + + `${r.docsPerSec.toFixed(1).padStart(6)} ` + + `${formatBytes(r.vramPerContext).padStart(8)} ` + + `${formatBytes(r.totalVram).padStart(10)} ` + + `${formatBytes(r.peakRss).padStart(8)} ` + + speedupStr + ); + } + + // Best config + if (results.length > 0) { + const best = results.reduce((a, b) => a.docsPerSec > b.docsPerSec ? a : b); + console.log(`\n Best: ${best.parallelism} contexts, flash=${best.flashAttention}`); + console.log(` ${best.medianMs.toFixed(0)}ms for ${DOC_COUNT} docs (${best.docsPerSec.toFixed(1)} docs/s)`); + if (best.totalVram > 0) console.log(` ${formatBytes(best.totalVram)} VRAM`); + } + + console.log(""); + await model.dispose(); + await llama.dispose(); +} + +main().catch(console.error); diff --git a/src/collections.ts b/src/collections.ts index f13ba70c..257f144f 100644 --- a/src/collections.ts +++ b/src/collections.ts @@ -6,7 +6,7 @@ */ import { existsSync, mkdirSync, readFileSync, writeFileSync } from "fs"; -import { join } from "path"; +import { join, dirname } from "path"; import { homedir } from "os"; import YAML from "yaml"; @@ -25,10 +25,12 @@ export type ContextMap = Record; * A single collection configuration */ export interface Collection { - path: string; // Absolute path to index - pattern: string; // Glob pattern (e.g., "**/*.md") - context?: ContextMap; // Optional context definitions - update?: string; // Optional bash command to run during qmd update + path: string; // Absolute path to index + pattern: string; // Glob pattern (e.g., "**/*.md") + ignore?: string[]; // Glob patterns to exclude (e.g., ["Sessions/**"]) + context?: ContextMap; // Optional context definitions + update?: string; // Optional bash command to run during qmd update + includeByDefault?: boolean; // Include in queries by default (default: true) } /** @@ -53,12 +55,48 @@ export interface NamedCollection extends Collection { // Current index name (default: "index") let currentIndexName: string = "index"; +// SDK mode: optional in-memory config or custom config path +let configSource: { type: 'file'; path?: string } | { type: 'inline'; config: CollectionConfig } = { type: 'file' }; + +/** + * Set the config source for SDK mode. + * - File path: load/save from a specific YAML file + * - Inline config: use an in-memory CollectionConfig (saveConfig updates in place, no file I/O) + * - undefined: reset to default file-based config + */ +export function setConfigSource(source?: { configPath?: string; config?: CollectionConfig }): void { + if (!source) { + configSource = { type: 'file' }; + return; + } + if (source.config) { + // Ensure collections object exists + if (!source.config.collections) { + source.config.collections = {}; + } + configSource = { type: 'inline', config: source.config }; + } else if (source.configPath) { + configSource = { type: 'file', path: source.configPath }; + } else { + configSource = { type: 'file' }; + } +} + /** * Set the current index name for config file lookup * Config file will be ~/.config/qmd/{indexName}.yml */ export function setConfigIndexName(name: string): void { - currentIndexName = name; + // Resolve relative paths to absolute paths and sanitize for use as filename + if (name.includes('/')) { + const { resolve } = require('path'); + const { cwd } = require('process'); + const absolutePath = resolve(cwd(), name); + // Replace path separators with underscores to create a valid filename + currentIndexName = absolutePath.replace(/\//g, '_').replace(/^_/, ''); + } else { + currentIndexName = name; + } } function getConfigDir(): string { @@ -66,6 +104,10 @@ function getConfigDir(): string { if (process.env.QMD_CONFIG_DIR) { return process.env.QMD_CONFIG_DIR; } + // Respect XDG Base Directory specification (consistent with store.ts) + if (process.env.XDG_CONFIG_HOME) { + return join(process.env.XDG_CONFIG_HOME, "qmd"); + } return join(homedir(), ".config", "qmd"); } @@ -88,11 +130,19 @@ function ensureConfigDir(): void { // ============================================================================ /** - * Load configuration from ~/.config/qmd/index.yml + * Load configuration from the configured source. + * - Inline config: returns the in-memory object directly + * - File-based: reads from YAML file (default ~/.config/qmd/index.yml) * Returns empty config if file doesn't exist */ export function loadConfig(): CollectionConfig { - const configPath = getConfigFilePath(); + // SDK inline config mode + if (configSource.type === 'inline') { + return configSource.config; + } + + // File-based config (SDK custom path or default) + const configPath = configSource.path || getConfigFilePath(); if (!existsSync(configPath)) { return { collections: {} }; } @@ -113,11 +163,22 @@ export function loadConfig(): CollectionConfig { } /** - * Save configuration to ~/.config/qmd/index.yml + * Save configuration to the configured source. + * - Inline config: updates the in-memory object (no file I/O) + * - File-based: writes to YAML file (default ~/.config/qmd/index.yml) */ export function saveConfig(config: CollectionConfig): void { - ensureConfigDir(); - const configPath = getConfigFilePath(); + // SDK inline config mode: update in place, no file I/O + if (configSource.type === 'inline') { + configSource.config = config; + return; + } + + const configPath = configSource.path || getConfigFilePath(); + const configDir = dirname(configPath); + if (!existsSync(configDir)) { + mkdirSync(configDir, { recursive: true }); + } try { const yaml = YAML.stringify(config, { @@ -156,6 +217,52 @@ export function listCollections(): NamedCollection[] { })); } +/** + * Get collections that are included by default in queries + */ +export function getDefaultCollections(): NamedCollection[] { + return listCollections().filter(c => c.includeByDefault !== false); +} + +/** + * Get collection names that are included by default + */ +export function getDefaultCollectionNames(): string[] { + return getDefaultCollections().map(c => c.name); +} + +/** + * Update a collection's settings + */ +export function updateCollectionSettings( + name: string, + settings: { update?: string | null; includeByDefault?: boolean } +): boolean { + const config = loadConfig(); + const collection = config.collections[name]; + if (!collection) return false; + + if (settings.update !== undefined) { + if (settings.update === null) { + delete collection.update; + } else { + collection.update = settings.update; + } + } + + if (settings.includeByDefault !== undefined) { + if (settings.includeByDefault === true) { + // true is default, remove the field + delete collection.includeByDefault; + } else { + collection.includeByDefault = settings.includeByDefault; + } + } + + saveConfig(config); + return true; +} + /** * Add or update a collection */ @@ -370,14 +477,17 @@ export function findContextForPath( * Get the config file path (useful for error messages) */ export function getConfigPath(): string { - return getConfigFilePath(); + if (configSource.type === 'inline') return ''; + return configSource.path || getConfigFilePath(); } /** * Check if config file exists */ export function configExists(): boolean { - return existsSync(getConfigFilePath()); + if (configSource.type === 'inline') return true; + const path = configSource.path || getConfigFilePath(); + return existsSync(path); } /** diff --git a/src/db.ts b/src/db.ts new file mode 100644 index 00000000..1e5e5709 --- /dev/null +++ b/src/db.ts @@ -0,0 +1,54 @@ +/** + * db.ts - Cross-runtime SQLite compatibility layer + * + * Provides a unified Database export that works under both Bun (bun:sqlite) + * and Node.js (better-sqlite3). The APIs are nearly identical — the main + * difference is the import path. + */ + +export const isBun = typeof globalThis.Bun !== "undefined"; + +let _Database: any; +let _sqliteVecLoad: (db: any) => void; + +if (isBun) { + // Dynamic string prevents tsc from resolving bun:sqlite on Node.js builds + const bunSqlite = "bun:" + "sqlite"; + _Database = (await import(/* @vite-ignore */ bunSqlite)).Database; + const { getLoadablePath } = await import("sqlite-vec"); + _sqliteVecLoad = (db: any) => db.loadExtension(getLoadablePath()); +} else { + _Database = (await import("better-sqlite3")).default; + const sqliteVec = await import("sqlite-vec"); + _sqliteVecLoad = (db: any) => sqliteVec.load(db); +} + +/** + * Open a SQLite database. Works with both bun:sqlite and better-sqlite3. + */ +export function openDatabase(path: string): Database { + return new _Database(path) as Database; +} + +/** + * Common subset of the Database interface used throughout QMD. + */ +export interface Database { + exec(sql: string): void; + prepare(sql: string): Statement; + loadExtension(path: string): void; + close(): void; +} + +export interface Statement { + run(...params: any[]): { changes: number; lastInsertRowid: number | bigint }; + get(...params: any[]): any; + all(...params: any[]): any[]; +} + +/** + * Load the sqlite-vec extension into a database. + */ +export function loadSqliteVec(db: Database): void { + _sqliteVecLoad(db); +} diff --git a/src/formatter.ts b/src/formatter.ts index 756c8d3a..bf37316f 100644 --- a/src/formatter.ts +++ b/src/formatter.ts @@ -40,6 +40,7 @@ export type FormatOptions = { query?: string; // Query for snippet extraction and highlighting useColor?: boolean; // Enable terminal colors (default: false for non-CLI) lineNumbers?: boolean;// Add line numbers to output + intent?: string; // Domain intent for snippet extraction disambiguation }; // ============================================================================= @@ -101,7 +102,7 @@ export function searchResultsToJson( const output = results.map(row => { const bodyStr = row.body || ""; let body = opts.full ? bodyStr : undefined; - let snippet = !opts.full ? extractSnippet(bodyStr, query, 300, row.chunkPos).snippet : undefined; + let snippet = !opts.full ? extractSnippet(bodyStr, query, 300, row.chunkPos, undefined, opts.intent).snippet : undefined; if (opts.lineNumbers) { if (body) body = addLineNumbers(body); @@ -132,7 +133,7 @@ export function searchResultsToCsv( const header = "docid,score,file,title,context,line,snippet"; const rows = results.map(row => { const bodyStr = row.body || ""; - const { line, snippet } = extractSnippet(bodyStr, query, 500, row.chunkPos); + const { line, snippet } = extractSnippet(bodyStr, query, 500, row.chunkPos, undefined, opts.intent); let content = opts.full ? bodyStr : snippet; if (opts.lineNumbers && content) { content = addLineNumbers(content); @@ -175,12 +176,13 @@ export function searchResultsToMarkdown( if (opts.full) { content = bodyStr; } else { - content = extractSnippet(bodyStr, query, 500, row.chunkPos).snippet; + content = extractSnippet(bodyStr, query, 500, row.chunkPos, undefined, opts.intent).snippet; } if (opts.lineNumbers) { content = addLineNumbers(content); } - return `---\n# ${heading}\n\n**docid:** \`#${row.docid}\`\n\n${content}\n`; + const contextLine = row.context ? `**context:** ${row.context}\n` : ""; + return `---\n# ${heading}\n\n**docid:** \`#${row.docid}\`\n${contextLine}\n${content}\n`; }).join("\n"); } @@ -195,11 +197,12 @@ export function searchResultsToXml( const items = results.map(row => { const titleAttr = row.title ? ` title="${escapeXml(row.title)}"` : ""; const bodyStr = row.body || ""; - let content = opts.full ? bodyStr : extractSnippet(bodyStr, query, 500, row.chunkPos).snippet; + let content = opts.full ? bodyStr : extractSnippet(bodyStr, query, 500, row.chunkPos, undefined, opts.intent).snippet; if (opts.lineNumbers) { content = addLineNumbers(content); } - return `\n${escapeXml(content)}\n`; + const contextAttr = row.context ? ` context="${escapeXml(row.context)}"` : ""; + return `\n${escapeXml(content)}\n`; }); return items.join("\n\n"); } diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 00000000..4fbd52b8 --- /dev/null +++ b/src/index.ts @@ -0,0 +1,249 @@ +/** + * QMD SDK - Library mode for programmatic access to QMD search and indexing. + * + * Usage: + * import { createStore } from '@tobilu/qmd' + * + * const store = createStore({ + * dbPath: './my-index.sqlite', + * config: { + * collections: { + * docs: { path: '/path/to/docs', pattern: '**\/*.md' } + * } + * } + * }) + * + * const results = await store.query("how does auth work?") + * store.close() + */ + +import { + createStore as createStoreInternal, + hybridQuery, + structuredSearch, + listCollections as storeListCollections, + type Store as InternalStore, + type DocumentResult, + type DocumentNotFound, + type SearchResult, + type HybridQueryResult, + type HybridQueryOptions, + type HybridQueryExplain, + type StructuredSubSearch, + type StructuredSearchOptions, + type MultiGetResult, + type IndexStatus, + type IndexHealthInfo, + type ExpandedQuery, + type SearchHooks, +} from "./store.js"; +import { + setConfigSource, + loadConfig, + addCollection as collectionsAddCollection, + removeCollection as collectionsRemoveCollection, + renameCollection as collectionsRenameCollection, + listCollections as collectionsListCollections, + addContext as collectionsAddContext, + removeContext as collectionsRemoveContext, + setGlobalContext as collectionsSetGlobalContext, + getGlobalContext as collectionsGetGlobalContext, + listAllContexts as collectionsListAllContexts, + type Collection, + type CollectionConfig, + type NamedCollection, + type ContextMap, +} from "./collections.js"; + +// Re-export types for SDK consumers +export type { + DocumentResult, + DocumentNotFound, + SearchResult, + HybridQueryResult, + HybridQueryOptions, + HybridQueryExplain, + StructuredSubSearch, + StructuredSearchOptions, + MultiGetResult, + IndexStatus, + IndexHealthInfo, + ExpandedQuery, + SearchHooks, + Collection, + CollectionConfig, + NamedCollection, + ContextMap, +}; + +/** + * Options for creating a QMD store. + * You must provide `dbPath` and either `configPath` (YAML file) or `config` (inline). + */ +export interface StoreOptions { + /** Path to the SQLite database file */ + dbPath: string; + /** Path to a YAML config file (mutually exclusive with `config`) */ + configPath?: string; + /** Inline collection config (mutually exclusive with `configPath`) */ + config?: CollectionConfig; +} + +/** + * The QMD SDK store — provides search, retrieval, collection management, + * context management, and indexing operations. + */ +export interface QMDStore { + /** The underlying internal store (for advanced use) */ + readonly internal: InternalStore; + /** Path to the SQLite database */ + readonly dbPath: string; + + // ── Search & Retrieval ────────────────────────────────────────────── + + /** Hybrid search: BM25 + vector + query expansion + LLM reranking */ + query(query: string, options?: HybridQueryOptions): Promise; + + /** BM25 full-text keyword search (fast, no LLM) */ + search(query: string, options?: { limit?: number; collection?: string }): SearchResult[]; + + /** Structured search with pre-expanded queries (for LLM callers) */ + structuredSearch(searches: StructuredSubSearch[], options?: StructuredSearchOptions): Promise; + + /** Get a single document by path or docid */ + get(pathOrDocid: string, options?: { includeBody?: boolean }): DocumentResult | DocumentNotFound; + + /** Get multiple documents by glob pattern or comma-separated list */ + multiGet(pattern: string, options?: { includeBody?: boolean; maxBytes?: number }): { docs: MultiGetResult[]; errors: string[] }; + + // ── Collection Management ─────────────────────────────────────────── + + /** Add or update a collection */ + addCollection(name: string, opts: { path: string; pattern?: string; ignore?: string[] }): void; + + /** Remove a collection */ + removeCollection(name: string): boolean; + + /** Rename a collection */ + renameCollection(oldName: string, newName: string): boolean; + + /** List all collections with document stats */ + listCollections(): { name: string; pwd: string; glob_pattern: string; doc_count: number; active_count: number; last_modified: string | null }[]; + + // ── Context Management ────────────────────────────────────────────── + + /** Add context for a path within a collection */ + addContext(collectionName: string, pathPrefix: string, contextText: string): boolean; + + /** Remove context from a collection path */ + removeContext(collectionName: string, pathPrefix: string): boolean; + + /** Set global context (applies to all collections) */ + setGlobalContext(context: string | undefined): void; + + /** Get global context */ + getGlobalContext(): string | undefined; + + /** List all contexts across all collections */ + listContexts(): Array<{ collection: string; path: string; context: string }>; + + // ── Index Health ──────────────────────────────────────────────────── + + /** Get index status (document counts, collections, embedding state) */ + getStatus(): IndexStatus; + + /** Get index health info (stale embeddings, etc.) */ + getIndexHealth(): IndexHealthInfo; + + // ── Lifecycle ─────────────────────────────────────────────────────── + + /** Close the database connection */ + close(): void; +} + +/** + * Create a QMD store for programmatic access to search and indexing. + * + * @example + * ```typescript + * // With a YAML config file + * const store = createStore({ + * dbPath: './index.sqlite', + * configPath: './qmd.yml', + * }) + * + * // With inline config (no files needed besides the DB) + * const store = createStore({ + * dbPath: './index.sqlite', + * config: { + * collections: { + * docs: { path: '/path/to/docs', pattern: '**\/*.md' } + * } + * } + * }) + * + * const results = await store.query("authentication flow") + * store.close() + * ``` + */ +export function createStore(options: StoreOptions): QMDStore { + if (!options.dbPath) { + throw new Error("dbPath is required"); + } + if (!options.configPath && !options.config) { + throw new Error("Either configPath or config is required"); + } + if (options.configPath && options.config) { + throw new Error("Provide either configPath or config, not both"); + } + + // Inject config source into collections module + setConfigSource({ + configPath: options.configPath, + config: options.config, + }); + + // Create the internal store + const internal = createStoreInternal(options.dbPath); + + const store: QMDStore = { + internal, + dbPath: internal.dbPath, + + // Search & Retrieval + query: (q, opts) => hybridQuery(internal, q, opts), + search: (q, opts) => internal.searchFTS(q, opts?.limit, opts?.collection), + structuredSearch: (searches, opts) => structuredSearch(internal, searches, opts), + get: (pathOrDocid, opts) => internal.findDocument(pathOrDocid, opts), + multiGet: (pattern, opts) => internal.findDocuments(pattern, opts), + + // Collection Management + addCollection: (name, opts) => { + collectionsAddCollection(name, opts.path, opts.pattern); + }, + removeCollection: (name) => collectionsRemoveCollection(name), + renameCollection: (oldName, newName) => collectionsRenameCollection(oldName, newName), + listCollections: () => storeListCollections(internal.db), + + // Context Management + addContext: (collectionName, pathPrefix, contextText) => + collectionsAddContext(collectionName, pathPrefix, contextText), + removeContext: (collectionName, pathPrefix) => + collectionsRemoveContext(collectionName, pathPrefix), + setGlobalContext: (context) => collectionsSetGlobalContext(context), + getGlobalContext: () => collectionsGetGlobalContext(), + listContexts: () => collectionsListAllContexts(), + + // Index Health + getStatus: () => internal.getStatus(), + getIndexHealth: () => internal.getIndexHealth(), + + // Lifecycle + close: () => { + internal.close(); + setConfigSource(undefined); // Reset config source + }, + }; + + return store; +} diff --git a/src/llm.ts b/src/llm.ts index ab39c861..100a1ec7 100644 --- a/src/llm.ts +++ b/src/llm.ts @@ -22,19 +22,38 @@ import { existsSync, mkdirSync, statSync, unlinkSync, readdirSync, readFileSync, // Embedding Formatting Functions // ============================================================================= +/** + * Detect if a model URI uses the Qwen3-Embedding format. + * Qwen3-Embedding uses a different prompting style than nomic/embeddinggemma. + */ +export function isQwen3EmbeddingModel(modelUri: string): boolean { + return /qwen.*embed/i.test(modelUri) || /embed.*qwen/i.test(modelUri); +} + /** * Format a query for embedding. - * Uses nomic-style task prefix format for embeddinggemma. + * Uses nomic-style task prefix format for embeddinggemma (default). + * Uses Qwen3-Embedding instruct format when a Qwen embedding model is active. */ -export function formatQueryForEmbedding(query: string): string { +export function formatQueryForEmbedding(query: string, modelUri?: string): string { + const uri = modelUri ?? process.env.QMD_EMBED_MODEL ?? DEFAULT_EMBED_MODEL; + if (isQwen3EmbeddingModel(uri)) { + return `Instruct: Retrieve relevant documents for the given query\nQuery: ${query}`; + } return `task: search result | query: ${query}`; } /** * Format a document for embedding. - * Uses nomic-style format with title and text fields. + * Uses nomic-style format with title and text fields (default). + * Qwen3-Embedding encodes documents as raw text without special prefixes. */ -export function formatDocForEmbedding(text: string, title?: string): string { +export function formatDocForEmbedding(text: string, title?: string, modelUri?: string): string { + const uri = modelUri ?? process.env.QMD_EMBED_MODEL ?? DEFAULT_EMBED_MODEL; + if (isQwen3EmbeddingModel(uri)) { + // Qwen3-Embedding: documents are raw text, no task prefix + return title ? `${title}\n${text}` : text; + } return `title: ${title || "none"} | text: ${text}`; } @@ -173,11 +192,18 @@ export type RerankDocument = { // HuggingFace model URIs for node-llama-cpp // Format: hf:// -const DEFAULT_EMBED_MODEL = "hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf"; +// Override via QMD_EMBED_MODEL env var (e.g. hf:Qwen/Qwen3-Embedding-0.6B-GGUF/qwen3-embedding-0.6b-q8_0.gguf) +const DEFAULT_EMBED_MODEL = process.env.QMD_EMBED_MODEL ?? "hf:ggml-org/embeddinggemma-300M-GGUF/embeddinggemma-300M-Q8_0.gguf"; const DEFAULT_RERANK_MODEL = "hf:ggml-org/Qwen3-Reranker-0.6B-Q8_0-GGUF/qwen3-reranker-0.6b-q8_0.gguf"; // const DEFAULT_GENERATE_MODEL = "hf:ggml-org/Qwen3-0.6B-GGUF/Qwen3-0.6B-Q8_0.gguf"; const DEFAULT_GENERATE_MODEL = "hf:tobil/qmd-query-expansion-1.7B-gguf/qmd-query-expansion-1.7B-q4_k_m.gguf"; +// Alternative generation models for query expansion: +// LiquidAI LFM2 - hybrid architecture optimized for edge/on-device inference +// Use these as base for fine-tuning with configs/sft_lfm2.yaml +export const LFM2_GENERATE_MODEL = "hf:LiquidAI/LFM2-1.2B-GGUF/LFM2-1.2B-Q4_K_M.gguf"; +export const LFM2_INSTRUCT_MODEL = "hf:LiquidAI/LFM2.5-1.2B-Instruct-GGUF/LFM2.5-1.2B-Instruct-Q4_K_M.gguf"; + export const DEFAULT_EMBED_MODEL_URI = DEFAULT_EMBED_MODEL; export const DEFAULT_RERANK_MODEL_URI = DEFAULT_RERANK_MODEL; export const DEFAULT_GENERATE_MODEL_URI = DEFAULT_GENERATE_MODEL; @@ -328,6 +354,11 @@ export type LlamaCppConfig = { generateModel?: string; rerankModel?: string; modelCacheDir?: string; + /** + * Context size used for query expansion generation contexts. + * Default: 2048. Can also be set via QMD_EXPAND_CONTEXT_SIZE. + */ + expandContextSize?: number; /** * Inactivity timeout in ms before unloading contexts (default: 2 minutes, 0 to disable). * @@ -350,23 +381,45 @@ export type LlamaCppConfig = { */ // Default inactivity timeout: 5 minutes (keep models warm during typical search sessions) const DEFAULT_INACTIVITY_TIMEOUT_MS = 5 * 60 * 1000; +const DEFAULT_EXPAND_CONTEXT_SIZE = 2048; + +function resolveExpandContextSize(configValue?: number): number { + if (configValue !== undefined) { + if (!Number.isInteger(configValue) || configValue <= 0) { + throw new Error(`Invalid expandContextSize: ${configValue}. Must be a positive integer.`); + } + return configValue; + } + + const envValue = process.env.QMD_EXPAND_CONTEXT_SIZE?.trim(); + if (!envValue) return DEFAULT_EXPAND_CONTEXT_SIZE; + + const parsed = Number.parseInt(envValue, 10); + if (!Number.isInteger(parsed) || parsed <= 0) { + process.stderr.write( + `QMD Warning: invalid QMD_EXPAND_CONTEXT_SIZE="${envValue}", using default ${DEFAULT_EXPAND_CONTEXT_SIZE}.\n` + ); + return DEFAULT_EXPAND_CONTEXT_SIZE; + } + return parsed; +} export class LlamaCpp implements LLM { private llama: Llama | null = null; private embedModel: LlamaModel | null = null; - private embedContext: LlamaEmbeddingContext | null = null; + private embedContexts: LlamaEmbeddingContext[] = []; private generateModel: LlamaModel | null = null; private rerankModel: LlamaModel | null = null; - private rerankContext: Awaited> | null = null; + private rerankContexts: Awaited>[] = []; private embedModelUri: string; private generateModelUri: string; private rerankModelUri: string; private modelCacheDir: string; + private expandContextSize: number; // Ensure we don't load the same model/context concurrently (which can allocate duplicate VRAM). private embedModelLoadPromise: Promise | null = null; - private embedContextCreatePromise: Promise | null = null; private generateModelLoadPromise: Promise | null = null; private rerankModelLoadPromise: Promise | null = null; @@ -384,6 +437,7 @@ export class LlamaCpp implements LLM { this.generateModelUri = config.generateModel || DEFAULT_GENERATE_MODEL; this.rerankModelUri = config.rerankModel || DEFAULT_RERANK_MODEL; this.modelCacheDir = config.modelCacheDir || MODEL_CACHE_DIR; + this.expandContextSize = resolveExpandContextSize(config.expandContextSize); this.inactivityTimeoutMs = config.inactivityTimeoutMs ?? DEFAULT_INACTIVITY_TIMEOUT_MS; this.disposeModelsOnInactivity = config.disposeModelsOnInactivity ?? false; } @@ -423,7 +477,7 @@ export class LlamaCpp implements LLM { * Check if any contexts are currently loaded (and therefore worth unloading on inactivity). */ private hasLoadedContexts(): boolean { - return !!(this.embedContext || this.rerankContext); + return !!(this.embedContexts.length > 0 || this.rerankContexts.length > 0); } /** @@ -445,14 +499,14 @@ export class LlamaCpp implements LLM { } // Dispose contexts first - if (this.embedContext) { - await this.embedContext.dispose(); - this.embedContext = null; + for (const ctx of this.embedContexts) { + await ctx.dispose(); } - if (this.rerankContext) { - await this.rerankContext.dispose(); - this.rerankContext = null; + this.embedContexts = []; + for (const ctx of this.rerankContexts) { + await ctx.dispose(); } + this.rerankContexts = []; // Optionally dispose models too (opt-in) if (this.disposeModelsOnInactivity) { @@ -491,7 +545,18 @@ export class LlamaCpp implements LLM { */ private async ensureLlama(): Promise { if (!this.llama) { - this.llama = await getLlama({ logLevel: LlamaLogLevel.error }); + const llama = await getLlama({ + // attempt to build + build: "autoAttempt", + logLevel: LlamaLogLevel.error + }); + + if (llama.gpu === false) { + process.stderr.write( + "QMD Warning: no GPU acceleration, running on CPU (slow). Run 'qmd status' for details.\n" + ); + } + this.llama = llama; } return this.llama; } @@ -535,34 +600,92 @@ export class LlamaCpp implements LLM { } /** - * Load embedding context (lazy). Context can be disposed and recreated without reloading the model. - * Uses promise guard to prevent concurrent context creation race condition. + * Compute how many parallel contexts to create. + * + * GPU: constrained by VRAM (25% of free, capped at 8). + * CPU: constrained by cores. Splitting threads across contexts enables + * true parallelism (each context runs on its own cores). Use at most + * half the math cores, with at least 4 threads per context. */ - private async ensureEmbedContext(): Promise { - if (!this.embedContext) { - // If context creation is already in progress, wait for it - if (this.embedContextCreatePromise) { - return await this.embedContextCreatePromise; + private async computeParallelism(perContextMB: number): Promise { + const llama = await this.ensureLlama(); + + if (llama.gpu) { + try { + const vram = await llama.getVramState(); + const freeMB = vram.free / (1024 * 1024); + const maxByVram = Math.floor((freeMB * 0.25) / perContextMB); + return Math.max(1, Math.min(8, maxByVram)); + } catch { + return 2; } + } - // Start context creation and store promise so concurrent calls wait - this.embedContextCreatePromise = (async () => { - const model = await this.ensureEmbedModel(); - const context = await model.createEmbeddingContext(); - this.embedContext = context; - return context; - })(); + // CPU: split cores across contexts. At least 4 threads per context. + const cores = llama.cpuMathCores || 4; + const maxContexts = Math.floor(cores / 4); + return Math.max(1, Math.min(4, maxContexts)); + } - try { - const context = await this.embedContextCreatePromise; - this.touchActivity(); - return context; - } finally { - this.embedContextCreatePromise = null; + /** + * Get the number of threads each context should use, given N parallel contexts. + * Splits available math cores evenly across contexts. + */ + private async threadsPerContext(parallelism: number): Promise { + const llama = await this.ensureLlama(); + if (llama.gpu) return 0; // GPU: let the library decide + const cores = llama.cpuMathCores || 4; + return Math.max(1, Math.floor(cores / parallelism)); + } + + /** + * Load embedding contexts (lazy). Creates multiple for parallel embedding. + * Uses promise guard to prevent concurrent context creation race condition. + */ + private embedContextsCreatePromise: Promise | null = null; + + private async ensureEmbedContexts(): Promise { + if (this.embedContexts.length > 0) { + this.touchActivity(); + return this.embedContexts; + } + + if (this.embedContextsCreatePromise) { + return await this.embedContextsCreatePromise; + } + + this.embedContextsCreatePromise = (async () => { + const model = await this.ensureEmbedModel(); + // Embed contexts are ~143 MB each (nomic-embed 2048 ctx) + const n = await this.computeParallelism(150); + const threads = await this.threadsPerContext(n); + for (let i = 0; i < n; i++) { + try { + this.embedContexts.push(await model.createEmbeddingContext({ + ...(threads > 0 ? { threads } : {}), + })); + } catch { + if (this.embedContexts.length === 0) throw new Error("Failed to create any embedding context"); + break; + } } + this.touchActivity(); + return this.embedContexts; + })(); + + try { + return await this.embedContextsCreatePromise; + } finally { + this.embedContextsCreatePromise = null; } - this.touchActivity(); - return this.embedContext; + } + + /** + * Get a single embed context (for single-embed calls). Uses first from pool. + */ + private async ensureEmbedContext(): Promise { + const contexts = await this.ensureEmbedContexts(); + return contexts[0]!; } /** @@ -624,15 +747,49 @@ export class LlamaCpp implements LLM { } /** - * Load rerank context (lazy). Context can be disposed and recreated without reloading the model. + * Load rerank contexts (lazy). Creates multiple contexts for parallel ranking. + * Each context has its own sequence, so they can evaluate independently. + * + * Tuning choices: + * - contextSize 1024: reranking chunks are ~800 tokens max, 1024 is plenty + * - flashAttention: ~20% less VRAM per context (568 vs 711 MB) + * - Combined: drops from 11.6 GB (auto, no flash) to 568 MB per context (20×) */ - private async ensureRerankContext(): Promise>> { - if (!this.rerankContext) { + // Qwen3 reranker template adds ~200 tokens overhead (system prompt, tags, etc.) + // Chunks are max 800 tokens, so 800 + 200 + query ≈ 1100 tokens typical. + // Use 2048 for safety margin. Still 17× less than auto (40960). + private static readonly RERANK_CONTEXT_SIZE = 2048; + private async ensureRerankContexts(): Promise>[]> { + if (this.rerankContexts.length === 0) { const model = await this.ensureRerankModel(); - this.rerankContext = await model.createRankingContext(); + // ~960 MB per context with flash attention at contextSize 2048 + const n = Math.min(await this.computeParallelism(1000), 4); + const threads = await this.threadsPerContext(n); + for (let i = 0; i < n; i++) { + try { + this.rerankContexts.push(await model.createRankingContext({ + contextSize: LlamaCpp.RERANK_CONTEXT_SIZE, + flashAttention: true, + ...(threads > 0 ? { threads } : {}), + } as any)); + } catch { + if (this.rerankContexts.length === 0) { + // Flash attention might not be supported — retry without it + try { + this.rerankContexts.push(await model.createRankingContext({ + contextSize: LlamaCpp.RERANK_CONTEXT_SIZE, + ...(threads > 0 ? { threads } : {}), + })); + } catch { + throw new Error("Failed to create any rerank context"); + } + } + break; + } + } } this.touchActivity(); - return this.rerankContext; + return this.rerankContexts; } // ========================================================================== @@ -703,26 +860,51 @@ export class LlamaCpp implements LLM { if (texts.length === 0) return []; try { - const context = await this.ensureEmbedContext(); - - // node-llama-cpp handles batching internally when we make parallel requests - const embeddings = await Promise.all( - texts.map(async (text) => { + const contexts = await this.ensureEmbedContexts(); + const n = contexts.length; + + if (n === 1) { + // Single context: sequential (no point splitting) + const context = contexts[0]!; + const embeddings: ({ embedding: number[]; model: string } | null)[] = []; + for (const text of texts) { try { const embedding = await context.getEmbeddingFor(text); - this.touchActivity(); // Keep-alive during slow batches - return { - embedding: Array.from(embedding.vector), - model: this.embedModelUri, - }; + this.touchActivity(); + embeddings.push({ embedding: Array.from(embedding.vector), model: this.embedModelUri }); } catch (err) { console.error("Embedding error for text:", err); - return null; + embeddings.push(null); + } + } + return embeddings; + } + + // Multiple contexts: split texts across contexts for parallel evaluation + const chunkSize = Math.ceil(texts.length / n); + const chunks = Array.from({ length: n }, (_, i) => + texts.slice(i * chunkSize, (i + 1) * chunkSize) + ); + + const chunkResults = await Promise.all( + chunks.map(async (chunk, i) => { + const ctx = contexts[i]!; + const results: (EmbeddingResult | null)[] = []; + for (const text of chunk) { + try { + const embedding = await ctx.getEmbeddingFor(text); + this.touchActivity(); + results.push({ embedding: Array.from(embedding.vector), model: this.embedModelUri }); + } catch (err) { + console.error("Embedding error for text:", err); + results.push(null); + } } + return results; }) ); - return embeddings; + return chunkResults.flat(); } catch (error) { console.error("Batch embedding error:", error); return texts.map(() => null); @@ -788,7 +970,7 @@ export class LlamaCpp implements LLM { // High-level abstractions // ========================================================================== - async expandQuery(query: string, options: { context?: string, includeLexical?: boolean } = {}): Promise { + async expandQuery(query: string, options: { context?: string, includeLexical?: boolean, intent?: string } = {}): Promise { // Ping activity at start to keep models alive during this operation this.touchActivity(); @@ -807,10 +989,15 @@ export class LlamaCpp implements LLM { ` }); - const prompt = `/no_think Expand this search query: ${query}`; + const intent = options.intent; + const prompt = intent + ? `/no_think Expand this search query: ${query}\nQuery intent: ${intent}` + : `/no_think Expand this search query: ${query}`; - // Create fresh context for each call - const genContext = await this.generateModel!.createContext(); + // Create a bounded context for expansion to prevent large default VRAM allocations. + const genContext = await this.generateModel!.createContext({ + contextSize: this.expandContextSize, + }); const sequence = genContext.getSequence(); const session = new LlamaChatSession({ contextSequence: sequence }); @@ -871,6 +1058,10 @@ export class LlamaCpp implements LLM { } } + // Qwen3 reranker chat template overhead (system prompt, tags, separators) + private static readonly RERANK_TEMPLATE_OVERHEAD = 200; + private static readonly RERANK_TARGET_DOCS_PER_CONTEXT = 10; + async rerank( query: string, documents: RerankDocument[], @@ -879,36 +1070,121 @@ export class LlamaCpp implements LLM { // Ping activity at start to keep models alive during this operation this.touchActivity(); - const context = await this.ensureRerankContext(); + const contexts = await this.ensureRerankContexts(); + const model = await this.ensureRerankModel(); - // Build a map from document text to original indices (for lookup after sorting) - const textToDoc = new Map(); - documents.forEach((doc, index) => { - textToDoc.set(doc.text, { file: doc.file, index }); - }); + // Truncate documents that would exceed the rerank context size. + // Budget = contextSize - template overhead - query tokens + const queryTokens = model.tokenize(query).length; + const maxDocTokens = LlamaCpp.RERANK_CONTEXT_SIZE - LlamaCpp.RERANK_TEMPLATE_OVERHEAD - queryTokens; + const truncationCache = new Map(); - // Extract just the text for ranking - const texts = documents.map((doc) => doc.text); + const truncatedDocs = documents.map((doc) => { + const cached = truncationCache.get(doc.text); + if (cached !== undefined) { + return cached === doc.text ? doc : { ...doc, text: cached }; + } - // Use the proper ranking API - returns [{document: string, score: number}] sorted by score - const ranked = await context.rankAndSort(query, texts); + const tokens = model.tokenize(doc.text); + const truncatedText = tokens.length <= maxDocTokens + ? doc.text + : model.detokenize(tokens.slice(0, maxDocTokens)); + truncationCache.set(doc.text, truncatedText); - // Map back to our result format using the text-to-doc map - const results: RerankDocumentResult[] = ranked.map((item) => { - const docInfo = textToDoc.get(item.document)!; - return { - file: docInfo.file, - score: item.score, - index: docInfo.index, - }; + if (truncatedText === doc.text) return doc; + return { ...doc, text: truncatedText }; + }); + + // Deduplicate identical effective texts before scoring. + // This avoids redundant work for repeated chunks and fixes collisions where + // multiple docs map to the same chunk text. + const textToDocs = new Map(); + truncatedDocs.forEach((doc, index) => { + const existing = textToDocs.get(doc.text); + if (existing) { + existing.push({ file: doc.file, index }); + } else { + textToDocs.set(doc.text, [{ file: doc.file, index }]); + } }); + // Extract just the text for ranking + const texts = Array.from(textToDocs.keys()); + + // Split documents across contexts for parallel evaluation. + // Each context has its own sequence with a lock, so parallelism comes + // from multiple contexts evaluating different chunks simultaneously. + const activeContextCount = Math.max( + 1, + Math.min( + contexts.length, + Math.ceil(texts.length / LlamaCpp.RERANK_TARGET_DOCS_PER_CONTEXT) + ) + ); + const activeContexts = contexts.slice(0, activeContextCount); + const chunkSize = Math.ceil(texts.length / activeContexts.length); + const chunks = Array.from({ length: activeContexts.length }, (_, i) => + texts.slice(i * chunkSize, (i + 1) * chunkSize) + ).filter(chunk => chunk.length > 0); + + const allScores = await Promise.all( + chunks.map((chunk, i) => activeContexts[i]!.rankAll(query, chunk)) + ); + + // Reassemble scores in original order and sort + const flatScores = allScores.flat(); + const ranked = texts + .map((text, i) => ({ document: text, score: flatScores[i]! })) + .sort((a, b) => b.score - a.score); + + // Map back to our result format. + const results: RerankDocumentResult[] = []; + for (const item of ranked) { + const docInfos = textToDocs.get(item.document) ?? []; + for (const docInfo of docInfos) { + results.push({ + file: docInfo.file, + score: item.score, + index: docInfo.index, + }); + } + } + return { results, model: this.rerankModelUri, }; } + /** + * Get device/GPU info for status display. + * Initializes llama if not already done. + */ + async getDeviceInfo(): Promise<{ + gpu: string | false; + gpuOffloading: boolean; + gpuDevices: string[]; + vram?: { total: number; used: number; free: number }; + cpuCores: number; + }> { + const llama = await this.ensureLlama(); + const gpuDevices = await llama.getGpuDeviceNames(); + let vram: { total: number; used: number; free: number } | undefined; + if (llama.gpu) { + try { + const state = await llama.getVramState(); + vram = { total: state.total, used: state.used, free: state.free }; + } catch { /* no vram info */ } + } + return { + gpu: llama.gpu, + gpuOffloading: llama.supportsGpuOffloading, + gpuDevices, + vram, + cpuCores: llama.cpuMathCores, + }; + } + async dispose(): Promise { // Prevent double-dispose if (this.disposed) { @@ -932,8 +1208,8 @@ export class LlamaCpp implements LLM { } // Clear references - this.embedContext = null; - this.rerankContext = null; + this.embedContexts = []; + this.rerankContexts = []; this.embedModel = null; this.generateModel = null; this.rerankModel = null; @@ -941,7 +1217,7 @@ export class LlamaCpp implements LLM { // Clear any in-flight load/create promises this.embedModelLoadPromise = null; - this.embedContextCreatePromise = null; + this.embedContextsCreatePromise = null; this.generateModelLoadPromise = null; this.rerankModelLoadPromise = null; } @@ -1184,7 +1460,8 @@ let defaultLlamaCpp: LlamaCpp | null = null; */ export function getDefaultLlamaCpp(): LlamaCpp { if (!defaultLlamaCpp) { - defaultLlamaCpp = new LlamaCpp(); + const embedModel = process.env.QMD_EMBED_MODEL; + defaultLlamaCpp = new LlamaCpp(embedModel ? { embedModel } : {}); } return defaultLlamaCpp; } diff --git a/src/mcp.ts b/src/mcp.ts index aa092048..ccef26e4 100644 --- a/src/mcp.ts +++ b/src/mcp.ts @@ -1,4 +1,3 @@ -#!/usr/bin/env bun /** * QMD MCP Server - Model Context Protocol server for QMD * @@ -8,19 +7,25 @@ * Follows MCP spec 2025-06-18 for proper response types. */ +import { createServer, type IncomingMessage, type ServerResponse } from "node:http"; +import { randomUUID } from "node:crypto"; +import { fileURLToPath } from "url"; import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js"; +import { WebStandardStreamableHTTPServerTransport } + from "@modelcontextprotocol/sdk/server/webStandardStreamableHttp.js"; +import { isInitializeRequest } from "@modelcontextprotocol/sdk/types.js"; import { z } from "zod"; import { createStore, - reciprocalRankFusion, extractSnippet, - DEFAULT_EMBED_MODEL, - DEFAULT_QUERY_MODEL, - DEFAULT_RERANK_MODEL, + addLineNumbers, + structuredSearch, DEFAULT_MULTI_GET_MAX_BYTES, } from "./store.js"; -import type { RankedResult } from "./store.js"; +import type { Store, StructuredSubSearch } from "./store.js"; +import { getCollection, getGlobalContext, getDefaultCollectionNames } from "./collections.js"; +import { disposeDefaultLlamaCpp } from "./llm.js"; // ============================================================================= // Types for structured content @@ -75,27 +80,85 @@ function formatSearchSummary(results: SearchResultItem[], query: string): string return lines.join('\n'); } -/** - * Add line numbers to text content. - * Each line becomes: "{lineNum}: {content}" - */ -function addLineNumbers(text: string, startLine: number = 1): string { - const lines = text.split('\n'); - return lines.map((line, i) => `${startLine + i}: ${line}`).join('\n'); -} - // ============================================================================= // MCP Server // ============================================================================= -export async function startMcpServer(): Promise { - // Open database once at startup - keep it open for the lifetime of the server - const store = createStore(); +/** + * Build dynamic server instructions from actual index state. + * Injected into the LLM's system prompt via MCP initialize response — + * gives the LLM immediate context about what's searchable without a tool call. + */ +function buildInstructions(store: Store): string { + const status = store.getStatus(); + const lines: string[] = []; + + // --- What is this? --- + const globalCtx = getGlobalContext(); + lines.push(`QMD is your local search engine over ${status.totalDocuments} markdown documents.`); + if (globalCtx) lines.push(`Context: ${globalCtx}`); + + // --- What's searchable? --- + if (status.collections.length > 0) { + lines.push(""); + lines.push("Collections (scope with `collection` parameter):"); + for (const col of status.collections) { + const collConfig = getCollection(col.name); + const rootCtx = collConfig?.context?.[""] || collConfig?.context?.["/"]; + const desc = rootCtx ? ` — ${rootCtx}` : ""; + lines.push(` - "${col.name}" (${col.documents} docs)${desc}`); + } + } - const server = new McpServer({ - name: "qmd", - version: "1.0.0", - }); + // --- Capability gaps --- + if (!status.hasVectorIndex) { + lines.push(""); + lines.push("Note: No vector embeddings yet. Run `qmd embed` to enable semantic search (vec/hyde)."); + } else if (status.needsEmbedding > 0) { + lines.push(""); + lines.push(`Note: ${status.needsEmbedding} documents need embedding. Run \`qmd embed\` to update.`); + } + + // --- Search tool --- + lines.push(""); + lines.push("Search: Use `query` with sub-queries (lex/vec/hyde):"); + lines.push(" - type:'lex' — BM25 keyword search (exact terms, fast)"); + lines.push(" - type:'vec' — semantic vector search (meaning-based)"); + lines.push(" - type:'hyde' — hypothetical document (write what the answer looks like)"); + lines.push(""); + lines.push(" Always provide `intent` on every search call to disambiguate and improve snippets."); + lines.push(""); + lines.push("Examples:"); + lines.push(" Quick keyword lookup: [{type:'lex', query:'error handling'}]"); + lines.push(" Semantic search: [{type:'vec', query:'how to handle errors gracefully'}]"); + lines.push(" Best results: [{type:'lex', query:'error'}, {type:'vec', query:'error handling best practices'}]"); + lines.push(" With intent: searches=[{type:'lex', query:'performance'}], intent='web page load times'"); + + // --- Retrieval workflow --- + lines.push(""); + lines.push("Retrieval:"); + lines.push(" - `get` — single document by path or docid (#abc123). Supports line offset (`file.md:100`)."); + lines.push(" - `multi_get` — batch retrieve by glob (`journals/2025-05*.md`) or comma-separated list."); + + // --- Non-obvious things that prevent mistakes --- + lines.push(""); + lines.push("Tips:"); + lines.push(" - File paths in results are relative to their collection."); + lines.push(" - Use `minScore: 0.5` to filter low-confidence results."); + lines.push(" - Results include a `context` field describing the content type."); + + return lines.join("\n"); +} + +/** + * Create an MCP server with all QMD tools, resources, and prompts registered. + * Shared by both stdio and HTTP transports. + */ +function createMcpServer(store: Store): McpServer { + const server = new McpServer( + { name: "qmd", version: "0.9.9" }, + { instructions: buildInstructions(store) }, + ); // --------------------------------------------------------------------------- // Resource: qmd://{path} - read-only access to documents by path @@ -166,276 +229,134 @@ export async function startMcpServer(): Promise { ); // --------------------------------------------------------------------------- - // Prompt: query guide - // --------------------------------------------------------------------------- - - server.registerPrompt( - "query", - { - title: "QMD Query Guide", - description: "How to effectively search your knowledge base with QMD", - }, - () => ({ - messages: [ - { - role: "user", - content: { - type: "text", - text: `# QMD - Quick Markdown Search - -QMD is your on-device search engine for markdown knowledge bases. Use it to find information across your notes, documents, and meeting transcripts. - -## Available Tools - -### 1. search (Fast keyword search) -Best for: Finding documents with specific keywords or phrases. -- Uses BM25 full-text search -- Fast, no LLM required -- Good for exact matches -- Use \`collection\` parameter to filter to a specific collection - -### 2. vsearch (Semantic search) -Best for: Finding conceptually related content even without exact keyword matches. -- Uses vector embeddings -- Understands meaning and context -- Good for "how do I..." or conceptual queries -- Use \`collection\` parameter to filter to a specific collection - -### 3. query (Hybrid search - highest quality) -Best for: Important searches where you want the best results. -- Combines keyword + semantic search -- Expands your query with variations -- Re-ranks results with LLM -- Slower but most accurate -- Use \`collection\` parameter to filter to a specific collection - -### 4. get (Retrieve document) -Best for: Getting the full content of a single document you found. -- Use the file path from search results -- Supports line ranges: \`file.md:100\` or fromLine/maxLines parameters -- Suggests similar files if not found - -### 5. multi_get (Retrieve multiple documents) -Best for: Getting content from multiple files at once. -- Use glob patterns: \`journals/2025-05*.md\` -- Or comma-separated: \`file1.md, file2.md\` -- Skips files over maxBytes (default 10KB) - use get for large files - -### 6. status (Index info) -Shows collection info, document counts, and embedding status. - -## Resources - -You can also access documents directly via the \`qmd://\` URI scheme: -- List all documents: \`resources/list\` -- Read a document: \`resources/read\` with uri \`qmd://path/to/file.md\` - -## Search Strategy - -1. **Start with search** for quick keyword lookups -2. **Use vsearch** when keywords aren't working or for conceptual queries -3. **Use query** for important searches or when you need high confidence -4. **Use get** to retrieve a single full document -5. **Use multi_get** to batch retrieve multiple related files - -## Tips - -- Use \`minScore: 0.5\` to filter low-relevance results -- Use \`collection: "notes"\` to search only in a specific collection -- Check the "Context" field - it describes what kind of content the file contains -- File paths are relative to their collection (e.g., \`pages/meeting.md\`) -- For glob patterns, match on display_path (e.g., \`journals/2025-*.md\`)`, - }, - }, - ], - }) - ); - - // --------------------------------------------------------------------------- - // Tool: qmd_search (BM25 full-text) + // Tool: query (Primary search tool) // --------------------------------------------------------------------------- - server.registerTool( - "search", - { - title: "Search (BM25)", - description: "Fast keyword-based full-text search using BM25. Best for finding documents with specific words or phrases.", - inputSchema: { - query: z.string().describe("Search query - keywords or phrases to find"), - limit: z.number().optional().default(10).describe("Maximum number of results (default: 10)"), - minScore: z.number().optional().default(0).describe("Minimum relevance score 0-1 (default: 0)"), - collection: z.string().optional().describe("Filter to a specific collection by name"), - }, - }, - async ({ query, limit, minScore, collection }) => { - // Note: Collection filtering is now done post-search since collections are managed in YAML - const results = store.searchFTS(query, limit || 10) - .filter(r => !collection || r.collectionName === collection); - const filtered: SearchResultItem[] = results - .filter(r => r.score >= (minScore || 0)) - .map(r => { - const { line, snippet } = extractSnippet(r.body || "", query, 300, r.chunkPos); - return { - docid: `#${r.docid}`, - file: r.displayPath, - title: r.title, - score: Math.round(r.score * 100) / 100, - context: store.getContextForFile(r.filepath), - snippet: addLineNumbers(snippet, line), // Default to line numbers - }; - }); - - return { - content: [{ type: "text", text: formatSearchSummary(filtered, query) }], - structuredContent: { results: filtered }, - }; - } - ); - - // --------------------------------------------------------------------------- - // Tool: qmd_vsearch (Vector semantic search) - // --------------------------------------------------------------------------- - - server.registerTool( - "vsearch", - { - title: "Vector Search (Semantic)", - description: "Semantic similarity search using vector embeddings. Finds conceptually related content even without exact keyword matches. Requires embeddings (run 'qmd embed' first).", - inputSchema: { - query: z.string().describe("Natural language query - describe what you're looking for"), - limit: z.number().optional().default(10).describe("Maximum number of results (default: 10)"), - minScore: z.number().optional().default(0.3).describe("Minimum relevance score 0-1 (default: 0.3)"), - collection: z.string().optional().describe("Filter to a specific collection by name"), - }, - }, - async ({ query, limit, minScore, collection }) => { - const tableExists = store.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get(); - if (!tableExists) { - return { - content: [{ type: "text", text: "Vector index not found. Run 'qmd embed' first to create embeddings." }], - isError: true, - }; - } - - // Expand query - const queries = await store.expandQuery(query, DEFAULT_QUERY_MODEL); - - // Collect results (filter by collection after search) - const allResults = new Map(); - for (const q of queries) { - const vecResults = await store.searchVec(q, DEFAULT_EMBED_MODEL, limit || 10) - .then(results => results.filter(r => !collection || r.collectionName === collection)); - for (const r of vecResults) { - const existing = allResults.get(r.filepath); - if (!existing || r.score > existing.score) { - allResults.set(r.filepath, { file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score, docid: r.docid }); - } - } - } - - const filtered: SearchResultItem[] = Array.from(allResults.values()) - .sort((a, b) => b.score - a.score) - .slice(0, limit || 10) - .filter(r => r.score >= (minScore || 0.3)) - .map(r => { - const { line, snippet } = extractSnippet(r.body || "", query, 300); - return { - docid: `#${r.docid}`, - file: r.displayPath, - title: r.title, - score: Math.round(r.score * 100) / 100, - context: store.getContextForFile(r.file), - snippet: addLineNumbers(snippet, line), // Default to line numbers - }; - }); - - return { - content: [{ type: "text", text: formatSearchSummary(filtered, query) }], - structuredContent: { results: filtered }, - }; - } - ); - - // --------------------------------------------------------------------------- - // Tool: qmd_query (Hybrid with reranking) - // --------------------------------------------------------------------------- + const subSearchSchema = z.object({ + type: z.enum(['lex', 'vec', 'hyde']).describe( + "lex = BM25 keywords (supports \"phrase\" and -negation); " + + "vec = semantic question; hyde = hypothetical answer passage" + ), + query: z.string().describe( + "The query text. For lex: use keywords, \"quoted phrases\", and -negation. " + + "For vec: natural language question. For hyde: 50-100 word answer passage." + ), + }); server.registerTool( "query", { - title: "Hybrid Query (Best Quality)", - description: "Highest quality search combining BM25 + vector + query expansion + LLM reranking. Slower but most accurate. Use for important searches.", + title: "Query", + description: `Search the knowledge base using a query document — one or more typed sub-queries combined for best recall. + +## Query Types + +**lex** — BM25 keyword search. Fast, exact, no LLM needed. +Full lex syntax: +- \`term\` — prefix match ("perf" matches "performance") +- \`"exact phrase"\` — phrase must appear verbatim +- \`-term\` or \`-"phrase"\` — exclude documents containing this + +Good lex examples: +- \`"connection pool" timeout -redis\` +- \`"machine learning" -sports -athlete\` +- \`handleError async typescript\` + +**vec** — Semantic vector search. Write a natural language question. Finds documents by meaning, not exact words. +- \`how does the rate limiter handle burst traffic?\` +- \`what is the tradeoff between consistency and availability?\` + +**hyde** — Hypothetical document. Write 50-100 words that look like the answer. Often the most powerful for nuanced topics. +- \`The rate limiter uses a token bucket algorithm. When a client exceeds 100 req/min, subsequent requests return 429 until the window resets.\` + +## Strategy + +Combine types for best results. First sub-query gets 2× weight — put your strongest signal first. + +| Goal | Approach | +|------|----------| +| Know exact term/name | \`lex\` only | +| Concept search | \`vec\` only | +| Best recall | \`lex\` + \`vec\` | +| Complex/nuanced | \`lex\` + \`vec\` + \`hyde\` | +| Unknown vocabulary | Use a standalone natural-language query (no typed lines) so the server can auto-expand it | + +## Examples + +Simple lookup: +\`\`\`json +[{ "type": "lex", "query": "CAP theorem" }] +\`\`\` + +Best recall on a technical topic: +\`\`\`json +[ + { "type": "lex", "query": "\\"connection pool\\" timeout -redis" }, + { "type": "vec", "query": "why do database connections time out under load" }, + { "type": "hyde", "query": "Connection pool exhaustion occurs when all connections are in use and new requests must wait. This typically happens under high concurrency when queries run longer than expected." } +] +\`\`\` + +Intent-aware lex (C++ performance, not sports): +\`\`\`json +[ + { "type": "lex", "query": "\\"C++ performance\\" optimization -sports -athlete" }, + { "type": "vec", "query": "how to optimize C++ program performance" } +] +\`\`\``, + annotations: { readOnlyHint: true, openWorldHint: false }, inputSchema: { - query: z.string().describe("Natural language query - describe what you're looking for"), - limit: z.number().optional().default(10).describe("Maximum number of results (default: 10)"), - minScore: z.number().optional().default(0).describe("Minimum relevance score 0-1 (default: 0)"), - collection: z.string().optional().describe("Filter to a specific collection by name"), + searches: z.array(subSearchSchema).min(1).max(10).describe( + "Typed sub-queries to execute (lex/vec/hyde). First gets 2x weight." + ), + limit: z.number().optional().default(10).describe("Max results (default: 10)"), + minScore: z.number().optional().default(0).describe("Min relevance 0-1 (default: 0)"), + candidateLimit: z.number().optional().describe( + "Maximum candidates to rerank (default: 40, lower = faster but may miss results)" + ), + collections: z.array(z.string()).optional().describe("Filter to collections (OR match)"), + intent: z.string().optional().describe( + "Background context to disambiguate the query. Example: query='performance', intent='web page load times and Core Web Vitals'. Does not search on its own." + ), }, }, - async ({ query, limit, minScore, collection }) => { - // Expand query - const queries = await store.expandQuery(query, DEFAULT_QUERY_MODEL); - - // Collect ranked lists (filter by collection after search) - const rankedLists: RankedResult[][] = []; - const docidMap = new Map(); // filepath -> docid - const hasVectors = !!store.db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get(); - - for (const q of queries) { - const ftsResults = store.searchFTS(q, 20) - .filter(r => !collection || r.collectionName === collection); - if (ftsResults.length > 0) { - for (const r of ftsResults) docidMap.set(r.filepath, r.docid); - rankedLists.push(ftsResults.map(r => ({ file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score }))); - } - if (hasVectors) { - const vecResults = await store.searchVec(q, DEFAULT_EMBED_MODEL, 20) - .then(results => results.filter(r => !collection || r.collectionName === collection)); - if (vecResults.length > 0) { - for (const r of vecResults) docidMap.set(r.filepath, r.docid); - rankedLists.push(vecResults.map(r => ({ file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score }))); - } - } - } - - // RRF fusion - const weights = rankedLists.map((_, i) => i < 2 ? 2.0 : 1.0); - const fused = reciprocalRankFusion(rankedLists, weights); - const candidates = fused.slice(0, 30); - - // Rerank - const reranked = await store.rerank( - query, - candidates.map(c => ({ file: c.file, text: c.body })), - DEFAULT_RERANK_MODEL - ); - - // Blend scores - const candidateMap = new Map(candidates.map(c => [c.file, { displayPath: c.displayPath, title: c.title, body: c.body }])); - const rrfRankMap = new Map(candidates.map((c, i) => [c.file, i + 1])); - - const filtered: SearchResultItem[] = reranked.map(r => { - const rrfRank = rrfRankMap.get(r.file) || candidates.length; - let rrfWeight: number; - if (rrfRank <= 3) rrfWeight = 0.75; - else if (rrfRank <= 10) rrfWeight = 0.60; - else rrfWeight = 0.40; - const rrfScore = 1 / rrfRank; - const blendedScore = rrfWeight * rrfScore + (1 - rrfWeight) * r.score; - const candidate = candidateMap.get(r.file); - const { line, snippet } = extractSnippet(candidate?.body || "", query, 300); + async ({ searches, limit, minScore, candidateLimit, collections, intent }) => { + // Map to internal format + const subSearches: StructuredSubSearch[] = searches.map(s => ({ + type: s.type, + query: s.query, + })); + + // Use default collections if none specified + const effectiveCollections = collections ?? getDefaultCollectionNames(); + + const results = await structuredSearch(store, subSearches, { + collections: effectiveCollections.length > 0 ? effectiveCollections : undefined, + limit, + minScore, + candidateLimit, + intent, + }); + + // Use first lex or vec query for snippet extraction + const primaryQuery = searches.find(s => s.type === 'lex')?.query + || searches.find(s => s.type === 'vec')?.query + || searches[0]?.query || ""; + + const filtered: SearchResultItem[] = results.map(r => { + const { line, snippet } = extractSnippet(r.bestChunk, primaryQuery, 300, undefined, undefined, intent); return { - docid: `#${docidMap.get(r.file) || ""}`, - file: candidate?.displayPath || "", - title: candidate?.title || "", - score: Math.round(blendedScore * 100) / 100, - context: store.getContextForFile(r.file), - snippet: addLineNumbers(snippet, line), // Default to line numbers + docid: `#${r.docid}`, + file: r.displayPath, + title: r.title, + score: Math.round(r.score * 100) / 100, + context: r.context, + snippet: addLineNumbers(snippet, line), }; - }).filter(r => r.score >= (minScore || 0)).slice(0, limit || 10); + }); return { - content: [{ type: "text", text: formatSearchSummary(filtered, query) }], + content: [{ type: "text", text: formatSearchSummary(filtered, primaryQuery) }], structuredContent: { results: filtered }, }; } @@ -450,6 +371,7 @@ You can also access documents directly via the \`qmd://\` URI scheme: { title: "Get Document", description: "Retrieve the full content of a document by its file path or docid. Use paths or docids (#abc123) from search results. Suggests similar files if not found.", + annotations: { readOnlyHint: true, openWorldHint: false }, inputSchema: { file: z.string().describe("File path or docid from search results (e.g., 'pages/meeting.md', '#abc123', or 'pages/meeting.md:100' to start at line 100)"), fromLine: z.number().optional().describe("Start from this line number (1-indexed)"), @@ -514,6 +436,7 @@ You can also access documents directly via the \`qmd://\` URI scheme: { title: "Multi-Get Documents", description: "Retrieve multiple documents by glob pattern (e.g., 'journals/2025-05*.md') or comma-separated list. Skips files larger than maxBytes.", + annotations: { readOnlyHint: true, openWorldHint: false }, inputSchema: { pattern: z.string().describe("Glob pattern or comma-separated list of file paths"), maxLines: z.number().optional().describe("Maximum lines per file"), @@ -586,6 +509,7 @@ You can also access documents directly via the \`qmd://\` URI scheme: { title: "Index Status", description: "Show the status of the QMD index: collections, document counts, and health information.", + annotations: { readOnlyHint: true, openWorldHint: false }, inputSchema: {}, }, async () => { @@ -610,17 +534,293 @@ You can also access documents directly via the \`qmd://\` URI scheme: } ); - // --------------------------------------------------------------------------- - // Connect via stdio - // --------------------------------------------------------------------------- + return server; +} +// ============================================================================= +// Transport: stdio (default) +// ============================================================================= + +export async function startMcpServer(): Promise { + const store = createStore(); + const server = createMcpServer(store); const transport = new StdioServerTransport(); await server.connect(transport); +} + +// ============================================================================= +// Transport: Streamable HTTP +// ============================================================================= + +export type HttpServerHandle = { + httpServer: import("http").Server; + port: number; + stop: () => Promise; +}; + +/** + * Start MCP server over Streamable HTTP (JSON responses, no SSE). + * Binds to localhost only. Returns a handle for shutdown and port discovery. + */ +export async function startMcpHttpServer(port: number, options?: { quiet?: boolean }): Promise { + const store = createStore(); + + // Session map: each client gets its own McpServer + Transport pair (MCP spec requirement). + // The store is shared — it's stateless SQLite, safe for concurrent access. + const sessions = new Map(); + + async function createSession(): Promise { + const transport = new WebStandardStreamableHTTPServerTransport({ + sessionIdGenerator: () => randomUUID(), + enableJsonResponse: true, + onsessioninitialized: (sessionId: string) => { + sessions.set(sessionId, transport); + log(`${ts()} New session ${sessionId} (${sessions.size} active)`); + }, + }); + const server = createMcpServer(store); + await server.connect(transport); + + transport.onclose = () => { + if (transport.sessionId) { + sessions.delete(transport.sessionId); + } + }; + + return transport; + } + + const startTime = Date.now(); + const quiet = options?.quiet ?? false; + + /** Format timestamp for request logging */ + function ts(): string { + return new Date().toISOString().slice(11, 23); // HH:mm:ss.SSS + } + + /** Extract a human-readable label from a JSON-RPC body */ + function describeRequest(body: any): string { + const method = body?.method ?? "unknown"; + if (method === "tools/call") { + const tool = body.params?.name ?? "?"; + const args = body.params?.arguments; + // Show query string if present, truncated + if (args?.query) { + const q = String(args.query).slice(0, 80); + return `tools/call ${tool} "${q}"`; + } + if (args?.path) return `tools/call ${tool} ${args.path}`; + if (args?.pattern) return `tools/call ${tool} ${args.pattern}`; + return `tools/call ${tool}`; + } + return method; + } + + function log(msg: string): void { + if (!quiet) console.error(msg); + } + + // Helper to collect request body + async function collectBody(req: IncomingMessage): Promise { + const chunks: Buffer[] = []; + for await (const chunk of req) chunks.push(chunk as Buffer); + return Buffer.concat(chunks).toString(); + } + + const httpServer = createServer(async (nodeReq: IncomingMessage, nodeRes: ServerResponse) => { + const reqStart = Date.now(); + const pathname = nodeReq.url || "/"; + + try { + if (pathname === "/health" && nodeReq.method === "GET") { + const body = JSON.stringify({ status: "ok", uptime: Math.floor((Date.now() - startTime) / 1000) }); + nodeRes.writeHead(200, { "Content-Type": "application/json" }); + nodeRes.end(body); + log(`${ts()} GET /health (${Date.now() - reqStart}ms)`); + return; + } + + // REST endpoint: POST /search — structured search without MCP protocol + // REST endpoint: POST /query (alias: /search) — structured search without MCP protocol + if ((pathname === "/query" || pathname === "/search") && nodeReq.method === "POST") { + const rawBody = await collectBody(nodeReq); + const params = JSON.parse(rawBody); + + // Validate required fields + if (!params.searches || !Array.isArray(params.searches)) { + nodeRes.writeHead(400, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ error: "Missing required field: searches (array)" })); + return; + } + + // Map to internal format + const subSearches: StructuredSubSearch[] = params.searches.map((s: any) => ({ + type: s.type as 'lex' | 'vec' | 'hyde', + query: String(s.query || ""), + })); + + // Use default collections if none specified + const effectiveCollections = params.collections ?? getDefaultCollectionNames(); + + const results = await structuredSearch(store, subSearches, { + collections: effectiveCollections.length > 0 ? effectiveCollections : undefined, + limit: params.limit ?? 10, + minScore: params.minScore ?? 0, + candidateLimit: params.candidateLimit, + }); + + // Use first lex or vec query for snippet extraction + const primaryQuery = params.searches.find((s: any) => s.type === 'lex')?.query + || params.searches.find((s: any) => s.type === 'vec')?.query + || params.searches[0]?.query || ""; + + const formatted = results.map(r => { + const { line, snippet } = extractSnippet(r.bestChunk, primaryQuery, 300); + return { + docid: `#${r.docid}`, + file: r.displayPath, + title: r.title, + score: Math.round(r.score * 100) / 100, + context: r.context, + snippet: addLineNumbers(snippet, line), + }; + }); + + nodeRes.writeHead(200, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ results: formatted })); + log(`${ts()} POST /query ${params.searches.length} queries (${Date.now() - reqStart}ms)`); + return; + } + + if (pathname === "/mcp" && nodeReq.method === "POST") { + const rawBody = await collectBody(nodeReq); + const body = JSON.parse(rawBody); + const label = describeRequest(body); + const url = `http://localhost:${port}${pathname}`; + const headers: Record = {}; + for (const [k, v] of Object.entries(nodeReq.headers)) { + if (typeof v === "string") headers[k] = v; + } + + // Route to existing session or create new one on initialize + const sessionId = headers["mcp-session-id"]; + let transport: WebStandardStreamableHTTPServerTransport; + + if (sessionId) { + const existing = sessions.get(sessionId); + if (!existing) { + nodeRes.writeHead(404, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ + jsonrpc: "2.0", + error: { code: -32001, message: "Session not found" }, + id: body?.id ?? null, + })); + return; + } + transport = existing; + } else if (isInitializeRequest(body)) { + transport = await createSession(); + } else { + nodeRes.writeHead(400, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ + jsonrpc: "2.0", + error: { code: -32000, message: "Bad Request: Missing session ID" }, + id: body?.id ?? null, + })); + return; + } + + const request = new Request(url, { method: "POST", headers, body: rawBody }); + const response = await transport.handleRequest(request, { parsedBody: body }); + + nodeRes.writeHead(response.status, Object.fromEntries(response.headers)); + nodeRes.end(Buffer.from(await response.arrayBuffer())); + log(`${ts()} POST /mcp ${label} (${Date.now() - reqStart}ms)`); + return; + } + + if (pathname === "/mcp") { + const headers: Record = {}; + for (const [k, v] of Object.entries(nodeReq.headers)) { + if (typeof v === "string") headers[k] = v; + } + + // GET/DELETE must have a valid session + const sessionId = headers["mcp-session-id"]; + if (!sessionId) { + nodeRes.writeHead(400, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ + jsonrpc: "2.0", + error: { code: -32000, message: "Bad Request: Missing session ID" }, + id: null, + })); + return; + } + const transport = sessions.get(sessionId); + if (!transport) { + nodeRes.writeHead(404, { "Content-Type": "application/json" }); + nodeRes.end(JSON.stringify({ + jsonrpc: "2.0", + error: { code: -32001, message: "Session not found" }, + id: null, + })); + return; + } + + const url = `http://localhost:${port}${pathname}`; + const rawBody = nodeReq.method !== "GET" && nodeReq.method !== "HEAD" ? await collectBody(nodeReq) : undefined; + const request = new Request(url, { method: nodeReq.method || "GET", headers, ...(rawBody ? { body: rawBody } : {}) }); + const response = await transport.handleRequest(request); + nodeRes.writeHead(response.status, Object.fromEntries(response.headers)); + nodeRes.end(Buffer.from(await response.arrayBuffer())); + return; + } + + nodeRes.writeHead(404); + nodeRes.end("Not Found"); + } catch (err) { + console.error("HTTP handler error:", err); + nodeRes.writeHead(500); + nodeRes.end("Internal Server Error"); + } + }); + + await new Promise((resolve, reject) => { + httpServer.on("error", reject); + httpServer.listen(port, "localhost", () => resolve()); + }); + + const actualPort = (httpServer.address() as import("net").AddressInfo).port; + + let stopping = false; + const stop = async () => { + if (stopping) return; + stopping = true; + for (const transport of sessions.values()) { + await transport.close(); + } + sessions.clear(); + httpServer.close(); + store.close(); + await disposeDefaultLlamaCpp(); + }; + + process.on("SIGTERM", async () => { + console.error("Shutting down (SIGTERM)..."); + await stop(); + process.exit(0); + }); + process.on("SIGINT", async () => { + console.error("Shutting down (SIGINT)..."); + await stop(); + process.exit(0); + }); - // Note: Database stays open - it will be closed when the process exits + log(`QMD MCP server listening on http://localhost:${actualPort}/mcp`); + return { httpServer, port: actualPort, stop }; } // Run if this is the main module -if (import.meta.main) { +if (fileURLToPath(import.meta.url) === process.argv[1] || process.argv[1]?.endsWith("/mcp.ts") || process.argv[1]?.endsWith("/mcp.js")) { startMcpServer().catch(console.error); } diff --git a/src/memory.ts b/src/memory.ts deleted file mode 100644 index 46a7ff2e..00000000 --- a/src/memory.ts +++ /dev/null @@ -1,848 +0,0 @@ -/** - * memory.ts - Conversation memory storage & retrieval for QMD - * - * Stores conversation messages in sessions, provides FTS5 + vector search, - * summarization via Ollama, and memory recall for LLM context. - * - * Reuses QMD's existing infrastructure: - * - content_vectors + vectors_vec tables for embeddings - * - hashContent() for content-addressable storage - * - chunkDocumentByTokens() for chunking - * - insertEmbedding() for vector storage - * - BM25 normalization pattern from searchFTS - * - Two-step vector search pattern from searchVec - * - reciprocalRankFusion() for combining results - */ - -import { Database } from "bun:sqlite"; -import { - hashContent, - chunkDocumentByTokens, - insertEmbedding, - reciprocalRankFusion, - getDocid, - type RankedResult, -} from "./store.js"; -import { - getDefaultLlamaCpp, - formatQueryForEmbedding, - formatDocForEmbedding, -} from "./llm.js"; -import { ollamaSummarize, ollamaRecall as ollamaRecallSynthesize } from "./ollama.js"; - -// ============================================================================= -// Types -// ============================================================================= - -export type MemorySession = { - id: string; - title: string; - created_at: string; - updated_at: string; - summary: string | null; - summary_at: string | null; - active: number; -}; - -export type MemoryMessage = { - id: number; - session_id: string; - role: string; - content: string; - hash: string; - created_at: string; - metadata: Record | null; -}; - -export type MemorySearchResult = { - session_id: string; - session_title: string; - message_id: number; - role: string; - content: string; - score: number; - source: "fts" | "vec"; -}; - -// ============================================================================= -// Schema Initialization -// ============================================================================= - -/** - * Create memory tables, indexes, triggers in the QMD database. - * Safe to call multiple times (uses IF NOT EXISTS). - */ -export function initializeMemoryTables(db: Database): void { - // Sessions table - db.exec(` - CREATE TABLE IF NOT EXISTS memory_sessions ( - id TEXT PRIMARY KEY, - title TEXT NOT NULL DEFAULT '', - created_at TEXT NOT NULL, - updated_at TEXT NOT NULL, - summary TEXT, - summary_at TEXT, - active INTEGER NOT NULL DEFAULT 1 - ) - `); - - // Messages table - db.exec(` - CREATE TABLE IF NOT EXISTS memory_messages ( - id INTEGER PRIMARY KEY AUTOINCREMENT, - session_id TEXT NOT NULL, - role TEXT NOT NULL, - content TEXT NOT NULL, - hash TEXT NOT NULL, - created_at TEXT NOT NULL, - metadata TEXT, - FOREIGN KEY (session_id) REFERENCES memory_sessions(id) ON DELETE CASCADE - ) - `); - - db.exec(`CREATE INDEX IF NOT EXISTS idx_memory_messages_session ON memory_messages(session_id)`); - db.exec(`CREATE INDEX IF NOT EXISTS idx_memory_messages_hash ON memory_messages(hash)`); - - // FTS5 for memory search - db.exec(` - CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5( - session_title, role, content, - tokenize='porter unicode61' - ) - `); - - // Triggers to sync memory_fts - db.exec(` - CREATE TRIGGER IF NOT EXISTS memory_messages_ai AFTER INSERT ON memory_messages - BEGIN - INSERT INTO memory_fts(rowid, session_title, role, content) - SELECT - new.id, - (SELECT title FROM memory_sessions WHERE id = new.session_id), - new.role, - new.content; - END - `); - - db.exec(` - CREATE TRIGGER IF NOT EXISTS memory_messages_ad AFTER DELETE ON memory_messages - BEGIN - DELETE FROM memory_fts WHERE rowid = old.id; - END - `); -} - -// ============================================================================= -// FTS5 Query Building (same pattern as store.ts buildFTS5Query) -// ============================================================================= - -function sanitizeMemoryFTSTerm(term: string): string { - return term.replace(/[^\p{L}\p{N}']/gu, "").toLowerCase(); -} - -function buildMemoryFTS5Query(query: string): string | null { - const terms = query - .split(/\s+/) - .map((t) => sanitizeMemoryFTSTerm(t)) - .filter((t) => t.length > 0); - if (terms.length === 0) return null; - if (terms.length === 1) return `"${terms[0]}"*`; - return terms.map((t) => `"${t}"*`).join(" AND "); -} - -// ============================================================================= -// Session CRUD -// ============================================================================= - -/** - * Create a new memory session. If id is "new", generates a random ID. - */ -export function createSession( - db: Database, - id: string, - title: string = "" -): MemorySession { - const now = new Date().toISOString(); - const sessionId = id === "new" ? crypto.randomUUID().slice(0, 8) : id; - - db.prepare( - `INSERT INTO memory_sessions (id, title, created_at, updated_at, active) VALUES (?, ?, ?, ?, 1)` - ).run(sessionId, title, now, now); - - return { - id: sessionId, - title, - created_at: now, - updated_at: now, - summary: null, - summary_at: null, - active: 1, - }; -} - -/** - * Get a session by ID. - */ -export function getSession(db: Database, id: string): MemorySession | null { - return ( - (db - .prepare(`SELECT * FROM memory_sessions WHERE id = ?`) - .get(id) as MemorySession | null) || null - ); -} - -/** - * List sessions, most recent first. - */ -export function listSessions( - db: Database, - options: { limit?: number; includeInactive?: boolean } = {} -): MemorySession[] { - const limit = options.limit ?? 20; - const where = options.includeInactive ? "" : "WHERE active = 1"; - return db - .prepare( - `SELECT * FROM memory_sessions ${where} ORDER BY updated_at DESC LIMIT ?` - ) - .all(limit) as MemorySession[]; -} - -/** - * Soft-delete a session (set active = 0). If hard = true, permanently delete. - */ -export function deleteSession( - db: Database, - id: string, - hard: boolean = false -): void { - if (hard) { - // Delete messages first (CASCADE should handle, but be explicit) - db.prepare(`DELETE FROM memory_messages WHERE session_id = ?`).run(id); - db.prepare(`DELETE FROM memory_sessions WHERE id = ?`).run(id); - } else { - db.prepare(`UPDATE memory_sessions SET active = 0 WHERE id = ?`).run(id); - } -} - -/** - * Clear all sessions (soft or hard delete). - */ -export function clearAllSessions(db: Database, hard: boolean = false): number { - if (hard) { - const count = ( - db.prepare(`SELECT COUNT(*) as count FROM memory_sessions`).get() as { - count: number; - } - ).count; - db.exec(`DELETE FROM memory_messages`); - db.exec(`DELETE FROM memory_sessions`); - db.exec(`DELETE FROM memory_fts`); - return count; - } else { - const result = db.prepare( - `UPDATE memory_sessions SET active = 0 WHERE active = 1` - ); - return result.run().changes; - } -} - -// ============================================================================= -// Message CRUD -// ============================================================================= - -/** - * Add a message to a session. Creates session if it doesn't exist. - */ -export async function addMessage( - db: Database, - sessionId: string, - role: string, - content: string, - options: { title?: string; metadata?: Record } = {} -): Promise { - const now = new Date().toISOString(); - const hash = await hashContent(content); - - // Ensure session exists (createSession may generate a new ID for "new") - let session = getSession(db, sessionId); - if (!session) { - session = createSession(db, sessionId, options.title || ""); - } else if (options.title && !session.title) { - db.prepare(`UPDATE memory_sessions SET title = ? WHERE id = ?`).run( - options.title, - sessionId - ); - } - - // Use the resolved session ID (may differ from input if "new" was passed) - const resolvedSessionId = session.id; - - const metadataStr = options.metadata - ? JSON.stringify(options.metadata) - : null; - - const result = db - .prepare( - `INSERT INTO memory_messages (session_id, role, content, hash, created_at, metadata) - VALUES (?, ?, ?, ?, ?, ?)` - ) - .run(resolvedSessionId, role, content, hash, now, metadataStr); - - // Update session timestamp - db.prepare(`UPDATE memory_sessions SET updated_at = ? WHERE id = ?`).run( - now, - resolvedSessionId - ); - - return { - id: Number(result.lastInsertRowid), - session_id: resolvedSessionId, - role, - content, - hash, - created_at: now, - metadata: options.metadata || null, - }; -} - -/** - * Get messages for a session, ordered by creation time. - */ -export function getMessages( - db: Database, - sessionId: string, - options: { limit?: number } = {} -): MemoryMessage[] { - let sql = `SELECT * FROM memory_messages WHERE session_id = ? ORDER BY created_at ASC`; - const params: (string | number)[] = [sessionId]; - if (options.limit) { - sql += ` LIMIT ?`; - params.push(options.limit); - } - return db.prepare(sql).all(...params) as MemoryMessage[]; -} - -/** - * Get a formatted transcript for a session. - */ -export function getSessionTranscript( - db: Database, - sessionId: string -): string { - const messages = getMessages(db, sessionId); - return messages.map((m) => `${m.role}: ${m.content}`).join("\n\n"); -} - -// ============================================================================= -// Search -// ============================================================================= - -/** - * Search memory using FTS5 (BM25). Same normalization as store.ts searchFTS. - */ -export function searchMemoryFTS( - db: Database, - query: string, - limit: number = 20 -): MemorySearchResult[] { - const ftsQuery = buildMemoryFTS5Query(query); - if (!ftsQuery) return []; - - const sql = ` - SELECT - m.session_id, - s.title as session_title, - m.id as message_id, - m.role, - m.content, - bm25(memory_fts, 5.0, 1.0, 1.0) as bm25_score - FROM memory_fts f - JOIN memory_messages m ON m.id = f.rowid - JOIN memory_sessions s ON s.id = m.session_id - WHERE memory_fts MATCH ? AND s.active = 1 - ORDER BY bm25_score ASC - LIMIT ? - `; - - const rows = db.prepare(sql).all(ftsQuery, limit) as { - session_id: string; - session_title: string; - message_id: number; - role: string; - content: string; - bm25_score: number; - }[]; - - return rows.map((row) => ({ - session_id: row.session_id, - session_title: row.session_title, - message_id: row.message_id, - role: row.role, - content: row.content, - // Same BM25 normalization as store.ts: 1 / (1 + |score|) - score: 1 / (1 + Math.abs(row.bm25_score)), - source: "fts" as const, - })); -} - -/** - * Search memory using vector similarity. - * Two-step pattern: query vectors_vec first, then JOIN separately. - */ -export async function searchMemoryVec( - db: Database, - query: string, - limit: number = 20 -): Promise { - // Check if vectors_vec table exists - const tableExists = db - .prepare( - `SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'` - ) - .get(); - if (!tableExists) return []; - - // Get query embedding - const llm = getDefaultLlamaCpp(); - const formattedQuery = formatQueryForEmbedding(query); - const result = await llm.embed(formattedQuery, { isQuery: true }); - if (!result) return []; - - // Step 1: Get vector matches (no JOINs - sqlite-vec hangs with JOINs) - const vecResults = db - .prepare( - `SELECT hash_seq, distance FROM vectors_vec WHERE embedding MATCH ? AND k = ?` - ) - .all(new Float32Array(result.embedding), limit * 3) as { - hash_seq: string; - distance: number; - }[]; - - if (vecResults.length === 0) return []; - - // Step 2: Match against memory_messages by hash - const hashSeqs = vecResults.map((r) => r.hash_seq); - const distanceMap = new Map(vecResults.map((r) => [r.hash_seq, r.distance])); - - // Extract unique hashes from hash_seq (format: "hash_seq") - const hashes = [ - ...new Set(hashSeqs.map((hs) => hs.split("_").slice(0, -1).join("_"))), - ]; - const hashPlaceholders = hashes.map(() => "?").join(","); - - const docSql = ` - SELECT - m.id as message_id, - m.session_id, - s.title as session_title, - m.role, - m.content, - m.hash, - cv.hash || '_' || cv.seq as hash_seq - FROM memory_messages m - JOIN memory_sessions s ON s.id = m.session_id - JOIN content_vectors cv ON cv.hash = m.hash - WHERE m.hash IN (${hashPlaceholders}) AND s.active = 1 - `; - - const docRows = db.prepare(docSql).all(...hashes) as { - message_id: number; - session_id: string; - session_title: string; - role: string; - content: string; - hash: string; - hash_seq: string; - }[]; - - // Combine with distances, dedupe by message_id - const seen = new Map< - number, - { row: (typeof docRows)[0]; bestDist: number } - >(); - for (const row of docRows) { - const distance = distanceMap.get(row.hash_seq) ?? 1; - const existing = seen.get(row.message_id); - if (!existing || distance < existing.bestDist) { - seen.set(row.message_id, { row, bestDist: distance }); - } - } - - return Array.from(seen.values()) - .sort((a, b) => a.bestDist - b.bestDist) - .slice(0, limit) - .map(({ row, bestDist }) => ({ - session_id: row.session_id, - session_title: row.session_title, - message_id: row.message_id, - role: row.role, - content: row.content, - score: 1 - bestDist, // cosine similarity - source: "vec" as const, - })); -} - -// ============================================================================= -// Embedding -// ============================================================================= - -/** - * Embed unembedded memory messages. - * Reuses existing content_vectors + vectors_vec tables. - * Returns count of newly embedded messages. - */ -export async function embedMemoryMessages( - db: Database, - options: { onProgress?: (done: number, total: number) => void } = {} -): Promise { - // Find messages without embeddings - const unembedded = db - .prepare( - ` - SELECT m.hash, m.content, m.session_id - FROM memory_messages m - LEFT JOIN content_vectors cv ON cv.hash = m.hash AND cv.seq = 0 - WHERE cv.hash IS NULL - GROUP BY m.hash - ` - ) - .all() as { hash: string; content: string; session_id: string }[]; - - if (unembedded.length === 0) return 0; - - const llm = getDefaultLlamaCpp(); - let embedded = 0; - - for (const msg of unembedded) { - // Chunk the message content - const chunks = await chunkDocumentByTokens(msg.content); - - // Ensure vec table exists with correct dimensions - // Get dimension from first embedding - const firstText = formatDocForEmbedding(chunks[0]!.text); - const firstEmbed = await llm.embed(firstText); - if (!firstEmbed) continue; - - const dimensions = firstEmbed.embedding.length; - - // Ensure vectors_vec table exists with correct dimensions - const tableInfo = db - .prepare( - `SELECT sql FROM sqlite_master WHERE type='table' AND name='vectors_vec'` - ) - .get() as { sql: string } | null; - if (!tableInfo) { - db.exec( - `CREATE VIRTUAL TABLE vectors_vec USING vec0(hash_seq TEXT PRIMARY KEY, embedding float[${dimensions}] distance_metric=cosine)` - ); - } - - const now = new Date().toISOString(); - - // Insert first chunk embedding - insertEmbedding( - db, - msg.hash, - 0, - chunks[0]!.pos, - new Float32Array(firstEmbed.embedding), - firstEmbed.model, - now - ); - - // Embed remaining chunks - for (let i = 1; i < chunks.length; i++) { - const chunk = chunks[i]!; - const text = formatDocForEmbedding(chunk.text); - const embedResult = await llm.embed(text); - if (embedResult) { - insertEmbedding( - db, - msg.hash, - i, - chunk.pos, - new Float32Array(embedResult.embedding), - embedResult.model, - now - ); - } - } - - embedded++; - options.onProgress?.(embedded, unembedded.length); - } - - return embedded; -} - -// ============================================================================= -// Summarization -// ============================================================================= - -/** - * Summarize a session via Ollama and store the summary. - */ -export async function summarizeSession( - db: Database, - sessionId: string, - options: { model?: string; force?: boolean } = {} -): Promise { - const session = getSession(db, sessionId); - if (!session) throw new Error(`Session not found: ${sessionId}`); - - // Check if already summarized (unless force) - if (session.summary && !options.force) { - return session.summary; - } - - const transcript = getSessionTranscript(db, sessionId); - if (!transcript.trim()) throw new Error(`Session ${sessionId} has no messages`); - - const summary = await ollamaSummarize(transcript, { model: options.model }); - const now = new Date().toISOString(); - - db.prepare( - `UPDATE memory_sessions SET summary = ?, summary_at = ? WHERE id = ?` - ).run(summary, now, sessionId); - - return summary; -} - -/** - * Summarize recent sessions that don't have summaries yet. - * Returns count of sessions summarized. - */ -export async function summarizeRecentSessions( - db: Database, - options: { limit?: number; model?: string } = {} -): Promise { - const limit = options.limit ?? 10; - const sessions = db - .prepare( - `SELECT id FROM memory_sessions WHERE active = 1 AND summary IS NULL ORDER BY updated_at DESC LIMIT ?` - ) - .all(limit) as { id: string }[]; - - let count = 0; - for (const s of sessions) { - try { - await summarizeSession(db, s.id, { model: options.model }); - count++; - } catch { - // Skip sessions that fail to summarize - } - } - return count; -} - -// ============================================================================= -// Recall -// ============================================================================= - -/** - * Recall relevant memories for a query. - * Combines FTS + vector search using RRF, deduplicates by session, - * and optionally synthesizes via Ollama. - */ -export async function recallMemories( - db: Database, - query: string, - options: { - limit?: number; - synthesize?: boolean; - model?: string; - maxTokens?: number; - } = {} -): Promise<{ results: MemorySearchResult[]; synthesis?: string }> { - const limit = options.limit ?? 10; - - // Run FTS and vector search - const ftsResults = searchMemoryFTS(db, query, limit); - let vecResults: MemorySearchResult[] = []; - try { - vecResults = await searchMemoryVec(db, query, limit); - } catch { - // Vector search may fail if no embeddings exist - } - - // Convert to RankedResult format for RRF - const toRanked = (results: MemorySearchResult[]): RankedResult[] => - results.map((r) => ({ - file: `${r.session_id}:${r.message_id}`, - displayPath: r.session_title, - title: r.role, - body: r.content, - score: r.score, - })); - - // Fuse results with RRF - const fused = reciprocalRankFusion( - [toRanked(ftsResults), toRanked(vecResults)], - [1.0, 1.0] - ); - - // Deduplicate by session, keeping best score per session - const sessionSeen = new Map(); - const dedupedResults: MemorySearchResult[] = []; - - for (const r of fused) { - const [sessionId] = r.file.split(":"); - if (!sessionId) continue; - - // Find the original result to preserve all fields - const original = - [...ftsResults, ...vecResults].find( - (o) => `${o.session_id}:${o.message_id}` === r.file - ) || null; - - if (original && !sessionSeen.has(sessionId)) { - sessionSeen.set(sessionId, true); - dedupedResults.push({ ...original, score: r.score }); - } else if (!original && !sessionSeen.has(sessionId)) { - sessionSeen.set(sessionId, true); - dedupedResults.push({ - session_id: sessionId!, - session_title: r.displayPath, - message_id: parseInt(r.file.split(":")[1] || "0"), - role: r.title, - content: r.body, - score: r.score, - source: "fts", - }); - } - } - - const results = dedupedResults.slice(0, limit); - - // Optionally synthesize via Ollama - let synthesis: string | undefined; - if (options.synthesize && results.length > 0) { - const memoriesText = results - .map( - (r) => - `[Session: ${r.session_title || r.session_id}]\n${r.role}: ${r.content}` - ) - .join("\n\n---\n\n"); - - synthesis = await ollamaRecallSynthesize(query, memoriesText, { - model: options.model, - maxTokens: options.maxTokens, - }); - } - - return { results, synthesis }; -} - -// ============================================================================= -// Import -// ============================================================================= - -/** - * Import a conversation transcript from a file. - * Supports 'chat' format (role: content) and 'jsonl' format. - */ -export async function importTranscript( - db: Database, - content: string, - options: { title?: string; format?: "chat" | "jsonl"; sessionId?: string } = {} -): Promise<{ sessionId: string; messageCount: number }> { - const format = options.format ?? "chat"; - const sessionId = options.sessionId || crypto.randomUUID().slice(0, 8); - - let messages: { role: string; content: string }[] = []; - - if (format === "jsonl") { - messages = content - .split("\n") - .filter((line) => line.trim()) - .map((line) => { - const parsed = JSON.parse(line); - return { role: parsed.role || "user", content: parsed.content || "" }; - }); - } else { - // Chat format: "role: content" separated by blank lines - const blocks = content.split(/\n\n+/); - for (const block of blocks) { - const trimmed = block.trim(); - if (!trimmed) continue; - const colonIdx = trimmed.indexOf(":"); - if (colonIdx > 0 && colonIdx < 20) { - const role = trimmed.slice(0, colonIdx).trim().toLowerCase(); - const msgContent = trimmed.slice(colonIdx + 1).trim(); - if (msgContent) { - messages.push({ role, content: msgContent }); - } - } else { - messages.push({ role: "user", content: trimmed }); - } - } - } - - for (const msg of messages) { - await addMessage(db, sessionId, msg.role, msg.content, { - title: options.title, - }); - } - - return { sessionId, messageCount: messages.length }; -} - -// ============================================================================= -// Status -// ============================================================================= - -/** - * Get memory statistics. - */ -export function getMemoryStatus(db: Database): { - sessions: number; - activeSessions: number; - messages: number; - embeddedMessages: number; - summarizedSessions: number; -} { - const sessions = ( - db - .prepare(`SELECT COUNT(*) as count FROM memory_sessions`) - .get() as { count: number } - ).count; - - const activeSessions = ( - db - .prepare( - `SELECT COUNT(*) as count FROM memory_sessions WHERE active = 1` - ) - .get() as { count: number } - ).count; - - const messages = ( - db - .prepare(`SELECT COUNT(*) as count FROM memory_messages`) - .get() as { count: number } - ).count; - - const embeddedMessages = ( - db - .prepare( - `SELECT COUNT(DISTINCT m.hash) as count FROM memory_messages m - JOIN content_vectors cv ON cv.hash = m.hash` - ) - .get() as { count: number } - ).count; - - const summarizedSessions = ( - db - .prepare( - `SELECT COUNT(*) as count FROM memory_sessions WHERE summary IS NOT NULL` - ) - .get() as { count: number } - ).count; - - return { - sessions, - activeSessions, - messages, - embeddedMessages, - summarizedSessions, - }; -} diff --git a/src/ollama.ts b/src/ollama.ts deleted file mode 100644 index 0bbbde98..00000000 --- a/src/ollama.ts +++ /dev/null @@ -1,169 +0,0 @@ -/** - * ollama.ts - Ollama API client for QMD memory summarization and synthesis - * - * Uses Bun's fetch() to call Ollama's HTTP API. Separate from llm.ts which - * uses node-llama-cpp for embeddings/reranking. - * - * Config via env: - * OLLAMA_HOST - Ollama server URL (default: http://127.0.0.1:11434) - * QMD_MEMORY_MODEL - Model for summarization/synthesis (default: qwen3:8b-tuned) - */ - -// ============================================================================= -// Configuration -// ============================================================================= - -const OLLAMA_HOST = Bun.env.OLLAMA_HOST || "http://127.0.0.1:11434"; -const DEFAULT_MEMORY_MODEL = Bun.env.QMD_MEMORY_MODEL || "qwen3:8b-tuned"; - -// ============================================================================= -// Types -// ============================================================================= - -export type OllamaChatMessage = { - role: "system" | "user" | "assistant"; - content: string; -}; - -export type OllamaChatOptions = { - model?: string; - temperature?: number; - maxTokens?: number; -}; - -export type OllamaChatResponse = { - model: string; - message: OllamaChatMessage; - done: boolean; - total_duration?: number; - eval_count?: number; -}; - -// ============================================================================= -// Core API -// ============================================================================= - -/** - * Send a chat completion request to Ollama. - * Uses stream: false for simple request/response. - */ -export async function ollamaChat( - messages: OllamaChatMessage[], - options: OllamaChatOptions = {} -): Promise { - const model = options.model || DEFAULT_MEMORY_MODEL; - const resp = await fetch(`${OLLAMA_HOST}/api/chat`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - model, - messages, - stream: false, - options: { - ...(options.temperature !== undefined && { temperature: options.temperature }), - ...(options.maxTokens !== undefined && { num_predict: options.maxTokens }), - }, - }), - }); - - if (!resp.ok) { - const body = await resp.text(); - throw new Error(`Ollama chat failed (${resp.status}): ${body}`); - } - - return resp.json() as Promise; -} - -/** - * Summarize a conversation transcript via Ollama. - * Returns a concise summary of the conversation. - */ -export async function ollamaSummarize( - transcript: string, - options: OllamaChatOptions = {} -): Promise { - const messages: OllamaChatMessage[] = [ - { - role: "system", - content: - "You are a conversation summarizer. Produce a concise summary of the following conversation. " + - "Focus on key topics discussed, decisions made, questions asked, and solutions provided. " + - "Keep it under 200 words. Output only the summary, no preamble.", - }, - { - role: "user", - content: transcript, - }, - ]; - - const resp = await ollamaChat(messages, { - ...options, - temperature: options.temperature ?? 0.3, - maxTokens: options.maxTokens ?? 512, - }); - - return resp.message.content.trim(); -} - -/** - * Synthesize recalled memories into coherent context via Ollama. - * Takes a query and memory fragments, returns a synthesized response. - */ -export async function ollamaRecall( - query: string, - memories: string, - options: OllamaChatOptions = {} -): Promise { - const messages: OllamaChatMessage[] = [ - { - role: "system", - content: - "You are a memory recall assistant. Given a query and relevant past conversation memories, " + - "synthesize the memories into useful context for answering the query. " + - "Be concise and focus on information directly relevant to the query. " + - "If memories contain contradictory information, note the most recent. " + - "Output only the synthesized context, no preamble.", - }, - { - role: "user", - content: `Query: ${query}\n\nRelevant memories:\n${memories}`, - }, - ]; - - const resp = await ollamaChat(messages, { - ...options, - temperature: options.temperature ?? 0.3, - maxTokens: options.maxTokens ?? 1024, - }); - - return resp.message.content.trim(); -} - -/** - * Check if Ollama is running and accessible. - * Pings the /api/tags endpoint. - */ -export async function ollamaHealthCheck(): Promise<{ - ok: boolean; - models?: string[]; - error?: string; -}> { - try { - const resp = await fetch(`${OLLAMA_HOST}/api/tags`, { - signal: AbortSignal.timeout(5000), - }); - if (!resp.ok) { - return { ok: false, error: `HTTP ${resp.status}` }; - } - const data = (await resp.json()) as { models?: { name: string }[] }; - const models = data.models?.map((m) => m.name) || []; - return { ok: true, models }; - } catch (err) { - return { - ok: false, - error: err instanceof Error ? err.message : String(err), - }; - } -} - -export { DEFAULT_MEMORY_MODEL, OLLAMA_HOST }; diff --git a/src/qmd.ts b/src/qmd.ts index a6b4b312..9446ab9d 100755 --- a/src/qmd.ts +++ b/src/qmd.ts @@ -1,9 +1,11 @@ -#!/usr/bin/env bun -import { Database } from "bun:sqlite"; -import { Glob, $ } from "bun"; +import { openDatabase } from "./db.js"; +import type { Database } from "./db.js"; +import fastGlob from "fast-glob"; +import { execSync, spawn as nodeSpawn } from "child_process"; +import { fileURLToPath } from "url"; +import { dirname, join as pathJoin } from "path"; import { parseArgs } from "util"; -import { readFileSync, statSync } from "fs"; -import * as sqliteVec from "sqlite-vec"; +import { readFileSync, realpathSync, statSync, existsSync, unlinkSync, writeFileSync, openSync, closeSync, mkdirSync } from "fs"; import { getPwd, getRealPath, @@ -11,7 +13,6 @@ import { resolve, enableProductionMode, searchFTS, - searchVec, extractSnippet, getContextForFile, getContextForPath, @@ -30,8 +31,6 @@ import { hashContent, extractTitle, formatDocForEmbedding, - formatQueryForEmbedding, - chunkDocument, chunkDocumentByTokens, clearCache, getCacheKey, @@ -58,16 +57,21 @@ import { getCollectionsWithoutContext, getTopLevelPathsWithoutContext, handelize, + hybridQuery, + vectorSearchQuery, + structuredSearch, + addLineNumbers, + type ExpandedQuery, + type HybridQueryExplain, + type StructuredSubSearch, DEFAULT_EMBED_MODEL, - DEFAULT_QUERY_MODEL, DEFAULT_RERANK_MODEL, DEFAULT_GLOB, DEFAULT_MULTI_GET_MAX_BYTES, createStore, getDefaultDbPath, } from "./store.js"; -import { getDefaultLlamaCpp, disposeDefaultLlamaCpp, withLLMSession, pullModels, DEFAULT_EMBED_MODEL_URI, DEFAULT_GENERATE_MODEL_URI, DEFAULT_RERANK_MODEL_URI, DEFAULT_MODEL_CACHE_DIR, type ILLMSession, type RerankDocument, type Queryable, type QueryType } from "./llm.js"; -import type { SearchResult, RankedResult } from "./store.js"; +import { disposeDefaultLlamaCpp, getDefaultLlamaCpp, withLLMSession, pullModels, DEFAULT_EMBED_MODEL_URI, DEFAULT_GENERATE_MODEL_URI, DEFAULT_RERANK_MODEL_URI, DEFAULT_MODEL_CACHE_DIR } from "./llm.js"; import { formatSearchResults, formatDocuments, @@ -78,6 +82,7 @@ import { import { getCollection as getCollectionFromYaml, listCollections as yamlListCollections, + getDefaultCollectionNames, addContext as yamlAddContext, removeContext as yamlRemoveContext, setGlobalContext, @@ -119,7 +124,16 @@ function getDbPath(): string { } function setIndexName(name: string | null): void { - storeDbPathOverride = name ? getDefaultDbPath(name) : undefined; + let normalizedName = name; + // Normalize relative paths to prevent malformed database paths + if (name && name.includes('/')) { + const { resolve } = require('path'); + const { cwd } = require('process'); + const absolutePath = resolve(cwd(), name); + // Replace path separators with underscores to create a valid filename + normalizedName = absolutePath.replace(/\//g, '_').replace(/^_/, ''); + } + storeDbPathOverride = normalizedName ? getDefaultDbPath(normalizedName) : undefined; // Reset open handle so next use opens the new index closeDb(); } @@ -152,19 +166,20 @@ const cursor = { process.on('SIGINT', () => { cursor.show(); process.exit(130); }); process.on('SIGTERM', () => { cursor.show(); process.exit(143); }); -// Terminal progress bar using OSC 9;4 escape sequence +// Terminal progress bar using OSC 9;4 escape sequence (TTY only) +const isTTY = process.stderr.isTTY; const progress = { set(percent: number) { - process.stderr.write(`\x1b]9;4;1;${Math.round(percent)}\x07`); + if (isTTY) process.stderr.write(`\x1b]9;4;1;${Math.round(percent)}\x07`); }, clear() { - process.stderr.write(`\x1b]9;4;0\x07`); + if (isTTY) process.stderr.write(`\x1b]9;4;0\x07`); }, indeterminate() { - process.stderr.write(`\x1b]9;4;3\x07`); + if (isTTY) process.stderr.write(`\x1b]9;4;3\x07`); }, error() { - process.stderr.write(`\x1b]9;4;2\x07`); + if (isTTY) process.stderr.write(`\x1b]9;4;2\x07`); }, }; @@ -232,28 +247,6 @@ function computeDisplayPath( return filepath; } -// Rerank documents using node-llama-cpp cross-encoder model -async function rerank(query: string, documents: { file: string; text: string }[], _model: string = DEFAULT_RERANK_MODEL, _db?: Database, session?: ILLMSession): Promise<{ file: string; score: number }[]> { - if (documents.length === 0) return []; - - const total = documents.length; - process.stderr.write(`Reranking ${total} documents...\n`); - progress.indeterminate(); - - const rerankDocs: RerankDocument[] = documents.map((doc) => ({ - file: doc.file, - text: doc.text.slice(0, 4000), // Truncate to context limit - })); - - const result = session - ? await session.rerank(query, rerankDocs) - : await getDefaultLlamaCpp().rerank(query, rerankDocs); - - progress.clear(); - process.stderr.write("\n"); - - return result.results.map((r) => ({ file: r.file, score: r.score })); -} function formatTimeAgo(date: Date): string { const seconds = Math.floor((Date.now() - date.getTime()) / 1000); @@ -266,6 +259,11 @@ function formatTimeAgo(date: Date): string { return `${days}d ago`; } +function formatMs(ms: number): string { + if (ms < 1000) return `${ms}ms`; + return `${(ms / 1000).toFixed(1)}s`; +} + function formatBytes(bytes: number): string { if (bytes < 1024) return `${bytes} B`; if (bytes < 1024 * 1024) return `${(bytes / 1024).toFixed(1)} KB`; @@ -273,7 +271,7 @@ function formatBytes(bytes: number): string { return `${(bytes / (1024 * 1024 * 1024)).toFixed(1)} GB`; } -function showStatus(): void { +async function showStatus(): Promise { const dbPath = getDbPath(); const db = getDb(); @@ -300,7 +298,24 @@ function showStatus(): void { console.log(`${c.bold}QMD Status${c.reset}\n`); console.log(`Index: ${dbPath}`); - console.log(`Size: ${formatBytes(indexSize)}\n`); + console.log(`Size: ${formatBytes(indexSize)}`); + + // MCP daemon status (check PID file liveness) + const mcpCacheDir = process.env.XDG_CACHE_HOME + ? resolve(process.env.XDG_CACHE_HOME, "qmd") + : resolve(homedir(), ".cache", "qmd"); + const mcpPidPath = resolve(mcpCacheDir, "mcp.pid"); + if (existsSync(mcpPidPath)) { + const mcpPid = parseInt(readFileSync(mcpPidPath, "utf-8").trim()); + try { + process.kill(mcpPid, 0); + console.log(`MCP: ${c.green}running${c.reset} (PID ${mcpPid})`); + } catch { + unlinkSync(mcpPidPath); + // Stale PID file cleaned up silently + } + } + console.log(""); console.log(`${c.bold}Documents${c.reset}`); console.log(` Total: ${totalDocs.count} files indexed`); @@ -369,6 +384,84 @@ function showStatus(): void { console.log(`\n${c.dim}No collections. Run 'qmd collection add .' to index markdown files.${c.reset}`); } + // Models + { + // hf:org/repo/file.gguf → https://huggingface.co/org/repo + const hfLink = (uri: string) => { + const match = uri.match(/^hf:([^/]+\/[^/]+)\//); + return match ? `https://huggingface.co/${match[1]}` : uri; + }; + console.log(`\n${c.bold}Models${c.reset}`); + console.log(` Embedding: ${hfLink(DEFAULT_EMBED_MODEL_URI)}`); + console.log(` Reranking: ${hfLink(DEFAULT_RERANK_MODEL_URI)}`); + console.log(` Generation: ${hfLink(DEFAULT_GENERATE_MODEL_URI)}`); + } + + // Device / GPU info + try { + const llm = getDefaultLlamaCpp(); + const device = await llm.getDeviceInfo(); + console.log(`\n${c.bold}Device${c.reset}`); + if (device.gpu) { + console.log(` GPU: ${c.green}${device.gpu}${c.reset} (offloading: ${device.gpuOffloading ? 'yes' : 'no'})`); + if (device.gpuDevices.length > 0) { + // Deduplicate and count GPUs + const counts = new Map(); + for (const name of device.gpuDevices) { + counts.set(name, (counts.get(name) || 0) + 1); + } + const deviceStr = Array.from(counts.entries()) + .map(([name, count]) => count > 1 ? `${count}× ${name}` : name) + .join(', '); + console.log(` Devices: ${deviceStr}`); + } + if (device.vram) { + console.log(` VRAM: ${formatBytes(device.vram.free)} free / ${formatBytes(device.vram.total)} total`); + } + } else { + console.log(` GPU: ${c.yellow}none${c.reset} (running on CPU — models will be slow)`); + console.log(` ${c.dim}Tip: Install CUDA, Vulkan, or Metal support for GPU acceleration.${c.reset}`); + } + console.log(` CPU: ${device.cpuCores} math cores`); + } catch { + // Don't fail status if LLM init fails + } + + // Tips section + const tips: string[] = []; + + // Check for collections without context + const collectionsWithoutContext = collections.filter(col => { + const contexts = contextsByCollection.get(col.name) || []; + return contexts.length === 0; + }); + if (collectionsWithoutContext.length > 0) { + const names = collectionsWithoutContext.map(c => c.name).slice(0, 3).join(', '); + const more = collectionsWithoutContext.length > 3 ? ` +${collectionsWithoutContext.length - 3} more` : ''; + tips.push(`Add context to collections for better search results: ${names}${more}`); + tips.push(` ${c.dim}qmd context add qmd:/// "What this collection contains"${c.reset}`); + tips.push(` ${c.dim}qmd context add qmd:///meeting-notes "Weekly team meeting notes"${c.reset}`); + } + + // Check for collections without update commands + const collectionsWithoutUpdate = collections.filter(col => { + const yamlCol = getCollectionFromYaml(col.name); + return !yamlCol?.update; + }); + if (collectionsWithoutUpdate.length > 0 && collections.length > 1) { + const names = collectionsWithoutUpdate.map(c => c.name).slice(0, 3).join(', '); + const more = collectionsWithoutUpdate.length > 3 ? ` +${collectionsWithoutUpdate.length - 3} more` : ''; + tips.push(`Add update commands to keep collections fresh: ${names}${more}`); + tips.push(` ${c.dim}qmd collection update-cmd 'git stash && git pull --rebase --ff-only && git stash pop'${c.reset}`); + } + + if (tips.length > 0) { + console.log(`\n${c.bold}Tips${c.reset}`); + for (const tip of tips) { + console.log(` ${tip}`); + } + } + closeDb(); } @@ -400,15 +493,19 @@ async function updateCollections(): Promise { if (yamlCol?.update) { console.log(`${c.dim} Running update command: ${yamlCol.update}${c.reset}`); try { - const proc = Bun.spawn(["/usr/bin/env", "bash", "-c", yamlCol.update], { + const proc = nodeSpawn("bash", ["-c", yamlCol.update], { cwd: col.pwd, - stdout: "pipe", - stderr: "pipe", + stdio: ["ignore", "pipe", "pipe"], }); - const output = await new Response(proc.stdout).text(); - const errorOutput = await new Response(proc.stderr).text(); - const exitCode = await proc.exited; + const [output, errorOutput, exitCode] = await new Promise<[string, string, number]>((resolve, reject) => { + let out = ""; + let err = ""; + proc.stdout?.on("data", (d: Buffer) => { out += d.toString(); }); + proc.stderr?.on("data", (d: Buffer) => { err += d.toString(); }); + proc.on("error", reject); + proc.on("close", (code) => resolve([out, err, code ?? 1])); + }); if (output.trim()) { console.log(output.trim().split('\n').map(l => ` ${l}`).join('\n')); @@ -427,7 +524,7 @@ async function updateCollections(): Promise { } } - await indexFiles(col.pwd, col.glob_pattern, col.name, true); + await indexFiles(col.pwd, col.glob_pattern, col.name, true, yamlCol?.ignore); console.log(""); } @@ -631,63 +728,6 @@ function contextRemove(pathArg: string): void { console.log(`${c.green}✓${c.reset} Removed context for: qmd://${detected.collectionName}/${detected.relativePath}`); } -function contextCheck(): void { - const db = getDb(); - - // Get collections without any context - const collectionsWithoutContext = getCollectionsWithoutContext(db); - - // Get all collections to check for missing path contexts - const allCollections = listCollections(db); - - if (collectionsWithoutContext.length === 0 && allCollections.length > 0) { - // Check if all collections have contexts - console.log(`\n${c.green}✓${c.reset} ${c.bold}All collections have context configured${c.reset}\n`); - } - - if (collectionsWithoutContext.length > 0) { - console.log(`\n${c.yellow}Collections without any context:${c.reset}\n`); - - for (const coll of collectionsWithoutContext) { - console.log(`${c.cyan}${coll.name}${c.reset} ${c.dim}(${coll.doc_count} documents)${c.reset}`); - console.log(` ${c.dim}Suggestion: qmd context add qmd://${coll.name}/ "Description of ${coll.name}"${c.reset}\n`); - } - } - - // Check for top-level paths without context within collections that DO have context - const collectionsWithContext = allCollections.filter(c => - c && !collectionsWithoutContext.some(cwc => cwc.name === c.name) - ); - - let hasPathSuggestions = false; - - for (const coll of collectionsWithContext) { - if (!coll) continue; - const missingPaths = getTopLevelPathsWithoutContext(db, coll.name); - - if (missingPaths.length > 0) { - if (!hasPathSuggestions) { - console.log(`${c.yellow}Top-level directories without context:${c.reset}\n`); - hasPathSuggestions = true; - } - - console.log(`${c.cyan}${coll.name}${c.reset}`); - for (const path of missingPaths) { - console.log(` ${path}`); - console.log(` ${c.dim}Suggestion: qmd context add qmd://${coll.name}/${path} "Description of ${path}"${c.reset}`); - } - console.log(''); - } - } - - if (collectionsWithoutContext.length === 0 && !hasPathSuggestions) { - console.log(`${c.dim}All collections and major paths have context configured.${c.reset}`); - console.log(`${c.dim}Use 'qmd context list' to see all configured contexts.${c.reset}\n`); - } - - closeDb(); -} - function getDocument(filename: string, fromLine?: number, maxLines?: number, lineNumbers?: boolean): void { const db = getDb(); @@ -1111,7 +1151,7 @@ function listFiles(pathArg?: string): void { const yamlCollections = yamlListCollections(); if (yamlCollections.length === 0) { - console.log("No collections found. Run 'qmd add .' to index files."); + console.log("No collections found. Run 'qmd collection add .' to index files."); closeDb(); return; } @@ -1250,7 +1290,7 @@ function collectionList(): void { const collections = listCollections(db); if (collections.length === 0) { - console.log("No collections found. Run 'qmd add .' to create one."); + console.log("No collections found. Run 'qmd collection add .' to create one."); closeDb(); return; } @@ -1260,9 +1300,17 @@ function collectionList(): void { for (const coll of collections) { const updatedAt = coll.last_modified ? new Date(coll.last_modified) : new Date(); const timeAgo = formatTimeAgo(updatedAt); + + // Get YAML config to check includeByDefault + const yamlColl = getCollectionFromYaml(coll.name); + const excluded = yamlColl?.includeByDefault === false; + const excludeTag = excluded ? ` ${c.yellow}[excluded]${c.reset}` : ''; - console.log(`${c.cyan}${coll.name}${c.reset} ${c.dim}(qmd://${coll.name}/)${c.reset}`); + console.log(`${c.cyan}${coll.name}${c.reset} ${c.dim}(qmd://${coll.name}/)${c.reset}${excludeTag}`); console.log(` ${c.dim}Pattern:${c.reset} ${coll.glob_pattern}`); + if (yamlColl?.ignore?.length) { + console.log(` ${c.dim}Ignore:${c.reset} ${yamlColl.ignore.join(', ')}`); + } console.log(` ${c.dim}Files:${c.reset} ${coll.active_count}`); console.log(` ${c.dim}Updated:${c.reset} ${timeAgo}`); console.log(); @@ -1305,7 +1353,8 @@ async function collectionAdd(pwd: string, globPattern: string, name?: string): P // Create the collection and index files console.log(`Creating collection '${collName}'...`); - await indexFiles(pwd, globPattern, collName); + const newColl = getCollectionFromYaml(collName); + await indexFiles(pwd, globPattern, collName, false, newColl?.ignore); console.log(`${c.green}✓${c.reset} Collection '${collName}' created successfully`); } @@ -1354,7 +1403,7 @@ function collectionRename(oldName: string, newName: string): void { console.log(` Virtual paths updated: ${c.cyan}qmd://${oldName}/${c.reset} → ${c.cyan}qmd://${newName}/${c.reset}`); } -async function indexFiles(pwd?: string, globPattern: string = DEFAULT_GLOB, collectionName?: string, suppressEmbedNotice: boolean = false): Promise { +async function indexFiles(pwd?: string, globPattern: string = DEFAULT_GLOB, collectionName?: string, suppressEmbedNotice: boolean = false, ignorePatterns?: string[]): Promise { const db = getDb(); const resolvedPwd = pwd || getPwd(); const now = new Date().toISOString(); @@ -1371,27 +1420,29 @@ async function indexFiles(pwd?: string, globPattern: string = DEFAULT_GLOB, coll console.log(`Collection: ${resolvedPwd} (${globPattern})`); progress.indeterminate(); - const glob = new Glob(globPattern); - const files: string[] = []; - for await (const file of glob.scan({ cwd: resolvedPwd, onlyFiles: true, followSymlinks: true })) { - // Skip node_modules, hidden folders (.*), and other common excludes + const allIgnore = [ + ...excludeDirs.map(d => `**/${d}/**`), + ...(ignorePatterns || []), + ]; + const allFiles: string[] = await fastGlob(globPattern, { + cwd: resolvedPwd, + onlyFiles: true, + followSymbolicLinks: false, + dot: false, + ignore: allIgnore, + }); + // Filter hidden files/folders (dot: false handles top-level but not nested) + const files = allFiles.filter(file => { const parts = file.split("/"); - const shouldSkip = parts.some(part => - part === "node_modules" || - part.startsWith(".") || - excludeDirs.includes(part) - ); - if (!shouldSkip) { - files.push(file); - } - } + return !parts.some(part => part.startsWith(".")); + }); const total = files.length; - if (total === 0) { + const hasNoFiles = total === 0; + if (hasNoFiles) { progress.clear(); console.log("No files found matching pattern."); - closeDb(); - return; + // Continue so the deactivation pass can mark previously indexed docs as inactive. } let indexed = 0, updated = 0, unchanged = 0, processed = 0; @@ -1403,7 +1454,15 @@ async function indexFiles(pwd?: string, globPattern: string = DEFAULT_GLOB, coll const path = handelize(relativeFile); // Normalize path for token-friendliness seenPaths.add(path); - const content = readFileSync(filepath, "utf-8"); + let content: string; + try { + content = readFileSync(filepath, "utf-8"); + } catch (err: any) { + // Skip files that can't be read (e.g. iCloud evicted files returning EAGAIN) + processed++; + progress.set((processed / total) * 100); + continue; + } // Skip empty files - nothing useful to index if (!content.trim()) { @@ -1450,7 +1509,7 @@ async function indexFiles(pwd?: string, globPattern: string = DEFAULT_GLOB, coll const rate = processed / elapsed; const remaining = (total - processed) / rate; const eta = processed > 2 ? ` ETA: ${formatETA(remaining)}` : ""; - process.stderr.write(`\rIndexing: ${processed}/${total}${eta} `); + if (isTTY) process.stderr.write(`\rIndexing: ${processed}/${total}${eta} `); } // Deactivate documents in this collection that no longer exist @@ -1641,7 +1700,7 @@ async function vectorIndex(model: string = DEFAULT_EMBED_MODEL, force: boolean = const eta = elapsed > 2 ? formatETA(etaSec) : "..."; const errStr = errors > 0 ? ` ${c.yellow}${errors} err${c.reset}` : ""; - process.stderr.write(`\r${c.cyan}${bar}${c.reset} ${c.bold}${percentStr}%${c.reset} ${c.dim}${chunksEmbedded}/${totalChunks}${c.reset}${errStr} ${c.dim}${throughput} ETA ${eta}${c.reset} `); + if (isTTY) process.stderr.write(`\r${c.cyan}${bar}${c.reset} ${c.bold}${percentStr}%${c.reset} ${c.dim}${chunksEmbedded}/${totalChunks}${c.reset}${errStr} ${c.dim}${throughput} ETA ${eta}${c.reset} `); } progress.clear(); @@ -1701,64 +1760,18 @@ function normalizeBM25(score: number): number { return 1 / (1 + Math.exp(-(absScore - 5) / 3)); } -function normalizeScores(results: SearchResult[]): SearchResult[] { - if (results.length === 0) return results; - const maxScore = Math.max(...results.map(r => r.score)); - const minScore = Math.min(...results.map(r => r.score)); - const range = maxScore - minScore || 1; - return results.map(r => ({ ...r, score: (r.score - minScore) / range })); -} - -// Reciprocal Rank Fusion: combines multiple ranked lists -// RRF score = sum(1 / (k + rank)) across all lists where doc appears -// k=60 is standard, provides good balance between top and lower ranks - -function reciprocalRankFusion( - resultLists: RankedResult[][], - weights: number[] = [], // Weight per result list (default 1.0) - k: number = 60 -): RankedResult[] { - const scores = new Map(); - - for (let listIdx = 0; listIdx < resultLists.length; listIdx++) { - const results = resultLists[listIdx]; - if (!results) continue; - const weight = weights[listIdx] ?? 1.0; - for (let rank = 0; rank < results.length; rank++) { - const doc = results[rank]; - if (!doc) continue; // Ensure doc is not undefined - const rrfScore = weight / (k + rank + 1); - const existing = scores.get(doc.file); - if (existing) { - existing.score += rrfScore; - existing.bestRank = Math.min(existing.bestRank, rank); - } else { - scores.set(doc.file, { score: rrfScore, displayPath: doc.displayPath, title: doc.title, body: doc.body, bestRank: rank }); - } - } - } - - // Add bonus for best rank: documents that ranked #1-3 in any list get a boost - // This prevents dilution of exact matches by expansion queries - return Array.from(scores.entries()) - .map(([file, { score, displayPath, title, body, bestRank }]) => { - let bonus = 0; - if (bestRank === 0) bonus = 0.05; // Ranked #1 somewhere - else if (bestRank <= 2) bonus = 0.02; // Ranked top-3 somewhere - return { file, displayPath, title, body, score: score + bonus }; - }) - .sort((a, b) => b.score - a.score); -} - type OutputOptions = { format: OutputFormat; full: boolean; limit: number; minScore: number; all?: boolean; - collection?: string; // Filter by collection name (pwd suffix match) + collection?: string | string[]; // Filter by collection name(s) lineNumbers?: boolean; // Add line numbers to output + explain?: boolean; // Include retrieval score traces (query only) context?: string; // Optional context for query expansion + candidateLimit?: number; // Max candidates to rerank (default: 40) + intent?: string; // Domain intent for disambiguation }; // Highlight query terms in text (skip short words < 3 chars) @@ -1782,6 +1795,10 @@ function formatScore(score: number): string { return `${c.dim}${pct}%${c.reset}`; } +function formatExplainNumber(value: number): string { + return value.toFixed(4); +} + // Shorten directory path for display - relative to $HOME (used for context paths, not documents) function shortPath(dirpath: string): string { const home = homedir(); @@ -1791,17 +1808,51 @@ function shortPath(dirpath: string): string { return dirpath; } -// Add line numbers to text content -function addLineNumbers(text: string, startLine: number = 1): string { - const lines = text.split('\n'); - return lines.map((line, i) => `${startLine + i}: ${line}`).join('\n'); +type EmptySearchReason = "no_results" | "min_score"; + +// Emit format-safe empty output for search commands. +function printEmptySearchResults(format: OutputFormat, reason: EmptySearchReason = "no_results"): void { + if (format === "json") { + console.log("[]"); + return; + } + if (format === "csv") { + console.log("docid,score,file,title,context,line,snippet"); + return; + } + if (format === "xml") { + console.log(""); + return; + } + if (format === "md" || format === "files") { + return; + } + + if (reason === "min_score") { + console.log("No results found above minimum score threshold."); + return; + } + console.log("No results found."); } -function outputResults(results: { file: string; displayPath: string; title: string; body: string; score: number; context?: string | null; chunkPos?: number; hash?: string; docid?: string }[], query: string, opts: OutputOptions): void { +type OutputRow = { + file: string; + displayPath: string; + title: string; + body: string; + score: number; + context?: string | null; + chunkPos?: number; + hash?: string; + docid?: string; + explain?: HybridQueryExplain; +}; + +function outputResults(results: OutputRow[], query: string, opts: OutputOptions): void { const filtered = results.filter(r => r.score >= opts.minScore).slice(0, opts.limit); if (filtered.length === 0) { - console.log("No results found above minimum score threshold."); + printEmptySearchResults(opts.format, "min_score"); return; } @@ -1813,7 +1864,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri const output = filtered.map(row => { const docid = row.docid || (row.hash ? row.hash.slice(0, 6) : undefined); let body = opts.full ? row.body : undefined; - let snippet = !opts.full ? extractSnippet(row.body, query, 300, row.chunkPos).snippet : undefined; + let snippet = !opts.full ? extractSnippet(row.body, query, 300, row.chunkPos, undefined, opts.intent).snippet : undefined; if (opts.lineNumbers) { if (body) body = addLineNumbers(body); if (snippet) snippet = addLineNumbers(snippet); @@ -1826,6 +1877,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri ...(row.context && { context: row.context }), ...(body && { body }), ...(snippet && { snippet }), + ...(opts.explain && row.explain && { explain: row.explain }), }; }); console.log(JSON.stringify(output, null, 2)); @@ -1840,7 +1892,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri for (let i = 0; i < filtered.length; i++) { const row = filtered[i]; if (!row) continue; - const { line, snippet } = extractSnippet(row.body, query, 500, row.chunkPos); + const { line, snippet } = extractSnippet(row.body, query, 500, row.chunkPos, undefined, opts.intent); const docid = row.docid || (row.hash ? row.hash.slice(0, 6) : undefined); // Line 1: filepath with docid @@ -1865,6 +1917,28 @@ function outputResults(results: { file: string; displayPath: string; title: stri // Line 4: Score const score = formatScore(row.score); console.log(`Score: ${c.bold}${score}${c.reset}`); + if (opts.explain && row.explain) { + const explain = row.explain; + const ftsScores = explain.ftsScores.length > 0 + ? explain.ftsScores.map(formatExplainNumber).join(", ") + : "none"; + const vecScores = explain.vectorScores.length > 0 + ? explain.vectorScores.map(formatExplainNumber).join(", ") + : "none"; + const contribSummary = explain.rrf.contributions + .slice() + .sort((a, b) => b.rrfContribution - a.rrfContribution) + .slice(0, 3) + .map(c => `${c.source}/${c.queryType}#${c.rank}:${formatExplainNumber(c.rrfContribution)}`) + .join(" | "); + + console.log(`${c.dim}Explain: fts=[${ftsScores}] vec=[${vecScores}]${c.reset}`); + console.log(`${c.dim} RRF: total=${formatExplainNumber(explain.rrf.totalScore)} base=${formatExplainNumber(explain.rrf.baseScore)} bonus=${formatExplainNumber(explain.rrf.topRankBonus)} rank=${explain.rrf.rank}${c.reset}`); + console.log(`${c.dim} Blend: ${Math.round(explain.rrf.weight * 100)}%*${formatExplainNumber(explain.rrf.positionScore)} + ${Math.round((1 - explain.rrf.weight) * 100)}%*${formatExplainNumber(explain.rerankScore)} = ${formatExplainNumber(explain.blendedScore)}${c.reset}`); + if (contribSummary.length > 0) { + console.log(`${c.dim} Top RRF contributions: ${contribSummary}${c.reset}`); + } + } console.log(); // Snippet with highlighting (diff-style header included) @@ -1881,7 +1955,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri if (!row) continue; const heading = row.title || row.displayPath; const docid = row.docid || (row.hash ? row.hash.slice(0, 6) : undefined); - let content = opts.full ? row.body : extractSnippet(row.body, query, 500, row.chunkPos).snippet; + let content = opts.full ? row.body : extractSnippet(row.body, query, 500, row.chunkPos, undefined, opts.intent).snippet; if (opts.lineNumbers) { content = addLineNumbers(content); } @@ -1894,7 +1968,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri const titleAttr = row.title ? ` title="${row.title.replace(/"/g, '"')}"` : ""; const contextAttr = row.context ? ` context="${row.context.replace(/"/g, '"')}"` : ""; const docid = row.docid || (row.hash ? row.hash.slice(0, 6) : ""); - let content = opts.full ? row.body : extractSnippet(row.body, query, 500, row.chunkPos).snippet; + let content = opts.full ? row.body : extractSnippet(row.body, query, 500, row.chunkPos, undefined, opts.intent).snippet; if (opts.lineNumbers) { content = addLineNumbers(content); } @@ -1904,7 +1978,7 @@ function outputResults(results: { file: string; displayPath: string; title: stri // CSV format console.log("docid,score,file,title,context,line,snippet"); for (const row of filtered) { - const { line, snippet } = extractSnippet(row.body, query, 500, row.chunkPos); + const { line, snippet } = extractSnippet(row.body, query, 500, row.chunkPos, undefined, opts.intent); let content = opts.full ? row.body : snippet; if (opts.lineNumbers) { content = addLineNumbers(content, line); @@ -1916,25 +1990,142 @@ function outputResults(results: { file: string; displayPath: string; title: stri } } -function search(query: string, opts: OutputOptions): void { - const db = getDb(); - - // Validate collection filter if specified - let collectionName: string | undefined; - if (opts.collection) { - const coll = getCollectionFromYaml(opts.collection); +// Resolve -c collection filter: supports single string, array, or undefined. +// Returns validated collection names (exits on unknown collection). +function resolveCollectionFilter(raw: string | string[] | undefined, useDefaults: boolean = false): string[] { + // If no filter specified and useDefaults is true, use default collections + if (!raw && useDefaults) { + return getDefaultCollectionNames(); + } + if (!raw) return []; + const names = Array.isArray(raw) ? raw : [raw]; + const validated: string[] = []; + for (const name of names) { + const coll = getCollectionFromYaml(name); if (!coll) { - console.error(`Collection not found: ${opts.collection}`); + console.error(`Collection not found: ${name}`); closeDb(); process.exit(1); } - collectionName = opts.collection; + validated.push(name); } + return validated; +} + +// Post-filter results to only include files from specified collections. +function filterByCollections(results: T[], collectionNames: string[]): T[] { + if (collectionNames.length <= 1) return results; + const prefixes = collectionNames.map(n => `qmd://${n}/`); + return results.filter(r => { + const path = r.filepath || r.file || ''; + return prefixes.some(p => path.startsWith(p)); + }); +} + +/** + * Parse structured search query syntax. + * Lines starting with lex:, vec:, or hyde: are routed directly. + * Plain lines without prefix go through query expansion. + * + * Returns null if this is a plain query (single line, no prefix). + * Returns StructuredSubSearch[] if structured syntax detected. + * Throws if multiple plain lines (ambiguous). + * + * Examples: + * "CAP theorem" -> null (plain query, use expansion) + * "lex: CAP theorem" -> [{ type: 'lex', query: 'CAP theorem' }] + * "lex: CAP\nvec: consistency" -> [{ type: 'lex', ... }, { type: 'vec', ... }] + * "CAP\nconsistency" -> throws (multiple plain lines) + */ +interface ParsedStructuredQuery { + searches: StructuredSubSearch[]; + intent?: string; +} + +function parseStructuredQuery(query: string): ParsedStructuredQuery | null { + const rawLines = query.split('\n').map((line, idx) => ({ + raw: line, + trimmed: line.trim(), + number: idx + 1, + })).filter(line => line.trimmed.length > 0); + + if (rawLines.length === 0) return null; + + const prefixRe = /^(lex|vec|hyde):\s*/i; + const expandRe = /^expand:\s*/i; + const intentRe = /^intent:\s*/i; + const typed: StructuredSubSearch[] = []; + let intent: string | undefined; + + for (const line of rawLines) { + if (expandRe.test(line.trimmed)) { + if (rawLines.length > 1) { + throw new Error(`Line ${line.number} starts with expand:, but query documents cannot mix expand with typed lines. Submit a single expand query instead.`); + } + const text = line.trimmed.replace(expandRe, '').trim(); + if (!text) { + throw new Error('expand: query must include text.'); + } + return null; // treat as standalone expand query + } + + // Parse intent: lines + if (intentRe.test(line.trimmed)) { + if (intent !== undefined) { + throw new Error(`Line ${line.number}: only one intent: line is allowed per query document.`); + } + const text = line.trimmed.replace(intentRe, '').trim(); + if (!text) { + throw new Error(`Line ${line.number}: intent: must include text.`); + } + intent = text; + continue; + } + + const match = line.trimmed.match(prefixRe); + if (match) { + const type = match[1]!.toLowerCase() as 'lex' | 'vec' | 'hyde'; + const text = line.trimmed.slice(match[0].length).trim(); + if (!text) { + throw new Error(`Line ${line.number} (${type}:) must include text.`); + } + if (/\r|\n/.test(text)) { + throw new Error(`Line ${line.number} (${type}:) contains a newline. Keep each query on a single line.`); + } + typed.push({ type, query: text, line: line.number }); + continue; + } + + if (rawLines.length === 1) { + // Single plain line -> implicit expand + return null; + } + + throw new Error(`Line ${line.number} is missing a lex:/vec:/hyde:/intent: prefix. Each line in a query document must start with one.`); + } + + // intent: alone is not a valid query — must have at least one search + if (intent && typed.length === 0) { + throw new Error('intent: cannot appear alone. Add at least one lex:, vec:, or hyde: line.'); + } + + return typed.length > 0 ? { searches: typed, intent } : null; +} + +function search(query: string, opts: OutputOptions): void { + const db = getDb(); + + // Validate collection filter (supports multiple -c flags) + // Use default collections if none specified + const collectionNames = resolveCollectionFilter(opts.collection, true); + const singleCollection = collectionNames.length === 1 ? collectionNames[0] : undefined; // Use large limit for --all, otherwise fetch more than needed and let outputResults filter const fetchLimit = opts.all ? 100000 : Math.max(50, opts.limit * 2); - // searchFTS accepts collection name as number parameter for legacy reasons (will be fixed in store.ts) - const results = searchFTS(db, query, fetchLimit, collectionName as any); + const results = filterByCollections( + searchFTS(db, query, fetchLimit, singleCollection), + collectionNames + ); // Add context to results const resultsWithContext = results.map(r => ({ @@ -1951,346 +2142,216 @@ function search(query: string, opts: OutputOptions): void { closeDb(); if (resultsWithContext.length === 0) { - console.log("No results found."); + printEmptySearchResults(opts.format); return; } outputResults(resultsWithContext, query, opts); } -async function vectorSearch(query: string, opts: OutputOptions, model: string = DEFAULT_EMBED_MODEL): Promise { - const db = getDb(); - - // Validate collection filter if specified - let collectionName: string | undefined; - if (opts.collection) { - const coll = getCollectionFromYaml(opts.collection); - if (!coll) { - console.error(`Collection not found: ${opts.collection}`); - closeDb(); - process.exit(1); - } - collectionName = opts.collection; +// Log query expansion as a tree to stderr (CLI progress feedback) +function logExpansionTree(originalQuery: string, expanded: ExpandedQuery[]): void { + const lines: string[] = []; + lines.push(`${c.dim}├─ ${originalQuery}${c.reset}`); + for (const q of expanded) { + let preview = q.text.replace(/\n/g, ' '); + if (preview.length > 72) preview = preview.substring(0, 69) + '...'; + lines.push(`${c.dim}├─ ${q.type}: ${preview}${c.reset}`); } - - const tableExists = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get(); - if (!tableExists) { - console.error("Vector index not found. Run 'qmd embed' first to create embeddings."); - closeDb(); - return; + if (lines.length > 0) { + lines[lines.length - 1] = lines[lines.length - 1]!.replace('├─', '└─'); } + for (const line of lines) process.stderr.write(line + '\n'); +} - // Check index health and warn about issues - checkIndexHealth(db); - - // Wrap LLM operations in a session for lifecycle management - await withLLMSession(async (session) => { - // Expand query using structured output (no lexical for vector-only search) - const queryables = await expandQueryStructured(query, false, opts.context, session); - - // Build list of queries for vector search: original, vec, and hyde - const vectorQueries: string[] = [query]; - for (const q of queryables) { - if (q.type === 'vec' || q.type === 'hyde') { - if (q.text && q.text !== query) { - vectorQueries.push(q.text); - } - } - } - - process.stderr.write(`${c.dim}Searching ${vectorQueries.length} vector queries...${c.reset}\n`); - - // Collect results from all query variations - const perQueryLimit = opts.all ? 500 : 20; - const allResults = new Map(); +async function vectorSearch(query: string, opts: OutputOptions, _model: string = DEFAULT_EMBED_MODEL): Promise { + const store = getStore(); + + // Validate collection filter (supports multiple -c flags) + // Use default collections if none specified + const collectionNames = resolveCollectionFilter(opts.collection, true); + const singleCollection = collectionNames.length === 1 ? collectionNames[0] : undefined; + + checkIndexHealth(store.db); + + await withLLMSession(async () => { + let results = await vectorSearchQuery(store, query, { + collection: singleCollection, + limit: opts.all ? 500 : (opts.limit || 10), + minScore: opts.minScore || 0.3, + intent: opts.intent, + hooks: { + onExpand: (original, expanded) => { + logExpansionTree(original, expanded); + process.stderr.write(`${c.dim}Searching ${expanded.length + 1} vector queries...${c.reset}\n`); + }, + }, + }); - // IMPORTANT: Run vector searches sequentially, not with Promise.all. - // node-llama-cpp's embedding context hangs when multiple concurrent embed() calls - // are made. This is a known limitation of the LlamaEmbeddingContext. - // See: https://github.com/tobi/qmd/pull/23 - for (const q of vectorQueries) { - const vecResults = await searchVec(db, q, model, perQueryLimit, collectionName as any, session); - for (const r of vecResults) { - const existing = allResults.get(r.filepath); - if (!existing || r.score > existing.score) { - allResults.set(r.filepath, { file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score, hash: r.hash }); - } - } + // Post-filter for multi-collection + if (collectionNames.length > 1) { + results = results.filter(r => { + const prefixes = collectionNames.map(n => `qmd://${n}/`); + return prefixes.some(p => r.file.startsWith(p)); + }); } - // Sort by max score and limit to requested count - const results = Array.from(allResults.values()) - .sort((a, b) => b.score - a.score) - .slice(0, opts.limit) - .map(r => ({ ...r, context: getContextForFile(db, r.file) })); - closeDb(); if (results.length === 0) { - console.log("No results found."); + printEmptySearchResults(opts.format); return; } - outputResults(results, query, { ...opts, limit: results.length }); // Already limited + + outputResults(results.map(r => ({ + file: r.file, + displayPath: r.displayPath, + title: r.title, + body: r.body, + score: r.score, + context: r.context, + docid: r.docid, + })), query, { ...opts, limit: results.length }); }, { maxDuration: 10 * 60 * 1000, name: 'vectorSearch' }); } -// Expand query using structured output with GBNF grammar -async function expandQueryStructured(query: string, includeLexical: boolean = true, context?: string, session?: ILLMSession): Promise { - process.stderr.write(`${c.dim}Expanding query...${c.reset}\n`); - - const queryables = session - ? await session.expandQuery(query, { includeLexical, context }) - : await getDefaultLlamaCpp().expandQuery(query, { includeLexical, context }); +async function querySearch(query: string, opts: OutputOptions, _embedModel: string = DEFAULT_EMBED_MODEL, _rerankModel: string = DEFAULT_RERANK_MODEL): Promise { + const store = getStore(); - // Log the expansion as a tree - const lines: string[] = []; - const bothLabel = includeLexical ? ' · (lexical+vector)' : ' · (vector)'; - lines.push(`${c.dim}├─ ${query}${bothLabel}${c.reset}`); + // Validate collection filter (supports multiple -c flags) + // Use default collections if none specified + const collectionNames = resolveCollectionFilter(opts.collection, true); + const singleCollection = collectionNames.length === 1 ? collectionNames[0] : undefined; - for (let i = 0; i < queryables.length; i++) { - const q = queryables[i]; - if (!q || q.text === query) continue; - - let textPreview = q.text.replace(/\n/g, ' '); - if (textPreview.length > 80) { - textPreview = textPreview.substring(0, 77) + '...'; - } + checkIndexHealth(store.db); - const label = q.type === 'lex' ? 'lexical' : (q.type === 'hyde' ? 'hyde' : 'vector'); - lines.push(`${c.dim}├─ ${textPreview} · (${label})${c.reset}`); - } + // Check for structured query syntax (lex:/vec:/hyde:/intent: prefixes) + const parsed = parseStructuredQuery(query); + // Intent can come from --intent flag or from intent: line in query document + const intent = opts.intent || parsed?.intent; - // Fix last item to use └─ instead of ├─ - if (lines.length > 0) { - lines[lines.length - 1] = lines[lines.length - 1]!.replace('├─', '└─'); - } + await withLLMSession(async () => { + let results; - for (const line of lines) { - process.stderr.write(line + '\n'); - } - - return queryables; -} - -async function expandQuery(query: string, _model: string = DEFAULT_QUERY_MODEL, _db?: Database, session?: ILLMSession): Promise { - const queryables = await expandQueryStructured(query, true, undefined, session); - const queries = new Set([query]); - for (const q of queryables) { - queries.add(q.text); - } - return Array.from(queries); -} - -async function querySearch(query: string, opts: OutputOptions, embedModel: string = DEFAULT_EMBED_MODEL, rerankModel: string = DEFAULT_RERANK_MODEL): Promise { - const db = getDb(); - - // Validate collection filter if specified - let collectionName: string | undefined; - if (opts.collection) { - const coll = getCollectionFromYaml(opts.collection); - if (!coll) { - console.error(`Collection not found: ${opts.collection}`); - closeDb(); - process.exit(1); - } - collectionName = opts.collection; - } - - // Check index health and warn about issues - checkIndexHealth(db); - - // Run initial BM25 search (will be reused for retrieval) - const initialFts = searchFTS(db, query, 20, collectionName as any); - let hasVectors = !!db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get(); - - // Check if initial results have strong signals (skip expansion if so) - // Strong signal = top result is strong AND clearly separated from runner-up. - // This avoids skipping expansion when BM25 has lots of mediocre matches. - const topScore = initialFts[0]?.score ?? 0; - const secondScore = initialFts[1]?.score ?? 0; - const hasStrongSignal = initialFts.length > 0 && topScore >= 0.85 && (topScore - secondScore) >= 0.15; + if (parsed) { + const structuredQueries = parsed.searches; + // Structured search — user provided their own query expansions + const typeLabels = structuredQueries.map(s => s.type).join('+'); + process.stderr.write(`${c.dim}Structured search: ${structuredQueries.length} queries (${typeLabels})${c.reset}\n`); + if (intent) { + process.stderr.write(`${c.dim}├─ intent: ${intent}${c.reset}\n`); + } - // Wrap LLM operations in a session for lifecycle management - await withLLMSession(async (session) => { - let ftsQueries: string[] = [query]; - let vectorQueries: string[] = [query]; - - if (hasStrongSignal) { - // Strong BM25 signal - skip expensive LLM expansion - process.stderr.write(`${c.dim}Strong BM25 signal (${topScore.toFixed(2)}) - skipping expansion${c.reset}\n`); - // Still log the "expansion tree" in the same style as vsearch for consistency. - { - const lines: string[] = []; - lines.push(`${c.dim}├─ ${query} · (lexical+vector)${c.reset}`); - lines[lines.length - 1] = lines[lines.length - 1]!.replace('├─', '└─'); - for (const line of lines) process.stderr.write(line + '\n'); + // Log each sub-query + for (const s of structuredQueries) { + let preview = s.query.replace(/\n/g, ' '); + if (preview.length > 72) preview = preview.substring(0, 69) + '...'; + process.stderr.write(`${c.dim}├─ ${s.type}: ${preview}${c.reset}\n`); } + process.stderr.write(`${c.dim}└─ Searching...${c.reset}\n`); + + results = await structuredSearch(store, structuredQueries, { + collections: singleCollection ? [singleCollection] : undefined, + limit: opts.all ? 500 : (opts.limit || 10), + minScore: opts.minScore || 0, + candidateLimit: opts.candidateLimit, + explain: !!opts.explain, + intent, + hooks: { + onEmbedStart: (count) => { + process.stderr.write(`${c.dim}Embedding ${count} ${count === 1 ? 'query' : 'queries'}...${c.reset}`); + }, + onEmbedDone: (ms) => { + process.stderr.write(`${c.dim} (${formatMs(ms)})${c.reset}\n`); + }, + onRerankStart: (chunkCount) => { + process.stderr.write(`${c.dim}Reranking ${chunkCount} chunks...${c.reset}`); + progress.indeterminate(); + }, + onRerankDone: (ms) => { + progress.clear(); + process.stderr.write(`${c.dim} (${formatMs(ms)})${c.reset}\n`); + }, + }, + }); } else { - // Weak signal - expand query for better recall - const queryables = await expandQueryStructured(query, true, opts.context, session); - - for (const q of queryables) { - if (q.type === 'lex') { - if (q.text && q.text !== query) ftsQueries.push(q.text); - } else if (q.type === 'vec' || q.type === 'hyde') { - if (q.text && q.text !== query) vectorQueries.push(q.text); - } - } + // Standard hybrid query with automatic expansion + results = await hybridQuery(store, query, { + collection: singleCollection, + limit: opts.all ? 500 : (opts.limit || 10), + minScore: opts.minScore || 0, + candidateLimit: opts.candidateLimit, + explain: !!opts.explain, + intent, + hooks: { + onStrongSignal: (score) => { + process.stderr.write(`${c.dim}Strong BM25 signal (${score.toFixed(2)}) — skipping expansion${c.reset}\n`); + }, + onExpandStart: () => { + process.stderr.write(`${c.dim}Expanding query...${c.reset}`); + }, + onExpand: (original, expanded, ms) => { + process.stderr.write(`${c.dim} (${formatMs(ms)})${c.reset}\n`); + logExpansionTree(original, expanded); + process.stderr.write(`${c.dim}Searching ${expanded.length + 1} queries...${c.reset}\n`); + }, + onEmbedStart: (count) => { + process.stderr.write(`${c.dim}Embedding ${count} ${count === 1 ? 'query' : 'queries'}...${c.reset}`); + }, + onEmbedDone: (ms) => { + process.stderr.write(`${c.dim} (${formatMs(ms)})${c.reset}\n`); + }, + onRerankStart: (chunkCount) => { + process.stderr.write(`${c.dim}Reranking ${chunkCount} chunks...${c.reset}`); + progress.indeterminate(); + }, + onRerankDone: (ms) => { + progress.clear(); + process.stderr.write(`${c.dim} (${formatMs(ms)})${c.reset}\n`); + }, + }, + }); } - process.stderr.write(`${c.dim}Searching ${ftsQueries.length} lexical + ${vectorQueries.length} vector queries...${c.reset}\n`); - - // Collect ranked result lists for RRF fusion - const rankedLists: RankedResult[][] = []; - - // Map to store hash by filepath for final results - const hashMap = new Map(); - - // Run all searches concurrently (FTS + Vector) - const searchPromises: Promise[] = []; - - // FTS searches - for (const q of ftsQueries) { - if (!q) continue; - searchPromises.push((async () => { - const ftsResults = searchFTS(db, q, 20, (collectionName || "") as any); - if (ftsResults.length > 0) { - for (const r of ftsResults) { - // Mutex for hashMap is not strictly needed as it's just adding values - hashMap.set(r.filepath, r.hash); - } - rankedLists.push(ftsResults.map(r => ({ file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score }))); - } - })()); - } - - // Vector searches (session ensures contexts stay alive) - if (hasVectors) { - for (const q of vectorQueries) { - if (!q) continue; - searchPromises.push((async () => { - const vecResults = await searchVec(db, q, embedModel, 20, (collectionName || "") as any, session); - if (vecResults.length > 0) { - for (const r of vecResults) hashMap.set(r.filepath, r.hash); - rankedLists.push(vecResults.map(r => ({ file: r.filepath, displayPath: r.displayPath, title: r.title, body: r.body || "", score: r.score }))); - } - })()); - } + // Post-filter for multi-collection + if (collectionNames.length > 1) { + results = results.filter(r => { + const prefixes = collectionNames.map(n => `qmd://${n}/`); + return prefixes.some(p => r.file.startsWith(p)); + }); } - await Promise.all(searchPromises); - - // Apply Reciprocal Rank Fusion to combine all ranked lists - // Give 2x weight to original query results (first 2 lists: FTS + vector) - const weights = rankedLists.map((_, i) => i < 2 ? 2.0 : 1.0); - const fused = reciprocalRankFusion(rankedLists, weights); - // Hard cap reranking for latency/cost. We rerank per-document (best chunk only). - const RERANK_DOC_LIMIT = 40; - const candidates = fused.slice(0, RERANK_DOC_LIMIT); + closeDb(); - if (candidates.length === 0) { - console.log("No results found."); - closeDb(); + if (results.length === 0) { + printEmptySearchResults(opts.format); return; } - // Rerank multiple chunks per document, then aggregate scores - // This improves ranking for long documents where keyword-matched chunk isn't always best - // We only rerank ONE chunk per document (best chunk by a simple keyword heuristic), - // so we never rerank more than RERANK_DOC_LIMIT items. - const chunksToRerank: { file: string; text: string; chunkIdx: number }[] = []; - const docChunkMap = new Map(); - - const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2); - for (const cand of candidates) { - const chunks = chunkDocument(cand.body); - if (chunks.length === 0) continue; - - // Choose best chunk by keyword matches; fall back to first chunk. - let bestIdx = 0; - let bestScore = -1; - for (let i = 0; i < chunks.length; i++) { - const chunkLower = chunks[i]!.text.toLowerCase(); - const score = queryTerms.reduce((acc, term) => acc + (chunkLower.includes(term) ? 1 : 0), 0); - if (score > bestScore) { - bestScore = score; - bestIdx = i; - } - } - - chunksToRerank.push({ file: cand.file, text: chunks[bestIdx]!.text, chunkIdx: bestIdx }); - docChunkMap.set(cand.file, { chunks, bestIdx }); - } - - // Rerank selected chunks (with caching). One chunk per doc -> one rerank item per doc. - const reranked = await rerank( - query, - chunksToRerank.map(ch => ({ file: ch.file, text: ch.text })), - rerankModel, - db, - session - ); - - const aggregatedScores = new Map(); - for (const r of reranked) { - const chunkInfo = docChunkMap.get(r.file); - aggregatedScores.set(r.file, { score: r.score, bestChunkIdx: chunkInfo?.bestIdx ?? 0 }); - } - - // Blend RRF position score with aggregated reranker score using position-aware weights - // Top retrieval results get more protection from reranker disagreement - const candidateMap = new Map(candidates.map(cand => [cand.file, { displayPath: cand.displayPath, title: cand.title, body: cand.body }])); - const rrfRankMap = new Map(candidates.map((cand, i) => [cand.file, i + 1])); // 1-indexed rank - - const finalResults = Array.from(aggregatedScores.entries()).map(([file, { score: rerankScore, bestChunkIdx }]) => { - const rrfRank = rrfRankMap.get(file) || 30; - // Position-aware blending: top retrieval results preserved more - // Rank 1-3: 75% RRF, 25% reranker (trust retrieval for exact matches) - // Rank 4-10: 60% RRF, 40% reranker - // Rank 11+: 40% RRF, 60% reranker (trust reranker for lower-ranked) - let rrfWeight: number; - if (rrfRank <= 3) { - rrfWeight = 0.75; - } else if (rrfRank <= 10) { - rrfWeight = 0.60; - } else { - rrfWeight = 0.40; - } - const rrfScore = 1 / rrfRank; // Position-based: 1, 0.5, 0.33... - const blendedScore = rrfWeight * rrfScore + (1 - rrfWeight) * rerankScore; - const candidate = candidateMap.get(file); - // Use the best-scoring chunk's text for the body (better for snippets) - const chunkInfo = docChunkMap.get(file); - const chunkBody = chunkInfo ? (chunkInfo.chunks[bestChunkIdx]?.text || chunkInfo.chunks[0]!.text) : candidate?.body || ""; - const chunkPos = chunkInfo ? (chunkInfo.chunks[bestChunkIdx]?.pos || 0) : 0; - return { - file, - displayPath: candidate?.displayPath || "", - title: candidate?.title || "", - body: chunkBody, - chunkPos, - score: blendedScore, - context: getContextForFile(db, file), - hash: hashMap.get(file) || "", - }; - }).sort((a, b) => b.score - a.score); - - // Deduplicate by file (safety net - shouldn't happen but prevents duplicate output) - const seenFiles = new Set(); - const dedupedResults = finalResults.filter(r => { - if (seenFiles.has(r.file)) return false; - seenFiles.add(r.file); - return true; - }); + // Use first lex/vec query for output context, or original query + const structuredQueries = parsed?.searches; + const displayQuery = structuredQueries + ? (structuredQueries.find(s => s.type === 'lex')?.query || structuredQueries.find(s => s.type === 'vec')?.query || query) + : query; - closeDb(); - outputResults(dedupedResults, query, opts); + // Map to CLI output format — use bestChunk for snippet display + outputResults(results.map(r => ({ + file: r.file, + displayPath: r.displayPath, + title: r.title, + body: r.bestChunk, + chunkPos: r.bestChunkPos, + score: r.score, + context: r.context, + docid: r.docid, + explain: r.explain, + })), displayQuery, { ...opts, limit: results.length }); }, { maxDuration: 10 * 60 * 1000, name: 'querySearch' }); } // Parse CLI arguments using util.parseArgs function parseCLI() { const { values, positionals } = parseArgs({ - args: Bun.argv.slice(2), // Skip bun and script path + args: process.argv.slice(2), // Skip node and script path options: { // Global options index: { @@ -2299,10 +2360,9 @@ function parseCLI() { context: { type: "string", }, - "no-lex": { - type: "boolean", - }, help: { type: "boolean", short: "h" }, + version: { type: "boolean", short: "v" }, + skill: { type: "boolean" }, // Search options n: { type: "string" }, "min-score": { type: "string" }, @@ -2313,7 +2373,8 @@ function parseCLI() { xml: { type: "boolean" }, files: { type: "boolean" }, json: { type: "boolean" }, - collection: { type: "string", short: "c" }, // Filter by collection + explain: { type: "boolean" }, + collection: { type: "string", short: "c", multiple: true }, // Filter by collection(s) // Collection options name: { type: "string" }, // collection name mask: { type: "string" }, // glob pattern @@ -2327,6 +2388,13 @@ function parseCLI() { from: { type: "string" }, // start line "max-bytes": { type: "string" }, // max bytes for multi-get "line-numbers": { type: "boolean" }, // add line numbers to output + // Query options + "candidate-limit": { type: "string", short: "C" }, + intent: { type: "string" }, + // MCP HTTP transport options + http: { type: "boolean" }, + daemon: { type: "boolean" }, + port: { type: "string" }, }, allowPositionals: true, strict: false, // Allow unknown options to pass through @@ -2358,8 +2426,11 @@ function parseCLI() { limit: isAll ? 100000 : (values.n ? parseInt(String(values.n), 10) || defaultLimit : defaultLimit), minScore: values["min-score"] ? parseFloat(String(values["min-score"])) || 0 : 0, all: isAll, - collection: values.collection as string | undefined, + collection: values.collection as string[] | undefined, lineNumbers: !!values["line-numbers"], + candidateLimit: values["candidate-limit"] ? parseInt(String(values["candidate-limit"]), 10) : undefined, + explain: !!values.explain, + intent: values.intent as string | undefined, }; return { @@ -2371,60 +2442,147 @@ function parseCLI() { }; } +function showSkill(): void { + const scriptDir = dirname(fileURLToPath(import.meta.url)); + const relativePath = pathJoin("skills", "qmd", "SKILL.md"); + const skillPath = pathJoin(scriptDir, "..", relativePath); + + console.log(`QMD Skill (${relativePath})`); + console.log(`Location: ${skillPath}`); + console.log(""); + + if (!existsSync(skillPath)) { + console.error("SKILL.md not found. If you built from source, ensure skills/qmd/SKILL.md exists."); + return; + } + + const content = readFileSync(skillPath, "utf-8"); + process.stdout.write(content.endsWith("\n") ? content : content + "\n"); +} + function showHelp(): void { + console.log("qmd — Quick Markdown Search"); + console.log(""); console.log("Usage:"); - console.log(" qmd collection add [path] --name --mask - Create/index collection"); - console.log(" qmd collection list - List all collections with details"); - console.log(" qmd collection remove - Remove a collection by name"); - console.log(" qmd collection rename - Rename a collection"); - console.log(" qmd ls [collection[/path]] - List collections or files in a collection"); - console.log(" qmd context add [path] \"text\" - Add context for path (defaults to current dir)"); - console.log(" qmd context list - List all contexts"); - console.log(" qmd context rm - Remove context"); - console.log(" qmd get [:line] [-l N] [--from N] - Get document (optionally from line, max N lines)"); - console.log(" qmd multi-get [-l N] [--max-bytes N] - Get multiple docs by glob or comma-separated list"); - console.log(" qmd status - Show index status and collections"); - console.log(" qmd update [--pull] - Re-index all collections (--pull: git pull first)"); - console.log(" qmd embed [-f] - Create vector embeddings (800 tokens/chunk, 15% overlap)"); - console.log(" qmd cleanup - Remove cache and orphaned data, vacuum DB"); - console.log(" qmd search - Full-text search (BM25)"); - console.log(" qmd vsearch - Vector similarity search"); - console.log(" qmd query - Combined search with query expansion + reranking"); - console.log(" qmd mcp - Start MCP server (for AI agent integration)"); + console.log(" qmd [options]"); + console.log(""); + console.log("Primary commands:"); + console.log(" qmd query - Hybrid search with auto expansion + reranking (recommended)"); + console.log(" qmd query 'lex:..\\nvec:...' - Structured query document (you provide lex/vec/hyde lines)"); + console.log(" qmd search - Full-text BM25 keywords (no LLM)"); + console.log(" qmd vsearch - Vector similarity only"); + console.log(" qmd get [:line] [-l N] - Show a single document, optional line slice"); + console.log(" qmd multi-get - Batch fetch via glob or comma-separated list"); + console.log(" qmd mcp - Start the MCP server (stdio transport for AI agents)"); + console.log(""); + console.log("Collections & context:"); + console.log(" qmd collection add/list/remove/rename/show - Manage indexed folders"); + console.log(" qmd context add/list/rm - Attach human-written summaries"); + console.log(" qmd ls [collection[/path]] - Inspect indexed files"); + console.log(""); + console.log("Maintenance:"); + console.log(" qmd status - View index + collection health"); + console.log(" qmd update [--pull] - Re-index collections (optionally git pull first)"); + console.log(" qmd embed [-f] - Generate/refresh vector embeddings"); + console.log(" qmd cleanup - Clear caches, vacuum DB"); + console.log(""); + console.log("Query syntax (qmd query):"); + console.log(" QMD queries are either a single expand query (no prefix) or a multi-line"); + console.log(" document where every line is typed with lex:, vec:, or hyde:. This grammar"); + console.log(" matches the docs in docs/SYNTAX.md and is enforced in the CLI."); + console.log(""); + const grammar = [ + `query = expand_query | query_document ;`, + `expand_query = text | explicit_expand ;`, + `explicit_expand= "expand:" text ;`, + `query_document = [ intent_line ] { typed_line } ;`, + `intent_line = "intent:" text newline ;`, + `typed_line = type ":" text newline ;`, + `type = "lex" | "vec" | "hyde" ;`, + `text = quoted_phrase | plain_text ;`, + `quoted_phrase = '"' { character } '"' ;`, + `plain_text = { character } ;`, + `newline = "\\n" ;`, + ]; + console.log(" Grammar:"); + for (const line of grammar) { + console.log(` ${line}`); + } + console.log(""); + console.log(" Examples:"); + console.log(" qmd query \"how does auth work\" # single-line → implicit expand"); + console.log(" qmd query $'lex: CAP theorem\\nvec: consistency' # typed query document"); + console.log(" qmd query $'lex: \"exact matches\" sports -baseball' # phrase + negation lex search"); + console.log(" qmd query $'hyde: Hypothetical answer text' # hyde-only document"); + console.log(""); + console.log(" Constraints:"); + console.log(" - Standalone expand queries cannot mix with typed lines."); + console.log(" - Query documents allow only lex:, vec:, or hyde: prefixes."); + console.log(" - Each typed line must be single-line text with balanced quotes."); + console.log(""); + console.log("AI agents & integrations:"); + console.log(" - Run `qmd mcp` to expose the MCP server (stdio) to agents/IDEs."); + console.log(" - `qmd --skill` prints the packaged skills/qmd/SKILL.md (path + contents)."); + console.log(" - Advanced: `qmd mcp --http ...` and `qmd mcp --http --daemon` are optional for custom transports."); console.log(""); console.log("Global options:"); - console.log(" --index - Use custom index name (default: index)"); + console.log(" --index - Use a named index (default: index)"); console.log(""); console.log("Search options:"); - console.log(" -n - Number of results (default: 5, or 20 for --files)"); - console.log(" --all - Return all matches (use with --min-score to filter)"); + console.log(" -n - Max results (default 5, or 20 for --files/--json)"); + console.log(" --all - Return all matches (pair with --min-score)"); console.log(" --min-score - Minimum similarity score"); console.log(" --full - Output full document instead of snippet"); - console.log(" --line-numbers - Add line numbers to output"); - console.log(" --files - Output docid,score,filepath,context (default: 20 results)"); - console.log(" --json - JSON output with snippets (default: 20 results)"); - console.log(" --csv - CSV output with snippets"); - console.log(" --md - Markdown output"); - console.log(" --xml - XML output"); - console.log(" -c, --collection - Filter results to a specific collection"); + console.log(" -C, --candidate-limit - Max candidates to rerank (default 40, lower = faster)"); + console.log(" --line-numbers - Include line numbers in output"); + console.log(" --explain - Include retrieval score traces (query --json/CLI)"); + console.log(" --files | --json | --csv | --md | --xml - Output format"); + console.log(" -c, --collection - Filter by one or more collections"); console.log(""); console.log("Multi-get options:"); console.log(" -l - Maximum lines per file"); - console.log(" --max-bytes - Skip files larger than N bytes (default: 10240)"); - console.log(" --json/--csv/--md/--xml/--files - Output format (same as search)"); - console.log(""); - console.log("Models (auto-downloaded from HuggingFace):"); - console.log(" Embedding: embeddinggemma-300M-Q8_0"); - console.log(" Reranking: qwen3-reranker-0.6b-q8_0"); - console.log(" Generation: Qwen3-0.6B-Q8_0"); + console.log(" --max-bytes - Skip files larger than N bytes (default 10240)"); + console.log(" --json/--csv/--md/--xml/--files - Same formats as search"); console.log(""); console.log(`Index: ${getDbPath()}`); } +async function showVersion(): Promise { + const scriptDir = dirname(fileURLToPath(import.meta.url)); + const pkgPath = resolve(scriptDir, "..", "package.json"); + const pkg = JSON.parse(readFileSync(pkgPath, "utf-8")); + + let commit = ""; + try { + commit = execSync(`git -C ${scriptDir} rev-parse --short HEAD`, { encoding: "utf-8", stdio: ["pipe", "pipe", "pipe"] }).trim(); + } catch { + // Not a git repo or git not available + } + + const versionStr = commit ? `${pkg.version} (${commit})` : pkg.version; + console.log(`qmd ${versionStr}`); +} + // Main CLI - only run if this is the main module -if (import.meta.main) { +const __filename = fileURLToPath(import.meta.url); +const argv1 = process.argv[1]; +const isMain = argv1 === __filename + || argv1?.endsWith("/qmd.ts") + || argv1?.endsWith("/qmd.js") + || (argv1 != null && realpathSync(argv1) === __filename); +if (isMain) { const cli = parseCLI(); + if (cli.values.version) { + await showVersion(); + process.exit(0); + } + + if (cli.values.skill) { + showSkill(); + process.exit(0); + } + if (!cli.command || cli.values.help) { showHelp(); process.exit(cli.values.help ? 0 : 1); @@ -2434,13 +2592,12 @@ if (import.meta.main) { case "context": { const subcommand = cli.args[0]; if (!subcommand) { - console.error("Usage: qmd context "); + console.error("Usage: qmd context "); console.error(""); console.error("Commands:"); console.error(" qmd context add [path] \"text\" - Add context (defaults to current dir)"); console.error(" qmd context add / \"text\" - Add global context to all collections"); console.error(" qmd context list - List all contexts"); - console.error(" qmd context check - Check for missing contexts"); console.error(" qmd context rm - Remove context"); process.exit(1); } @@ -2488,11 +2645,6 @@ if (import.meta.main) { break; } - case "check": { - contextCheck(); - break; - } - case "rm": case "remove": { if (cli.args.length < 2 || !cli.args[1]) { @@ -2508,7 +2660,7 @@ if (import.meta.main) { default: console.error(`Unknown subcommand: ${subcommand}`); - console.error("Available: add, list, check, rm"); + console.error("Available: add, list, rm"); process.exit(1); } break; @@ -2582,16 +2734,109 @@ if (import.meta.main) { break; } + case "set-update": + case "update-cmd": { + const name = cli.args[1]; + const cmd = cli.args.slice(2).join(' ') || null; + if (!name) { + console.error("Usage: qmd collection update-cmd [command]"); + console.error(" Set the command to run before indexing (e.g., 'git pull')"); + console.error(" Omit command to clear it"); + process.exit(1); + } + const { updateCollectionSettings, getCollection } = await import("./collections.js"); + const col = getCollection(name); + if (!col) { + console.error(`Collection not found: ${name}`); + process.exit(1); + } + updateCollectionSettings(name, { update: cmd }); + if (cmd) { + console.log(`✓ Set update command for '${name}': ${cmd}`); + } else { + console.log(`✓ Cleared update command for '${name}'`); + } + break; + } + + case "include": + case "exclude": { + const name = cli.args[1]; + if (!name) { + console.error(`Usage: qmd collection ${subcommand} `); + console.error(` ${subcommand === 'include' ? 'Include' : 'Exclude'} collection in default queries`); + process.exit(1); + } + const { updateCollectionSettings, getCollection } = await import("./collections.js"); + const col = getCollection(name); + if (!col) { + console.error(`Collection not found: ${name}`); + process.exit(1); + } + const include = subcommand === 'include'; + updateCollectionSettings(name, { includeByDefault: include }); + console.log(`✓ Collection '${name}' ${include ? 'included in' : 'excluded from'} default queries`); + break; + } + + case "show": + case "info": { + const name = cli.args[1]; + if (!name) { + console.error("Usage: qmd collection show "); + process.exit(1); + } + const { getCollection } = await import("./collections.js"); + const col = getCollection(name); + if (!col) { + console.error(`Collection not found: ${name}`); + process.exit(1); + } + console.log(`Collection: ${name}`); + console.log(` Path: ${col.path}`); + console.log(` Pattern: ${col.pattern}`); + console.log(` Include: ${col.includeByDefault !== false ? 'yes (default)' : 'no'}`); + if (col.update) { + console.log(` Update: ${col.update}`); + } + if (col.context) { + const ctxCount = Object.keys(col.context).length; + console.log(` Contexts: ${ctxCount}`); + } + break; + } + + case "help": + case undefined: { + console.log("Usage: qmd collection [options]"); + console.log(""); + console.log("Commands:"); + console.log(" list List all collections"); + console.log(" add [--name NAME] Add a collection"); + console.log(" remove Remove a collection"); + console.log(" rename Rename a collection"); + console.log(" show Show collection details"); + console.log(" update-cmd [cmd] Set pre-update command (e.g., 'git pull')"); + console.log(" include Include in default queries"); + console.log(" exclude Exclude from default queries"); + console.log(""); + console.log("Examples:"); + console.log(" qmd collection add ~/notes --name notes"); + console.log(" qmd collection update-cmd brain 'git pull'"); + console.log(" qmd collection exclude archive"); + process.exit(0); + } + default: console.error(`Unknown subcommand: ${subcommand}`); - console.error("Available: list, add, remove, rename"); + console.error("Run 'qmd collection help' for usage"); process.exit(1); } break; } case "status": - showStatus(); + await showStatus(); break; case "update": @@ -2631,6 +2876,7 @@ if (import.meta.main) { break; case "vsearch": + case "vector-search": // undocumented alias if (!cli.query) { console.error("Usage: qmd vsearch [options] "); process.exit(1); @@ -2643,6 +2889,7 @@ if (import.meta.main) { break; case "query": + case "deep-search": // undocumented alias if (!cli.query) { console.error("Usage: qmd query [options] "); process.exit(1); @@ -2651,8 +2898,88 @@ if (import.meta.main) { break; case "mcp": { - const { startMcpServer } = await import("./mcp.js"); - await startMcpServer(); + const sub = cli.args[0]; // stop | status | undefined + + // Cache dir for PID/log files — same dir as the index + const cacheDir = process.env.XDG_CACHE_HOME + ? resolve(process.env.XDG_CACHE_HOME, "qmd") + : resolve(homedir(), ".cache", "qmd"); + const pidPath = resolve(cacheDir, "mcp.pid"); + + // Subcommands take priority over flags + if (sub === "stop") { + if (!existsSync(pidPath)) { + console.log("Not running (no PID file)."); + process.exit(0); + } + const pid = parseInt(readFileSync(pidPath, "utf-8").trim()); + try { + process.kill(pid, 0); // alive? + process.kill(pid, "SIGTERM"); + unlinkSync(pidPath); + console.log(`Stopped QMD MCP server (PID ${pid}).`); + } catch { + unlinkSync(pidPath); + console.log("Cleaned up stale PID file (server was not running)."); + } + process.exit(0); + } + + if (cli.values.http) { + const port = Number(cli.values.port) || 8181; + + if (cli.values.daemon) { + // Guard: check if already running + if (existsSync(pidPath)) { + const existingPid = parseInt(readFileSync(pidPath, "utf-8").trim()); + try { + process.kill(existingPid, 0); // alive? + console.error(`Already running (PID ${existingPid}). Run 'qmd mcp stop' first.`); + process.exit(1); + } catch { + // Stale PID file — continue + } + } + + mkdirSync(cacheDir, { recursive: true }); + const logPath = resolve(cacheDir, "mcp.log"); + const logFd = openSync(logPath, "w"); // truncate — fresh log per daemon run + const selfPath = fileURLToPath(import.meta.url); + const spawnArgs = selfPath.endsWith(".ts") + ? ["--import", pathJoin(dirname(selfPath), "..", "node_modules", "tsx", "dist", "esm", "index.mjs"), selfPath, "mcp", "--http", "--port", String(port)] + : [selfPath, "mcp", "--http", "--port", String(port)]; + const child = nodeSpawn(process.execPath, spawnArgs, { + stdio: ["ignore", logFd, logFd], + detached: true, + }); + child.unref(); + closeSync(logFd); // parent's copy; child inherited the fd + + writeFileSync(pidPath, String(child.pid)); + console.log(`Started on http://localhost:${port}/mcp (PID ${child.pid})`); + console.log(`Logs: ${logPath}`); + process.exit(0); + } + + // Foreground HTTP mode — remove top-level cursor handlers so the + // async cleanup handlers in startMcpHttpServer actually run. + process.removeAllListeners("SIGTERM"); + process.removeAllListeners("SIGINT"); + const { startMcpHttpServer } = await import("./mcp.js"); + try { + await startMcpHttpServer(port); + } catch (e: any) { + if (e?.code === "EADDRINUSE") { + console.error(`Port ${port} already in use. Try a different port with --port.`); + process.exit(1); + } + throw e; + } + } else { + // Default: stdio transport + const { startMcpServer } = await import("./mcp.js"); + await startMcpServer(); + } break; } @@ -2696,4 +3023,4 @@ if (import.meta.main) { process.exit(0); } -} // end if (import.meta.main) +} // end if (main module) diff --git a/src/store.ts b/src/store.ts index fb7dd70d..4c7f8a0f 100644 --- a/src/store.ts +++ b/src/store.ts @@ -11,10 +11,11 @@ * const store = createStore(); */ -import { Database } from "bun:sqlite"; -import { Glob } from "bun"; -import { realpathSync, statSync } from "node:fs"; -import * as sqliteVec from "sqlite-vec"; +import { openDatabase, loadSqliteVec } from "./db.js"; +import type { Database } from "./db.js"; +import picomatch from "picomatch"; +import { createHash } from "crypto"; +import { realpathSync, statSync, mkdirSync } from "node:fs"; import { LlamaCpp, getDefaultLlamaCpp, @@ -22,7 +23,7 @@ import { formatDocForEmbedding, type RerankDocument, type ILLMSession, -} from "./llm"; +} from "./llm.js"; import { findContextForPath as collectionsFindContextForPath, addContext as collectionsAddContext, @@ -36,25 +37,207 @@ import { setGlobalContext, loadConfig as collectionsLoadConfig, type NamedCollection, -} from "./collections"; +} from "./collections.js"; // ============================================================================= // Configuration // ============================================================================= -const HOME = Bun.env.HOME || "/tmp"; +const HOME = process.env.HOME || "/tmp"; export const DEFAULT_EMBED_MODEL = "embeddinggemma"; export const DEFAULT_RERANK_MODEL = "ExpedientFalcon/qwen3-reranker:0.6b-q8_0"; export const DEFAULT_QUERY_MODEL = "Qwen/Qwen3-1.7B"; export const DEFAULT_GLOB = "**/*.md"; export const DEFAULT_MULTI_GET_MAX_BYTES = 10 * 1024; // 10KB -// Chunking: 800 tokens per chunk with 15% overlap -export const CHUNK_SIZE_TOKENS = 800; -export const CHUNK_OVERLAP_TOKENS = Math.floor(CHUNK_SIZE_TOKENS * 0.15); // 120 tokens (15% overlap) +// Chunking: 900 tokens per chunk with 15% overlap +// Increased from 800 to accommodate smart chunking finding natural break points +export const CHUNK_SIZE_TOKENS = 900; +export const CHUNK_OVERLAP_TOKENS = Math.floor(CHUNK_SIZE_TOKENS * 0.15); // 135 tokens (15% overlap) // Fallback char-based approximation for sync chunking (~4 chars per token) -export const CHUNK_SIZE_CHARS = CHUNK_SIZE_TOKENS * 4; // 3200 chars -export const CHUNK_OVERLAP_CHARS = CHUNK_OVERLAP_TOKENS * 4; // 480 chars +export const CHUNK_SIZE_CHARS = CHUNK_SIZE_TOKENS * 4; // 3600 chars +export const CHUNK_OVERLAP_CHARS = CHUNK_OVERLAP_TOKENS * 4; // 540 chars +// Search window for finding optimal break points (in tokens, ~200 tokens) +export const CHUNK_WINDOW_TOKENS = 200; +export const CHUNK_WINDOW_CHARS = CHUNK_WINDOW_TOKENS * 4; // 800 chars + +// ============================================================================= +// Smart Chunking - Break Point Detection +// ============================================================================= + +/** + * A potential break point in the document with a base score indicating quality. + */ +export interface BreakPoint { + pos: number; // character position + score: number; // base score (higher = better break point) + type: string; // for debugging: 'h1', 'h2', 'blank', etc. +} + +/** + * A region where a code fence exists (between ``` markers). + * We should never split inside a code fence. + */ +export interface CodeFenceRegion { + start: number; // position of opening ``` + end: number; // position of closing ``` (or document end if unclosed) +} + +/** + * Patterns for detecting break points in markdown documents. + * Higher scores indicate better places to split. + * Scores are spread wide so headings decisively beat lower-quality breaks. + * Order matters for scoring - more specific patterns first. + */ +export const BREAK_PATTERNS: [RegExp, number, string][] = [ + [/\n#{1}(?!#)/g, 100, 'h1'], // # but not ## + [/\n#{2}(?!#)/g, 90, 'h2'], // ## but not ### + [/\n#{3}(?!#)/g, 80, 'h3'], // ### but not #### + [/\n#{4}(?!#)/g, 70, 'h4'], // #### but not ##### + [/\n#{5}(?!#)/g, 60, 'h5'], // ##### but not ###### + [/\n#{6}(?!#)/g, 50, 'h6'], // ###### + [/\n```/g, 80, 'codeblock'], // code block boundary (same as h3) + [/\n(?:---|\*\*\*|___)\s*\n/g, 60, 'hr'], // horizontal rule + [/\n\n+/g, 20, 'blank'], // paragraph boundary + [/\n[-*]\s/g, 5, 'list'], // unordered list item + [/\n\d+\.\s/g, 5, 'numlist'], // ordered list item + [/\n/g, 1, 'newline'], // minimal break +]; + +/** + * Scan text for all potential break points. + * Returns sorted array of break points with higher-scoring patterns taking precedence + * when multiple patterns match the same position. + */ +export function scanBreakPoints(text: string): BreakPoint[] { + const points: BreakPoint[] = []; + const seen = new Map(); // pos -> best break point at that pos + + for (const [pattern, score, type] of BREAK_PATTERNS) { + for (const match of text.matchAll(pattern)) { + const pos = match.index!; + const existing = seen.get(pos); + // Keep higher score if position already seen + if (!existing || score > existing.score) { + const bp = { pos, score, type }; + seen.set(pos, bp); + } + } + } + + // Convert to array and sort by position + for (const bp of seen.values()) { + points.push(bp); + } + return points.sort((a, b) => a.pos - b.pos); +} + +/** + * Find all code fence regions in the text. + * Code fences are delimited by ``` and we should never split inside them. + */ +export function findCodeFences(text: string): CodeFenceRegion[] { + const regions: CodeFenceRegion[] = []; + const fencePattern = /\n```/g; + let inFence = false; + let fenceStart = 0; + + for (const match of text.matchAll(fencePattern)) { + if (!inFence) { + fenceStart = match.index!; + inFence = true; + } else { + regions.push({ start: fenceStart, end: match.index! + match[0].length }); + inFence = false; + } + } + + // Handle unclosed fence - extends to end of document + if (inFence) { + regions.push({ start: fenceStart, end: text.length }); + } + + return regions; +} + +/** + * Check if a position is inside a code fence region. + */ +export function isInsideCodeFence(pos: number, fences: CodeFenceRegion[]): boolean { + return fences.some(f => pos > f.start && pos < f.end); +} + +/** + * Find the best cut position using scored break points with distance decay. + * + * Uses squared distance for gentler early decay - headings far back still win + * over low-quality breaks near the target. + * + * @param breakPoints - Pre-scanned break points from scanBreakPoints() + * @param targetCharPos - The ideal cut position (e.g., maxChars boundary) + * @param windowChars - How far back to search for break points (default ~200 tokens) + * @param decayFactor - How much to penalize distance (0.7 = 30% score at window edge) + * @param codeFences - Code fence regions to avoid splitting inside + * @returns The best position to cut at + */ +export function findBestCutoff( + breakPoints: BreakPoint[], + targetCharPos: number, + windowChars: number = CHUNK_WINDOW_CHARS, + decayFactor: number = 0.7, + codeFences: CodeFenceRegion[] = [] +): number { + const windowStart = targetCharPos - windowChars; + let bestScore = -1; + let bestPos = targetCharPos; + + for (const bp of breakPoints) { + if (bp.pos < windowStart) continue; + if (bp.pos > targetCharPos) break; // sorted, so we can stop + + // Skip break points inside code fences + if (isInsideCodeFence(bp.pos, codeFences)) continue; + + const distance = targetCharPos - bp.pos; + // Squared distance decay: gentle early, steep late + // At target: multiplier = 1.0 + // At 25% back: multiplier = 0.956 + // At 50% back: multiplier = 0.825 + // At 75% back: multiplier = 0.606 + // At window edge: multiplier = 0.3 + const normalizedDist = distance / windowChars; + const multiplier = 1.0 - (normalizedDist * normalizedDist) * decayFactor; + const finalScore = bp.score * multiplier; + + if (finalScore > bestScore) { + bestScore = finalScore; + bestPos = bp.pos; + } + } + + return bestPos; +} + +// Hybrid query: strong BM25 signal detection thresholds +// Skip expensive LLM expansion when top result is strong AND clearly separated from runner-up +export const STRONG_SIGNAL_MIN_SCORE = 0.85; +export const STRONG_SIGNAL_MIN_GAP = 0.15; +// Max candidates to pass to reranker — balances quality vs latency. +// 40 keeps rank 31-40 visible to the reranker (matters for recall on broad queries). +export const RERANK_CANDIDATE_LIMIT = 40; + +/** + * A typed query expansion result. Decoupled from llm.ts internal Queryable — + * same shape, but store.ts owns its own public API type. + * + * - lex: keyword variant → routes to FTS only + * - vec: semantic variant → routes to vector only + * - hyde: hypothetical document → routes to vector only + */ +export type ExpandedQuery = { + type: 'lex' | 'vec' | 'hyde'; + text: string; +}; // ============================================================================= // Path utilities @@ -169,7 +352,7 @@ export function resolve(...paths: string[]): string { } } else { // Start with PWD or cwd, then append the first relative path - const pwd = normalizePathSeparators(Bun.env.PWD || process.cwd()); + const pwd = normalizePathSeparators(process.env.PWD || process.cwd()); // Extract Windows drive from PWD if present if (pwd.length >= 2 && /[a-zA-Z]/.test(pwd[0]!) && pwd[1] === ':') { @@ -240,8 +423,8 @@ export function enableProductionMode(): void { export function getDefaultDbPath(indexName: string = "index"): string { // Always allow override via INDEX_PATH (for testing) - if (Bun.env.INDEX_PATH) { - return Bun.env.INDEX_PATH; + if (process.env.INDEX_PATH) { + return process.env.INDEX_PATH; } // In non-production mode (tests), require explicit path @@ -252,9 +435,9 @@ export function getDefaultDbPath(indexName: string = "index"): string { ); } - const cacheDir = Bun.env.XDG_CACHE_HOME || resolve(homedir(), ".cache"); + const cacheDir = process.env.XDG_CACHE_HOME || resolve(homedir(), ".cache"); const qmdCacheDir = resolve(cacheDir, "qmd"); - try { Bun.spawnSync(["mkdir", "-p", qmdCacheDir]); } catch { } + try { mkdirSync(qmdCacheDir, { recursive: true }); } catch { } return resolve(qmdCacheDir, `${indexName}.sqlite`); } @@ -409,46 +592,42 @@ export function toVirtualPath(db: Database, absolutePath: string): string | null // Database initialization // ============================================================================= -function setSQLiteFromBrewPrefixEnv(): void { - const candidates: string[] = []; - if (process.platform === "darwin") { - // Use BREW_PREFIX for non-standard Homebrew installs (common on corporate Macs). - const brewPrefix = Bun.env.BREW_PREFIX || Bun.env.HOMEBREW_PREFIX; - if (brewPrefix) { - // Homebrew can place SQLite in opt/sqlite (keg-only) or directly under the prefix. - candidates.push(`${brewPrefix}/opt/sqlite/lib/libsqlite3.dylib`); - candidates.push(`${brewPrefix}/lib/libsqlite3.dylib`); - } else { - candidates.push("/opt/homebrew/opt/sqlite/lib/libsqlite3.dylib"); - candidates.push("/usr/local/opt/sqlite/lib/libsqlite3.dylib"); - } - } +function createSqliteVecUnavailableError(reason: string): Error { + return new Error( + "sqlite-vec extension is unavailable. " + + `${reason}. ` + + "Install Homebrew SQLite so the sqlite-vec extension can be loaded, " + + "and set BREW_PREFIX if Homebrew is installed in a non-standard location." + ); +} - for (const candidate of candidates) { - try { - if (statSync(candidate).size > 0) { - Database.setCustomSQLite(candidate); - return; - } - } catch { } +function getErrorMessage(err: unknown): string { + return err instanceof Error ? err.message : String(err); +} + +export function verifySqliteVecLoaded(db: Database): void { + try { + const row = db.prepare(`SELECT vec_version() AS version`).get() as { version?: string } | null; + if (!row?.version || typeof row.version !== "string") { + throw new Error("vec_version() returned no version"); + } + } catch (err) { + const message = getErrorMessage(err); + throw createSqliteVecUnavailableError(`sqlite-vec probe failed (${message})`); } } -setSQLiteFromBrewPrefixEnv(); +let _sqliteVecAvailable: boolean | null = null; function initializeDatabase(db: Database): void { try { - sqliteVec.load(db); - } catch (err) { - if (err instanceof Error && err.message.includes("does not support dynamic extension loading")) { - throw new Error( - "SQLite build does not support dynamic extension loading. " + - "Install Homebrew SQLite so the sqlite-vec extension can be loaded, " + - "and set BREW_PREFIX if Homebrew is installed in a non-standard location." - ); - } - throw err; + loadSqliteVec(db); + verifySqliteVecLoaded(db); + _sqliteVecAvailable = true; + } catch { + // sqlite-vec is optional — vector search won't work but FTS is fine + _sqliteVecAvailable = false; } db.exec("PRAGMA journal_mode = WAL"); db.exec("PRAGMA foreign_keys = ON"); @@ -562,7 +741,14 @@ function initializeDatabase(db: Database): void { } +export function isSqliteVecAvailable(): boolean { + return _sqliteVecAvailable === true; +} + function ensureVecTableInternal(db: Database, dimensions: number): void { + if (!_sqliteVecAvailable) { + throw new Error("sqlite-vec is not available. Vector operations require a SQLite build with extension loading support."); + } const tableInfo = db.prepare(`SELECT sql FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get() as { sql: string } | null; if (tableInfo) { const match = tableInfo.sql.match(/float\[(\d+)\]/); @@ -619,12 +805,12 @@ export type Store = { toVirtualPath: (absolutePath: string) => string | null; // Search - searchFTS: (query: string, limit?: number, collectionId?: number) => SearchResult[]; - searchVec: (query: string, model: string, limit?: number, collectionName?: string) => Promise; + searchFTS: (query: string, limit?: number, collectionName?: string) => SearchResult[]; + searchVec: (query: string, model: string, limit?: number, collectionName?: string, session?: ILLMSession, precomputedEmbedding?: number[]) => Promise; // Query expansion & reranking - expandQuery: (query: string, model?: string) => Promise; - rerank: (query: string, documents: { file: string; text: string }[], model?: string) => Promise<{ file: string; score: number }[]>; + expandQuery: (query: string, model?: string, intent?: string) => Promise; + rerank: (query: string, documents: { file: string; text: string }[], model?: string, intent?: string) => Promise<{ file: string; score: number }[]>; // Document retrieval findDocument: (filename: string, options?: { includeBody?: boolean }) => DocumentResult | DocumentNotFound; @@ -660,7 +846,7 @@ export type Store = { */ export function createStore(dbPath?: string): Store { const resolvedPath = dbPath || getDefaultDbPath(); - const db = new Database(resolvedPath); + const db = openDatabase(resolvedPath); initializeDatabase(db); return { @@ -702,12 +888,12 @@ export function createStore(dbPath?: string): Store { toVirtualPath: (absolutePath: string) => toVirtualPath(db, absolutePath), // Search - searchFTS: (query: string, limit?: number, collectionId?: number) => searchFTS(db, query, limit, collectionId), - searchVec: (query: string, model: string, limit?: number, collectionName?: string) => searchVec(db, query, model, limit, collectionName), + searchFTS: (query: string, limit?: number, collectionName?: string) => searchFTS(db, query, limit, collectionName), + searchVec: (query: string, model: string, limit?: number, collectionName?: string, session?: ILLMSession, precomputedEmbedding?: number[]) => searchVec(db, query, model, limit, collectionName, session, precomputedEmbedding), // Query expansion & reranking - expandQuery: (query: string, model?: string) => expandQuery(query, model, db), - rerank: (query: string, documents: { file: string; text: string }[], model?: string) => rerank(query, documents, model, db), + expandQuery: (query: string, model?: string, intent?: string) => expandQuery(query, model, db, intent), + rerank: (query: string, documents: { file: string; text: string }[], model?: string, intent?: string) => rerank(query, documents, model, db, intent), // Document retrieval findDocument: (filename: string, options?: { includeBody?: boolean }) => findDocument(db, filename, options), @@ -772,17 +958,26 @@ export function getDocid(hash: string): string { * - Preserve folder structure (a/b/c/d.md stays structured) * - Preserve file extension */ +/** Replace emoji/symbol codepoints with their hex representation (e.g. 🐘 → 1f418) */ +function emojiToHex(str: string): string { + return str.replace(/(?:\p{So}\p{Mn}?|\p{Sk})+/gu, (run) => { + // Split the run into individual emoji and convert each to hex, dash-separated + return [...run].filter(c => /\p{So}|\p{Sk}/u.test(c)) + .map(c => c.codePointAt(0)!.toString(16)).join('-'); + }); +} + export function handelize(path: string): string { if (!path || path.trim() === '') { throw new Error('handelize: path cannot be empty'); } - // Check for paths that are just extensions or only dots/special chars - // A valid path must have at least one letter or digit (including Unicode) + // Allow route-style "$" filenames while still rejecting paths with no usable content. + // Emoji (\p{So}) counts as valid content — they get converted to hex codepoints below. const segments = path.split('/').filter(Boolean); const lastSegment = segments[segments.length - 1] || ''; const filenameWithoutExt = lastSegment.replace(/\.[^.]+$/, ''); - const hasValidContent = /[\p{L}\p{N}]/u.test(filenameWithoutExt); + const hasValidContent = /[\p{L}\p{N}\p{So}\p{Sk}$]/u.test(filenameWithoutExt); if (!hasValidContent) { throw new Error(`handelize: path "${path}" has no valid filename content`); } @@ -794,6 +989,9 @@ export function handelize(path: string): string { .map((segment, idx, arr) => { const isLastSegment = idx === arr.length - 1; + // Convert emoji to hex codepoints before cleaning + segment = emojiToHex(segment); + if (isLastSegment) { // For the filename (last segment), preserve the extension const extMatch = segment.match(/(\.[a-z0-9]+)$/i); @@ -801,14 +999,14 @@ export function handelize(path: string): string { const nameWithoutExt = ext ? segment.slice(0, -ext.length) : segment; const cleanedName = nameWithoutExt - .replace(/[^\p{L}\p{N}]+/gu, '-') // Replace non-letter/digit chars with dash + .replace(/[^\p{L}\p{N}$]+/gu, '-') // Keep route marker "$", dash-separate other chars .replace(/^-+|-+$/g, ''); // Remove leading/trailing dashes return cleanedName + ext; } else { // For directories, just clean normally return segment - .replace(/[^\p{L}\p{N}]+/gu, '-') + .replace(/[^\p{L}\p{N}$]+/gu, '-') .replace(/^-+|-+$/g, ''); } }) @@ -842,6 +1040,41 @@ export type RankedResult = { score: number; }; +export type RRFContributionTrace = { + listIndex: number; + source: "fts" | "vec"; + queryType: "original" | "lex" | "vec" | "hyde"; + query: string; + rank: number; // 1-indexed rank within list + weight: number; + backendScore: number; // Backend-normalized score before fusion + rrfContribution: number; // weight / (k + rank) +}; + +export type RRFScoreTrace = { + contributions: RRFContributionTrace[]; + baseScore: number; // Sum of reciprocal-rank contributions + topRank: number; // Best (lowest) rank seen across lists + topRankBonus: number; // +0.05 for rank 1, +0.02 for rank 2-3 + totalScore: number; // baseScore + topRankBonus +}; + +export type HybridQueryExplain = { + ftsScores: number[]; + vectorScores: number[]; + rrf: { + rank: number; // Rank after RRF fusion (1-indexed) + positionScore: number; // 1 / rank used in position-aware blending + weight: number; // Position-aware RRF weight (0.75 / 0.60 / 0.40) + baseScore: number; + topRankBonus: number; + totalScore: number; + contributions: RRFContributionTrace[]; + }; + rerankScore: number; + blendedScore: number; +}; + /** * Error result when document is not found */ @@ -917,7 +1150,7 @@ export function getIndexHealth(db: Database): IndexHealthInfo { // ============================================================================= export function getCacheKey(url: string, body: object): string { - const hash = new Bun.CryptoHasher("sha256"); + const hash = createHash("sha256"); hash.update(url); hash.update(JSON.stringify(body)); return hash.digest("hex"); @@ -1033,7 +1266,7 @@ export function vacuumDatabase(db: Database): void { // ============================================================================= export async function hashContent(content: string): Promise { - const hash = new Bun.CryptoHasher("sha256"); + const hash = createHash("sha256"); hash.update(content); return hash.digest("hex"); } @@ -1098,6 +1331,11 @@ export function insertDocument( db.prepare(` INSERT INTO documents (collection, path, title, hash, created_at, modified_at, active) VALUES (?, ?, ?, ?, ?, ?, 1) + ON CONFLICT(collection, path) DO UPDATE SET + title = excluded.title, + hash = excluded.hash, + modified_at = excluded.modified_at, + active = 1 `).run(collectionName, path, title, hash, createdAt, modifiedAt); } @@ -1109,10 +1347,11 @@ export function findActiveDocument( collectionName: string, path: string ): { id: number; hash: string; title: string } | null { - return db.prepare(` + const row = db.prepare(` SELECT id, hash, title FROM documents WHERE collection = ? AND path = ? AND active = 1 - `).get(collectionName, path) as { id: number; hash: string; title: string } | null; + `).get(collectionName, path) as { id: number; hash: string; title: string } | undefined; + return row ?? null; } /** @@ -1163,57 +1402,43 @@ export function getActiveDocumentPaths(db: Database, collectionName: string): st export { formatQueryForEmbedding, formatDocForEmbedding }; -export function chunkDocument(content: string, maxChars: number = CHUNK_SIZE_CHARS, overlapChars: number = CHUNK_OVERLAP_CHARS): { text: string; pos: number }[] { +export function chunkDocument( + content: string, + maxChars: number = CHUNK_SIZE_CHARS, + overlapChars: number = CHUNK_OVERLAP_CHARS, + windowChars: number = CHUNK_WINDOW_CHARS +): { text: string; pos: number }[] { if (content.length <= maxChars) { return [{ text: content, pos: 0 }]; } + // Pre-scan all break points and code fences once + const breakPoints = scanBreakPoints(content); + const codeFences = findCodeFences(content); + const chunks: { text: string; pos: number }[] = []; let charPos = 0; while (charPos < content.length) { - // Calculate end position for this chunk - let endPos = Math.min(charPos + maxChars, content.length); - - // If not at the end, try to find a good break point - if (endPos < content.length) { - const slice = content.slice(charPos, endPos); + // Calculate target end position for this chunk + const targetEndPos = Math.min(charPos + maxChars, content.length); - // Look for break points in the last 30% of the chunk - const searchStart = Math.floor(slice.length * 0.7); - const searchSlice = slice.slice(searchStart); + let endPos = targetEndPos; - // Priority: paragraph > sentence > line > word - let breakOffset = -1; - const paragraphBreak = searchSlice.lastIndexOf('\n\n'); - if (paragraphBreak >= 0) { - breakOffset = searchStart + paragraphBreak + 2; - } else { - const sentenceEnd = Math.max( - searchSlice.lastIndexOf('. '), - searchSlice.lastIndexOf('.\n'), - searchSlice.lastIndexOf('? '), - searchSlice.lastIndexOf('?\n'), - searchSlice.lastIndexOf('! '), - searchSlice.lastIndexOf('!\n') - ); - if (sentenceEnd >= 0) { - breakOffset = searchStart + sentenceEnd + 2; - } else { - const lineBreak = searchSlice.lastIndexOf('\n'); - if (lineBreak >= 0) { - breakOffset = searchStart + lineBreak + 1; - } else { - const spaceBreak = searchSlice.lastIndexOf(' '); - if (spaceBreak >= 0) { - breakOffset = searchStart + spaceBreak + 1; - } - } - } - } + // If not at the end, find the best break point + if (endPos < content.length) { + // Find best cutoff using scored algorithm + const bestCutoff = findBestCutoff( + breakPoints, + targetEndPos, + windowChars, + 0.7, + codeFences + ); - if (breakOffset > 0) { - endPos = charPos + breakOffset; + // Only use the cutoff if it's within our current chunk + if (bestCutoff > charPos && bestCutoff <= targetEndPos) { + endPos = bestCutoff; } } @@ -1247,73 +1472,49 @@ export function chunkDocument(content: string, maxChars: number = CHUNK_SIZE_CHA export async function chunkDocumentByTokens( content: string, maxTokens: number = CHUNK_SIZE_TOKENS, - overlapTokens: number = CHUNK_OVERLAP_TOKENS + overlapTokens: number = CHUNK_OVERLAP_TOKENS, + windowTokens: number = CHUNK_WINDOW_TOKENS ): Promise<{ text: string; pos: number; tokens: number }[]> { const llm = getDefaultLlamaCpp(); - // Tokenize once upfront - const allTokens = await llm.tokenize(content); - const totalTokens = allTokens.length; + // Use moderate chars/token estimate (prose ~4, code ~2, mixed ~3) + // If chunks exceed limit, they'll be re-split with actual ratio + const avgCharsPerToken = 3; + const maxChars = maxTokens * avgCharsPerToken; + const overlapChars = overlapTokens * avgCharsPerToken; + const windowChars = windowTokens * avgCharsPerToken; - if (totalTokens <= maxTokens) { - return [{ text: content, pos: 0, tokens: totalTokens }]; - } + // Chunk in character space with conservative estimate + let charChunks = chunkDocument(content, maxChars, overlapChars, windowChars); - const chunks: { text: string; pos: number; tokens: number }[] = []; - const step = maxTokens - overlapTokens; - const avgCharsPerToken = content.length / totalTokens; - let tokenPos = 0; + // Tokenize and split any chunks that still exceed limit + const results: { text: string; pos: number; tokens: number }[] = []; - while (tokenPos < totalTokens) { - const chunkEnd = Math.min(tokenPos + maxTokens, totalTokens); - const chunkTokens = allTokens.slice(tokenPos, chunkEnd); - let chunkText = await llm.detokenize(chunkTokens); - - // Find a good break point if not at end of document - if (chunkEnd < totalTokens) { - const searchStart = Math.floor(chunkText.length * 0.7); - const searchSlice = chunkText.slice(searchStart); - - let breakOffset = -1; - const paragraphBreak = searchSlice.lastIndexOf('\n\n'); - if (paragraphBreak >= 0) { - breakOffset = paragraphBreak + 2; - } else { - const sentenceEnd = Math.max( - searchSlice.lastIndexOf('. '), - searchSlice.lastIndexOf('.\n'), - searchSlice.lastIndexOf('? '), - searchSlice.lastIndexOf('?\n'), - searchSlice.lastIndexOf('! '), - searchSlice.lastIndexOf('!\n') - ); - if (sentenceEnd >= 0) { - breakOffset = sentenceEnd + 2; - } else { - const lineBreak = searchSlice.lastIndexOf('\n'); - if (lineBreak >= 0) { - breakOffset = lineBreak + 1; - } - } - } + for (const chunk of charChunks) { + const tokens = await llm.tokenize(chunk.text); - if (breakOffset >= 0) { - chunkText = chunkText.slice(0, searchStart + breakOffset); + if (tokens.length <= maxTokens) { + results.push({ text: chunk.text, pos: chunk.pos, tokens: tokens.length }); + } else { + // Chunk is still too large - split it further + // Use actual token count to estimate better char limit + const actualCharsPerToken = chunk.text.length / tokens.length; + const safeMaxChars = Math.floor(maxTokens * actualCharsPerToken * 0.95); // 5% safety margin + + const subChunks = chunkDocument(chunk.text, safeMaxChars, Math.floor(overlapChars * actualCharsPerToken / 2), Math.floor(windowChars * actualCharsPerToken / 2)); + + for (const subChunk of subChunks) { + const subTokens = await llm.tokenize(subChunk.text); + results.push({ + text: subChunk.text, + pos: chunk.pos + subChunk.pos, + tokens: subTokens.length, + }); } } - - // Approximate character position based on token position - const charPos = Math.floor(tokenPos * avgCharsPerToken); - chunks.push({ text: chunkText, pos: charPos, tokens: chunkTokens.length }); - - // Move forward - if (chunkEnd >= totalTokens) break; - - // Advance by step tokens (maxTokens - overlap) - tokenPos += step; } - return chunks; + return results; } // ============================================================================= @@ -1423,9 +1624,9 @@ export function matchFilesByGlob(db: Database, pattern: string): { filepath: str WHERE d.active = 1 `).all() as { virtual_path: string; body_length: number; path: string; collection: string }[]; - const glob = new Glob(pattern); + const isMatch = picomatch(pattern); return allFiles - .filter(f => glob.match(f.virtual_path) || glob.match(f.path)) + .filter(f => isMatch(f.virtual_path) || isMatch(f.path)) .map(f => ({ filepath: f.virtual_path, // Virtual path for precise lookup displayPath: f.path, // Relative path for display @@ -1834,16 +2035,113 @@ function sanitizeFTS5Term(term: string): string { return term.replace(/[^\p{L}\p{N}']/gu, '').toLowerCase(); } +/** + * Parse lex query syntax into FTS5 query. + * + * Supports: + * - Quoted phrases: "exact phrase" → "exact phrase" (exact match) + * - Negation: -term or -"phrase" → uses FTS5 NOT operator + * - Plain terms: term → "term"* (prefix match) + * + * FTS5 NOT is a binary operator: `term1 NOT term2` means "match term1 but not term2". + * So `-term` only works when there are also positive terms. + * + * Examples: + * performance -sports → "performance"* NOT "sports"* + * "machine learning" → "machine learning" + */ function buildFTS5Query(query: string): string | null { - const terms = query.split(/\s+/) - .map(t => sanitizeFTS5Term(t)) - .filter(t => t.length > 0); - if (terms.length === 0) return null; - if (terms.length === 1) return `"${terms[0]}"*`; - return terms.map(t => `"${t}"*`).join(' AND '); + const positive: string[] = []; + const negative: string[] = []; + + let i = 0; + const s = query.trim(); + + while (i < s.length) { + // Skip whitespace + while (i < s.length && /\s/.test(s[i]!)) i++; + if (i >= s.length) break; + + // Check for negation prefix + const negated = s[i] === '-'; + if (negated) i++; + + // Check for quoted phrase + if (s[i] === '"') { + const start = i + 1; + i++; + while (i < s.length && s[i] !== '"') i++; + const phrase = s.slice(start, i).trim(); + i++; // skip closing quote + if (phrase.length > 0) { + const sanitized = phrase.split(/\s+/).map(t => sanitizeFTS5Term(t)).filter(t => t).join(' '); + if (sanitized) { + const ftsPhrase = `"${sanitized}"`; // Exact phrase, no prefix match + if (negated) { + negative.push(ftsPhrase); + } else { + positive.push(ftsPhrase); + } + } + } + } else { + // Plain term (until whitespace or quote) + const start = i; + while (i < s.length && !/[\s"]/.test(s[i]!)) i++; + const term = s.slice(start, i); + + const sanitized = sanitizeFTS5Term(term); + if (sanitized) { + const ftsTerm = `"${sanitized}"*`; // Prefix match + if (negated) { + negative.push(ftsTerm); + } else { + positive.push(ftsTerm); + } + } + } + } + + if (positive.length === 0 && negative.length === 0) return null; + + // If only negative terms, we can't search (FTS5 NOT is binary) + if (positive.length === 0) return null; + + // Join positive terms with AND + let result = positive.join(' AND '); + + // Add NOT clause for negative terms + for (const neg of negative) { + result = `${result} NOT ${neg}`; + } + + return result; +} + +/** + * Validate that a vec/hyde query doesn't use lex-only syntax. + * Returns error message if invalid, null if valid. + */ +export function validateSemanticQuery(query: string): string | null { + // Check for negation syntax + if (/-\w/.test(query) || /-"/.test(query)) { + return 'Negation (-term) is not supported in vec/hyde queries. Use lex for exclusions.'; + } + return null; } -export function searchFTS(db: Database, query: string, limit: number = 20, collectionId?: number): SearchResult[] { +export function validateLexQuery(query: string): string | null { + if (/[\r\n]/.test(query)) { + return 'Lex queries must be a single line. Remove newline characters or split into separate lex: lines.'; + } + const quoteCount = (query.match(/"/g) ?? []).length; + if (quoteCount % 2 === 1) { + return 'Lex query has an unmatched double quote ("). Add the closing quote or remove it.'; + } + return null; +} + +export function searchFTS(db: Database, query: string, limit: number = 20, collectionName?: string): SearchResult[] { const ftsQuery = buildFTS5Query(query); if (!ftsQuery) return []; @@ -1862,12 +2160,9 @@ export function searchFTS(db: Database, query: string, limit: number = 20, colle `; const params: (string | number)[] = [ftsQuery]; - if (collectionId) { - // Note: collectionId is a legacy parameter that should be phased out - // Collections are now managed in YAML. For now, we interpret it as a collection name filter. - // This code path is likely unused as collection filtering should be done at CLI level. + if (collectionName) { sql += ` AND d.collection = ?`; - params.push(String(collectionId)); + params.push(String(collectionName)); } // bm25 lower is better; sort ascending. @@ -1877,10 +2172,11 @@ export function searchFTS(db: Database, query: string, limit: number = 20, colle const rows = db.prepare(sql).all(...params) as { filepath: string; display_path: string; title: string; body: string; hash: string; bm25_score: number }[]; return rows.map(row => { const collectionName = row.filepath.split('//')[1]?.split('/')[0] || ""; - // Convert bm25 (negative, lower is better) into a stable (0..1] score where higher is better. - // BM25 scores in SQLite FTS5 are negative (e.g., -10 is strong, -2 is weak). - // Avoid per-query normalization so "strong signal" heuristics can work. - const score = 1 / (1 + Math.abs(row.bm25_score)); + // Convert bm25 (negative, lower is better) into a stable [0..1) score where higher is better. + // FTS5 BM25 scores are negative (e.g., -10 is strong, -2 is weak). + // |x| / (1 + |x|) maps: strong(-10)→0.91, medium(-2)→0.67, weak(-0.5)→0.33, none(0)→0. + // Monotonic and query-independent — no per-query normalization needed. + const score = Math.abs(row.bm25_score) / (1 + Math.abs(row.bm25_score)); return { filepath: row.filepath, displayPath: row.display_path, @@ -1902,11 +2198,11 @@ export function searchFTS(db: Database, query: string, limit: number = 20, colle // Vector Search // ============================================================================= -export async function searchVec(db: Database, query: string, model: string, limit: number = 20, collectionName?: string, session?: ILLMSession): Promise { +export async function searchVec(db: Database, query: string, model: string, limit: number = 20, collectionName?: string, session?: ILLMSession, precomputedEmbedding?: number[]): Promise { const tableExists = db.prepare(`SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'`).get(); if (!tableExists) return []; - const embedding = await getEmbedding(query, model, true, session); + const embedding = precomputedEmbedding ?? await getEmbedding(query, model, true, session); if (!embedding) return []; // IMPORTANT: We use a two-step query approach here because sqlite-vec virtual tables @@ -1994,7 +2290,7 @@ export async function searchVec(db: Database, query: string, model: string, limi async function getEmbedding(text: string, model: string, isQuery: boolean, session?: ILLMSession): Promise { // Format text using the appropriate prompt template - const formattedText = isQuery ? formatQueryForEmbedding(text) : formatDocForEmbedding(text); + const formattedText = isQuery ? formatQueryForEmbedding(text, model) : formatDocForEmbedding(text, undefined, model); const result = session ? await session.embed(formattedText, { model, isQuery }) : await getDefaultLlamaCpp().embed(formattedText, { model, isQuery }); @@ -2050,64 +2346,81 @@ export function insertEmbedding( // Query expansion // ============================================================================= -export async function expandQuery(query: string, model: string = DEFAULT_QUERY_MODEL, db: Database): Promise { - // Check cache first - const cacheKey = getCacheKey("expandQuery", { query, model }); +export async function expandQuery(query: string, model: string = DEFAULT_QUERY_MODEL, db: Database, intent?: string): Promise { + // Check cache first — stored as JSON preserving types + const cacheKey = getCacheKey("expandQuery", { query, model, ...(intent && { intent }) }); const cached = getCachedResult(db, cacheKey); if (cached) { - const lines = cached.split('\n').map(l => l.trim()).filter(l => l.length > 0); - return [query, ...lines.slice(0, 2)]; + try { + return JSON.parse(cached) as ExpandedQuery[]; + } catch { + // Old cache format (pre-typed, newline-separated text) — re-expand + } } const llm = getDefaultLlamaCpp(); // Note: LlamaCpp uses hardcoded model, model parameter is ignored - const results = await llm.expandQuery(query); - const queryTexts = results.map(r => r.text); + const results = await llm.expandQuery(query, { intent }); + + // Map Queryable[] → ExpandedQuery[] (same shape, decoupled from llm.ts internals). + // Filter out entries that duplicate the original query text. + const expanded: ExpandedQuery[] = results + .filter(r => r.text !== query) + .map(r => ({ type: r.type, text: r.text })); - // Cache the expanded queries (excluding original) - const expandedOnly = queryTexts.filter(t => t !== query); - if (expandedOnly.length > 0) { - setCachedResult(db, cacheKey, expandedOnly.join('\n')); + if (expanded.length > 0) { + setCachedResult(db, cacheKey, JSON.stringify(expanded)); } - return Array.from(new Set([query, ...queryTexts])); + return expanded; } // ============================================================================= // Reranking // ============================================================================= -export async function rerank(query: string, documents: { file: string; text: string }[], model: string = DEFAULT_RERANK_MODEL, db: Database): Promise<{ file: string; score: number }[]> { +export async function rerank(query: string, documents: { file: string; text: string }[], model: string = DEFAULT_RERANK_MODEL, db: Database, intent?: string): Promise<{ file: string; score: number }[]> { + // Prepend intent to rerank query so the reranker scores with domain context + const rerankQuery = intent ? `${intent}\n\n${query}` : query; + const cachedResults: Map = new Map(); - const uncachedDocs: RerankDocument[] = []; + const uncachedDocsByChunk: Map = new Map(); // Check cache for each document + // Cache key includes chunk text — different queries can select different chunks + // from the same file, and the reranker score depends on which chunk was sent. + // File path is excluded from the new cache key because the reranker score + // depends on the chunk content, not where it came from. for (const doc of documents) { - const cacheKey = getCacheKey("rerank", { query, file: doc.file, model }); - const cached = getCachedResult(db, cacheKey); + const cacheKey = getCacheKey("rerank", { query: rerankQuery, model, chunk: doc.text }); + const legacyCacheKey = getCacheKey("rerank", { query, file: doc.file, model, chunk: doc.text }); + const cached = getCachedResult(db, cacheKey) ?? getCachedResult(db, legacyCacheKey); if (cached !== null) { - cachedResults.set(doc.file, parseFloat(cached)); + cachedResults.set(doc.text, parseFloat(cached)); } else { - uncachedDocs.push({ file: doc.file, text: doc.text }); + uncachedDocsByChunk.set(doc.text, { file: doc.file, text: doc.text }); } } // Rerank uncached documents using LlamaCpp - if (uncachedDocs.length > 0) { + if (uncachedDocsByChunk.size > 0) { const llm = getDefaultLlamaCpp(); - const rerankResult = await llm.rerank(query, uncachedDocs, { model }); + const uncachedDocs = [...uncachedDocsByChunk.values()]; + const rerankResult = await llm.rerank(rerankQuery, uncachedDocs, { model }); - // Cache results + // Cache results by chunk text so identical chunks across files are scored once. + const textByFile = new Map(uncachedDocs.map(d => [d.file, d.text])); for (const result of rerankResult.results) { - const cacheKey = getCacheKey("rerank", { query, file: result.file, model }); + const chunk = textByFile.get(result.file) || ""; + const cacheKey = getCacheKey("rerank", { query: rerankQuery, model, chunk }); setCachedResult(db, cacheKey, result.score.toString()); - cachedResults.set(result.file, result.score); + cachedResults.set(chunk, result.score); } } // Return all results sorted by score return documents - .map(doc => ({ file: doc.file, score: cachedResults.get(doc.file) || 0 })) + .map(doc => ({ file: doc.file, score: cachedResults.get(doc.text) || 0 })) .sort((a, b) => b.score - a.score); } @@ -2160,6 +2473,72 @@ export function reciprocalRankFusion( .map(e => ({ ...e.result, score: e.rrfScore })); } +/** + * Build per-document RRF contribution traces for explain/debug output. + */ +export function buildRrfTrace( + resultLists: RankedResult[][], + weights: number[] = [], + listMeta: RankedListMeta[] = [], + k: number = 60 +): Map { + const traces = new Map(); + + for (let listIdx = 0; listIdx < resultLists.length; listIdx++) { + const list = resultLists[listIdx]; + if (!list) continue; + const weight = weights[listIdx] ?? 1.0; + const meta = listMeta[listIdx] ?? { + source: "fts", + queryType: "original", + query: "", + } as const; + + for (let rank0 = 0; rank0 < list.length; rank0++) { + const result = list[rank0]; + if (!result) continue; + const rank = rank0 + 1; // 1-indexed rank for explain output + const contribution = weight / (k + rank); + const existing = traces.get(result.file); + + const detail: RRFContributionTrace = { + listIndex: listIdx, + source: meta.source, + queryType: meta.queryType, + query: meta.query, + rank, + weight, + backendScore: result.score, + rrfContribution: contribution, + }; + + if (existing) { + existing.baseScore += contribution; + existing.topRank = Math.min(existing.topRank, rank); + existing.contributions.push(detail); + } else { + traces.set(result.file, { + contributions: [detail], + baseScore: contribution, + topRank: rank, + topRankBonus: 0, + totalScore: 0, + }); + } + } + } + + for (const trace of traces.values()) { + let bonus = 0; + if (trace.topRank === 1) bonus = 0.05; + else if (trace.topRank <= 3) bonus = 0.02; + trace.topRankBonus = bonus; + trace.totalScore = trace.baseScore + bonus; + } + + return traces; +} + // ============================================================================= // Document retrieval // ============================================================================= @@ -2509,14 +2888,55 @@ export type SnippetResult = { snippetLines: number; // Number of lines in snippet }; -export function extractSnippet(body: string, query: string, maxLen = 500, chunkPos?: number): SnippetResult { +/** Weight for intent terms relative to query terms (1.0) in snippet scoring */ +export const INTENT_WEIGHT_SNIPPET = 0.3; + +/** Weight for intent terms relative to query terms (1.0) in chunk selection */ +export const INTENT_WEIGHT_CHUNK = 0.5; + +// Common stop words filtered from intent strings before tokenization. +// Seeded from finetune/reward.py KEY_TERM_STOPWORDS, extended with common +// 2-3 char function words so the length threshold can drop to >1 and let +// short domain terms (API, SQL, LLM, CPU, CDN, …) survive. +const INTENT_STOP_WORDS = new Set([ + // 2-char function words + "am", "an", "as", "at", "be", "by", "do", "he", "if", + "in", "is", "it", "me", "my", "no", "of", "on", "or", "so", + "to", "up", "us", "we", + // 3-char function words + "all", "and", "any", "are", "but", "can", "did", "for", "get", + "has", "her", "him", "his", "how", "its", "let", "may", "not", + "our", "out", "the", "too", "was", "who", "why", "you", + // 4+ char common words + "also", "does", "find", "from", "have", "into", "more", "need", + "show", "some", "tell", "that", "them", "this", "want", "what", + "when", "will", "with", "your", + // Search-context noise + "about", "looking", "notes", "search", "where", "which", +]); + +/** + * Extract meaningful terms from an intent string, filtering stop words and punctuation. + * Uses Unicode-aware punctuation stripping so domain terms like "API" survive. + * Returns lowercase terms suitable for text matching. + */ +export function extractIntentTerms(intent: string): string[] { + return intent.toLowerCase().split(/\s+/) + .map(t => t.replace(/^[^\p{L}\p{N}]+|[^\p{L}\p{N}]+$/gu, "")) + .filter(t => t.length > 1 && !INTENT_STOP_WORDS.has(t)); +} + +export function extractSnippet(body: string, query: string, maxLen = 500, chunkPos?: number, chunkLen?: number, intent?: string): SnippetResult { const totalLines = body.split('\n').length; let searchBody = body; let lineOffset = 0; if (chunkPos && chunkPos > 0) { + // Search within the chunk region, with some padding for context + // Use provided chunkLen or fall back to max chunk size (covers variable-length chunks) + const searchLen = chunkLen || CHUNK_SIZE_CHARS; const contextStart = Math.max(0, chunkPos - 100); - const contextEnd = Math.min(body.length, chunkPos + maxLen + 100); + const contextEnd = Math.min(body.length, chunkPos + searchLen + 100); searchBody = body.slice(contextStart, contextEnd); if (contextStart > 0) { lineOffset = body.slice(0, contextStart).split('\n').length - 1; @@ -2525,13 +2945,17 @@ export function extractSnippet(body: string, query: string, maxLen = 500, chunkP const lines = searchBody.split('\n'); const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 0); + const intentTerms = intent ? extractIntentTerms(intent) : []; let bestLine = 0, bestScore = -1; for (let i = 0; i < lines.length; i++) { const lineLower = (lines[i] ?? "").toLowerCase(); let score = 0; for (const term of queryTerms) { - if (lineLower.includes(term)) score++; + if (lineLower.includes(term)) score += 1.0; + } + for (const term of intentTerms) { + if (lineLower.includes(term)) score += INTENT_WEIGHT_SNIPPET; } if (score > bestScore) { bestScore = score; @@ -2547,7 +2971,7 @@ export function extractSnippet(body: string, query: string, maxLen = 500, chunkP // If we focused on a chunk window and it produced an empty/whitespace-only snippet, // fall back to a full-document snippet so we always show something useful. if (chunkPos && chunkPos > 0 && snippetText.trim().length === 0) { - return extractSnippet(body, query, maxLen, undefined); + return extractSnippet(body, query, maxLen, undefined, undefined, intent); } if (snippetText.length > maxLen) snippetText = snippetText.substring(0, maxLen - 3) + "..."; @@ -2569,3 +2993,650 @@ export function extractSnippet(body: string, query: string, maxLen = 500, chunkP snippetLines: snippetLineCount, }; } + +// ============================================================================= +// Shared helpers (used by both CLI and MCP) +// ============================================================================= + +/** + * Add line numbers to text content. + * Each line becomes: "{lineNum}: {content}" + */ +export function addLineNumbers(text: string, startLine: number = 1): string { + const lines = text.split('\n'); + return lines.map((line, i) => `${startLine + i}: ${line}`).join('\n'); +} + +// ============================================================================= +// Shared search orchestration +// +// hybridQuery() and vectorSearchQuery() are standalone functions (not Store +// methods) because they are orchestration over primitives — same rationale as +// reciprocalRankFusion(). They take a Store as first argument so both CLI +// and MCP can share the identical pipeline. +// ============================================================================= + +/** + * Optional progress hooks for search orchestration. + * CLI wires these to stderr for user feedback; MCP leaves them unset. + */ +export interface SearchHooks { + /** BM25 probe found strong signal — expansion will be skipped */ + onStrongSignal?: (topScore: number) => void; + /** Query expansion starting */ + onExpandStart?: () => void; + /** Query expansion complete. Empty array = strong signal skip. elapsedMs = time taken. */ + onExpand?: (original: string, expanded: ExpandedQuery[], elapsedMs: number) => void; + /** Embedding starting (vec/hyde queries) */ + onEmbedStart?: (count: number) => void; + /** Embedding complete */ + onEmbedDone?: (elapsedMs: number) => void; + /** Reranking is about to start */ + onRerankStart?: (chunkCount: number) => void; + /** Reranking finished */ + onRerankDone?: (elapsedMs: number) => void; +} + +export interface HybridQueryOptions { + collection?: string; + limit?: number; // default 10 + minScore?: number; // default 0 + candidateLimit?: number; // default RERANK_CANDIDATE_LIMIT + explain?: boolean; // include backend/RRF/rerank score traces + intent?: string; // domain intent hint for disambiguation + hooks?: SearchHooks; +} + +export interface HybridQueryResult { + file: string; // internal filepath (qmd://collection/path) + displayPath: string; + title: string; + body: string; // full document body (for snippet extraction) + bestChunk: string; // best chunk text + bestChunkPos: number; // char offset of best chunk in body + score: number; // blended score (full precision) + context: string | null; // user-set context + docid: string; // content hash prefix (6 chars) + explain?: HybridQueryExplain; +} + +export type RankedListMeta = { + source: "fts" | "vec"; + queryType: "original" | "lex" | "vec" | "hyde"; + query: string; +}; + +/** + * Hybrid search: BM25 + vector + query expansion + RRF + chunked reranking. + * + * Pipeline: + * 1. BM25 probe → skip expansion if strong signal + * 2. expandQuery() → typed query variants (lex/vec/hyde) + * 3. Type-routed search: original→vector, lex→FTS, vec/hyde→vector + * 4. RRF fusion → slice to candidateLimit + * 5. chunkDocument() + keyword-best-chunk selection + * 6. rerank on chunks (NOT full bodies — O(tokens) trap) + * 7. Position-aware score blending (RRF rank × reranker score) + * 8. Dedup by file, filter by minScore, slice to limit + */ +export async function hybridQuery( + store: Store, + query: string, + options?: HybridQueryOptions +): Promise { + const limit = options?.limit ?? 10; + const minScore = options?.minScore ?? 0; + const candidateLimit = options?.candidateLimit ?? RERANK_CANDIDATE_LIMIT; + const collection = options?.collection; + const explain = options?.explain ?? false; + const intent = options?.intent; + const hooks = options?.hooks; + + const rankedLists: RankedResult[][] = []; + const rankedListMeta: RankedListMeta[] = []; + const docidMap = new Map(); // filepath -> docid + const hasVectors = !!store.db.prepare( + `SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'` + ).get(); + + // Step 1: BM25 probe — strong signal skips expensive LLM expansion + // When intent is provided, disable strong-signal bypass — the obvious BM25 + // match may not be what the caller wants (e.g. "performance" with intent + // "web page load times" should NOT shortcut to a sports-performance doc). + // Pass collection directly into FTS query (filter at SQL level, not post-hoc) + const initialFts = store.searchFTS(query, 20, collection); + const topScore = initialFts[0]?.score ?? 0; + const secondScore = initialFts[1]?.score ?? 0; + const hasStrongSignal = !intent && initialFts.length > 0 + && topScore >= STRONG_SIGNAL_MIN_SCORE + && (topScore - secondScore) >= STRONG_SIGNAL_MIN_GAP; + + if (hasStrongSignal) hooks?.onStrongSignal?.(topScore); + + // Step 2: Expand query (or skip if strong signal) + hooks?.onExpandStart?.(); + const expandStart = Date.now(); + const expanded = hasStrongSignal + ? [] + : await store.expandQuery(query, undefined, intent); + + hooks?.onExpand?.(query, expanded, Date.now() - expandStart); + + // Seed with initial FTS results (avoid re-running original query FTS) + if (initialFts.length > 0) { + for (const r of initialFts) docidMap.set(r.filepath, r.docid); + rankedLists.push(initialFts.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + rankedListMeta.push({ source: "fts", queryType: "original", query }); + } + + // Step 3: Route searches by query type + // + // Strategy: run all FTS queries immediately (they're sync/instant), then + // batch-embed all vector queries in one embedBatch() call, then run + // sqlite-vec lookups with pre-computed embeddings. + + // 3a: Run FTS for all lex expansions right away (no LLM needed) + for (const q of expanded) { + if (q.type === 'lex') { + const ftsResults = store.searchFTS(q.text, 20, collection); + if (ftsResults.length > 0) { + for (const r of ftsResults) docidMap.set(r.filepath, r.docid); + rankedLists.push(ftsResults.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + rankedListMeta.push({ source: "fts", queryType: "lex", query: q.text }); + } + } + } + + // 3b: Collect all texts that need vector search (original query + vec/hyde expansions) + if (hasVectors) { + const vecQueries: { text: string; queryType: "original" | "vec" | "hyde" }[] = [ + { text: query, queryType: "original" }, + ]; + for (const q of expanded) { + if (q.type === 'vec' || q.type === 'hyde') { + vecQueries.push({ text: q.text, queryType: q.type }); + } + } + + // Batch embed all vector queries in a single call + const llm = getDefaultLlamaCpp(); + const textsToEmbed = vecQueries.map(q => formatQueryForEmbedding(q.text)); + hooks?.onEmbedStart?.(textsToEmbed.length); + const embedStart = Date.now(); + const embeddings = await llm.embedBatch(textsToEmbed); + hooks?.onEmbedDone?.(Date.now() - embedStart); + + // Run sqlite-vec lookups with pre-computed embeddings + for (let i = 0; i < vecQueries.length; i++) { + const embedding = embeddings[i]?.embedding; + if (!embedding) continue; + + const vecResults = await store.searchVec( + vecQueries[i]!.text, DEFAULT_EMBED_MODEL, 20, collection, + undefined, embedding + ); + if (vecResults.length > 0) { + for (const r of vecResults) docidMap.set(r.filepath, r.docid); + rankedLists.push(vecResults.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + rankedListMeta.push({ + source: "vec", + queryType: vecQueries[i]!.queryType, + query: vecQueries[i]!.text, + }); + } + } + } + + // Step 4: RRF fusion — first 2 lists (original FTS + first vec) get 2x weight + const weights = rankedLists.map((_, i) => i < 2 ? 2.0 : 1.0); + const fused = reciprocalRankFusion(rankedLists, weights); + const rrfTraceByFile = explain ? buildRrfTrace(rankedLists, weights, rankedListMeta) : null; + const candidates = fused.slice(0, candidateLimit); + + if (candidates.length === 0) return []; + + // Step 5: Chunk documents, pick best chunk per doc for reranking. + // Reranking full bodies is O(tokens) — the critical perf lesson that motivated this refactor. + const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2); + const intentTerms = intent ? extractIntentTerms(intent) : []; + const chunksToRerank: { file: string; text: string }[] = []; + const docChunkMap = new Map(); + + for (const cand of candidates) { + const chunks = chunkDocument(cand.body); + if (chunks.length === 0) continue; + + // Pick chunk with most keyword overlap (fallback: first chunk) + // Intent terms contribute at INTENT_WEIGHT_CHUNK (0.5) relative to query terms (1.0) + let bestIdx = 0; + let bestScore = -1; + for (let i = 0; i < chunks.length; i++) { + const chunkLower = chunks[i]!.text.toLowerCase(); + let score = queryTerms.reduce((acc, term) => acc + (chunkLower.includes(term) ? 1 : 0), 0); + for (const term of intentTerms) { + if (chunkLower.includes(term)) score += INTENT_WEIGHT_CHUNK; + } + if (score > bestScore) { bestScore = score; bestIdx = i; } + } + + chunksToRerank.push({ file: cand.file, text: chunks[bestIdx]!.text }); + docChunkMap.set(cand.file, { chunks, bestIdx }); + } + + // Step 6: Rerank chunks (NOT full bodies) + hooks?.onRerankStart?.(chunksToRerank.length); + const rerankStart = Date.now(); + const reranked = await store.rerank(query, chunksToRerank, undefined, intent); + hooks?.onRerankDone?.(Date.now() - rerankStart); + + // Step 7: Blend RRF position score with reranker score + // Position-aware weights: top retrieval results get more protection from reranker disagreement + const candidateMap = new Map(candidates.map(c => [c.file, { + displayPath: c.displayPath, title: c.title, body: c.body, + }])); + const rrfRankMap = new Map(candidates.map((c, i) => [c.file, i + 1])); + + const blended = reranked.map(r => { + const rrfRank = rrfRankMap.get(r.file) || candidateLimit; + let rrfWeight: number; + if (rrfRank <= 3) rrfWeight = 0.75; + else if (rrfRank <= 10) rrfWeight = 0.60; + else rrfWeight = 0.40; + const rrfScore = 1 / rrfRank; + const blendedScore = rrfWeight * rrfScore + (1 - rrfWeight) * r.score; + + const candidate = candidateMap.get(r.file); + const chunkInfo = docChunkMap.get(r.file); + const bestIdx = chunkInfo?.bestIdx ?? 0; + const bestChunk = chunkInfo?.chunks[bestIdx]?.text || candidate?.body || ""; + const bestChunkPos = chunkInfo?.chunks[bestIdx]?.pos || 0; + const trace = rrfTraceByFile?.get(r.file); + const explainData: HybridQueryExplain | undefined = explain ? { + ftsScores: trace?.contributions.filter(c => c.source === "fts").map(c => c.backendScore) ?? [], + vectorScores: trace?.contributions.filter(c => c.source === "vec").map(c => c.backendScore) ?? [], + rrf: { + rank: rrfRank, + positionScore: rrfScore, + weight: rrfWeight, + baseScore: trace?.baseScore ?? 0, + topRankBonus: trace?.topRankBonus ?? 0, + totalScore: trace?.totalScore ?? 0, + contributions: trace?.contributions ?? [], + }, + rerankScore: r.score, + blendedScore, + } : undefined; + + return { + file: r.file, + displayPath: candidate?.displayPath || "", + title: candidate?.title || "", + body: candidate?.body || "", + bestChunk, + bestChunkPos, + score: blendedScore, + context: store.getContextForFile(r.file), + docid: docidMap.get(r.file) || "", + ...(explainData ? { explain: explainData } : {}), + }; + }).sort((a, b) => b.score - a.score); + + // Step 8: Dedup by file (safety net — prevents duplicate output) + const seenFiles = new Set(); + return blended + .filter(r => { + if (seenFiles.has(r.file)) return false; + seenFiles.add(r.file); + return true; + }) + .filter(r => r.score >= minScore) + .slice(0, limit); +} + +export interface VectorSearchOptions { + collection?: string; + limit?: number; // default 10 + minScore?: number; // default 0.3 + intent?: string; // domain intent hint for disambiguation + hooks?: Pick; +} + +export interface VectorSearchResult { + file: string; + displayPath: string; + title: string; + body: string; + score: number; + context: string | null; + docid: string; +} + +/** + * Vector-only semantic search with query expansion. + * + * Pipeline: + * 1. expandQuery() → typed variants, filter to vec/hyde only (lex irrelevant here) + * 2. searchVec() for original + vec/hyde variants (sequential — node-llama-cpp embed limitation) + * 3. Dedup by filepath (keep max score) + * 4. Sort by score descending, filter by minScore, slice to limit + */ +export async function vectorSearchQuery( + store: Store, + query: string, + options?: VectorSearchOptions +): Promise { + const limit = options?.limit ?? 10; + const minScore = options?.minScore ?? 0.3; + const collection = options?.collection; + const intent = options?.intent; + + const hasVectors = !!store.db.prepare( + `SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'` + ).get(); + if (!hasVectors) return []; + + // Expand query — filter to vec/hyde only (lex queries target FTS, not vector) + const expandStart = Date.now(); + const allExpanded = await store.expandQuery(query, undefined, intent); + const vecExpanded = allExpanded.filter(q => q.type !== 'lex'); + options?.hooks?.onExpand?.(query, vecExpanded, Date.now() - expandStart); + + // Run original + vec/hyde expanded through vector, sequentially — concurrent embed() hangs + const queryTexts = [query, ...vecExpanded.map(q => q.text)]; + const allResults = new Map(); + for (const q of queryTexts) { + const vecResults = await store.searchVec(q, DEFAULT_EMBED_MODEL, limit, collection); + for (const r of vecResults) { + const existing = allResults.get(r.filepath); + if (!existing || r.score > existing.score) { + allResults.set(r.filepath, { + file: r.filepath, + displayPath: r.displayPath, + title: r.title, + body: r.body || "", + score: r.score, + context: store.getContextForFile(r.filepath), + docid: r.docid, + }); + } + } + } + + return Array.from(allResults.values()) + .sort((a, b) => b.score - a.score) + .filter(r => r.score >= minScore) + .slice(0, limit); +} + +// ============================================================================= +// Structured search — pre-expanded queries from LLM +// ============================================================================= + +/** + * A single sub-search in a structured search request. + * Matches the format used in QMD training data. + */ +export interface StructuredSubSearch { + /** Search type: 'lex' for BM25, 'vec' for semantic, 'hyde' for hypothetical */ + type: 'lex' | 'vec' | 'hyde'; + /** The search query text */ + query: string; + /** Optional line number for error reporting (CLI parser) */ + line?: number; +} + +export interface StructuredSearchOptions { + collections?: string[]; // Filter to specific collections (OR match) + limit?: number; // default 10 + minScore?: number; // default 0 + candidateLimit?: number; // default RERANK_CANDIDATE_LIMIT + explain?: boolean; // include backend/RRF/rerank score traces + /** Domain intent hint for disambiguation — steers reranking and chunk selection */ + intent?: string; + hooks?: SearchHooks; +} + +/** + * Structured search: execute pre-expanded queries without LLM query expansion. + * + * Designed for LLM callers (MCP/HTTP) that generate their own query expansions. + * Skips the internal expandQuery() step — goes directly to: + * + * Pipeline: + * 1. Route searches: lex→FTS, vec/hyde→vector (batch embed) + * 2. RRF fusion across all result lists + * 3. Chunk documents + keyword-best-chunk selection + * 4. Rerank on chunks + * 5. Position-aware score blending + * 6. Dedup, filter, slice + * + * This is the recommended endpoint for capable LLMs — they can generate + * better query variations than our small local model, especially for + * domain-specific or nuanced queries. + */ +export async function structuredSearch( + store: Store, + searches: StructuredSubSearch[], + options?: StructuredSearchOptions +): Promise { + const limit = options?.limit ?? 10; + const minScore = options?.minScore ?? 0; + const candidateLimit = options?.candidateLimit ?? RERANK_CANDIDATE_LIMIT; + const explain = options?.explain ?? false; + const intent = options?.intent; + const hooks = options?.hooks; + + const collections = options?.collections; + + if (searches.length === 0) return []; + + // Validate queries before executing + for (const search of searches) { + const location = search.line ? `Line ${search.line}` : 'Structured search'; + if (/[\r\n]/.test(search.query)) { + throw new Error(`${location} (${search.type}): queries must be single-line. Remove newline characters.`); + } + if (search.type === 'lex') { + const error = validateLexQuery(search.query); + if (error) { + throw new Error(`${location} (lex): ${error}`); + } + } else if (search.type === 'vec' || search.type === 'hyde') { + const error = validateSemanticQuery(search.query); + if (error) { + throw new Error(`${location} (${search.type}): ${error}`); + } + } + } + + const rankedLists: RankedResult[][] = []; + const rankedListMeta: RankedListMeta[] = []; + const docidMap = new Map(); // filepath -> docid + const hasVectors = !!store.db.prepare( + `SELECT name FROM sqlite_master WHERE type='table' AND name='vectors_vec'` + ).get(); + + // Helper to run search across collections (or all if undefined) + const collectionList = collections ?? [undefined]; // undefined = all collections + + // Step 1: Run FTS for all lex searches (sync, instant) + for (const search of searches) { + if (search.type === 'lex') { + for (const coll of collectionList) { + const ftsResults = store.searchFTS(search.query, 20, coll); + if (ftsResults.length > 0) { + for (const r of ftsResults) docidMap.set(r.filepath, r.docid); + rankedLists.push(ftsResults.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + rankedListMeta.push({ + source: "fts", + queryType: "lex", + query: search.query, + }); + } + } + } + } + + // Step 2: Batch embed and run vector searches for vec/hyde + if (hasVectors) { + const vecSearches = searches.filter( + (s): s is StructuredSubSearch & { type: 'vec' | 'hyde' } => + s.type === 'vec' || s.type === 'hyde' + ); + if (vecSearches.length > 0) { + const llm = getDefaultLlamaCpp(); + const textsToEmbed = vecSearches.map(s => formatQueryForEmbedding(s.query)); + hooks?.onEmbedStart?.(textsToEmbed.length); + const embedStart = Date.now(); + const embeddings = await llm.embedBatch(textsToEmbed); + hooks?.onEmbedDone?.(Date.now() - embedStart); + + for (let i = 0; i < vecSearches.length; i++) { + const embedding = embeddings[i]?.embedding; + if (!embedding) continue; + + for (const coll of collectionList) { + const vecResults = await store.searchVec( + vecSearches[i]!.query, DEFAULT_EMBED_MODEL, 20, coll, + undefined, embedding + ); + if (vecResults.length > 0) { + for (const r of vecResults) docidMap.set(r.filepath, r.docid); + rankedLists.push(vecResults.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + rankedListMeta.push({ + source: "vec", + queryType: vecSearches[i]!.type, + query: vecSearches[i]!.query, + }); + } + } + } + } + } + + if (rankedLists.length === 0) return []; + + // Step 3: RRF fusion — first list gets 2x weight (assume caller ordered by importance) + const weights = rankedLists.map((_, i) => i === 0 ? 2.0 : 1.0); + const fused = reciprocalRankFusion(rankedLists, weights); + const rrfTraceByFile = explain ? buildRrfTrace(rankedLists, weights, rankedListMeta) : null; + const candidates = fused.slice(0, candidateLimit); + + if (candidates.length === 0) return []; + + hooks?.onExpand?.("", [], 0); // Signal no expansion (pre-expanded) + + // Step 4: Chunk documents, pick best chunk per doc for reranking + // Use first lex query as the "query" for keyword matching, or first vec if no lex + const primaryQuery = searches.find(s => s.type === 'lex')?.query + || searches.find(s => s.type === 'vec')?.query + || searches[0]?.query || ""; + const queryTerms = primaryQuery.toLowerCase().split(/\s+/).filter(t => t.length > 2); + const intentTerms = intent ? extractIntentTerms(intent) : []; + const chunksToRerank: { file: string; text: string }[] = []; + const docChunkMap = new Map(); + + for (const cand of candidates) { + const chunks = chunkDocument(cand.body); + if (chunks.length === 0) continue; + + // Pick chunk with most keyword overlap + // Intent terms contribute at INTENT_WEIGHT_CHUNK (0.5) relative to query terms (1.0) + let bestIdx = 0; + let bestScore = -1; + for (let i = 0; i < chunks.length; i++) { + const chunkLower = chunks[i]!.text.toLowerCase(); + let score = queryTerms.reduce((acc, term) => acc + (chunkLower.includes(term) ? 1 : 0), 0); + for (const term of intentTerms) { + if (chunkLower.includes(term)) score += INTENT_WEIGHT_CHUNK; + } + if (score > bestScore) { bestScore = score; bestIdx = i; } + } + + chunksToRerank.push({ file: cand.file, text: chunks[bestIdx]!.text }); + docChunkMap.set(cand.file, { chunks, bestIdx }); + } + + // Step 5: Rerank chunks + hooks?.onRerankStart?.(chunksToRerank.length); + const rerankStart2 = Date.now(); + const reranked = await store.rerank(primaryQuery, chunksToRerank, undefined, intent); + hooks?.onRerankDone?.(Date.now() - rerankStart2); + + // Step 6: Blend RRF position score with reranker score + const candidateMap = new Map(candidates.map(c => [c.file, { + displayPath: c.displayPath, title: c.title, body: c.body, + }])); + const rrfRankMap = new Map(candidates.map((c, i) => [c.file, i + 1])); + + const blended = reranked.map(r => { + const rrfRank = rrfRankMap.get(r.file) || candidateLimit; + let rrfWeight: number; + if (rrfRank <= 3) rrfWeight = 0.75; + else if (rrfRank <= 10) rrfWeight = 0.60; + else rrfWeight = 0.40; + const rrfScore = 1 / rrfRank; + const blendedScore = rrfWeight * rrfScore + (1 - rrfWeight) * r.score; + + const candidate = candidateMap.get(r.file); + const chunkInfo = docChunkMap.get(r.file); + const bestIdx = chunkInfo?.bestIdx ?? 0; + const bestChunk = chunkInfo?.chunks[bestIdx]?.text || candidate?.body || ""; + const bestChunkPos = chunkInfo?.chunks[bestIdx]?.pos || 0; + const trace = rrfTraceByFile?.get(r.file); + const explainData: HybridQueryExplain | undefined = explain ? { + ftsScores: trace?.contributions.filter(c => c.source === "fts").map(c => c.backendScore) ?? [], + vectorScores: trace?.contributions.filter(c => c.source === "vec").map(c => c.backendScore) ?? [], + rrf: { + rank: rrfRank, + positionScore: rrfScore, + weight: rrfWeight, + baseScore: trace?.baseScore ?? 0, + topRankBonus: trace?.topRankBonus ?? 0, + totalScore: trace?.totalScore ?? 0, + contributions: trace?.contributions ?? [], + }, + rerankScore: r.score, + blendedScore, + } : undefined; + + return { + file: r.file, + displayPath: candidate?.displayPath || "", + title: candidate?.title || "", + body: candidate?.body || "", + bestChunk, + bestChunkPos, + score: blendedScore, + context: store.getContextForFile(r.file), + docid: docidMap.get(r.file) || "", + ...(explainData ? { explain: explainData } : {}), + }; + }).sort((a, b) => b.score - a.score); + + // Step 7: Dedup by file + const seenFiles = new Set(); + return blended + .filter(r => { + if (seenFiles.has(r.file)) return false; + seenFiles.add(r.file); + return true; + }) + .filter(r => r.score >= minScore) + .slice(0, limit); +} diff --git a/src/test-preload.ts b/src/test-preload.ts new file mode 100644 index 00000000..afbd81f5 --- /dev/null +++ b/src/test-preload.ts @@ -0,0 +1,13 @@ +/** + * Test preload file to ensure proper cleanup of native resources. + * + * Uses bun:test afterAll to properly dispose of llama.cpp Metal + * resources before the process exits, avoiding GGML_ASSERT failures. + */ +import { afterAll } from "bun:test"; +import { disposeDefaultLlamaCpp } from "./llm"; + +// Global afterAll runs after all test files complete +afterAll(async () => { + await disposeDefaultLlamaCpp(); +}); diff --git a/test/Containerfile b/test/Containerfile new file mode 100644 index 00000000..28f32d08 --- /dev/null +++ b/test/Containerfile @@ -0,0 +1,29 @@ +FROM debian:bookworm-slim + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + curl ca-certificates bash git build-essential python3 libatomic1 && \ + rm -rf /var/lib/apt/lists/* + +# Install mise +ENV MISE_YES=1 +RUN curl https://mise.run | sh +ENV PATH="/root/.local/bin:$PATH" + +# Pre-install node and bun +RUN mise use -g node@latest bun@latest + +# Copy the packed tarball and install via both package managers +COPY tobilu-qmd-*.tgz /tmp/ +RUN mise exec node@latest -- npm install -g /tmp/tobilu-qmd-*.tgz +RUN mise exec bun@latest -- bun install -g /tmp/tobilu-qmd-*.tgz + +# Copy test project (src + test + configs) and install deps +COPY test-src/ /opt/qmd/ +RUN cd /opt/qmd && mise exec node@latest -- npm install 2>/dev/null +RUN cd /opt/qmd && mise exec bun@latest -- bun install 2>/dev/null || true + +# Put everything on PATH +ENV PATH="/root/.bun/bin:/root/.local/share/mise/shims:/root/.local/bin:$PATH" + +CMD ["bash"] diff --git a/src/cli.test.ts b/test/cli.test.ts similarity index 66% rename from src/cli.test.ts rename to test/cli.test.ts index 89300be3..10b9a6e9 100644 --- a/src/cli.test.ts +++ b/test/cli.test.ts @@ -5,10 +5,14 @@ * These tests spawn actual qmd processes to verify end-to-end functionality. */ -import { describe, test, expect, beforeAll, afterAll, beforeEach } from "bun:test"; +import { describe, test, expect, beforeAll, afterAll, beforeEach } from "vitest"; import { mkdtemp, rm, writeFile, mkdir } from "fs/promises"; +import { existsSync, readFileSync, writeFileSync, unlinkSync } from "fs"; import { tmpdir } from "os"; -import { join } from "path"; +import { join, dirname } from "path"; +import { fileURLToPath } from "url"; +import { spawn } from "child_process"; +import { setTimeout as sleep } from "timers/promises"; // Test fixtures directory and database path let testDir: string; @@ -17,9 +21,18 @@ let testConfigDir: string; let fixturesDir: string; let testCounter = 0; // Unique counter for each test run -// Get the directory where this test file lives (same as qmd.ts) -const qmdDir = import.meta.dir; -const qmdScript = join(qmdDir, "qmd.ts"); +// Get the directory where this test file lives +const thisDir = dirname(fileURLToPath(import.meta.url)); +const projectRoot = join(thisDir, ".."); +const qmdScript = join(projectRoot, "src", "qmd.ts"); +// Resolve tsx binary from project's node_modules (not cwd-dependent) +const tsxBin = (() => { + const candidate = join(projectRoot, "node_modules", ".bin", "tsx"); + if (existsSync(candidate)) { + return candidate; + } + return join(process.cwd(), "node_modules", ".bin", "tsx"); +})(); // Helper to run qmd command with test database async function runQmd( @@ -29,7 +42,7 @@ async function runQmd( const workingDir = options.cwd || fixturesDir; const dbPath = options.dbPath || testDbPath; const configDir = options.configDir || testConfigDir; - const proc = Bun.spawn(["bun", qmdScript, ...args], { + const proc = spawn(tsxBin, [qmdScript, ...args], { cwd: workingDir, env: { ...process.env, @@ -38,13 +51,27 @@ async function runQmd( PWD: workingDir, // Must explicitly set PWD since getPwd() checks this ...options.env, }, - stdout: "pipe", - stderr: "pipe", + stdio: ["ignore", "pipe", "pipe"], }); - const stdout = await new Response(proc.stdout).text(); - const stderr = await new Response(proc.stderr).text(); - const exitCode = await proc.exited; + const stdoutPromise = new Promise((resolve, reject) => { + let data = ""; + proc.stdout?.on("data", (chunk: Buffer) => { data += chunk.toString(); }); + proc.once("error", reject); + proc.stdout?.once("end", () => resolve(data)); + }); + const stderrPromise = new Promise((resolve, reject) => { + let data = ""; + proc.stderr?.on("data", (chunk: Buffer) => { data += chunk.toString(); }); + proc.once("error", reject); + proc.stderr?.once("end", () => resolve(data)); + }); + const exitCode = await new Promise((resolve, reject) => { + proc.once("error", reject); + proc.on("close", (code) => resolve(code ?? 1)); + }); + const stdout = await stdoutPromise; + const stderr = await stderrPromise; return { stdout, stderr, exitCode }; } @@ -287,6 +314,64 @@ describe("CLI Search Command", () => { expect(stdout).toContain("No results"); }); + test("returns empty JSON array for non-matching query with --json", async () => { + const { stdout, exitCode } = await runQmd(["search", "xyznonexistent123", "--json"]); + expect(exitCode).toBe(0); + expect(JSON.parse(stdout)).toEqual([]); + }); + + test("returns CSV header only for non-matching query with --csv", async () => { + const { stdout, exitCode } = await runQmd(["search", "xyznonexistent123", "--csv"]); + expect(exitCode).toBe(0); + expect(stdout.trim()).toBe("docid,score,file,title,context,line,snippet"); + }); + + test("returns empty XML container for non-matching query with --xml", async () => { + const { stdout, exitCode } = await runQmd(["search", "xyznonexistent123", "--xml"]); + expect(exitCode).toBe(0); + expect(stdout.trim()).toBe(""); + }); + + test("returns empty output for non-matching query with --md", async () => { + const { stdout, exitCode } = await runQmd(["search", "xyznonexistent123", "--md"]); + expect(exitCode).toBe(0); + expect(stdout.trim()).toBe(""); + }); + + test("returns empty output for non-matching query with --files", async () => { + const { stdout, exitCode } = await runQmd(["search", "xyznonexistent123", "--files"]); + expect(exitCode).toBe(0); + expect(stdout.trim()).toBe(""); + }); + + test("returns min-score threshold message for default CLI output", async () => { + const { stdout, exitCode } = await runQmd(["search", "test", "--min-score", "2"]); + expect(exitCode).toBe(0); + expect(stdout).toContain("No results found above minimum score threshold."); + }); + + test("returns format-safe empty output when --min-score filters all results", async () => { + const json = await runQmd(["search", "test", "--json", "--min-score", "2"]); + expect(json.exitCode).toBe(0); + expect(JSON.parse(json.stdout)).toEqual([]); + + const csv = await runQmd(["search", "test", "--csv", "--min-score", "2"]); + expect(csv.exitCode).toBe(0); + expect(csv.stdout.trim()).toBe("docid,score,file,title,context,line,snippet"); + + const xml = await runQmd(["search", "test", "--xml", "--min-score", "2"]); + expect(xml.exitCode).toBe(0); + expect(xml.stdout.trim()).toBe(""); + + const md = await runQmd(["search", "test", "--md", "--min-score", "2"]); + expect(md.exitCode).toBe(0); + expect(md.stdout.trim()).toBe(""); + + const files = await runQmd(["search", "test", "--files", "--min-score", "2"]); + expect(files.exitCode).toBe(0); + expect(files.stdout.trim()).toBe(""); + }); + test("requires query argument", async () => { const { stdout, stderr, exitCode } = await runQmd(["search"]); expect(exitCode).toBe(1); @@ -368,6 +453,43 @@ describe("CLI Update Command", () => { expect(exitCode).toBe(0); expect(stdout).toContain("Updating"); }); + + test("deactivates stale docs when collection has zero matching files", async () => { + const { dbPath, configDir } = await createIsolatedTestEnv("update-empty"); + const collectionDir = join(testDir, `update-empty-${Date.now()}`); + await mkdir(collectionDir, { recursive: true }); + + const docPath = join(collectionDir, "only.md"); + const token = `stale-proof-${Date.now()}`; + await writeFile( + docPath, + `--- +date: 2026-03-06 +--- +# Empty Collection Deactivation +${token} +` + ); + + const add = await runQmd( + ["collection", "add", collectionDir, "--name", "empty-check"], + { dbPath, configDir } + ); + expect(add.exitCode).toBe(0); + + const before = await runQmd(["get", "qmd://empty-check/only.md"], { dbPath, configDir }); + expect(before.exitCode).toBe(0); + expect(before.stdout).toContain(token); + + unlinkSync(docPath); + + const update = await runQmd(["update"], { dbPath, configDir }); + expect(update.exitCode).toBe(0); + expect(update.stdout).toContain("No files found matching pattern."); + + const after = await runQmd(["get", "qmd://empty-check/only.md"], { dbPath, configDir }); + expect(after.exitCode).toBe(1); + }); }); describe("CLI Add-Context Command", () => { @@ -438,8 +560,7 @@ describe("CLI Error Handling", () => { expect(exitCode).toBe(0); // The custom database should exist - const file = Bun.file(customDbPath); - expect(await file.exists()).toBe(true); + expect(existsSync(customDbPath)).toBe(true); }); }); @@ -756,6 +877,119 @@ describe("CLI Collection Commands", () => { }); }); +// ============================================================================= +// Collection Ignore Patterns +// ============================================================================= + +describe("collection ignore patterns", () => { + let localDbPath: string; + let localConfigDir: string; + let ignoreTestDir: string; + + beforeAll(async () => { + const env = await createIsolatedTestEnv("ignore-patterns"); + localDbPath = env.dbPath; + localConfigDir = env.configDir; + + // Create directory structure with subdirectories to ignore + ignoreTestDir = join(testDir, "ignore-fixtures"); + await mkdir(join(ignoreTestDir, "notes"), { recursive: true }); + await mkdir(join(ignoreTestDir, "sessions"), { recursive: true }); + await mkdir(join(ignoreTestDir, "sessions", "2026-03"), { recursive: true }); + await mkdir(join(ignoreTestDir, "archive"), { recursive: true }); + + // Files that should be indexed + await writeFile(join(ignoreTestDir, "readme.md"), "# Main readme\nThis should be indexed."); + await writeFile(join(ignoreTestDir, "notes", "note1.md"), "# Note 1\nThis is a personal note."); + + // Files that should be ignored + await writeFile(join(ignoreTestDir, "sessions", "session1.md"), "# Session 1\nThis session should be ignored."); + await writeFile(join(ignoreTestDir, "sessions", "2026-03", "session2.md"), "# Session 2\nNested session should also be ignored."); + await writeFile(join(ignoreTestDir, "archive", "old.md"), "# Old stuff\nThis archive file should be ignored."); + }); + + test("ignore patterns exclude matching files from indexing", async () => { + // Write YAML config with ignore patterns + await writeFile( + join(localConfigDir, "index.yml"), + `collections: + ignoretst: + path: ${ignoreTestDir} + pattern: "**/*.md" + ignore: + - "sessions/**" + - "archive/**" +` + ); + + const { stdout, exitCode } = await runQmd(["update"], { + cwd: ignoreTestDir, + dbPath: localDbPath, + configDir: localConfigDir, + }); + expect(exitCode).toBe(0); + // Should index 2 files (readme.md + notes/note1.md), not 5 + expect(stdout).toContain("2 new"); + }); + + test("ignored files are not searchable", async () => { + const { stdout, exitCode } = await runQmd(["search", "session", "-n", "10"], { + cwd: ignoreTestDir, + dbPath: localDbPath, + configDir: localConfigDir, + }); + // Should find no results since sessions/ was ignored + if (exitCode === 0) { + expect(stdout).not.toContain("session1"); + expect(stdout).not.toContain("session2"); + } + }); + + test("non-ignored files are searchable", async () => { + const { stdout, exitCode } = await runQmd(["search", "personal note", "-n", "10"], { + cwd: ignoreTestDir, + dbPath: localDbPath, + configDir: localConfigDir, + }); + expect(exitCode).toBe(0); + expect(stdout).toContain("note1"); + }); + + test("status shows ignore patterns", async () => { + const { stdout, exitCode } = await runQmd(["collection", "list"], { + cwd: ignoreTestDir, + dbPath: localDbPath, + configDir: localConfigDir, + }); + expect(exitCode).toBe(0); + expect(stdout).toContain("Ignore:"); + expect(stdout).toContain("sessions/**"); + expect(stdout).toContain("archive/**"); + }); + + test("collection without ignore indexes all files", async () => { + // Create a second collection without ignore + const env2 = await createIsolatedTestEnv("no-ignore"); + await writeFile( + join(env2.configDir, "index.yml"), + `collections: + allfiles: + path: ${ignoreTestDir} + pattern: "**/*.md" +` + ); + + const { stdout, exitCode } = await runQmd(["update"], { + cwd: ignoreTestDir, + dbPath: env2.dbPath, + configDir: env2.configDir, + }); + expect(exitCode).toBe(0); + // Should index all 5 files + expect(stdout).toContain("5 new"); + }); +}); + // ============================================================================= // Output Format Tests - qmd:// URIs, context, and docid // ============================================================================= @@ -961,3 +1195,232 @@ describe("status and collection list hide filesystem paths", () => { expect(stdout).not.toMatch(/Path:\s+\//); }); }); + +// ============================================================================= +// MCP HTTP Daemon Lifecycle +// ============================================================================= + +describe("mcp http daemon", () => { + let daemonTestDir: string; + let daemonCacheDir: string; // XDG_CACHE_HOME value (the qmd/ subdir is created automatically) + let daemonDbPath: string; + let daemonConfigDir: string; + + // Track spawned PIDs for cleanup + const spawnedPids: number[] = []; + + /** Get path to PID file inside the test cache dir */ + function pidPath(): string { + return join(daemonCacheDir, "qmd", "mcp.pid"); + } + + /** Run qmd with test-isolated env (cache, db, config) */ + async function runDaemonQmd( + args: string[], + ): Promise<{ stdout: string; stderr: string; exitCode: number }> { + return runQmd(args, { + dbPath: daemonDbPath, + configDir: daemonConfigDir, + env: { XDG_CACHE_HOME: daemonCacheDir }, + }); + } + + /** Spawn a foreground HTTP server (non-blocking) and return the process */ + function spawnHttpServer(port: number): import("child_process").ChildProcess { + const proc = spawn(tsxBin, [qmdScript, "mcp", "--http", "--port", String(port)], { + cwd: fixturesDir, + env: { + ...process.env, + INDEX_PATH: daemonDbPath, + QMD_CONFIG_DIR: daemonConfigDir, + }, + stdio: ["ignore", "pipe", "pipe"], + }); + if (proc.pid) spawnedPids.push(proc.pid); + return proc; + } + + /** Wait for HTTP server to become ready */ + async function waitForServer(port: number, timeoutMs = 5000): Promise { + const deadline = Date.now() + timeoutMs; + while (Date.now() < deadline) { + try { + const res = await fetch(`http://localhost:${port}/health`); + if (res.ok) return true; + } catch { /* not ready yet */ } + await sleep(200); + } + return false; + } + + /** Pick a random high port unlikely to conflict */ + function randomPort(): number { + return 10000 + Math.floor(Math.random() * 50000); + } + + beforeAll(async () => { + daemonTestDir = await mkdtemp(join(tmpdir(), "qmd-daemon-test-")); + daemonCacheDir = join(daemonTestDir, "cache"); + daemonDbPath = join(daemonTestDir, "test.sqlite"); + daemonConfigDir = join(daemonTestDir, "config"); + + await mkdir(join(daemonCacheDir, "qmd"), { recursive: true }); + await mkdir(daemonConfigDir, { recursive: true }); + await writeFile(join(daemonConfigDir, "index.yml"), "collections: {}\n"); + }); + + afterAll(async () => { + // Kill any leftover spawned processes + for (const pid of spawnedPids) { + try { process.kill(pid, "SIGTERM"); } catch { /* already dead */ } + } + // Also clean up via PID file if present + try { + const pf = pidPath(); + if (existsSync(pf)) { + const pid = parseInt(readFileSync(pf, "utf-8").trim()); + try { process.kill(pid, "SIGTERM"); } catch {} + unlinkSync(pf); + } + } catch {} + + await rm(daemonTestDir, { recursive: true, force: true }); + }); + + // ------------------------------------------------------------------------- + // Foreground HTTP + // ------------------------------------------------------------------------- + + test("foreground HTTP server starts and responds to health check", async () => { + const port = randomPort(); + const proc = spawnHttpServer(port); + + try { + const ready = await waitForServer(port); + expect(ready).toBe(true); + + const res = await fetch(`http://localhost:${port}/health`); + expect(res.status).toBe(200); + const body = await res.json(); + expect(body.status).toBe("ok"); + } finally { + proc.kill("SIGTERM"); + await new Promise(r => proc.on("close", r)); + } + }); + + // ------------------------------------------------------------------------- + // Daemon lifecycle + // ------------------------------------------------------------------------- + + test("--daemon writes PID file and starts server", async () => { + const port = randomPort(); + const { stdout, exitCode } = await runDaemonQmd([ + "mcp", "--http", "--daemon", "--port", String(port), + ]); + expect(exitCode).toBe(0); + expect(stdout).toContain(`http://localhost:${port}/mcp`); + + // PID file should exist + expect(existsSync(pidPath())).toBe(true); + + const pid = parseInt(readFileSync(pidPath(), "utf-8").trim()); + spawnedPids.push(pid); + + // Server should be reachable + const ready = await waitForServer(port); + expect(ready).toBe(true); + + // Clean up + process.kill(pid, "SIGTERM"); + await sleep(500); + try { unlinkSync(pidPath()); } catch {} + }); + + test("stop kills daemon and removes PID file", async () => { + const port = randomPort(); + // Start daemon + const { exitCode: startCode } = await runDaemonQmd([ + "mcp", "--http", "--daemon", "--port", String(port), + ]); + expect(startCode).toBe(0); + + const pid = parseInt(readFileSync(pidPath(), "utf-8").trim()); + spawnedPids.push(pid); + + await waitForServer(port); + + // Stop it + const { stdout: stopOut, exitCode: stopCode } = await runDaemonQmd(["mcp", "stop"]); + expect(stopCode).toBe(0); + expect(stopOut).toContain("Stopped"); + + // PID file should be gone + expect(existsSync(pidPath())).toBe(false); + + // Process should be dead + await sleep(500); + expect(() => process.kill(pid, 0)).toThrow(); + }); + + test("stop handles dead PID gracefully (cleans stale file)", async () => { + // Write a PID file pointing to a dead process + writeFileSync(pidPath(), "999999999"); + + const { stdout, exitCode } = await runDaemonQmd(["mcp", "stop"]); + expect(exitCode).toBe(0); + expect(stdout).toContain("stale"); + + // PID file should be cleaned up + expect(existsSync(pidPath())).toBe(false); + }); + + test("--daemon rejects if already running", async () => { + const port = randomPort(); + // Start first daemon + const { exitCode: firstCode } = await runDaemonQmd([ + "mcp", "--http", "--daemon", "--port", String(port), + ]); + expect(firstCode).toBe(0); + + const pid = parseInt(readFileSync(pidPath(), "utf-8").trim()); + spawnedPids.push(pid); + + await waitForServer(port); + + // Try to start second daemon — should fail + const { stderr, exitCode } = await runDaemonQmd([ + "mcp", "--http", "--daemon", "--port", String(port + 1), + ]); + expect(exitCode).toBe(1); + expect(stderr).toContain("Already running"); + + // Clean up first daemon + process.kill(pid, "SIGTERM"); + await sleep(500); + try { unlinkSync(pidPath()); } catch {} + }); + + test("--daemon cleans stale PID file and starts fresh", async () => { + // Write a stale PID file + writeFileSync(pidPath(), "999999999"); + + const port = randomPort(); + const { exitCode, stdout } = await runDaemonQmd([ + "mcp", "--http", "--daemon", "--port", String(port), + ]); + expect(exitCode).toBe(0); + expect(stdout).toContain(`http://localhost:${port}/mcp`); + + const pid = parseInt(readFileSync(pidPath(), "utf-8").trim()); + spawnedPids.push(pid); + expect(pid).not.toBe(999999999); + + // Clean up + const ready = await waitForServer(port); + expect(ready).toBe(true); + process.kill(pid, "SIGTERM"); + await sleep(500); + try { unlinkSync(pidPath()); } catch {} + }); +}); diff --git a/test/collections-config.test.ts b/test/collections-config.test.ts new file mode 100644 index 00000000..b6b15fe4 --- /dev/null +++ b/test/collections-config.test.ts @@ -0,0 +1,74 @@ +/** + * Unit tests for collection config path resolution (PR #190). + * + * Tests that getConfigDir() respects XDG_CONFIG_HOME, QMD_CONFIG_DIR, + * and falls back to ~/.config/qmd. + */ + +import { describe, test, expect, beforeEach, afterEach } from "vitest"; +import { join } from "path"; +import { homedir } from "os"; +import { getConfigPath, setConfigIndexName } from "../src/collections.js"; + +// Save/restore env vars around each test +let savedEnv: Record; + +beforeEach(() => { + savedEnv = { + QMD_CONFIG_DIR: process.env.QMD_CONFIG_DIR, + XDG_CONFIG_HOME: process.env.XDG_CONFIG_HOME, + }; + // Reset index name to default + setConfigIndexName("index"); +}); + +afterEach(() => { + // Reset index name to default (prevents leaking into other test files under bun test) + setConfigIndexName("index"); + for (const [key, val] of Object.entries(savedEnv)) { + if (val === undefined) { + delete process.env[key]; + } else { + process.env[key] = val; + } + } +}); + +describe("getConfigDir via getConfigPath", () => { + test("defaults to ~/.config/qmd when no env vars are set", () => { + delete process.env.QMD_CONFIG_DIR; + delete process.env.XDG_CONFIG_HOME; + expect(getConfigPath()).toBe(join(homedir(), ".config", "qmd", "index.yml")); + }); + + test("QMD_CONFIG_DIR takes highest priority", () => { + process.env.QMD_CONFIG_DIR = "/custom/qmd-config"; + process.env.XDG_CONFIG_HOME = "/xdg/config"; + expect(getConfigPath()).toBe(join("/custom/qmd-config", "index.yml")); + }); + + test("XDG_CONFIG_HOME is used when QMD_CONFIG_DIR is not set", () => { + delete process.env.QMD_CONFIG_DIR; + process.env.XDG_CONFIG_HOME = "/xdg/config"; + expect(getConfigPath()).toBe(join("/xdg/config", "qmd", "index.yml")); + }); + + test("XDG_CONFIG_HOME appends qmd subdirectory", () => { + delete process.env.QMD_CONFIG_DIR; + process.env.XDG_CONFIG_HOME = "/home/agent/.config"; + expect(getConfigPath()).toBe(join("/home/agent/.config", "qmd", "index.yml")); + }); + + test("QMD_CONFIG_DIR overrides XDG_CONFIG_HOME", () => { + process.env.QMD_CONFIG_DIR = "/override"; + process.env.XDG_CONFIG_HOME = "/should-not-use"; + expect(getConfigPath()).toBe(join("/override", "index.yml")); + }); + + test("respects custom index name", () => { + delete process.env.QMD_CONFIG_DIR; + process.env.XDG_CONFIG_HOME = "/xdg/config"; + setConfigIndexName("myindex"); + expect(getConfigPath()).toBe(join("/xdg/config", "qmd", "myindex.yml")); + }); +}); diff --git a/test/eval-bm25.test.ts b/test/eval-bm25.test.ts new file mode 100644 index 00000000..aaa9fe86 --- /dev/null +++ b/test/eval-bm25.test.ts @@ -0,0 +1,135 @@ +/** + * BM25-only evaluation tests (unit layer). + * + * This is a fast suite copied from the BM25 block in `models/eval.test.ts`. + */ + +import { describe, test, expect, beforeAll, afterAll } from "vitest"; +import { mkdtempSync, rmSync, readFileSync, readdirSync } from "fs"; +import { join, dirname } from "path"; +import { tmpdir } from "os"; +import type { Database } from "../src/db.js"; +import { createHash } from "crypto"; +import { fileURLToPath } from "url"; + +import { + createStore, + searchFTS, + insertDocument, + insertContent, +} from "../src/store"; + +// Set INDEX_PATH before importing store to prevent using global index +const tempDir = mkdtempSync(join(tmpdir(), "qmd-eval-unit-")); +process.env.INDEX_PATH = join(tempDir, "eval-unit.sqlite"); + +afterAll(() => { + rmSync(tempDir, { recursive: true, force: true }); +}); + +const evalQueries: { + query: string; + expectedDoc: string; + difficulty: "easy" | "medium" | "hard" | "fusion"; +}[] = [ + // EASY: Exact keyword matches + { query: "API versioning", expectedDoc: "api-design", difficulty: "easy" }, + { query: "Series A fundraising", expectedDoc: "fundraising", difficulty: "easy" }, + { query: "CAP theorem", expectedDoc: "distributed-systems", difficulty: "easy" }, + { query: "overfitting machine learning", expectedDoc: "machine-learning", difficulty: "easy" }, + { query: "remote work VPN", expectedDoc: "remote-work", difficulty: "easy" }, + { query: "Project Phoenix retrospective", expectedDoc: "product-launch", difficulty: "easy" }, + + // MEDIUM: Semantic/conceptual queries + { query: "how to structure REST endpoints", expectedDoc: "api-design", difficulty: "medium" }, + { query: "raising money for startup", expectedDoc: "fundraising", difficulty: "medium" }, + { query: "consistency vs availability tradeoffs", expectedDoc: "distributed-systems", difficulty: "medium" }, + { query: "how to prevent models from memorizing data", expectedDoc: "machine-learning", difficulty: "medium" }, + { query: "working from home guidelines", expectedDoc: "remote-work", difficulty: "medium" }, + { query: "what went wrong with the launch", expectedDoc: "product-launch", difficulty: "medium" }, + + // HARD: Vague, partial memory, indirect + { query: "nouns not verbs", expectedDoc: "api-design", difficulty: "hard" }, + { query: "Sequoia investor pitch", expectedDoc: "fundraising", difficulty: "hard" }, + { query: "Raft algorithm leader election", expectedDoc: "distributed-systems", difficulty: "hard" }, + { query: "F1 score precision recall", expectedDoc: "machine-learning", difficulty: "hard" }, + { query: "quarterly team gathering travel", expectedDoc: "remote-work", difficulty: "hard" }, + { query: "beta program 47 bugs", expectedDoc: "product-launch", difficulty: "hard" }, + + // FUSION: Multi-signal queries that need both lexical AND semantic matching + // These should have weak individual scores but strong combined RRF scores + { query: "how much runway before running out of money", expectedDoc: "fundraising", difficulty: "fusion" }, + { query: "datacenter replication sync strategy", expectedDoc: "distributed-systems", difficulty: "fusion" }, + { query: "splitting data for training and testing", expectedDoc: "machine-learning", difficulty: "fusion" }, + { query: "JSON response codes error messages", expectedDoc: "api-design", difficulty: "fusion" }, + { query: "video calls camera async messaging", expectedDoc: "remote-work", difficulty: "fusion" }, + { query: "CI/CD pipeline testing coverage", expectedDoc: "product-launch", difficulty: "fusion" }, +]; + +function matchesExpected(filepath: string, expectedDoc: string): boolean { + return filepath.toLowerCase().includes(expectedDoc); +} + +function calcHitRate( + queries: typeof evalQueries, + searchFn: (query: string) => { filepath: string }[], + topK: number +): number { + let hits = 0; + for (const { query, expectedDoc } of queries) { + const results = searchFn(query).slice(0, topK); + if (results.some(r => matchesExpected(r.filepath, expectedDoc))) hits++; + } + return hits / queries.length; +} + +describe("BM25 Search (FTS)", () => { + let store: ReturnType; + let db: Database; + + beforeAll(() => { + store = createStore(); + db = store.db; + + // Load and index eval documents + const evalDocsDir = join(dirname(fileURLToPath(import.meta.url)), "eval-docs"); + const files = readdirSync(evalDocsDir).filter(f => f.endsWith(".md")); + + for (const file of files) { + const content = readFileSync(join(evalDocsDir, file), "utf-8"); + const title = content.split("\n")[0]?.replace(/^#\s*/, "") || file; + const hash = createHash("sha256").update(content).digest("hex").slice(0, 12); + const now = new Date().toISOString(); + + insertContent(db, hash, content, now); + insertDocument(db, "eval-docs", file, title, hash, now, now); + } + }); + + afterAll(() => { + store.close(); + }); + + test("easy queries: ≥80% Hit@3", () => { + const easyQueries = evalQueries.filter(q => q.difficulty === "easy"); + const hitRate = calcHitRate(easyQueries, q => searchFTS(db, q, 5), 3); + expect(hitRate).toBeGreaterThanOrEqual(0.8); + }); + + test("medium queries: ≥15% Hit@3 (BM25 struggles with semantic)", () => { + const mediumQueries = evalQueries.filter(q => q.difficulty === "medium"); + const hitRate = calcHitRate(mediumQueries, q => searchFTS(db, q, 5), 3); + expect(hitRate).toBeGreaterThanOrEqual(0.15); + }); + + test("hard queries: ≥15% Hit@5 (BM25 baseline)", () => { + const hardQueries = evalQueries.filter(q => q.difficulty === "hard"); + const hitRate = calcHitRate(hardQueries, q => searchFTS(db, q, 5), 5); + expect(hitRate).toBeGreaterThanOrEqual(0.15); + }); + + test("overall Hit@3 ≥40% (BM25 baseline)", () => { + const hitRate = calcHitRate(evalQueries, q => searchFTS(db, q, 5), 3); + expect(hitRate).toBeGreaterThanOrEqual(0.4); + }); +}); diff --git a/src/eval.test.ts b/test/eval.test.ts similarity index 95% rename from src/eval.test.ts rename to test/eval.test.ts index ff5d7daa..d575ff84 100644 --- a/src/eval.test.ts +++ b/test/eval.test.ts @@ -10,11 +10,15 @@ * 3. Hybrid (RRF) - combined lexical + vector with rank fusion */ -import { describe, test, expect, beforeAll, afterAll } from "bun:test"; +import { describe, test, expect, beforeAll, afterAll } from "vitest"; import { mkdtempSync, rmSync, readFileSync, readdirSync } from "fs"; import { join } from "path"; import { tmpdir } from "os"; -import Database from "bun:sqlite"; +import { openDatabase } from "../src/db.js"; +import type { Database } from "../src/db.js"; +import { createHash } from "crypto"; +import { fileURLToPath } from "url"; +import { dirname } from "path"; // Set INDEX_PATH before importing store to prevent using global index const tempDir = mkdtempSync(join(tmpdir(), "qmd-eval-")); @@ -31,8 +35,8 @@ import { reciprocalRankFusion, DEFAULT_EMBED_MODEL, type RankedResult, -} from "./store"; -import { getDefaultLlamaCpp, formatDocForEmbedding, disposeDefaultLlamaCpp } from "./llm"; +} from "../src/store"; +import { getDefaultLlamaCpp, formatDocForEmbedding, disposeDefaultLlamaCpp } from "../src/llm"; // Eval queries with expected documents const evalQueries: { @@ -106,13 +110,13 @@ describe("BM25 Search (FTS)", () => { db = store.db; // Load and index eval documents - const evalDocsDir = join(import.meta.dir, "../test/eval-docs"); + const evalDocsDir = join(dirname(fileURLToPath(import.meta.url)), "eval-docs"); const files = readdirSync(evalDocsDir).filter(f => f.endsWith(".md")); for (const file of files) { const content = readFileSync(join(evalDocsDir, file), "utf-8"); const title = content.split("\n")[0]?.replace(/^#\s*/, "") || file; - const hash = Bun.hash(content).toString(16).slice(0, 12); + const hash = createHash("sha256").update(content).digest("hex").slice(0, 12); const now = new Date().toISOString(); insertContent(db, hash, content, now); @@ -152,7 +156,7 @@ describe("BM25 Search (FTS)", () => { // Vector Search Tests - Requires embedding model // ============================================================================= -describe("Vector Search", () => { +describe.skipIf(!!process.env.CI)("Vector Search", () => { let store: ReturnType; let db: Database; let hasEmbeddings = false; @@ -178,12 +182,12 @@ describe("Vector Search", () => { const llm = getDefaultLlamaCpp(); store.ensureVecTable(768); // embeddinggemma uses 768 dimensions - const evalDocsDir = join(import.meta.dir, "../test/eval-docs"); + const evalDocsDir = join(dirname(fileURLToPath(import.meta.url)), "eval-docs"); const files = readdirSync(evalDocsDir).filter(f => f.endsWith(".md")); for (const file of files) { const content = readFileSync(join(evalDocsDir, file), "utf-8"); - const hash = Bun.hash(content).toString(16).slice(0, 12); + const hash = createHash("sha256").update(content).digest("hex").slice(0, 12); const title = content.split("\n")[0]?.replace(/^#\s*/, "") || file; // Chunk and embed @@ -264,7 +268,7 @@ describe("Vector Search", () => { // Hybrid Search (RRF) Tests - Combines BM25 + Vector // ============================================================================= -describe("Hybrid Search (RRF)", () => { +describe.skipIf(!!process.env.CI)("Hybrid Search (RRF)", () => { let store: ReturnType; let db: Database; let hasVectors = false; diff --git a/test/formatter.test.ts b/test/formatter.test.ts new file mode 100644 index 00000000..9fee06ee --- /dev/null +++ b/test/formatter.test.ts @@ -0,0 +1,296 @@ +/** + * formatter.test.ts - Unit tests verifying context is shown in all output formats + * + * Run with: bun test formatter.test.ts + */ + +import { describe, test, expect } from "vitest"; +import { + // Search result formatters + searchResultsToJson, + searchResultsToCsv, + searchResultsToFiles, + searchResultsToMarkdown, + searchResultsToXml, + searchResultsToMcpCsv, + formatSearchResults, + // Document (multi-get) formatters + documentsToJson, + documentsToCsv, + documentsToFiles, + documentsToMarkdown, + documentsToXml, + formatDocuments, + // Single document formatters + documentToJson, + documentToMarkdown, + documentToXml, + formatDocument, + type MultiGetFile, +} from "../src/formatter.js"; +import type { SearchResult, DocumentResult } from "../src/store.js"; + +// ============================================================================= +// Test Fixtures +// ============================================================================= + +const TEST_CONTEXT = "Internal engineering keynotes from company summit events"; + +function makeSearchResult(overrides: Partial = {}): SearchResult { + return { + filepath: "qmd://archive/summit/keynote.md", + displayPath: "qmd://archive/summit/keynote.md", + title: "Summit Keynote", + context: TEST_CONTEXT, + hash: "dc5590abcdef", + docid: "dc5590", + collectionName: "archive", + modifiedAt: "2024-01-01T00:00:00Z", + bodyLength: 100, + body: "---\ntitle: Summit Keynote\n---\n\nThis is the keynote content.", + score: 0.84, + source: "fts", + ...overrides, + }; +} + +function makeDocumentResult(overrides: Partial = {}): DocumentResult { + return { + filepath: "qmd://archive/summit/keynote.md", + displayPath: "qmd://archive/summit/keynote.md", + title: "Summit Keynote", + context: TEST_CONTEXT, + hash: "dc5590abcdef", + docid: "dc5590", + collectionName: "archive", + modifiedAt: "2024-01-01T00:00:00Z", + bodyLength: 100, + body: "---\ntitle: Summit Keynote\n---\n\nThis is the keynote content.", + ...overrides, + }; +} + +function makeMultiGetFile(overrides: Partial = {}): MultiGetFile { + return { + filepath: "qmd://archive/summit/keynote.md", + displayPath: "qmd://archive/summit/keynote.md", + title: "Summit Keynote", + context: TEST_CONTEXT, + body: "---\ntitle: Summit Keynote\n---\n\nThis is the keynote content.", + skipped: false, + ...overrides, + }; +} + +// ============================================================================= +// Search Results: Context in Every Format +// ============================================================================= + +describe("search results include context in all formats", () => { + const results = [makeSearchResult()]; + + test("JSON format includes context", () => { + const output = searchResultsToJson(results, { query: "keynote" }); + const parsed = JSON.parse(output); + expect(parsed[0].context).toBe(TEST_CONTEXT); + }); + + test("CSV format includes context", () => { + const output = searchResultsToCsv(results, { query: "keynote" }); + // Header should have context column + const lines = output.split("\n"); + expect(lines[0]).toContain("context"); + // Data row should contain the context text + expect(output).toContain(TEST_CONTEXT); + }); + + test("files format includes context", () => { + const output = searchResultsToFiles(results); + expect(output).toContain(TEST_CONTEXT); + }); + + test("Markdown format includes context", () => { + const output = searchResultsToMarkdown(results, { query: "keynote" }); + expect(output).toContain(TEST_CONTEXT); + }); + + test("XML format includes context", () => { + const output = searchResultsToXml(results, { query: "keynote" }); + expect(output).toContain(TEST_CONTEXT); + }); + + test("MCP CSV format includes context", () => { + const mcpResults = [{ + docid: "dc5590", + file: "qmd://archive/summit/keynote.md", + title: "Summit Keynote", + score: 0.84, + context: TEST_CONTEXT, + snippet: "This is the keynote content.", + }]; + const output = searchResultsToMcpCsv(mcpResults); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatSearchResults (JSON) includes context", () => { + const output = formatSearchResults(results, "json", { query: "keynote" }); + const parsed = JSON.parse(output); + expect(parsed[0].context).toBe(TEST_CONTEXT); + }); + + test("formatSearchResults (CSV) includes context", () => { + const output = formatSearchResults(results, "csv", { query: "keynote" }); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatSearchResults (files) includes context", () => { + const output = formatSearchResults(results, "files"); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatSearchResults (md) includes context", () => { + const output = formatSearchResults(results, "md", { query: "keynote" }); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatSearchResults (xml) includes context", () => { + const output = formatSearchResults(results, "xml", { query: "keynote" }); + expect(output).toContain(TEST_CONTEXT); + }); +}); + +// ============================================================================= +// Search Results: No Context When Absent +// ============================================================================= + +describe("search results omit context when null", () => { + const results = [makeSearchResult({ context: null })]; + + test("JSON format omits context field when null", () => { + const output = searchResultsToJson(results, { query: "keynote" }); + const parsed = JSON.parse(output); + expect(parsed[0].context).toBeUndefined(); + }); + + test("files format does not include trailing context when null", () => { + const output = searchResultsToFiles(results); + // Should just be docid,score,path - no trailing comma/context + expect(output).not.toContain(",\""); + }); +}); + +// ============================================================================= +// Multi-Get Documents: Context in Every Format +// ============================================================================= + +describe("multi-get documents include context in all formats", () => { + const docs = [makeMultiGetFile()]; + + test("JSON format includes context", () => { + const output = documentsToJson(docs); + const parsed = JSON.parse(output); + expect(parsed[0].context).toBe(TEST_CONTEXT); + }); + + test("CSV format includes context", () => { + const output = documentsToCsv(docs); + const lines = output.split("\n"); + expect(lines[0]).toContain("context"); + expect(output).toContain(TEST_CONTEXT); + }); + + test("files format includes context", () => { + const output = documentsToFiles(docs); + expect(output).toContain(TEST_CONTEXT); + }); + + test("Markdown format includes context", () => { + const output = documentsToMarkdown(docs); + expect(output).toContain(TEST_CONTEXT); + }); + + test("XML format includes context", () => { + const output = documentsToXml(docs); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatDocuments (JSON) includes context", () => { + const output = formatDocuments(docs, "json"); + const parsed = JSON.parse(output); + expect(parsed[0].context).toBe(TEST_CONTEXT); + }); + + test("formatDocuments (md) includes context", () => { + const output = formatDocuments(docs, "md"); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatDocuments (xml) includes context", () => { + const output = formatDocuments(docs, "xml"); + expect(output).toContain(TEST_CONTEXT); + }); +}); + +// ============================================================================= +// Single Document: Context in Every Format +// ============================================================================= + +describe("single document includes context in all formats", () => { + const doc = makeDocumentResult(); + + test("JSON format includes context", () => { + const output = documentToJson(doc); + const parsed = JSON.parse(output); + expect(parsed.context).toBe(TEST_CONTEXT); + }); + + test("Markdown format includes context", () => { + const output = documentToMarkdown(doc); + expect(output).toContain(TEST_CONTEXT); + }); + + test("XML format includes context", () => { + const output = documentToXml(doc); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatDocument (JSON) includes context", () => { + const output = formatDocument(doc, "json"); + const parsed = JSON.parse(output); + expect(parsed.context).toBe(TEST_CONTEXT); + }); + + test("formatDocument (md) includes context", () => { + const output = formatDocument(doc, "md"); + expect(output).toContain(TEST_CONTEXT); + }); + + test("formatDocument (xml) includes context", () => { + const output = formatDocument(doc, "xml"); + expect(output).toContain(TEST_CONTEXT); + }); +}); + +// ============================================================================= +// Single Document: No Context When Absent +// ============================================================================= + +describe("single document omits context when null", () => { + const doc = makeDocumentResult({ context: null }); + + test("JSON format omits context field when null", () => { + const output = documentToJson(doc); + const parsed = JSON.parse(output); + expect(parsed.context).toBeUndefined(); + }); + + test("Markdown format does not show Context line when null", () => { + const output = documentToMarkdown(doc); + expect(output).not.toContain("Context:"); + }); + + test("XML format does not show context element when null", () => { + const output = documentToXml(doc); + expect(output).not.toContain(""); + }); +}); diff --git a/test/intent.test.ts b/test/intent.test.ts new file mode 100644 index 00000000..7995bafb --- /dev/null +++ b/test/intent.test.ts @@ -0,0 +1,513 @@ +/** + * intent.test.ts - Tests for the intent feature + * + * Tests cover: + * - extractIntentTerms: stop word filtering, punctuation, acronyms, edge cases + * - extractSnippet with intent: disambiguation across multiple document sections + * - parseStructuredQuery with intent: lines (parsing, validation, error cases) + * - Chunk selection scoring with intent + * - Strong-signal bypass when intent is present + * - Intent constants + * + * Run with: npx vitest run test/intent.test.ts + */ + +import { describe, test, expect } from "vitest"; +import { + extractSnippet, + extractIntentTerms, + INTENT_WEIGHT_SNIPPET, + INTENT_WEIGHT_CHUNK, + type StructuredSubSearch, +} from "../src/store.js"; + +// ============================================================================= +// parseStructuredQuery — duplicated from src/qmd.ts for unit testing +// (qmd.ts doesn't export it since it's a CLI internal) +// ============================================================================= + +interface ParsedStructuredQuery { + searches: StructuredSubSearch[]; + intent?: string; +} + +function parseStructuredQuery(query: string): ParsedStructuredQuery | null { + const rawLines = query.split('\n').map((line, idx) => ({ + raw: line, + trimmed: line.trim(), + number: idx + 1, + })).filter(line => line.trimmed.length > 0); + + if (rawLines.length === 0) return null; + + const prefixRe = /^(lex|vec|hyde):\s*/i; + const expandRe = /^expand:\s*/i; + const intentRe = /^intent:\s*/i; + const typed: StructuredSubSearch[] = []; + let intent: string | undefined; + + for (const line of rawLines) { + if (expandRe.test(line.trimmed)) { + if (rawLines.length > 1) { + throw new Error(`Line ${line.number} starts with expand:, but query documents cannot mix expand with typed lines. Submit a single expand query instead.`); + } + const text = line.trimmed.replace(expandRe, '').trim(); + if (!text) { + throw new Error('expand: query must include text.'); + } + return null; + } + + if (intentRe.test(line.trimmed)) { + if (intent !== undefined) { + throw new Error(`Line ${line.number}: only one intent: line is allowed per query document.`); + } + const text = line.trimmed.replace(intentRe, '').trim(); + if (!text) { + throw new Error(`Line ${line.number}: intent: must include text.`); + } + intent = text; + continue; + } + + const match = line.trimmed.match(prefixRe); + if (match) { + const type = match[1]!.toLowerCase() as 'lex' | 'vec' | 'hyde'; + const text = line.trimmed.slice(match[0].length).trim(); + if (!text) { + throw new Error(`Line ${line.number} (${type}:) must include text.`); + } + if (/\r|\n/.test(text)) { + throw new Error(`Line ${line.number} (${type}:) contains a newline. Keep each query on a single line.`); + } + typed.push({ type, query: text, line: line.number }); + continue; + } + + if (rawLines.length === 1) { + return null; + } + + throw new Error(`Line ${line.number} is missing a lex:/vec:/hyde:/intent: prefix. Each line in a query document must start with one.`); + } + + if (intent && typed.length === 0) { + throw new Error('intent: cannot appear alone. Add at least one lex:, vec:, or hyde: line.'); + } + + return typed.length > 0 ? { searches: typed, intent } : null; +} + +// ============================================================================= +// extractIntentTerms +// ============================================================================= + +describe("extractIntentTerms", () => { + test("filters stop words", () => { + // "looking", "for", "notes", "about" are stop words + expect(extractIntentTerms("looking for notes about latency optimization")) + .toEqual(["latency", "optimization"]); + }); + + test("filters common function words", () => { + // "what", "is", "the", "to", "find" are stop words; "best", "way" survive + expect(extractIntentTerms("what is the best way to find")) + .toEqual(["best", "way"]); + }); + + test("preserves domain terms", () => { + expect(extractIntentTerms("web performance latency page load times")) + .toEqual(["web", "performance", "latency", "page", "load", "times"]); + }); + + test("handles surrounding punctuation with Unicode awareness", () => { + expect(extractIntentTerms("personal health, fitness, and endurance")) + .toEqual(["personal", "health", "fitness", "endurance"]); + }); + + test("preserves internal hyphens", () => { + expect(extractIntentTerms("self-hosted real-time (decision-making)")) + .toEqual(["self-hosted", "real-time", "decision-making"]); + }); + + test("short domain terms survive (API, SQL, LLM)", () => { + expect(extractIntentTerms("API design for LLM agents")) + .toEqual(["api", "design", "llm", "agents"]); + }); + + test("returns empty for empty input", () => { + expect(extractIntentTerms("")).toEqual([]); + expect(extractIntentTerms(" ")).toEqual([]); + }); + + test("filters single-char terms", () => { + const terms = extractIntentTerms("a b c web"); + expect(terms).toEqual(["web"]); + }); + + test("all stop words returns empty", () => { + const terms = extractIntentTerms("the and or but in on at to for of with by"); + expect(terms).toEqual([]); + }); + + test("preserves 2-char domain terms (CI, CD, DB)", () => { + const terms = extractIntentTerms("SQL CI CD DB"); + expect(terms).toContain("sql"); + expect(terms).toContain("ci"); + expect(terms).toContain("cd"); + expect(terms).toContain("db"); + }); + + test("lowercases all terms", () => { + const terms = extractIntentTerms("WebSocket HTTP REST"); + expect(terms).toContain("websocket"); + expect(terms).toContain("http"); + expect(terms).toContain("rest"); + }); + + test("handles C++ style punctuation", () => { + const terms = extractIntentTerms("C++, performance! optimization."); + expect(terms).toContain("performance"); + expect(terms).toContain("optimization"); + }); +}); + +// ============================================================================= +// extractSnippet with intent — disambiguation +// ============================================================================= + +describe("extractSnippet with intent", () => { + // Each section contains "performance" so the query score is tied (1.0 each). + // Intent terms (INTENT_WEIGHT_SNIPPET) then break the tie toward the relevant section. + const body = [ + "# Notes on Various Topics", + "", + "## Web Performance Section", + "Web performance means optimizing page load times and Core Web Vitals.", + "Reduce latency, improve rendering speed, and measure performance budgets.", + "", + "## Team Performance Section", + "Team performance depends on trust, psychological safety, and feedback.", + "Build culture where performance reviews drive growth not fear.", + "", + "## Health Performance Section", + "Health performance comes from consistent exercise, sleep, and endurance.", + "Track fitness metrics, optimize recovery, and monitor healthspan.", + ].join("\n"); + + test("without intent, anchors on query terms only", () => { + const result = extractSnippet(body, "performance", 500); + // "performance" appears in title and multiple sections — should anchor on first match + expect(result.snippet).toContain("Performance"); + }); + + test("with web-perf intent, prefers web performance section", () => { + const result = extractSnippet( + body, "performance", 500, + undefined, undefined, + "Looking for notes about web performance, latency, and page load times" + ); + expect(result.snippet).toMatch(/latency|page.*load|Core Web Vitals/i); + }); + + test("with health intent, prefers health section", () => { + const result = extractSnippet( + body, "performance", 500, + undefined, undefined, + "Looking for notes about personal health, fitness, and endurance" + ); + expect(result.snippet).toMatch(/health|fitness|endurance|exercise/i); + }); + + test("with team intent, prefers team section", () => { + const result = extractSnippet( + body, "performance", 500, + undefined, undefined, + "Looking for notes about building high-performing teams and culture" + ); + expect(result.snippet).toMatch(/team|culture|trust|feedback/i); + }); + + test("intent does not override strong query match", () => { + // Query "Core Web Vitals" is very specific — intent shouldn't pull away from it + const result = extractSnippet( + body, "Core Web Vitals", 500, + undefined, undefined, + "Looking for notes about health and fitness" + ); + expect(result.snippet).toContain("Core Web Vitals"); + }); + + test("absent intent produces same result as undefined", () => { + const withoutIntent = extractSnippet(body, "performance", 500); + const withUndefined = extractSnippet(body, "performance", 500, undefined, undefined, undefined); + expect(withoutIntent.line).toBe(withUndefined.line); + expect(withoutIntent.snippet).toBe(withUndefined.snippet); + }); + + test("intent with no matching terms falls back to query-only scoring", () => { + const result = extractSnippet( + body, "performance", 500, + undefined, undefined, + "quantum computing and entanglement" + ); + expect(result.snippet).toContain("Performance"); + expect(result.snippet.length).toBeGreaterThan(0); + }); + + test("intent works with chunk position", () => { + const webPerfStart = body.indexOf("## Web Performance"); + const result = extractSnippet( + body, "performance", 500, + webPerfStart, 200, + "web page load times" + ); + expect(result.snippet).toMatch(/Web Performance|Core Web Vitals|Page load/i); + }); +}); + +// ============================================================================= +// extractSnippet — intent weight verification +// ============================================================================= + +describe("extractSnippet intent weight behavior", () => { + // Document where query term appears on every line but intent terms differ + const body = [ + "performance metrics for team velocity", + "performance metrics for web latency", + "performance metrics for athletic endurance", + ].join("\n"); + + test("intent breaks tie when query matches all lines equally", () => { + const noIntent = extractSnippet(body, "performance metrics", 500); + // Without intent, first line wins (all equal score) + expect(noIntent.line).toBe(1); + + const withIntent = extractSnippet( + body, "performance metrics", 500, + undefined, undefined, + "web latency and page speed" + ); + // Intent terms "web", "latency" match line 2 + expect(withIntent.snippet).toContain("web latency"); + }); +}); + +// ============================================================================= +// Chunk selection scoring with intent +// ============================================================================= + +describe("intent keyword extraction logic", () => { + // Mirrors the chunk selection scoring in hybridQuery, using the shared + // extractIntentTerms helper and INTENT_WEIGHT_CHUNK constant. + function scoreChunk(text: string, query: string, intent?: string): number { + const queryTerms = query.toLowerCase().split(/\s+/).filter(t => t.length > 2); + const intentTerms = intent ? extractIntentTerms(intent) : []; + const lower = text.toLowerCase(); + const qScore = queryTerms.reduce((acc, term) => acc + (lower.includes(term) ? 1 : 0), 0); + const iScore = intentTerms.reduce((acc, term) => acc + (lower.includes(term) ? INTENT_WEIGHT_CHUNK : 0), 0); + return qScore + iScore; + } + + const chunks = [ + "Web performance: optimize page load times, reduce latency, improve rendering pipeline.", + "Team performance: build trust, give feedback, set clear expectations for the group.", + "Health performance: exercise regularly, sleep 8 hours, manage stress for endurance.", + ]; + + test("without intent, all chunks score equally on 'performance'", () => { + const scores = chunks.map(c => scoreChunk(c, "performance")); + // All contain "performance", so all score 1 + expect(scores[0]).toBe(scores[1]); + expect(scores[1]).toBe(scores[2]); + }); + + test("with web intent, web chunk scores highest", () => { + const intent = "looking for notes about page load times and latency optimization"; + const scores = chunks.map(c => scoreChunk(c, "performance", intent)); + expect(scores[0]).toBeGreaterThan(scores[1]!); + expect(scores[0]).toBeGreaterThan(scores[2]!); + }); + + test("with health intent, health chunk scores highest", () => { + const intent = "looking for notes about exercise, sleep, and endurance"; + const scores = chunks.map(c => scoreChunk(c, "performance", intent)); + expect(scores[2]).toBeGreaterThan(scores[0]!); + expect(scores[2]).toBeGreaterThan(scores[1]!); + }); + + test("intent terms have lower weight than query terms (1.0)", () => { + const intent = "looking for latency"; + // Chunk 0 has "performance" (query: 1.0) + "latency" (intent: INTENT_WEIGHT_CHUNK) = 1.5 + const withBoth = scoreChunk(chunks[0]!, "performance", intent); + const queryOnly = scoreChunk(chunks[0]!, "performance"); + expect(withBoth).toBe(queryOnly + INTENT_WEIGHT_CHUNK); + }); + + test("stop words are filtered, short domain terms survive", () => { + const intent = "the art of web performance"; + // "the" (stop word), "art" (survives), "of" (stop word), + // "web" (survives), "performance" (survives) + // intent terms after filtering: ["art", "web", "performance"] + // Chunk 0 has "web" + "performance" → 2 intent hits (no "art") + // Chunks 1,2 have "performance" only → 1 intent hit + const scores = chunks.map(c => scoreChunk(c, "test", intent)); + expect(scores[0]).toBe(INTENT_WEIGHT_CHUNK * 2); // "web" + "performance" + expect(scores[1]).toBe(INTENT_WEIGHT_CHUNK); // "performance" only + expect(scores[2]).toBe(INTENT_WEIGHT_CHUNK); // "performance" only + }); +}); + +// ============================================================================= +// Strong-signal bypass with intent +// ============================================================================= + +describe("strong-signal bypass logic", () => { + // Mirrors the logic in hybridQuery: + // const hasStrongSignal = !intent && topScore >= STRONG_SIGNAL_MIN_SCORE && gap >= STRONG_SIGNAL_MIN_GAP + function hasStrongSignal(topScore: number, secondScore: number, intent?: string): boolean { + return !intent + && topScore >= 0.85 + && (topScore - secondScore) >= 0.15; + } + + test("strong signal detected without intent", () => { + expect(hasStrongSignal(0.90, 0.70)).toBe(true); + }); + + test("strong signal bypassed when intent provided", () => { + expect(hasStrongSignal(0.90, 0.70, "looking for health performance")).toBe(false); + }); + + test("weak signal not affected by intent", () => { + expect(hasStrongSignal(0.50, 0.45)).toBe(false); + expect(hasStrongSignal(0.50, 0.45, "some intent")).toBe(false); + }); + + test("close scores not strong even without intent", () => { + expect(hasStrongSignal(0.90, 0.80)).toBe(false); // gap < 0.15 + }); +}); + +// ============================================================================= +// parseStructuredQuery with intent +// ============================================================================= + +describe("parseStructuredQuery with intent", () => { + test("parses intent + lex query", () => { + const result = parseStructuredQuery("intent: web performance\nlex: performance"); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web performance"); + expect(result!.searches).toHaveLength(1); + expect(result!.searches[0]!.type).toBe("lex"); + expect(result!.searches[0]!.query).toBe("performance"); + }); + + test("parses intent + multiple typed lines", () => { + const result = parseStructuredQuery( + "intent: web page load times\nlex: performance\nvec: how to improve performance" + ); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web page load times"); + expect(result!.searches).toHaveLength(2); + expect(result!.searches[0]!.type).toBe("lex"); + expect(result!.searches[1]!.type).toBe("vec"); + }); + + test("intent can appear after typed lines", () => { + const result = parseStructuredQuery( + "lex: performance\nintent: web page load times\nvec: latency" + ); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web page load times"); + expect(result!.searches).toHaveLength(2); + }); + + test("intent is case-insensitive prefix", () => { + const result = parseStructuredQuery("Intent: web perf\nlex: performance"); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web perf"); + }); + + test("no intent returns undefined", () => { + const result = parseStructuredQuery("lex: performance\nvec: speed"); + expect(result).not.toBeNull(); + expect(result!.intent).toBeUndefined(); + }); + + test("intent alone throws error", () => { + expect(() => parseStructuredQuery("intent: web performance")).toThrow( + /intent: cannot appear alone/ + ); + }); + + test("multiple intent lines throw error", () => { + expect(() => + parseStructuredQuery("intent: web perf\nintent: team health\nlex: performance") + ).toThrow(/only one intent: line is allowed/); + }); + + test("empty intent text throws error", () => { + expect(() => + parseStructuredQuery("intent:\nlex: performance") + ).toThrow(/intent: must include text/); + }); + + test("intent with whitespace-only text throws error", () => { + expect(() => + parseStructuredQuery("intent: \nlex: performance") + ).toThrow(/intent: must include text/); + }); + + test("single plain line still returns null (expand mode)", () => { + const result = parseStructuredQuery("how does auth work"); + expect(result).toBeNull(); + }); + + test("expand: line still returns null", () => { + const result = parseStructuredQuery("expand: auth stuff"); + expect(result).toBeNull(); + }); + + test("intent with expand throws error (expand can't mix)", () => { + expect(() => + parseStructuredQuery("intent: web\nexpand: performance") + ).toThrow(/cannot mix expand/); + }); + + test("empty query returns null", () => { + expect(parseStructuredQuery("")).toBeNull(); + expect(parseStructuredQuery(" \n \n ")).toBeNull(); + }); + + test("intent with blank lines is fine", () => { + const result = parseStructuredQuery( + "intent: web perf\n\nlex: performance\n\nvec: speed" + ); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web perf"); + expect(result!.searches).toHaveLength(2); + }); + + test("intent preserves full text including colons", () => { + const result = parseStructuredQuery( + "intent: web performance: LCP, FID, CLS\nlex: performance" + ); + expect(result).not.toBeNull(); + expect(result!.intent).toBe("web performance: LCP, FID, CLS"); + }); +}); + +// ============================================================================= +// Constants exported +// ============================================================================= + +describe("intent constants", () => { + test("INTENT_WEIGHT_SNIPPET is 0.3", () => { + expect(INTENT_WEIGHT_SNIPPET).toBe(0.3); + }); + + test("INTENT_WEIGHT_CHUNK is 0.5", () => { + expect(INTENT_WEIGHT_CHUNK).toBe(0.5); + }); +}); diff --git a/src/llm.test.ts b/test/llm.test.ts similarity index 72% rename from src/llm.test.ts rename to test/llm.test.ts index 68ce859a..a1d0681b 100644 --- a/src/llm.test.ts +++ b/test/llm.test.ts @@ -7,7 +7,7 @@ * rerank functions first to trigger model downloads. */ -import { describe, test, expect, beforeAll, afterAll } from "bun:test"; +import { describe, test, expect, beforeAll, afterAll, vi } from "vitest"; import { LlamaCpp, getDefaultLlamaCpp, @@ -17,7 +17,7 @@ import { SessionReleasedError, type RerankDocument, type ILLMSession, -} from "./llm.js"; +} from "../src/llm.js"; // ============================================================================= // Singleton Tests (no model loading required) @@ -55,11 +55,104 @@ describe("LlamaCpp.modelExists", () => { }); }); +describe("LlamaCpp expand context size config", () => { + const defaultExpandContextSize = 2048; + + test("uses default expand context size when no config or env is set", () => { + const prev = process.env.QMD_EXPAND_CONTEXT_SIZE; + delete process.env.QMD_EXPAND_CONTEXT_SIZE; + try { + const llm = new LlamaCpp({}) as any; + expect(llm.expandContextSize).toBe(defaultExpandContextSize); + } finally { + if (prev === undefined) delete process.env.QMD_EXPAND_CONTEXT_SIZE; + else process.env.QMD_EXPAND_CONTEXT_SIZE = prev; + } + }); + + test("uses QMD_EXPAND_CONTEXT_SIZE when set to a positive integer", () => { + const prev = process.env.QMD_EXPAND_CONTEXT_SIZE; + process.env.QMD_EXPAND_CONTEXT_SIZE = "3072"; + try { + const llm = new LlamaCpp({}) as any; + expect(llm.expandContextSize).toBe(3072); + } finally { + if (prev === undefined) delete process.env.QMD_EXPAND_CONTEXT_SIZE; + else process.env.QMD_EXPAND_CONTEXT_SIZE = prev; + } + }); + + test("config value overrides QMD_EXPAND_CONTEXT_SIZE", () => { + const prev = process.env.QMD_EXPAND_CONTEXT_SIZE; + process.env.QMD_EXPAND_CONTEXT_SIZE = "4096"; + try { + const llm = new LlamaCpp({ expandContextSize: 1536 }) as any; + expect(llm.expandContextSize).toBe(1536); + } finally { + if (prev === undefined) delete process.env.QMD_EXPAND_CONTEXT_SIZE; + else process.env.QMD_EXPAND_CONTEXT_SIZE = prev; + } + }); + + test("falls back to default and warns when QMD_EXPAND_CONTEXT_SIZE is invalid", () => { + const prev = process.env.QMD_EXPAND_CONTEXT_SIZE; + process.env.QMD_EXPAND_CONTEXT_SIZE = "bad"; + const stderrSpy = vi.spyOn(process.stderr, "write").mockReturnValue(true); + try { + const llm = new LlamaCpp({}) as any; + expect(llm.expandContextSize).toBe(defaultExpandContextSize); + expect(stderrSpy).toHaveBeenCalled(); + expect(String(stderrSpy.mock.calls[0]?.[0] || "")).toContain("QMD_EXPAND_CONTEXT_SIZE"); + } finally { + stderrSpy.mockRestore(); + if (prev === undefined) delete process.env.QMD_EXPAND_CONTEXT_SIZE; + else process.env.QMD_EXPAND_CONTEXT_SIZE = prev; + } + }); + + test("throws when config expandContextSize is invalid", () => { + expect(() => new LlamaCpp({ expandContextSize: 0 })).toThrow( + "Invalid expandContextSize: 0. Must be a positive integer." + ); + }); +}); + +describe("LlamaCpp rerank deduping", () => { + test("deduplicates identical document texts before scoring", async () => { + const llm = new LlamaCpp({}) as any; + const rankAll = vi.fn(async (_query: string, docs: string[]) => + docs.map((doc) => doc === "shared chunk" ? 0.9 : 0.2) + ); + + llm.touchActivity = vi.fn(); + llm.ensureRerankContexts = vi.fn().mockResolvedValue([{ rankAll }]); + llm.ensureRerankModel = vi.fn().mockResolvedValue({ + tokenize: (text: string) => Array.from(text), + detokenize: (tokens: string[]) => tokens.join(""), + }); + + const result = await llm.rerank("query", [ + { file: "a.md", text: "shared chunk" }, + { file: "b.md", text: "shared chunk" }, + { file: "c.md", text: "different chunk" }, + ]); + + expect(rankAll).toHaveBeenCalledTimes(1); + expect(rankAll).toHaveBeenCalledWith("query", ["shared chunk", "different chunk"]); + expect(result.results).toHaveLength(3); + + const scoreByFile = new Map(result.results.map((item) => [item.file, item.score])); + expect(scoreByFile.get("a.md")).toBe(0.9); + expect(scoreByFile.get("b.md")).toBe(0.9); + expect(scoreByFile.get("c.md")).toBe(0.2); + }); +}); + // ============================================================================= // Integration Tests (require actual models) // ============================================================================= -describe("LlamaCpp Integration", () => { +describe.skipIf(!!process.env.CI)("LlamaCpp Integration", () => { // Use the singleton to avoid multiple Metal contexts const llm = getDefaultLlamaCpp(); @@ -221,10 +314,15 @@ describe("LlamaCpp Integration", () => { const successCount = allResults.filter(r => r !== null).length; expect(successCount).toBe(10); - // THE KEY ASSERTION: Only 1 context should be created, not 5 - // Without the fix, contextCreateCount would be 5 (one per concurrent embedBatch call) - console.log(`Context creation count: ${contextCreateCount} (expected: 1)`); - expect(contextCreateCount).toBe(1); + // THE KEY ASSERTION: Contexts should be created once (by ensureEmbedContexts), + // not duplicated per concurrent embedBatch call. The exact count depends on + // available VRAM (computeParallelism), but should not be 5 (one per call). + // Without the fix, contextCreateCount would be 5× the intended count (one set per concurrent call). + // With the promise guard, contexts are created exactly once regardless of concurrent callers. + // The count depends on VRAM (computeParallelism), but should be ≤ 8 (the cap). + console.log(`Context creation count: ${contextCreateCount} (expected: ≤ 8, not 5× duplicated)`); + expect(contextCreateCount).toBeGreaterThanOrEqual(1); + expect(contextCreateCount).toBeLessThanOrEqual(8); await freshLlm.dispose(); }, 60000); @@ -360,6 +458,73 @@ describe("LlamaCpp Integration", () => { // Log timing for monitoring batch performance console.log(`Batch rerank of 10 docs took ${elapsed}ms`); }); + + test("uses fewer active rerank contexts for small batches", async () => { + const freshLlm = new LlamaCpp({}); + const calls: number[] = []; + const fakeModel = { + tokenize: (text: string) => Array.from(text), + detokenize: (tokens: string[]) => tokens.join(""), + }; + const fakeContexts = Array.from({ length: 4 }, (_, idx) => ({ + rankAll: async (_query: string, docs: string[]) => { + calls.push(idx); + return docs.map(() => 0.5); + }, + })); + + (freshLlm as any).ensureRerankModel = async () => fakeModel; + (freshLlm as any).ensureRerankContexts = async () => fakeContexts; + + const documents: RerankDocument[] = Array.from({ length: 20 }, (_, i) => ({ + file: `doc${i}.md`, + text: `Document number ${i}`, + })); + + const result = await freshLlm.rerank("topic 1", documents); + + expect(result.results).toHaveLength(20); + expect(calls).toEqual([0, 1]); + }); + + test("truncates and reranks document exceeding 2048 token context size", async () => { + // The reranker context is created with contextSize=2048. Documents that + // exceed the token budget (contextSize - template overhead - query tokens) + // should be silently truncated rather than crashing. + const paragraph = "The quick brown fox jumps over the lazy dog near the riverbank. " + + "Authentication tokens must be validated on every request to ensure security. " + + "Database queries should use prepared statements to prevent SQL injection attacks. " + + "The deployment pipeline includes linting, testing, building, and publishing stages. "; + // ~320 chars per paragraph, repeat 40 times = ~12800 chars ≈ 3200 tokens + const longText = paragraph.repeat(40); + + const query = "How do I configure authentication?"; + const documents: RerankDocument[] = [ + { file: "short-relevant.md", text: "Authentication can be configured by setting AUTH_SECRET." }, + { file: "long-doc.md", text: longText }, + { file: "short-irrelevant.md", text: "The weather is sunny today." }, + ]; + + console.log(`Long doc length: ${longText.length} chars (~${Math.round(longText.length / 4)} tokens)`); + + const result = await llm.rerank(query, documents); + + // Should return all 3 documents without crashing + expect(result.results).toHaveLength(3); + + // All scores should be valid numbers in [0, 1] + for (const doc of result.results) { + expect(doc.score).toBeGreaterThanOrEqual(0); + expect(doc.score).toBeLessThanOrEqual(1); + expect(Number.isNaN(doc.score)).toBe(false); + } + + // The short, directly relevant doc should still rank highest + console.log("Rerank results for long doc test:"); + for (const doc of result.results) { + console.log(` ${doc.file}: ${doc.score.toFixed(4)}`); + } + }); }); describe("expandQuery", () => { @@ -390,7 +555,7 @@ describe("LlamaCpp Integration", () => { // Session Management Tests // ============================================================================= -describe("LLM Session Management", () => { +describe.skipIf(!!process.env.CI)("LLM Session Management", () => { describe("withLLMSession", () => { test("session provides access to LLM operations", async () => { const result = await withLLMSession(async (session) => { @@ -556,4 +721,3 @@ describe("LLM Session Management", () => { }); }); }); - diff --git a/src/mcp.test.ts b/test/mcp.test.ts similarity index 76% rename from src/mcp.test.ts rename to test/mcp.test.ts index f15b8d48..67e6e1e2 100644 --- a/src/mcp.test.ts +++ b/test/mcp.test.ts @@ -5,17 +5,19 @@ * Uses mocked Ollama responses and a test database. */ -import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach } from "bun:test"; -import { Database } from "bun:sqlite"; -import * as sqliteVec from "sqlite-vec"; +import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach } from "vitest"; +import { openDatabase, loadSqliteVec } from "../src/db.js"; +import type { Database } from "../src/db.js"; import { McpServer, ResourceTemplate } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; -import { getDefaultLlamaCpp, disposeDefaultLlamaCpp } from "./llm"; +import { getDefaultLlamaCpp, disposeDefaultLlamaCpp } from "../src/llm"; +import { unlinkSync } from "node:fs"; import { mkdtemp, writeFile, readdir, unlink, rmdir } from "node:fs/promises"; import { join } from "node:path"; import { tmpdir } from "node:os"; import YAML from "yaml"; -import type { CollectionConfig } from "./collections"; +import type { CollectionConfig } from "../src/collections"; +import { setConfigIndexName } from "../src/collections"; // ============================================================================= // Test Database Setup @@ -31,7 +33,7 @@ afterAll(async () => { }); function initTestDatabase(db: Database): void { - sqliteVec.load(db); + loadSqliteVec(db); db.exec("PRAGMA journal_mode = WAL"); // Content-addressable storage - the source of truth for document content @@ -192,8 +194,8 @@ import { DEFAULT_RERANK_MODEL, DEFAULT_MULTI_GET_MAX_BYTES, createStore, -} from "./store"; -import type { RankedResult } from "./store"; +} from "../src/store"; +import type { RankedResult } from "../src/store"; // Note: searchResultsToMcpCsv no longer used in MCP - using structuredContent instead // ============================================================================= @@ -206,6 +208,9 @@ describe("MCP Server", () => { // Use shared singleton to avoid creating multiple instances with separate GPU resources getDefaultLlamaCpp(); + // Reset index name in case another test file mutated it (bun test shares process) + setConfigIndexName("index"); + // Set up test config directory const configPrefix = join(tmpdir(), `qmd-mcp-config-${Date.now()}-${Math.random().toString(36).slice(2)}`); testConfigDir = await mkdtemp(configPrefix); @@ -226,7 +231,7 @@ describe("MCP Server", () => { await writeFile(join(testConfigDir, "index.yml"), YAML.stringify(testConfig)); testDbPath = `/tmp/qmd-mcp-test-${Date.now()}.sqlite`; - testDb = new Database(testDbPath); + testDb = openDatabase(testDbPath); initTestDatabase(testDb); seedTestData(testDb); }); @@ -234,7 +239,7 @@ describe("MCP Server", () => { afterAll(async () => { testDb.close(); try { - require("fs").unlinkSync(testDbPath); + unlinkSync(testDbPath); } catch {} // Clean up test config directory @@ -253,7 +258,7 @@ describe("MCP Server", () => { // Tool: qmd_search (BM25) // =========================================================================== - describe("qmd_search tool", () => { + describe("searchFTS (BM25 keyword search)", () => { test("returns results for matching query", () => { const results = searchFTS(testDb, "readme", 10); expect(results.length).toBeGreaterThan(0); @@ -291,10 +296,10 @@ describe("MCP Server", () => { }); // =========================================================================== - // Tool: qmd_vsearch (Vector) + // searchVec (Vector similarity search) // =========================================================================== - describe("qmd_vsearch tool", () => { + describe.skipIf(!!process.env.CI)("searchVec (vector similarity)", () => { test("returns results for semantic query", async () => { const results = await searchVec(testDb, "project documentation", DEFAULT_EMBED_MODEL, 10); expect(results.length).toBeGreaterThan(0); @@ -306,7 +311,7 @@ describe("MCP Server", () => { }); test("returns empty when no vector table exists", async () => { - const emptyDb = new Database(":memory:"); + const emptyDb = openDatabase(":memory:"); initTestDatabase(emptyDb); emptyDb.exec("DROP TABLE IF EXISTS vectors_vec"); @@ -317,15 +322,18 @@ describe("MCP Server", () => { }); // =========================================================================== - // Tool: qmd_query (Hybrid) + // hybridQuery (query expansion + reranking) // =========================================================================== - describe("qmd_query tool", () => { - test("expands query with variations", async () => { - const queries = await expandQuery("api documentation", DEFAULT_QUERY_MODEL, testDb); - // Always returns at least the original query, may have more if generation succeeds - expect(queries.length).toBeGreaterThanOrEqual(1); - expect(queries[0]).toBe("api documentation"); + describe.skipIf(!!process.env.CI)("hybridQuery (expansion + reranking)", () => { + test("expands query with typed variations", async () => { + const expanded = await expandQuery("api documentation", DEFAULT_QUERY_MODEL, testDb); + // Returns ExpandedQuery[] — typed expansions, original excluded + expect(expanded.length).toBeGreaterThanOrEqual(1); + for (const q of expanded) { + expect(['lex', 'vec', 'hyde']).toContain(q.type); + expect(q.text.length).toBeGreaterThan(0); + } }, 30000); // 30s timeout for model loading test("performs RRF fusion on multiple result lists", () => { @@ -356,22 +364,33 @@ describe("MCP Server", () => { }); test("full hybrid search pipeline", async () => { - // Simulate full qmd_query flow + // Simulate full qmd_deep_search flow with type-routed queries const query = "meeting notes"; - const queries = await expandQuery(query, DEFAULT_QUERY_MODEL, testDb); + const expanded = await expandQuery(query, DEFAULT_QUERY_MODEL, testDb); const rankedLists: RankedResult[][] = []; - for (const q of queries) { - const ftsResults = searchFTS(testDb, q, 20); - if (ftsResults.length > 0) { - rankedLists.push(ftsResults.map(r => ({ - file: r.filepath, - displayPath: r.displayPath, - title: r.title, - body: r.body || "", - score: r.score, - }))); + + // Original query → FTS (probe) + const probeFts = searchFTS(testDb, query, 20); + if (probeFts.length > 0) { + rankedLists.push(probeFts.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + } + + // Expanded queries → route by type: lex→FTS, vec/hyde skipped (no vectors in test) + for (const q of expanded) { + if (q.type === 'lex') { + const ftsResults = searchFTS(testDb, q.text, 20); + if (ftsResults.length > 0) { + rankedLists.push(ftsResults.map(r => ({ + file: r.filepath, displayPath: r.displayPath, + title: r.title, body: r.body || "", score: r.score, + }))); + } } + // vec/hyde would go to searchVec — not available in this unit test } expect(rankedLists.length).toBeGreaterThan(0); @@ -635,7 +654,7 @@ describe("MCP Server", () => { WHERE d.path = ? AND d.active = 1 `).get(path) as { filepath: string; display_path: string; body: string } | null; - expect(doc).toBeNull(); + expect(doc == null).toBe(true); // bun:sqlite returns null, better-sqlite3 returns undefined }); test("includes context in document body", () => { @@ -720,47 +739,6 @@ describe("MCP Server", () => { }); }); - // =========================================================================== - // Prompt: query - // =========================================================================== - - describe("query prompt", () => { - test("returns usage guide", () => { - // The prompt content is static, just verify the structure - const promptContent = `# QMD - Quick Markdown Search - -QMD is your on-device search engine for markdown knowledge bases.`; - - expect(promptContent).toContain("QMD"); - expect(promptContent).toContain("search"); - }); - - test("describes all available tools", () => { - const toolNames = [ - "qmd_search", - "qmd_vsearch", - "qmd_query", - "qmd_get", - "qmd_multi_get", - "qmd_status", - ]; - - // Verify these are documented in the prompt - const promptGuide = ` -### 1. qmd_search (Fast keyword search) -### 2. qmd_vsearch (Semantic search) -### 3. qmd_query (Hybrid search - highest quality) -### 4. qmd_get (Retrieve document) -### 5. qmd_multi_get (Retrieve multiple documents) -### 6. qmd_status (Index info) - `; - - for (const tool of toolNames) { - expect(promptGuide).toContain(tool); - } - }); - }); - // =========================================================================== // Edge Cases // =========================================================================== @@ -887,3 +865,186 @@ QMD is your on-device search engine for markdown knowledge bases.`; }); }); }); + +// ============================================================================= +// HTTP Transport Tests +// ============================================================================= + +import { startMcpHttpServer, type HttpServerHandle } from "../src/mcp"; +import { enableProductionMode } from "../src/store"; + +describe("MCP HTTP Transport", () => { + let handle: HttpServerHandle; + let baseUrl: string; + let httpTestDbPath: string; + let httpTestConfigDir: string; + // Stash original env to restore after tests + const origIndexPath = process.env.INDEX_PATH; + const origConfigDir = process.env.QMD_CONFIG_DIR; + + beforeAll(async () => { + // Create isolated test database with seeded data + httpTestDbPath = `/tmp/qmd-mcp-http-test-${Date.now()}.sqlite`; + const db = openDatabase(httpTestDbPath); + initTestDatabase(db); + seedTestData(db); + db.close(); + + // Create isolated YAML config + const configPrefix = join(tmpdir(), `qmd-mcp-http-config-${Date.now()}-${Math.random().toString(36).slice(2)}`); + httpTestConfigDir = await mkdtemp(configPrefix); + const testConfig: CollectionConfig = { + collections: { + docs: { + path: "/test/docs", + pattern: "**/*.md", + } + } + }; + await writeFile(join(httpTestConfigDir, "index.yml"), YAML.stringify(testConfig)); + + // Point createStore() at our test DB + process.env.INDEX_PATH = httpTestDbPath; + process.env.QMD_CONFIG_DIR = httpTestConfigDir; + + handle = await startMcpHttpServer(0, { quiet: true }); // OS-assigned ephemeral port + baseUrl = `http://localhost:${handle.port}`; + }); + + afterAll(async () => { + await handle.stop(); + + // Restore env + if (origIndexPath !== undefined) process.env.INDEX_PATH = origIndexPath; + else delete process.env.INDEX_PATH; + if (origConfigDir !== undefined) process.env.QMD_CONFIG_DIR = origConfigDir; + else delete process.env.QMD_CONFIG_DIR; + + // Clean up test files + try { unlinkSync(httpTestDbPath); } catch {} + try { + const files = await readdir(httpTestConfigDir); + for (const f of files) await unlink(join(httpTestConfigDir, f)); + await rmdir(httpTestConfigDir); + } catch {} + }); + + // --------------------------------------------------------------------------- + // Health & routing + // --------------------------------------------------------------------------- + + test("GET /health returns 200 with status and uptime", async () => { + const res = await fetch(`${baseUrl}/health`); + expect(res.status).toBe(200); + expect(res.headers.get("content-type")).toContain("application/json"); + const body = await res.json(); + expect(body.status).toBe("ok"); + expect(typeof body.uptime).toBe("number"); + }); + + test("GET /other returns 404", async () => { + const res = await fetch(`${baseUrl}/other`); + expect(res.status).toBe(404); + }); + + // --------------------------------------------------------------------------- + // MCP protocol over HTTP + // --------------------------------------------------------------------------- + + /** Track session ID returned by initialize (MCP Streamable HTTP spec) */ + let sessionId: string | null = null; + + /** Send a JSON-RPC message to /mcp and return the parsed response. + * MCP Streamable HTTP requires Accept header with both JSON and SSE. */ + async function mcpRequest(body: object): Promise<{ status: number; json: any; contentType: string | null }> { + const headers: Record = { + "Content-Type": "application/json", + "Accept": "application/json, text/event-stream", + }; + if (sessionId) headers["mcp-session-id"] = sessionId; + + const res = await fetch(`${baseUrl}/mcp`, { + method: "POST", + headers, + body: JSON.stringify(body), + }); + + // Capture session ID from initialize responses + const sid = res.headers.get("mcp-session-id"); + if (sid) sessionId = sid; + + const json = await res.json(); + return { status: res.status, json, contentType: res.headers.get("content-type") }; + } + + test("POST /mcp initialize returns 200 JSON (not SSE)", async () => { + const { status, json, contentType } = await mcpRequest({ + jsonrpc: "2.0", + id: 1, + method: "initialize", + params: { + protocolVersion: "2025-03-26", + capabilities: {}, + clientInfo: { name: "test-client", version: "1.0.0" }, + }, + }); + expect(status).toBe(200); + expect(contentType).toContain("application/json"); + expect(json.jsonrpc).toBe("2.0"); + expect(json.id).toBe(1); + expect(json.result.serverInfo.name).toBe("qmd"); + }); + + test("POST /mcp tools/list returns registered tools", async () => { + // Initialize first (required by MCP protocol) + await mcpRequest({ + jsonrpc: "2.0", id: 1, method: "initialize", + params: { protocolVersion: "2025-03-26", capabilities: {}, clientInfo: { name: "test", version: "1.0" } }, + }); + + const { status, json, contentType } = await mcpRequest({ + jsonrpc: "2.0", id: 2, method: "tools/list", params: {}, + }); + expect(status).toBe(200); + expect(contentType).toContain("application/json"); + + const toolNames = json.result.tools.map((t: any) => t.name); + expect(toolNames).toContain("query"); + expect(toolNames).toContain("get"); + expect(toolNames).toContain("status"); + }); + + test("POST /mcp tools/call query returns results", async () => { + // Initialize + await mcpRequest({ + jsonrpc: "2.0", id: 1, method: "initialize", + params: { protocolVersion: "2025-03-26", capabilities: {}, clientInfo: { name: "test", version: "1.0" } }, + }); + + const { status, json } = await mcpRequest({ + jsonrpc: "2.0", id: 3, method: "tools/call", + params: { name: "query", arguments: { searches: [{ type: "lex", query: "readme" }] } }, + }); + expect(status).toBe(200); + expect(json.result).toBeDefined(); + // Should have content array with text results + expect(json.result.content.length).toBeGreaterThan(0); + expect(json.result.content[0].type).toBe("text"); + }); + + test("POST /mcp tools/call get returns document", async () => { + // Initialize + await mcpRequest({ + jsonrpc: "2.0", id: 1, method: "initialize", + params: { protocolVersion: "2025-03-26", capabilities: {}, clientInfo: { name: "test", version: "1.0" } }, + }); + + const { status, json } = await mcpRequest({ + jsonrpc: "2.0", id: 4, method: "tools/call", + params: { name: "get", arguments: { path: "readme.md" } }, + }); + expect(status).toBe(200); + expect(json.result).toBeDefined(); + expect(json.result.content.length).toBeGreaterThan(0); + }); +}); diff --git a/test/multi-collection-filter.test.ts b/test/multi-collection-filter.test.ts new file mode 100644 index 00000000..a71cbff8 --- /dev/null +++ b/test/multi-collection-filter.test.ts @@ -0,0 +1,143 @@ +/** + * Unit tests for multi-collection filter logic (PR #191). + * + * Tests the filterByCollections post-filter and the resolveCollectionFilter + * behavior for single-collection vs multi-collection search. + */ + +import { describe, test, expect } from "vitest"; +import { parseArgs } from "node:util"; + +// Reproduce the filterByCollections logic from qmd.ts for testing +// (the function is private in qmd.ts) +function filterByCollections( + results: T[], + collectionNames: string[], +): T[] { + if (collectionNames.length <= 1) return results; + const prefixes = collectionNames.map((n) => `qmd://${n}/`); + return results.filter((r) => { + const path = r.filepath || r.file || ""; + return prefixes.some((p) => path.startsWith(p)); + }); +} + +describe("filterByCollections", () => { + const results = [ + { filepath: "qmd://docs/readme.md", file: "qmd://docs/readme.md" }, + { filepath: "qmd://notes/todo.md", file: "qmd://notes/todo.md" }, + { filepath: "qmd://journals/2024/jan.md", file: "qmd://journals/2024/jan.md" }, + { filepath: "qmd://docs/api.md", file: "qmd://docs/api.md" }, + ]; + + test("returns all results when no collections specified", () => { + expect(filterByCollections(results, [])).toEqual(results); + }); + + test("returns all results for single collection (no-op, handled by SQL filter)", () => { + expect(filterByCollections(results, ["docs"])).toEqual(results); + }); + + test("filters to matching collections when multiple specified", () => { + const filtered = filterByCollections(results, ["docs", "journals"]); + expect(filtered).toHaveLength(3); + expect(filtered.map((r) => r.filepath)).toEqual([ + "qmd://docs/readme.md", + "qmd://journals/2024/jan.md", + "qmd://docs/api.md", + ]); + }); + + test("filters correctly with two collections", () => { + const filtered = filterByCollections(results, ["notes", "journals"]); + expect(filtered).toHaveLength(2); + expect(filtered.map((r) => r.filepath)).toEqual([ + "qmd://notes/todo.md", + "qmd://journals/2024/jan.md", + ]); + }); + + test("returns empty when no results match collections", () => { + const filtered = filterByCollections(results, ["archive", "trash"]); + expect(filtered).toHaveLength(0); + }); + + test("uses file field when filepath is missing", () => { + const fileOnlyResults = [ + { file: "qmd://docs/readme.md" }, + { file: "qmd://notes/todo.md" }, + ]; + const filtered = filterByCollections(fileOnlyResults, ["docs", "notes"]); + expect(filtered).toHaveLength(2); + }); + + test("uses filepath over file when both present", () => { + const mixedResults = [ + { filepath: "qmd://docs/readme.md", file: "qmd://notes/todo.md" }, + ]; + const filtered = filterByCollections(mixedResults, ["docs", "notes"]); + expect(filtered).toHaveLength(1); + // Should match via filepath (docs), not file (notes) + expect(filtered[0].filepath).toBe("qmd://docs/readme.md"); + }); +}); + +describe("resolveCollectionFilter input normalization", () => { + // Test the array normalization logic without the DB dependency + function normalizeCollectionInput(raw: string | string[] | undefined): string[] { + if (!raw) return []; + return Array.isArray(raw) ? raw : [raw]; + } + + test("undefined returns empty array", () => { + expect(normalizeCollectionInput(undefined)).toEqual([]); + }); + + test("single string returns single-element array", () => { + expect(normalizeCollectionInput("docs")).toEqual(["docs"]); + }); + + test("array passes through", () => { + expect(normalizeCollectionInput(["docs", "notes"])).toEqual(["docs", "notes"]); + }); + + test("empty string returns single-element array", () => { + expect(normalizeCollectionInput("")).toEqual([]); + }); +}); + +describe("collection option type from parseArgs", () => { + // Verify that parseArgs with `multiple: true` produces string[] + test("parseArgs multiple:true produces array for repeated flags", () => { + const { values } = parseArgs({ + args: ["-c", "docs", "-c", "notes"], + options: { + collection: { type: "string", short: "c", multiple: true }, + }, + strict: true, + }); + expect(values.collection).toEqual(["docs", "notes"]); + }); + + test("parseArgs multiple:true produces array for single flag", () => { + const { values } = parseArgs({ + args: ["-c", "docs"], + options: { + collection: { type: "string", short: "c", multiple: true }, + }, + strict: true, + }); + expect(values.collection).toEqual(["docs"]); + }); + + test("parseArgs multiple:true produces undefined when flag absent", () => { + const { values } = parseArgs({ + args: [], + options: { + collection: { type: "string", short: "c", multiple: true }, + }, + strict: true, + }); + expect(values.collection).toBeUndefined(); + }); +}); diff --git a/test/rrf-trace.test.ts b/test/rrf-trace.test.ts new file mode 100644 index 00000000..ad8b12c8 --- /dev/null +++ b/test/rrf-trace.test.ts @@ -0,0 +1,55 @@ +import { describe, expect, test } from "vitest"; +import { buildRrfTrace, reciprocalRankFusion, type RankedResult } from "../src/store"; + +describe("buildRrfTrace", () => { + test("matches reciprocalRankFusion totals and records per-list contributions", () => { + const list1: RankedResult[] = [ + { file: "qmd://docs/a.md", displayPath: "docs/a.md", title: "A", body: "", score: 0.92 }, + { file: "qmd://docs/b.md", displayPath: "docs/b.md", title: "B", body: "", score: 0.81 }, + ]; + const list2: RankedResult[] = [ + { file: "qmd://docs/b.md", displayPath: "docs/b.md", title: "B", body: "", score: 0.77 }, + { file: "qmd://docs/a.md", displayPath: "docs/a.md", title: "A", body: "", score: 0.65 }, + ]; + + const weights = [2.0, 1.0]; + const traces = buildRrfTrace( + [list1, list2], + weights, + [ + { source: "fts", queryType: "lex", query: "lex query" }, + { source: "vec", queryType: "vec", query: "vec query" }, + ] + ); + const fused = reciprocalRankFusion([list1, list2], weights); + + for (const result of fused) { + const trace = traces.get(result.file); + expect(trace).toBeDefined(); + expect(trace!.totalScore).toBeCloseTo(result.score, 10); + } + + const aTrace = traces.get("qmd://docs/a.md")!; + expect(aTrace.contributions).toHaveLength(2); + expect(aTrace.contributions[0]?.source).toBe("fts"); + expect(aTrace.contributions[1]?.source).toBe("vec"); + expect(aTrace.topRank).toBe(1); + expect(aTrace.topRankBonus).toBeCloseTo(0.05, 10); + }); + + test("applies top-rank bonus thresholds correctly", () => { + const list: RankedResult[] = [ + { file: "qmd://docs/r1.md", displayPath: "docs/r1.md", title: "R1", body: "", score: 0.9 }, + { file: "qmd://docs/r2.md", displayPath: "docs/r2.md", title: "R2", body: "", score: 0.8 }, + { file: "qmd://docs/r3.md", displayPath: "docs/r3.md", title: "R3", body: "", score: 0.7 }, + { file: "qmd://docs/r4.md", displayPath: "docs/r4.md", title: "R4", body: "", score: 0.6 }, + ]; + + const traces = buildRrfTrace([list], [1.0], [{ source: "fts", queryType: "lex", query: "rank" }]); + + expect(traces.get("qmd://docs/r1.md")?.topRankBonus).toBeCloseTo(0.05, 10); + expect(traces.get("qmd://docs/r2.md")?.topRankBonus).toBeCloseTo(0.02, 10); + expect(traces.get("qmd://docs/r3.md")?.topRankBonus).toBeCloseTo(0.02, 10); + expect(traces.get("qmd://docs/r4.md")?.topRankBonus).toBeCloseTo(0.0, 10); + }); +}); diff --git a/test/sdk.test.ts b/test/sdk.test.ts new file mode 100644 index 00000000..a943bbd5 --- /dev/null +++ b/test/sdk.test.ts @@ -0,0 +1,877 @@ +/** + * sdk.test.ts - Unit tests for the QMD SDK (library mode) + * + * Tests the public API exposed via `@tobilu/qmd` (src/index.ts). + * Uses inline config (no YAML files) to verify the SDK works self-contained. + */ + +import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach } from "vitest"; +import { mkdtemp, writeFile, mkdir, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { existsSync, writeFileSync, mkdirSync, readFileSync } from "node:fs"; +import YAML from "yaml"; +import { + createStore, + type QMDStore, + type CollectionConfig, + type StoreOptions, +} from "../src/index.js"; + +// ============================================================================= +// Test Helpers +// ============================================================================= + +let testDir: string; +let docsDir: string; +let notesDir: string; + +beforeAll(async () => { + testDir = await mkdtemp(join(tmpdir(), "qmd-sdk-test-")); + docsDir = join(testDir, "docs"); + notesDir = join(testDir, "notes"); + + // Create test directories with sample markdown files + await mkdir(docsDir, { recursive: true }); + await mkdir(notesDir, { recursive: true }); + + await writeFile(join(docsDir, "readme.md"), "# Getting Started\n\nThis is the getting started guide for the project.\n"); + await writeFile(join(docsDir, "auth.md"), "# Authentication\n\nAuthentication uses JWT tokens for session management.\nUsers log in with email and password.\n"); + await writeFile(join(docsDir, "api.md"), "# API Reference\n\n## Endpoints\n\n### POST /login\nAuthenticate a user.\n\n### GET /users\nList all users.\n"); + await writeFile(join(notesDir, "meeting-2025-01.md"), "# January Planning Meeting\n\nDiscussed Q1 roadmap and resource allocation.\n"); + await writeFile(join(notesDir, "meeting-2025-02.md"), "# February Standup\n\nReviewed sprint progress. Authentication feature is on track.\n"); + await writeFile(join(notesDir, "ideas.md"), "# Project Ideas\n\n- Build a search engine\n- Create a knowledge base\n- Implement vector search\n"); +}); + +afterAll(async () => { + try { + await rm(testDir, { recursive: true, force: true }); + } catch { + // Ignore cleanup errors + } +}); + +function freshDbPath(): string { + return join(testDir, `test-${Date.now()}-${Math.random().toString(36).slice(2)}.sqlite`); +} + +// ============================================================================= +// Constructor Tests +// ============================================================================= + +describe("createStore", () => { + test("creates store with inline config", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + expect(store).toBeDefined(); + expect(store.dbPath).toBeTruthy(); + expect(store.internal).toBeDefined(); + store.close(); + }); + + test("creates store with YAML config file", () => { + const configPath = join(testDir, "test-config.yml"); + const config: CollectionConfig = { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }; + writeFileSync(configPath, YAML.stringify(config)); + + const store = createStore({ + dbPath: freshDbPath(), + configPath, + }); + + expect(store).toBeDefined(); + store.close(); + }); + + test("throws if dbPath is missing", () => { + expect(() => + createStore({ dbPath: "", config: { collections: {} } }) + ).toThrow("dbPath is required"); + }); + + test("throws if neither configPath nor config is provided", () => { + expect(() => + createStore({ dbPath: freshDbPath() } as StoreOptions) + ).toThrow("Either configPath or config is required"); + }); + + test("throws if both configPath and config are provided", () => { + expect(() => + createStore({ + dbPath: freshDbPath(), + configPath: "/some/path.yml", + config: { collections: {} }, + }) + ).toThrow("Provide either configPath or config, not both"); + }); + + test("creates database file on disk", () => { + const dbPath = freshDbPath(); + const store = createStore({ + dbPath, + config: { collections: {} }, + }); + + expect(existsSync(dbPath)).toBe(true); + store.close(); + }); + + test("store.dbPath matches the provided path", () => { + const dbPath = freshDbPath(); + const store = createStore({ + dbPath, + config: { collections: {} }, + }); + + expect(store.dbPath).toBe(dbPath); + store.close(); + }); +}); + +// ============================================================================= +// Collection Management Tests +// ============================================================================= + +describe("collection management", () => { + let store: QMDStore; + + beforeEach(() => { + store = createStore({ + dbPath: freshDbPath(), + config: { collections: {} }, + }); + }); + + afterEach(() => { + store.close(); + }); + + test("addCollection adds a collection to inline config", () => { + store.addCollection("docs", { path: docsDir, pattern: "**/*.md" }); + + const collections = store.listCollections(); + const names = collections.map(c => c.name); + expect(names).toContain("docs"); + }); + + test("addCollection with default pattern", () => { + store.addCollection("notes", { path: notesDir }); + + const collections = store.listCollections(); + expect(collections.find(c => c.name === "notes")).toBeDefined(); + }); + + test("removeCollection removes existing collection", () => { + store.addCollection("docs", { path: docsDir, pattern: "**/*.md" }); + const removed = store.removeCollection("docs"); + + expect(removed).toBe(true); + const collections = store.listCollections(); + expect(collections.map(c => c.name)).not.toContain("docs"); + }); + + test("removeCollection returns false for non-existent collection", () => { + const removed = store.removeCollection("nonexistent"); + expect(removed).toBe(false); + }); + + test("renameCollection renames a collection", () => { + store.addCollection("old-name", { path: docsDir, pattern: "**/*.md" }); + const renamed = store.renameCollection("old-name", "new-name"); + + expect(renamed).toBe(true); + const names = store.listCollections().map(c => c.name); + expect(names).toContain("new-name"); + expect(names).not.toContain("old-name"); + }); + + test("renameCollection returns false for non-existent source", () => { + const renamed = store.renameCollection("nonexistent", "new-name"); + expect(renamed).toBe(false); + }); + + test("renameCollection throws if target exists", () => { + store.addCollection("a", { path: docsDir, pattern: "**/*.md" }); + store.addCollection("b", { path: notesDir, pattern: "**/*.md" }); + + expect(() => store.renameCollection("a", "b")).toThrow("already exists"); + }); + + test("listCollections returns empty array for empty config", () => { + const collections = store.listCollections(); + expect(collections).toEqual([]); + }); + + test("multiple collections can be added", () => { + store.addCollection("docs", { path: docsDir, pattern: "**/*.md" }); + store.addCollection("notes", { path: notesDir, pattern: "**/*.md" }); + + const names = store.listCollections().map(c => c.name); + expect(names).toContain("docs"); + expect(names).toContain("notes"); + expect(names).toHaveLength(2); + }); +}); + +// ============================================================================= +// Context Management Tests +// ============================================================================= + +describe("context management", () => { + let store: QMDStore; + + beforeEach(() => { + store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + notes: { path: notesDir, pattern: "**/*.md" }, + }, + }, + }); + }); + + afterEach(() => { + store.close(); + }); + + test("addContext adds context to a collection path", () => { + const added = store.addContext("docs", "/auth", "Authentication docs"); + expect(added).toBe(true); + + const contexts = store.listContexts(); + expect(contexts).toContainEqual({ + collection: "docs", + path: "/auth", + context: "Authentication docs", + }); + }); + + test("addContext returns false for non-existent collection", () => { + const added = store.addContext("nonexistent", "/path", "Some context"); + expect(added).toBe(false); + }); + + test("removeContext removes existing context", () => { + store.addContext("docs", "/auth", "Authentication docs"); + const removed = store.removeContext("docs", "/auth"); + + expect(removed).toBe(true); + const contexts = store.listContexts(); + expect(contexts.find(c => c.path === "/auth")).toBeUndefined(); + }); + + test("removeContext returns false for non-existent context", () => { + const removed = store.removeContext("docs", "/nonexistent"); + expect(removed).toBe(false); + }); + + test("setGlobalContext sets and retrieves global context", () => { + store.setGlobalContext("Global knowledge base"); + const global = store.getGlobalContext(); + + expect(global).toBe("Global knowledge base"); + }); + + test("setGlobalContext with undefined clears it", () => { + store.setGlobalContext("Some context"); + store.setGlobalContext(undefined); + const global = store.getGlobalContext(); + + expect(global).toBeUndefined(); + }); + + test("listContexts includes global context", () => { + store.setGlobalContext("Global context"); + const contexts = store.listContexts(); + + expect(contexts).toContainEqual({ + collection: "*", + path: "/", + context: "Global context", + }); + }); + + test("listContexts returns contexts across multiple collections", () => { + store.addContext("docs", "/", "Documentation"); + store.addContext("notes", "/", "Personal notes"); + + const contexts = store.listContexts(); + expect(contexts.filter(c => c.path === "/")).toHaveLength(2); + }); + + test("multiple contexts on same collection", () => { + store.addContext("docs", "/auth", "Auth docs"); + store.addContext("docs", "/api", "API docs"); + + const contexts = store.listContexts().filter(c => c.collection === "docs"); + expect(contexts).toHaveLength(2); + expect(contexts.map(c => c.path).sort()).toEqual(["/api", "/auth"]); + }); + + test("addContext overwrites existing context for same path", () => { + store.addContext("docs", "/auth", "Old context"); + store.addContext("docs", "/auth", "New context"); + + const contexts = store.listContexts().filter(c => c.path === "/auth"); + expect(contexts).toHaveLength(1); + expect(contexts[0]!.context).toBe("New context"); + }); +}); + +// ============================================================================= +// Inline Config Isolation Tests +// ============================================================================= + +describe("inline config isolation", () => { + test("inline config does not write any files to disk", () => { + const configDir = join(testDir, "should-not-exist"); + const store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + store.addCollection("notes", { path: notesDir, pattern: "**/*.md" }); + store.addContext("docs", "/", "Documentation"); + + expect(existsSync(configDir)).toBe(false); + store.close(); + }); + + test("inline config mutations persist within session", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { collections: {} }, + }); + + store.addCollection("docs", { path: docsDir, pattern: "**/*.md" }); + store.addContext("docs", "/", "My docs"); + + // Verify the mutations are visible + const collections = store.listCollections(); + expect(collections.map(c => c.name)).toContain("docs"); + + const contexts = store.listContexts(); + expect(contexts).toContainEqual({ + collection: "docs", + path: "/", + context: "My docs", + }); + + store.close(); + }); + + test("two stores with different inline configs are independent", () => { + const store1 = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + // Close first store (resets config source) + store1.close(); + + const store2 = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + notes: { path: notesDir, pattern: "**/*.md" }, + }, + }, + }); + + const names = store2.listCollections().map(c => c.name); + expect(names).toContain("notes"); + expect(names).not.toContain("docs"); + + store2.close(); + }); +}); + +// ============================================================================= +// YAML Config File Tests +// ============================================================================= + +describe("YAML config file mode", () => { + test("loads collections from YAML file", () => { + const configPath = join(testDir, `config-${Date.now()}.yml`); + const config: CollectionConfig = { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + notes: { path: notesDir, pattern: "**/*.md" }, + }, + }; + writeFileSync(configPath, YAML.stringify(config)); + + const store = createStore({ dbPath: freshDbPath(), configPath }); + const names = store.listCollections().map(c => c.name); + + expect(names).toContain("docs"); + expect(names).toContain("notes"); + store.close(); + }); + + test("addCollection persists to YAML file", () => { + const configPath = join(testDir, `config-persist-${Date.now()}.yml`); + writeFileSync(configPath, YAML.stringify({ collections: {} })); + + const store = createStore({ dbPath: freshDbPath(), configPath }); + store.addCollection("newcol", { path: docsDir, pattern: "**/*.md" }); + store.close(); + + // Read the YAML file directly and verify + const raw = readFileSync(configPath, "utf-8"); + const parsed = YAML.parse(raw) as CollectionConfig; + expect(parsed.collections).toHaveProperty("newcol"); + expect(parsed.collections.newcol!.path).toBe(docsDir); + }); + + test("context persists to YAML file", () => { + const configPath = join(testDir, `config-ctx-${Date.now()}.yml`); + writeFileSync(configPath, YAML.stringify({ + collections: { docs: { path: docsDir, pattern: "**/*.md" } }, + })); + + const store = createStore({ dbPath: freshDbPath(), configPath }); + store.addContext("docs", "/api", "API documentation"); + store.close(); + + const raw = readFileSync(configPath, "utf-8"); + const parsed = YAML.parse(raw) as CollectionConfig; + expect(parsed.collections.docs!.context).toEqual({ "/api": "API documentation" }); + }); + + test("non-existent config file returns empty collections", () => { + const configPath = join(testDir, "nonexistent-config.yml"); + const store = createStore({ dbPath: freshDbPath(), configPath }); + const collections = store.listCollections(); + + expect(collections).toEqual([]); + store.close(); + }); +}); + +// ============================================================================= +// Search Tests (BM25 - no LLM needed) +// ============================================================================= + +describe("search (BM25)", () => { + let store: QMDStore; + let dbPath: string; + + beforeAll(() => { + dbPath = join(testDir, "search-test.sqlite"); + store = createStore({ + dbPath, + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + notes: { path: notesDir, pattern: "**/*.md" }, + }, + }, + }); + + // Index documents manually using internal store + const now = new Date().toISOString(); + const { internal } = store; + const fs = require("fs"); + + // Index docs collection + for (const file of ["readme.md", "auth.md", "api.md"]) { + const fullPath = join(docsDir, file); + const content = fs.readFileSync(fullPath, "utf-8"); + const hash = require("crypto").createHash("sha256").update(content).digest("hex"); + const title = content.match(/^#\s+(.+)/m)?.[1] || file; + + internal.insertContent(hash, content, now); + internal.insertDocument("docs", `qmd://docs/${file}`, title, hash, now, now); + } + + // Index notes collection + for (const file of ["meeting-2025-01.md", "meeting-2025-02.md", "ideas.md"]) { + const fullPath = join(notesDir, file); + const content = fs.readFileSync(fullPath, "utf-8"); + const hash = require("crypto").createHash("sha256").update(content).digest("hex"); + const title = content.match(/^#\s+(.+)/m)?.[1] || file; + + internal.insertContent(hash, content, now); + internal.insertDocument("notes", `qmd://notes/${file}`, title, hash, now, now); + } + }); + + afterAll(() => { + store.close(); + }); + + test("search returns results for matching query", () => { + const results = store.search("authentication"); + expect(results.length).toBeGreaterThan(0); + }); + + test("search results have expected shape", () => { + const results = store.search("authentication"); + expect(results.length).toBeGreaterThan(0); + + const result = results[0]!; + expect(result).toHaveProperty("filepath"); + expect(result).toHaveProperty("score"); + expect(result).toHaveProperty("title"); + expect(result).toHaveProperty("docid"); + expect(result).toHaveProperty("collectionName"); + expect(typeof result.score).toBe("number"); + expect(result.score).toBeGreaterThan(0); + }); + + test("search respects limit option", () => { + const results = store.search("meeting", { limit: 1 }); + expect(results.length).toBeLessThanOrEqual(1); + }); + + test("search with collection filter", () => { + const results = store.search("authentication", { collection: "notes" }); + for (const r of results) { + expect(r.collectionName).toBe("notes"); + } + }); + + test("search returns empty for non-matching query", () => { + const results = store.search("xyznonexistentterm123"); + expect(results).toHaveLength(0); + }); + + test("search finds documents across collections", () => { + const results = store.search("authentication", { limit: 10 }); + const collections = new Set(results.map(r => r.collectionName)); + // Auth appears in both docs/auth.md and notes/meeting-2025-02.md + expect(collections.size).toBeGreaterThanOrEqual(1); + }); +}); + +// ============================================================================= +// Document Retrieval Tests +// ============================================================================= + +describe("get and multiGet", () => { + let store: QMDStore; + + beforeAll(() => { + store = createStore({ + dbPath: join(testDir, "get-test.sqlite"), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + // Index documents + const now = new Date().toISOString(); + const { internal } = store; + const fs = require("fs"); + + for (const file of ["readme.md", "auth.md", "api.md"]) { + const fullPath = join(docsDir, file); + const content = fs.readFileSync(fullPath, "utf-8"); + const hash = require("crypto").createHash("sha256").update(content).digest("hex"); + const title = content.match(/^#\s+(.+)/m)?.[1] || file; + + internal.insertContent(hash, content, now); + internal.insertDocument("docs", `qmd://docs/${file}`, title, hash, now, now); + } + }); + + afterAll(() => { + store.close(); + }); + + test("get retrieves a document by path", () => { + const result = store.get("qmd://docs/auth.md"); + + expect("error" in result).toBe(false); + if (!("error" in result)) { + expect(result.title).toBe("Authentication"); + expect(result.collectionName).toBe("docs"); + } + }); + + test("get with includeBody returns body content", () => { + const result = store.get("qmd://docs/auth.md", { includeBody: true }); + + if (!("error" in result)) { + expect(result.body).toBeDefined(); + expect(result.body).toContain("JWT tokens"); + } + }); + + test("get returns not_found for missing document", () => { + const result = store.get("qmd://docs/nonexistent.md"); + + expect("error" in result).toBe(true); + if ("error" in result) { + expect(result.error).toBe("not_found"); + } + }); + + test("get by docid", () => { + // First get a document to find its docid + const doc = store.get("qmd://docs/readme.md"); + if (!("error" in doc)) { + const byDocid = store.get(`#${doc.docid}`); + expect("error" in byDocid).toBe(false); + if (!("error" in byDocid)) { + expect(byDocid.docid).toBe(doc.docid); + } + } + }); + + test("multiGet retrieves multiple documents", () => { + const { docs, errors } = store.multiGet("qmd://docs/*.md"); + expect(docs.length).toBeGreaterThan(0); + }); +}); + +// ============================================================================= +// Index Health Tests +// ============================================================================= + +describe("index health", () => { + let store: QMDStore; + + beforeEach(() => { + store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + }); + + afterEach(() => { + store.close(); + }); + + test("getStatus returns valid structure", () => { + const status = store.getStatus(); + + expect(status).toHaveProperty("totalDocuments"); + expect(status).toHaveProperty("needsEmbedding"); + expect(status).toHaveProperty("hasVectorIndex"); + expect(status).toHaveProperty("collections"); + expect(typeof status.totalDocuments).toBe("number"); + }); + + test("getIndexHealth returns valid structure", () => { + const health = store.getIndexHealth(); + + expect(health).toHaveProperty("needsEmbedding"); + expect(health).toHaveProperty("totalDocs"); + expect(typeof health.needsEmbedding).toBe("number"); + expect(typeof health.totalDocs).toBe("number"); + }); + + test("fresh store has zero documents", () => { + const status = store.getStatus(); + expect(status.totalDocuments).toBe(0); + }); +}); + +// ============================================================================= +// Lifecycle Tests +// ============================================================================= + +describe("lifecycle", () => { + test("close() makes subsequent operations throw", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { collections: {} }, + }); + + store.close(); + + // Database operations should fail after close + expect(() => store.getStatus()).toThrow(); + }); + + test("multiple stores can coexist with different databases", () => { + const store1 = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + // Note: since config source is module-level, we close store1 first + store1.close(); + + const store2 = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + notes: { path: notesDir, pattern: "**/*.md" }, + }, + }, + }); + + const names = store2.listCollections().map(c => c.name); + expect(names).toContain("notes"); + expect(names).not.toContain("docs"); + + store2.close(); + }); +}); + +// ============================================================================= +// Config Initialization Tests +// ============================================================================= + +describe("config initialization", () => { + test("inline config with global_context is preserved", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { + global_context: "System knowledge base", + collections: { + docs: { path: docsDir, pattern: "**/*.md" }, + }, + }, + }); + + const global = store.getGlobalContext(); + expect(global).toBe("System knowledge base"); + store.close(); + }); + + test("inline config with pre-existing contexts is preserved", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { + path: docsDir, + pattern: "**/*.md", + context: { "/auth": "Authentication docs" }, + }, + }, + }, + }); + + const contexts = store.listContexts(); + expect(contexts).toContainEqual({ + collection: "docs", + path: "/auth", + context: "Authentication docs", + }); + store.close(); + }); + + test("inline config with empty collections object works", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { collections: {} }, + }); + + expect(store.listCollections()).toEqual([]); + expect(store.listContexts()).toEqual([]); + store.close(); + }); + + test("inline config with multiple collection options", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { + collections: { + docs: { + path: docsDir, + pattern: "**/*.md", + ignore: ["drafts/**"], + includeByDefault: true, + }, + notes: { + path: notesDir, + pattern: "**/*.md", + includeByDefault: false, + }, + }, + }, + }); + + const collections = store.listCollections(); + expect(collections).toHaveLength(2); + store.close(); + }); +}); + +// ============================================================================= +// Type Export Tests (compile-time checks, runtime verification) +// ============================================================================= + +describe("type exports", () => { + test("StoreOptions type is usable", () => { + const opts: StoreOptions = { + dbPath: "/tmp/test.sqlite", + config: { collections: {} }, + }; + expect(opts.dbPath).toBe("/tmp/test.sqlite"); + }); + + test("CollectionConfig type is usable", () => { + const config: CollectionConfig = { + global_context: "test", + collections: { + test: { path: "/tmp", pattern: "**/*.md" }, + }, + }; + expect(config.collections).toHaveProperty("test"); + }); + + test("QMDStore type exposes expected methods", () => { + const store = createStore({ + dbPath: freshDbPath(), + config: { collections: {} }, + }); + + // Verify all methods exist + expect(typeof store.query).toBe("function"); + expect(typeof store.search).toBe("function"); + expect(typeof store.structuredSearch).toBe("function"); + expect(typeof store.get).toBe("function"); + expect(typeof store.multiGet).toBe("function"); + expect(typeof store.addCollection).toBe("function"); + expect(typeof store.removeCollection).toBe("function"); + expect(typeof store.renameCollection).toBe("function"); + expect(typeof store.listCollections).toBe("function"); + expect(typeof store.addContext).toBe("function"); + expect(typeof store.removeContext).toBe("function"); + expect(typeof store.setGlobalContext).toBe("function"); + expect(typeof store.getGlobalContext).toBe("function"); + expect(typeof store.listContexts).toBe("function"); + expect(typeof store.getStatus).toBe("function"); + expect(typeof store.getIndexHealth).toBe("function"); + expect(typeof store.close).toBe("function"); + + store.close(); + }); +}); diff --git a/test/smoke-install.sh b/test/smoke-install.sh new file mode 100755 index 00000000..9acf2b7f --- /dev/null +++ b/test/smoke-install.sh @@ -0,0 +1,169 @@ +#!/usr/bin/env bash +# Build a container image with qmd installed via npm and bun, then run smoke tests. +# Works with docker or podman (whichever is available). +# +# Usage: +# test/smoke-install.sh # build + run all smoke tests +# test/smoke-install.sh --build # build image only +# test/smoke-install.sh --shell # drop into container shell +# test/smoke-install.sh -- CMD... # run arbitrary command in container +set -euo pipefail + +cd "$(dirname "$0")/.." + +# Pick container runtime +if command -v podman &>/dev/null; then + CTR=podman +elif command -v docker &>/dev/null; then + CTR=docker +else + echo "Error: neither podman nor docker found" >&2 + exit 1 +fi + +IMAGE=qmd-smoke + +build_image() { + echo "==> Building TypeScript..." + npm run build --silent + + echo "==> Packing tarball..." + rm -f test/tobilu-qmd-*.tgz + TARBALL=$(npm pack --pack-destination test/ 2>/dev/null | tail -1) + echo " $TARBALL" + + # Copy project files into build context so vitest/bun tests can run inside + rm -rf test/test-src + mkdir -p test/test-src/src test/test-src/test + cp src/*.ts test/test-src/src/ + cp -r dist test/test-src/ + cp test/*.test.ts test/test-src/test/ + cp package.json tsconfig.json tsconfig.build.json test/test-src/ + + echo "==> Building container image ($CTR)..." + $CTR build -f test/Containerfile -t "$IMAGE" test/ + + # Clean up + rm -f test/tobilu-qmd-*.tgz + rm -rf test/test-src + echo "==> Image ready: $IMAGE" +} + +run() { + $CTR run --rm "$IMAGE" bash -c "$*" +} + +PASS=0 +FAIL=0 + +ok() { printf " %-50s OK\n" "$1"; PASS=$((PASS + 1)); } +fail() { printf " %-50s FAIL\n" "$1"; FAIL=$((FAIL + 1)); echo "$2" | sed 's/^/ /'; } + +smoke_test() { + local label="$1"; shift + local out + if out=$(run "$@" 2>&1); then + ok "$label" + else + fail "$label" "$out" + fi +} + +smoke_test_output() { + local label="$1"; local expect="$2"; shift 2 + local out + out=$(run "$@" 2>&1) || true + if echo "$out" | grep -q "$expect"; then + ok "$label" + else + fail "$label" "$out" + fi +} + +run_smoke_tests() { + # ------------------------------------------------------------------ + # Node (npm-installed qmd) + # ------------------------------------------------------------------ + local NODE_BIN='$(mise where node@latest)/bin' + echo "=== Node (npm install) ===" + + smoke_test_output "qmd shows help" "Usage:" \ + "export PATH=$NODE_BIN:\$PATH; qmd" + + smoke_test "qmd collection list" \ + "export PATH=$NODE_BIN:\$PATH; qmd collection list" + + smoke_test "qmd status" \ + "export PATH=$NODE_BIN:\$PATH; qmd status" + + smoke_test "sqlite-vec loads" \ + "export PATH=$NODE_BIN:\$PATH; + NPM_GLOBAL=\$(npm root -g); + node -e \" + const {openDatabase, loadSqliteVec} = await import('\$NPM_GLOBAL/@tobilu/qmd/dist/db.js'); + const db = openDatabase(':memory:'); + loadSqliteVec(db); + const r = db.prepare('SELECT vec_version() as v').get(); + console.log('sqlite-vec', r.v); + if (!r.v) process.exit(1); + \"" + + smoke_test "vitest (node)" \ + "export PATH=$NODE_BIN:\$PATH; cd /opt/qmd && npx vitest run --reporter=verbose test/store.test.ts 2>&1 | tail -5" + + # ------------------------------------------------------------------ + # Bun (bun-installed qmd) + # ------------------------------------------------------------------ + local BUN_BIN='$(mise where bun@latest)/bin' + echo "" + echo "=== Bun (bun install) ===" + + smoke_test_output "qmd shows help" "Usage:" \ + "export PATH=$BUN_BIN:$NODE_BIN:\$PATH; \$HOME/.bun/bin/qmd" + + smoke_test "qmd collection list" \ + "export PATH=$BUN_BIN:$NODE_BIN:\$PATH; \$HOME/.bun/bin/qmd collection list" + + smoke_test "qmd status" \ + "export PATH=$BUN_BIN:$NODE_BIN:\$PATH; \$HOME/.bun/bin/qmd status" + + smoke_test "sqlite-vec loads (bun)" \ + "export PATH=$BUN_BIN:\$PATH; bun -e \" + const {openDatabase, loadSqliteVec} = await import('\$HOME/.bun/install/global/node_modules/@tobilu/qmd/dist/db.js'); + const db = openDatabase(':memory:'); + loadSqliteVec(db); + const r = db.prepare('SELECT vec_version() as v').get(); + console.log('sqlite-vec', r.v); + if (!r.v) process.exit(1); + \"" + + smoke_test "bun test store" \ + "export PATH=$BUN_BIN:\$PATH; cd /opt/qmd && bun test --preload ./src/test-preload.ts --timeout 30000 test/store.test.ts 2>&1 | tail -10" + + # ------------------------------------------------------------------ + echo "" + echo "=== Results: $PASS passed, $FAIL failed ===" + [[ $FAIL -eq 0 ]] +} + +# Parse arguments +case "${1:-}" in + --build) + build_image + ;; + --shell) + build_image + echo "==> Dropping into container shell..." + $CTR run --rm -it "$IMAGE" bash + ;; + --) + shift + run "$@" + ;; + *) + build_image + echo "" + echo "==> Running smoke tests..." + run_smoke_tests + ;; +esac diff --git a/src/store-paths.test.ts b/test/store-paths.test.ts similarity index 98% rename from src/store-paths.test.ts rename to test/store-paths.test.ts index 2f716781..52d658bb 100644 --- a/src/store-paths.test.ts +++ b/test/store-paths.test.ts @@ -10,13 +10,13 @@ * Run with: bun test store-paths.test.ts */ -import { describe, test, expect, beforeEach, afterEach } from "bun:test"; +import { describe, test, expect, beforeEach, afterEach } from "vitest"; import { isAbsolutePath, normalizePathSeparators, getRelativePathFromPrefix, resolve, -} from "./store.js"; +} from "../src/store.js"; // ============================================================================= // Test Utilities @@ -27,26 +27,26 @@ let originalProcessCwd: () => string; beforeEach(() => { // Save original environment - originalPWD = Bun.env.PWD; + originalPWD = process.env.PWD; originalProcessCwd = process.cwd; }); afterEach(() => { // Restore original environment if (originalPWD !== undefined) { - Bun.env.PWD = originalPWD; + process.env.PWD = originalPWD; } else { - delete Bun.env.PWD; + delete process.env.PWD; } process.cwd = originalProcessCwd; }); /** * Mock the current working directory for testing. - * Sets both Bun.env.PWD and process.cwd() to simulate different environments. + * Sets both process.env.PWD and process.cwd() to simulate different environments. */ function mockPWD(path: string): void { - Bun.env.PWD = path; + process.env.PWD = path; process.cwd = () => path; } diff --git a/test/store.helpers.unit.test.ts b/test/store.helpers.unit.test.ts new file mode 100644 index 00000000..4fd14140 --- /dev/null +++ b/test/store.helpers.unit.test.ts @@ -0,0 +1,218 @@ +/** + * Store helper-level unit tests (pure logic, no model/runtime dependency). + */ + +import { describe, test, expect } from "vitest"; +import { + homedir, + resolve, + getDefaultDbPath, + getPwd, + getRealPath, + isVirtualPath, + parseVirtualPath, + normalizeVirtualPath, + normalizeDocid, + isDocid, + handelize, +} from "../src/store"; + +// ============================================================================= +// Path Utilities +// ============================================================================= + +describe("Path Utilities", () => { + test("homedir returns HOME environment variable", () => { + expect(homedir()).toBe(process.env.HOME || "/tmp"); + }); + + test("resolve handles absolute paths", () => { + expect(resolve("/foo/bar")).toBe("/foo/bar"); + expect(resolve("/foo", "/bar")).toBe("/bar"); + }); + + test("resolve handles relative paths", () => { + const pwd = process.env.PWD || process.cwd(); + expect(resolve("foo")).toBe(`${pwd}/foo`); + expect(resolve("foo", "bar")).toBe(`${pwd}/foo/bar`); + }); + + test("resolve normalizes . and ..", () => { + expect(resolve("/foo/bar/./baz")).toBe("/foo/bar/baz"); + expect(resolve("/foo/bar/../baz")).toBe("/foo/baz"); + expect(resolve("/foo/bar/../../baz")).toBe("/baz"); + }); + + test("getDefaultDbPath throws in test mode without INDEX_PATH", () => { + const originalIndexPath = process.env.INDEX_PATH; + delete process.env.INDEX_PATH; + + expect(() => getDefaultDbPath()).toThrow("Database path not set"); + + if (originalIndexPath) { + process.env.INDEX_PATH = originalIndexPath; + } + }); + + test("getDefaultDbPath uses INDEX_PATH when set", () => { + const originalIndexPath = process.env.INDEX_PATH; + process.env.INDEX_PATH = "/tmp/test-index.sqlite"; + + expect(getDefaultDbPath()).toBe("/tmp/test-index.sqlite"); + expect(getDefaultDbPath("custom")).toBe("/tmp/test-index.sqlite"); + + if (originalIndexPath) { + process.env.INDEX_PATH = originalIndexPath; + } else { + delete process.env.INDEX_PATH; + } + }); + + test("getPwd returns current working directory", () => { + const pwd = getPwd(); + expect(pwd).toBeTruthy(); + expect(typeof pwd).toBe("string"); + }); + + test("getRealPath resolves symlinks", () => { + const result = getRealPath("/tmp"); + expect(result).toBeTruthy(); + expect(result === "/tmp" || result === "/private/tmp").toBe(true); + }); +}); + +// ============================================================================= +// Handelize Tests +// ============================================================================= + +describe("handelize", () => { + test("converts to lowercase", () => { + expect(handelize("README.md")).toBe("readme.md"); + expect(handelize("MyFile.MD")).toBe("myfile.md"); + }); + + test("preserves folder structure", () => { + expect(handelize("a/b/c/d.md")).toBe("a/b/c/d.md"); + expect(handelize("docs/api/README.md")).toBe("docs/api/readme.md"); + }); + + test("replaces non-word characters with dash", () => { + expect(handelize("hello world.md")).toBe("hello-world.md"); + expect(handelize("file (1).md")).toBe("file-1.md"); + expect(handelize("foo@bar#baz.md")).toBe("foo-bar-baz.md"); + }); + + test("collapses multiple special chars into single dash", () => { + expect(handelize("hello world.md")).toBe("hello-world.md"); + expect(handelize("foo---bar.md")).toBe("foo-bar.md"); + expect(handelize("a - b.md")).toBe("a-b.md"); + }); + + test("removes leading and trailing dashes from segments", () => { + expect(handelize("-hello-.md")).toBe("hello.md"); + expect(handelize("--test--.md")).toBe("test.md"); + expect(handelize("a/-b-/c.md")).toBe("a/b/c.md"); + }); + + test("converts triple underscore to folder separator", () => { + expect(handelize("foo___bar.md")).toBe("foo/bar.md"); + expect(handelize("notes___2025___january.md")).toBe("notes/2025/january.md"); + expect(handelize("a/b___c/d.md")).toBe("a/b/c/d.md"); + }); + + test("handles complex real-world meeting notes", () => { + const complexName = "Money Movement Licensing Review - 2025/11/19 10:25 EST - Notes by Gemini.md"; + const result = handelize(complexName); + expect(result).toBe("money-movement-licensing-review-2025-11-19-10-25-est-notes-by-gemini.md"); + expect(result).not.toContain(" "); + expect(result).not.toContain("/"); + expect(result).not.toContain(":"); + }); + + test("handles unicode characters", () => { + expect(handelize("日本語.md")).toBe("日本語.md"); + expect(handelize("Зоны и проекты.md")).toBe("зоны-и-проекты.md"); + expect(handelize("café-notes.md")).toBe("café-notes.md"); + expect(handelize("naïve.md")).toBe("naïve.md"); + expect(handelize("日本語-notes.md")).toBe("日本語-notes.md"); + }); + + test("handles emoji filenames (issue #302)", () => { + // Emoji-only filenames should convert to hex codepoints + expect(handelize("🐘.md")).toBe("1f418.md"); + expect(handelize("🎉.md")).toBe("1f389.md"); + // Emoji mixed with text + expect(handelize("notes 🐘.md")).toBe("notes-1f418.md"); + expect(handelize("🐘 elephant.md")).toBe("1f418-elephant.md"); + // Multiple emojis + expect(handelize("🐘🎉.md")).toBe("1f418-1f389.md"); + // Emoji in directory names + expect(handelize("🐘/notes.md")).toBe("1f418/notes.md"); + }); + + test("handles dates and times in filenames", () => { + expect(handelize("meeting-2025-01-15.md")).toBe("meeting-2025-01-15.md"); + expect(handelize("notes 2025/01/15.md")).toBe("notes-2025/01/15.md"); + expect(handelize("call_10:30_AM.md")).toBe("call-10-30-am.md"); + }); + + test("handles special project naming patterns", () => { + expect(handelize("PROJECT_ABC_v2.0.md")).toBe("project-abc-v2-0.md"); + expect(handelize("[WIP] Feature Request.md")).toBe("wip-feature-request.md"); + expect(handelize("(DRAFT) Proposal v1.md")).toBe("draft-proposal-v1.md"); + }); + + test("handles symbol-only route filenames", () => { + expect(handelize("routes/api/auth/$.ts")).toBe("routes/api/auth/$.ts"); + expect(handelize("app/routes/$id.tsx")).toBe("app/routes/$id.tsx"); + }); + + test("filters out empty segments", () => { + expect(handelize("a//b/c.md")).toBe("a/b/c.md"); + expect(handelize("/a/b/")).toBe("a/b"); + expect(handelize("///test///")).toBe("test"); + }); + + test("throws error for invalid inputs", () => { + expect(() => handelize("" )).toThrow("path cannot be empty"); + expect(() => handelize(" ")).toThrow("path cannot be empty"); + expect(() => handelize(".md")).toThrow("no valid filename content"); + expect(() => handelize("...")).toThrow("no valid filename content"); + expect(() => handelize("___")).toThrow("no valid filename content"); + }); + + test("handles minimal valid inputs", () => { + expect(handelize("a")).toBe("a"); + expect(handelize("1")).toBe("1"); + expect(handelize("a.md")).toBe("a.md"); + }); + + test("normalizes virtual paths", () => { + expect(normalizeVirtualPath("qmd://docs/readme.md")).toBe("qmd://docs/readme.md"); + expect(normalizeVirtualPath("docs/readme.md")).toBe("docs/readme.md"); + }); + + test("detects virtual paths", () => { + expect(isVirtualPath("qmd://docs/readme.md")).toBe(true); + expect(isVirtualPath("/tmp/file.md")).toBe(false); + }); + + test("parses virtual paths", () => { + expect(parseVirtualPath("qmd://docs/readme.md")).toEqual({ + collectionName: "docs", + path: "readme.md", + }); + }); + + test("normalizes docids", () => { + expect(normalizeDocid("123456")).toBe("123456"); + expect(normalizeDocid("#123456")).toBe("123456"); + }); + + test("checks docid validity", () => { + expect(isDocid("123456")).toBe(true); + expect(isDocid("#123456")).toBe(true); + expect(isDocid("bad-id")).toBe(false); + expect(isDocid("12345")).toBe(false); + }); +}); diff --git a/src/store.test.ts b/test/store.test.ts similarity index 80% rename from src/store.test.ts rename to test/store.test.ts index af34dd62..0a29d4ae 100644 --- a/src/store.test.ts +++ b/test/store.test.ts @@ -6,15 +6,18 @@ * LLM operations use LlamaCpp with local GGUF models (node-llama-cpp). */ -import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach, mock, spyOn } from "bun:test"; -import { Database } from "bun:sqlite"; +import { describe, test, expect, beforeAll, afterAll, beforeEach, afterEach, vi } from "vitest"; +import { openDatabase, loadSqliteVec } from "../src/db.js"; +import type { Database } from "../src/db.js"; import { unlink, mkdtemp, rmdir, writeFile } from "node:fs/promises"; import { tmpdir } from "node:os"; import { join } from "node:path"; import YAML from "yaml"; -import { disposeDefaultLlamaCpp } from "./llm.js"; +import * as llmModule from "../src/llm.js"; +import { disposeDefaultLlamaCpp } from "../src/llm.js"; import { createStore, + verifySqliteVecLoaded, getDefaultDbPath, homedir, resolve, @@ -26,6 +29,12 @@ import { formatDocForEmbedding, chunkDocument, chunkDocumentByTokens, + scanBreakPoints, + findCodeFences, + isInsideCodeFence, + findBestCutoff, + type BreakPoint, + type CodeFenceRegion, reciprocalRankFusion, extractSnippet, getCacheKey, @@ -35,12 +44,14 @@ import { parseVirtualPath, normalizeDocid, isDocid, + STRONG_SIGNAL_MIN_SCORE, + STRONG_SIGNAL_MIN_GAP, type Store, type DocumentResult, type SearchResult, type RankedResult, -} from "./store.js"; -import type { CollectionConfig } from "./collections.js"; +} from "../src/store.js"; +import type { CollectionConfig } from "../src/collections.js"; // ============================================================================= // LlamaCpp Setup @@ -244,7 +255,7 @@ afterAll(async () => { describe("Path Utilities", () => { test("homedir returns HOME environment variable", () => { const result = homedir(); - expect(result).toBe(Bun.env.HOME || "/tmp"); + expect(result).toBe(process.env.HOME || "/tmp"); }); test("resolve handles absolute paths", () => { @@ -253,7 +264,7 @@ describe("Path Utilities", () => { }); test("resolve handles relative paths", () => { - const pwd = Bun.env.PWD || process.cwd(); + const pwd = process.env.PWD || process.cwd(); expect(resolve("foo")).toBe(`${pwd}/foo`); expect(resolve("foo", "bar")).toBe(`${pwd}/foo/bar`); }); @@ -376,6 +387,11 @@ describe("handelize", () => { expect(handelize("(DRAFT) Proposal v1.md")).toBe("draft-proposal-v1.md"); }); + test("handles symbol-only route filenames", () => { + expect(handelize("routes/api/auth/$.ts")).toBe("routes/api/auth/$.ts"); + expect(handelize("app/routes/$id.tsx")).toBe("app/routes/$id.tsx"); + }); + test("filters out empty segments", () => { expect(handelize("a//b/c.md")).toBe("a/b/c.md"); expect(handelize("/a/b/")).toBe("a/b"); @@ -416,7 +432,8 @@ describe("Store Creation", () => { test("createStore creates a new store with custom path", async () => { const store = await createTestStore(); expect(store.dbPath).toBe(testDbPath); - expect(store.db).toBeInstanceOf(Database); + expect(store.db).toBeDefined(); + expect(typeof store.db.exec).toBe("function"); await cleanupTestDb(store); }); @@ -445,6 +462,25 @@ describe("Store Creation", () => { await cleanupTestDb(store); }); + test("verifySqliteVecLoaded throws when sqlite-vec is not loaded", () => { + const db = openDatabase(":memory:"); + try { + expect(() => verifySqliteVecLoaded(db)).toThrow("sqlite-vec extension is unavailable"); + } finally { + db.close(); + } + }); + + test("verifySqliteVecLoaded succeeds when sqlite-vec is loaded", () => { + const db = openDatabase(":memory:"); + try { + loadSqliteVec(db); + expect(() => verifySqliteVecLoaded(db)).not.toThrow(); + } finally { + db.close(); + } + }); + test("store.close closes the database connection", async () => { const store = await createTestStore(); store.close(); @@ -591,38 +627,38 @@ describe("Document Chunking", () => { } }); - test("chunkDocument with default params uses 800-token chunks", () => { - // Default is CHUNK_SIZE_CHARS (3200 chars) with CHUNK_OVERLAP_CHARS (480 chars) - const content = "Word ".repeat(2000); // ~10000 chars + test("chunkDocument with default params uses 900-token chunks", () => { + // Default is CHUNK_SIZE_CHARS (3600 chars) with CHUNK_OVERLAP_CHARS (540 chars) + const content = "Word ".repeat(2500); // ~12500 chars const chunks = chunkDocument(content); expect(chunks.length).toBeGreaterThan(1); - // Each chunk should be around 3200 chars (except last) - expect(chunks[0]!.text.length).toBeGreaterThan(2500); - expect(chunks[0]!.text.length).toBeLessThanOrEqual(3200); + // Each chunk should be around 3600 chars (except last) + expect(chunks[0]!.text.length).toBeGreaterThan(2800); + expect(chunks[0]!.text.length).toBeLessThanOrEqual(3600); }); }); -describe("Token-based Chunking", () => { +describe.skipIf(!!process.env.CI)("Token-based Chunking", () => { test("chunkDocumentByTokens returns single chunk for small documents", async () => { const content = "This is a small document."; - const chunks = await chunkDocumentByTokens(content, 800, 120); + const chunks = await chunkDocumentByTokens(content, 900, 135); expect(chunks).toHaveLength(1); expect(chunks[0]!.text).toBe(content); expect(chunks[0]!.pos).toBe(0); expect(chunks[0]!.tokens).toBeGreaterThan(0); - expect(chunks[0]!.tokens).toBeLessThan(800); + expect(chunks[0]!.tokens).toBeLessThan(900); }); test("chunkDocumentByTokens splits large documents", async () => { - // Create a document that's definitely more than 800 tokens - const content = "The quick brown fox jumps over the lazy dog. ".repeat(200); - const chunks = await chunkDocumentByTokens(content, 800, 120); + // Create a document that's definitely more than 900 tokens + const content = "The quick brown fox jumps over the lazy dog. ".repeat(250); + const chunks = await chunkDocumentByTokens(content, 900, 135); expect(chunks.length).toBeGreaterThan(1); - // Each chunk should have ~800 tokens or less + // Each chunk should have ~900 tokens or less for (const chunk of chunks) { - expect(chunk.tokens).toBeLessThanOrEqual(850); // Allow slight overage + expect(chunk.tokens).toBeLessThanOrEqual(950); // Allow slight overage expect(chunk.tokens).toBeGreaterThan(0); } @@ -661,6 +697,308 @@ describe("Token-based Chunking", () => { }); }); +// ============================================================================= +// Smart Chunking - Break Point Detection Tests +// ============================================================================= + +describe("scanBreakPoints", () => { + test("detects h1 headings", () => { + const text = "Intro\n# Heading 1\nMore text"; + const breaks = scanBreakPoints(text); + const h1 = breaks.find(b => b.type === 'h1'); + expect(h1).toBeDefined(); + expect(h1!.score).toBe(100); + expect(h1!.pos).toBe(5); // position of \n# + }); + + test("detects multiple heading levels", () => { + const text = "Text\n# H1\n## H2\n### H3\nMore"; + const breaks = scanBreakPoints(text); + + const h1 = breaks.find(b => b.type === 'h1'); + const h2 = breaks.find(b => b.type === 'h2'); + const h3 = breaks.find(b => b.type === 'h3'); + + expect(h1).toBeDefined(); + expect(h2).toBeDefined(); + expect(h3).toBeDefined(); + expect(h1!.score).toBe(100); + expect(h2!.score).toBe(90); + expect(h3!.score).toBe(80); + }); + + test("detects code blocks", () => { + const text = "Before\n```js\ncode\n```\nAfter"; + const breaks = scanBreakPoints(text); + const codeBlocks = breaks.filter(b => b.type === 'codeblock'); + expect(codeBlocks.length).toBe(2); // opening and closing + expect(codeBlocks[0]!.score).toBe(80); + }); + + test("detects horizontal rules", () => { + const text = "Text\n---\nMore text"; + const breaks = scanBreakPoints(text); + const hr = breaks.find(b => b.type === 'hr'); + expect(hr).toBeDefined(); + expect(hr!.score).toBe(60); + }); + + test("detects blank lines (paragraph boundaries)", () => { + const text = "First paragraph.\n\nSecond paragraph."; + const breaks = scanBreakPoints(text); + const blank = breaks.find(b => b.type === 'blank'); + expect(blank).toBeDefined(); + expect(blank!.score).toBe(20); + }); + + test("detects list items", () => { + const text = "Intro\n- Item 1\n- Item 2\n1. Numbered"; + const breaks = scanBreakPoints(text); + + const lists = breaks.filter(b => b.type === 'list'); + const numLists = breaks.filter(b => b.type === 'numlist'); + + expect(lists.length).toBe(2); + expect(numLists.length).toBe(1); + expect(lists[0]!.score).toBe(5); + expect(numLists[0]!.score).toBe(5); + }); + + test("detects newlines as fallback", () => { + const text = "Line 1\nLine 2\nLine 3"; + const breaks = scanBreakPoints(text); + const newlines = breaks.filter(b => b.type === 'newline'); + expect(newlines.length).toBe(2); + expect(newlines[0]!.score).toBe(1); + }); + + test("returns breaks sorted by position", () => { + const text = "A\n# B\n\nC\n## D"; + const breaks = scanBreakPoints(text); + for (let i = 1; i < breaks.length; i++) { + expect(breaks[i]!.pos).toBeGreaterThan(breaks[i-1]!.pos); + } + }); + + test("higher-scoring pattern wins at same position", () => { + // \n# matches both newline (score 1) and h1 (score 100) + const text = "Text\n# Heading"; + const breaks = scanBreakPoints(text); + const atPos = breaks.filter(b => b.pos === 4); + expect(atPos.length).toBe(1); + expect(atPos[0]!.type).toBe('h1'); + expect(atPos[0]!.score).toBe(100); + }); +}); + +describe("findCodeFences", () => { + test("finds single code fence", () => { + const text = "Before\n```js\ncode here\n```\nAfter"; + const fences = findCodeFences(text); + expect(fences.length).toBe(1); + expect(fences[0]!.start).toBe(6); // position of first \n``` + // End is position after the closing \n``` (which is at position 22, length 4) + expect(fences[0]!.end).toBe(26); + }); + + test("finds multiple code fences", () => { + const text = "Intro\n```\nblock1\n```\nMiddle\n```\nblock2\n```\nEnd"; + const fences = findCodeFences(text); + expect(fences.length).toBe(2); + }); + + test("handles unclosed code fence", () => { + const text = "Before\n```\nunclosed code block"; + const fences = findCodeFences(text); + expect(fences.length).toBe(1); + expect(fences[0]!.end).toBe(text.length); // extends to end of document + }); + + test("returns empty array for no code fences", () => { + const text = "No code fences here"; + const fences = findCodeFences(text); + expect(fences.length).toBe(0); + }); +}); + +describe("isInsideCodeFence", () => { + test("returns true for position inside fence", () => { + const fences: CodeFenceRegion[] = [{ start: 10, end: 30 }]; + expect(isInsideCodeFence(15, fences)).toBe(true); + expect(isInsideCodeFence(20, fences)).toBe(true); + }); + + test("returns false for position outside fence", () => { + const fences: CodeFenceRegion[] = [{ start: 10, end: 30 }]; + expect(isInsideCodeFence(5, fences)).toBe(false); + expect(isInsideCodeFence(35, fences)).toBe(false); + }); + + test("returns false for position at fence boundaries", () => { + const fences: CodeFenceRegion[] = [{ start: 10, end: 30 }]; + expect(isInsideCodeFence(10, fences)).toBe(false); // at start + expect(isInsideCodeFence(30, fences)).toBe(false); // at end + }); + + test("handles multiple fences", () => { + const fences: CodeFenceRegion[] = [ + { start: 10, end: 30 }, + { start: 50, end: 70 } + ]; + expect(isInsideCodeFence(20, fences)).toBe(true); + expect(isInsideCodeFence(60, fences)).toBe(true); + expect(isInsideCodeFence(40, fences)).toBe(false); + }); +}); + +describe("findBestCutoff", () => { + test("prefers higher-scoring break points", () => { + const breakPoints: BreakPoint[] = [ + { pos: 100, score: 1, type: 'newline' }, + { pos: 150, score: 100, type: 'h1' }, + { pos: 180, score: 20, type: 'blank' }, + ]; + // Target is 200, window is 100 (so 100-200 is valid) + const cutoff = findBestCutoff(breakPoints, 200, 100, 0.7); + expect(cutoff).toBe(150); // h1 wins due to high score + }); + + test("h2 at window edge beats blank at target (squared decay)", () => { + const breakPoints: BreakPoint[] = [ + { pos: 100, score: 90, type: 'h2' }, // at window edge + { pos: 195, score: 20, type: 'blank' }, // close to target + ]; + // Target is 200, window is 100 + // With squared decay: + // h2 at 100: dist=100, normalized=1.0, mult=1-1*0.7=0.3, final=90*0.3=27 + // blank at 195: dist=5, normalized=0.05, mult=1-0.0025*0.7=0.998, final=20*0.998=19.97 + const cutoff = findBestCutoff(breakPoints, 200, 100, 0.7); + expect(cutoff).toBe(100); // h2 wins even at edge! + }); + + test("high score easily overcomes distance", () => { + const breakPoints: BreakPoint[] = [ + { pos: 150, score: 100, type: 'h1' }, // h1 at middle + { pos: 195, score: 1, type: 'newline' }, // newline near target + ]; + // Target is 200, window is 100 + // h1 at 150: dist=50, normalized=0.5, mult=1-0.25*0.7=0.825, final=82.5 + // newline at 195: dist=5, mult=0.998, final=0.998 + const cutoff = findBestCutoff(breakPoints, 200, 100, 0.7); + expect(cutoff).toBe(150); // h1 wins easily + }); + + test("returns target position when no breaks in window", () => { + const breakPoints: BreakPoint[] = [ + { pos: 10, score: 100, type: 'h1' }, // too far before window + ]; + const cutoff = findBestCutoff(breakPoints, 200, 100, 0.7); + expect(cutoff).toBe(200); + }); + + test("skips break points inside code fences", () => { + const breakPoints: BreakPoint[] = [ + { pos: 150, score: 100, type: 'h1' }, // inside fence + { pos: 180, score: 20, type: 'blank' }, // outside fence + ]; + const codeFences: CodeFenceRegion[] = [{ start: 140, end: 160 }]; + const cutoff = findBestCutoff(breakPoints, 200, 100, 0.7, codeFences); + expect(cutoff).toBe(180); // blank wins since h1 is inside fence + }); + + test("handles empty break points array", () => { + const cutoff = findBestCutoff([], 200, 100, 0.7); + expect(cutoff).toBe(200); + }); +}); + +describe("Smart Chunking Integration", () => { + test("chunkDocument prefers headings over arbitrary breaks", () => { + // Create content where the heading falls within the search window + // We want the heading at ~1700 chars so it's in the window for a 2000 char target + const section1 = "Introduction text here. ".repeat(70); // ~1680 chars + const section2 = "Main content text here. ".repeat(50); // ~1150 chars + const content = `${section1}\n# Main Section\n${section2}`; + + // With 2000 char chunks and 800 char window (searches 1200-2000) + // Heading is at ~1680 which is in window + const chunks = chunkDocument(content, 2000, 0, 800); + const headingPos = content.indexOf('\n# Main Section'); + + // First chunk should end at the heading (best break point in window) + expect(chunks.length).toBeGreaterThanOrEqual(2); + expect(chunks[0]!.text.length).toBe(headingPos); + }); + + test("chunkDocument does not split inside code blocks", () => { + const beforeCode = "Some intro text. ".repeat(30); // ~480 chars + const codeBlock = "```typescript\n" + "const x = 1;\n".repeat(100) + "```\n"; + const afterCode = "More text after code. ".repeat(30); + const content = beforeCode + codeBlock + afterCode; + + const chunks = chunkDocument(content, 1000, 0, 400); + + // Check that no chunk starts in the middle of a code block + for (const chunk of chunks) { + const hasOpenFence = (chunk.text.match(/\n```/g) || []).length; + // If we have an odd number of fence markers, we're splitting inside a block + // (unless it's the last chunk with unclosed fence) + if (hasOpenFence % 2 === 1 && !chunk.text.endsWith('```\n')) { + // This is acceptable only if it's an unclosed fence at document end + const isLastChunk = chunks.indexOf(chunk) === chunks.length - 1; + if (!isLastChunk) { + // Not the last chunk, so this would be a split inside code - check it's not common + // Actually this test is more about smoke testing - we just verify it runs + } + } + } + expect(chunks.length).toBeGreaterThan(1); + }); + + test("chunkDocument handles markdown with mixed elements", () => { + const content = `# Introduction + +This is the introduction paragraph with some text. + +## Section 1 + +Some content in section 1. + +- List item 1 +- List item 2 +- List item 3 + +## Section 2 + +\`\`\`javascript +function hello() { + console.log("Hello"); +} +\`\`\` + +More text after the code block. + +--- + +## Section 3 + +Final section content. +`.repeat(10); + + const chunks = chunkDocument(content, 500, 75, 200); + + // Should produce multiple chunks + expect(chunks.length).toBeGreaterThan(5); + + // All chunks should be valid strings + for (const chunk of chunks) { + expect(typeof chunk.text).toBe('string'); + expect(chunk.text.length).toBeGreaterThan(0); + expect(chunk.pos).toBeGreaterThanOrEqual(0); + } + }); +}); + // ============================================================================= // Caching Tests // ============================================================================= @@ -883,8 +1221,8 @@ describe("FTS Search", () => { const allResults = store.searchFTS("searchable", 10); expect(allResults).toHaveLength(2); - // Filter by collection name (collectionId is now treated as collection name string) - const filtered = store.searchFTS("searchable", 10, collection1 as unknown as number); + // Filter by collection name + const filtered = store.searchFTS("searchable", 10, collection1); expect(filtered).toHaveLength(1); expect(filtered[0]!.displayPath).toBe(`${collection1}/doc1.md`); @@ -908,6 +1246,96 @@ describe("FTS Search", () => { await cleanupTestDb(store); }); + // BM25 IDF requires corpus depth — helper adds non-matching docs so term frequency + // differentiation produces meaningful scores (2-doc corpus has near-zero IDF). + async function addNoiseDocuments(db: Database, collectionName: string, count = 8) { + for (let i = 0; i < count; i++) { + await insertTestDocument(db, collectionName, { + name: `noise${i}`, + title: `Unrelated Topic ${i}`, + body: `This document discusses completely different subjects like gardening and cooking ${i}`, + displayPath: `test/noise${i}.md`, + }); + } + } + + test("searchFTS scores: stronger BM25 match → higher normalized score", async () => { + const store = await createTestStore(); + const collectionName = await createTestCollection(); + await addNoiseDocuments(store.db, collectionName); + + // "alpha" appears in title (10x weight) + body → strong BM25 + await insertTestDocument(store.db, collectionName, { + name: "strong", + title: "Alpha Guide", + body: "This is the definitive alpha reference with alpha details and more alpha info", + displayPath: "test/strong.md", + }); + + // "alpha" appears once in body only → weaker BM25 + await insertTestDocument(store.db, collectionName, { + name: "weak", + title: "General Notes", + body: "Some notes that mention alpha in passing among other topics and keywords", + displayPath: "test/weak.md", + }); + + const results = store.searchFTS("alpha", 10); + expect(results.length).toBe(2); + + // Verify score direction: stronger match (title + body) should score HIGHER + const strongResult = results.find(r => r.displayPath.includes("strong"))!; + const weakResult = results.find(r => r.displayPath.includes("weak"))!; + expect(strongResult.score).toBeGreaterThan(weakResult.score); + + // Verify scores are in valid (0, 1) range + for (const r of results) { + expect(r.score).toBeGreaterThan(0); + expect(r.score).toBeLessThan(1); + } + + await cleanupTestDb(store); + }); + + test("searchFTS scores: minScore filter keeps strong matches, drops weak", async () => { + const store = await createTestStore(); + const collectionName = await createTestCollection(); + await addNoiseDocuments(store.db, collectionName); + + // Strong match: keyword in title (10x weight) + repeated in body + await insertTestDocument(store.db, collectionName, { + name: "strong", + title: "Kubernetes Deployment", + body: "Kubernetes deployment strategies for kubernetes clusters using kubernetes operators", + displayPath: "test/strong.md", + }); + + // Weak match: keyword appears once in body only + await insertTestDocument(store.db, collectionName, { + name: "weak", + title: "Random Notes", + body: "Various topics including a brief kubernetes mention among many other unrelated things", + displayPath: "test/weak.md", + }); + + const allResults = store.searchFTS("kubernetes", 10); + expect(allResults.length).toBe(2); + + // With a minScore threshold, strong match should survive, weak should be filterable + const strongScore = allResults.find(r => r.displayPath.includes("strong"))!.score; + const weakScore = allResults.find(r => r.displayPath.includes("weak"))!.score; + + // Find a threshold between them + const threshold = (strongScore + weakScore) / 2; + const filtered = allResults.filter(r => r.score >= threshold); + + // Strong match survives the filter, weak does not + expect(filtered.length).toBe(1); + expect(filtered[0]!.displayPath).toContain("strong"); + + await cleanupTestDb(store); + }); + test("searchFTS ignores inactive documents", async () => { const store = await createTestStore(); const collectionName = await createTestCollection(); @@ -933,6 +1361,53 @@ describe("FTS Search", () => { await cleanupTestDb(store); }); + + test("searchFTS scores: strong signal detection works with correct normalization", async () => { + const store = await createTestStore(); + const collectionName = await createTestCollection(); + + // BM25 IDF needs meaningful corpus depth for strong signal to fire. + // 50 noise docs give IDF ≈ log(50/2) ≈ 3.2 — enough for scores above 0.85. + await addNoiseDocuments(store.db, collectionName, 50); + + // Dominant: keyword in filepath (10x BM25 weight column) + title + body + await insertTestDocument(store.db, collectionName, { + name: "dominant", + title: "Zephyr Configuration Guide", + body: "Complete zephyr configuration guide. Zephyr setup instructions for zephyr deployment.", + displayPath: "zephyr/zephyr-guide.md", + }); + + // Weak: keyword once in body only, longer doc dilutes TF + await insertTestDocument(store.db, collectionName, { + name: "weak", + title: "General Notes", + body: "Various topics covering many areas of technology and design. " + + "One of them might relate to zephyr but mostly about other things entirely. " + + "Additional content about databases, networking, security, performance, " + + "monitoring, deployment, testing, and documentation practices.", + displayPath: "notes/misc.md", + }); + + const results = store.searchFTS("zephyr", 10); + expect(results.length).toBe(2); + + const topScore = results[0]!.score; + const secondScore = results[1]!.score; + + // With correct normalization: strong match should be well above threshold + expect(topScore).toBeGreaterThanOrEqual(STRONG_SIGNAL_MIN_SCORE); + + // Gap should exceed threshold when there's a dominant match + const gap = topScore - secondScore; + expect(gap).toBeGreaterThanOrEqual(STRONG_SIGNAL_MIN_GAP); + + // Full strong signal check should pass (this was dead code before the fix) + const hasStrongSignal = topScore >= STRONG_SIGNAL_MIN_SCORE && gap >= STRONG_SIGNAL_MIN_GAP; + expect(hasStrongSignal).toBe(true); + + await cleanupTestDb(store); + }); }); // ============================================================================= @@ -1772,7 +2247,7 @@ describe("Integration", () => { // LlamaCpp Integration Tests (using real local models) // ============================================================================= -describe("LlamaCpp Integration", () => { +describe.skipIf(!!process.env.CI)("LlamaCpp Integration", () => { test("searchVec returns empty when no vector index", async () => { const store = await createTestStore(); const collectionName = await createTestCollection(); @@ -1893,27 +2368,32 @@ describe("LlamaCpp Integration", () => { await cleanupTestDb(store); }); - test("expandQuery returns original plus expanded queries", async () => { + test("expandQuery returns typed expansions (no original query)", async () => { const store = await createTestStore(); - const queries = await store.expandQuery("test query"); - expect(queries).toContain("test query"); - expect(queries[0]).toBe("test query"); - // LlamaCpp returns original + variations - expect(queries.length).toBeGreaterThanOrEqual(1); + const expanded = await store.expandQuery("test query"); + // Returns ExpandedQuery[] — typed results from LLM, excluding original + expect(expanded.length).toBeGreaterThanOrEqual(1); + for (const q of expanded) { + expect(['lex', 'vec', 'hyde']).toContain(q.type); + expect(q.text.length).toBeGreaterThan(0); + expect(q.text).not.toBe("test query"); // original excluded + } await cleanupTestDb(store); }, 30000); - test("expandQuery caches results", async () => { + test("expandQuery caches results as JSON with types", async () => { const store = await createTestStore(); - // First call + // First call — hits LLM const queries1 = await store.expandQuery("cached query test"); - // Second call - should hit cache + // Second call — hits cache const queries2 = await store.expandQuery("cached query test"); - expect(queries1[0]).toBe(queries2[0]); + // Cache should preserve full typed structure + expect(queries1).toEqual(queries2); + expect(queries2[0]?.type).toBeDefined(); await cleanupTestDb(store); }, 30000); @@ -1948,6 +2428,40 @@ describe("LlamaCpp Integration", () => { await cleanupTestDb(store); }); + + test("rerank deduplicates identical chunks across files", async () => { + const store = await createTestStore(); + const rerankSpy = vi.fn(async (_query: string, docs: { file: string; text: string }[]) => ({ + results: docs.map((doc, index) => ({ + file: doc.file, + score: 1 - index * 0.1, + index, + })), + model: "mock-reranker", + })); + + const llmSpy = vi.spyOn(llmModule, "getDefaultLlamaCpp").mockReturnValue({ + rerank: rerankSpy, + } as any); + + try { + const docs = [ + { file: "doc1.md", text: "Shared chunk text" }, + { file: "doc2.md", text: "Shared chunk text" }, + ]; + + const first = await store.rerank("shared", docs); + const second = await store.rerank("shared", docs); + + expect(first).toHaveLength(2); + expect(second).toHaveLength(2); + expect(rerankSpy).toHaveBeenCalledTimes(1); + expect(rerankSpy.mock.calls[0]?.[1]).toEqual([{ file: "doc2.md", text: "Shared chunk text" }]); + } finally { + llmSpy.mockRestore(); + await cleanupTestDb(store); + } + }); }); // ============================================================================= @@ -2229,6 +2743,41 @@ describe("Content-Addressable Storage", () => { await cleanupTestDb(store); }); + + test("re-indexing a previously deactivated path reactivates instead of violating UNIQUE", async () => { + const store = await createTestStore(); + const collectionName = await createTestCollection(); + const now = new Date().toISOString(); + + const oldContent = "# First Version"; + const oldHash = await hashContent(oldContent); + store.insertContent(oldHash, oldContent, now); + store.insertDocument(collectionName, "docs/foo.md", "foo", oldHash, now, now); + + // Simulate file removal during update pass. + store.deactivateDocument(collectionName, "docs/foo.md"); + expect(store.findActiveDocument(collectionName, "docs/foo.md")).toBeNull(); + + // Simulate file coming back in a later update pass. + const newContent = "# Second Version"; + const newHash = await hashContent(newContent); + store.insertContent(newHash, newContent, now); + + expect(() => { + store.insertDocument(collectionName, "docs/foo.md", "foo", newHash, now, now); + }).not.toThrow(); + + const rows = store.db.prepare(` + SELECT id, hash, active FROM documents + WHERE collection = ? AND path = ? + `).all(collectionName, "docs/foo.md") as { id: number; hash: string; active: number }[]; + + expect(rows).toHaveLength(1); + expect(rows[0]!.active).toBe(1); + expect(rows[0]!.hash).toBe(newHash); + + await cleanupTestDb(store); + }); }); // ============================================================================= diff --git a/test/structured-search.test.ts b/test/structured-search.test.ts new file mode 100644 index 00000000..e3da9f55 --- /dev/null +++ b/test/structured-search.test.ts @@ -0,0 +1,491 @@ +/** + * structured-search.test.ts - Tests for structured search functionality + * + * Tests cover: + * - CLI query parser (parseStructuredQuery) + * - StructuredSubSearch type validation + * - Basic structuredSearch function behavior + * + * Run with: bun test structured-search.test.ts + */ + +import { describe, test, expect, beforeAll, afterAll } from "vitest"; +import { mkdtemp, rm } from "node:fs/promises"; +import { tmpdir } from "node:os"; +import { join } from "node:path"; +import { + createStore, + structuredSearch, + validateSemanticQuery, + validateLexQuery, + type StructuredSubSearch, + type Store, +} from "../src/store.js"; +import { disposeDefaultLlamaCpp } from "../src/llm.js"; + +// ============================================================================= +// parseStructuredQuery Tests (CLI Parser) +// ============================================================================= + +function parseStructuredQuery(query: string): StructuredSubSearch[] | null { + const rawLines = query.split('\n').map((line, idx) => ({ + raw: line, + trimmed: line.trim(), + number: idx + 1, + })).filter(line => line.trimmed.length > 0); + + if (rawLines.length === 0) return null; + + const prefixRe = /^(lex|vec|hyde):\s*/i; + const expandRe = /^expand:\s*/i; + const typed: StructuredSubSearch[] = []; + + for (const line of rawLines) { + if (expandRe.test(line.trimmed)) { + if (rawLines.length > 1) { + throw new Error(`Line ${line.number} starts with expand:, but query documents cannot mix expand with typed lines. Submit a single expand query instead.`); + } + const text = line.trimmed.replace(expandRe, '').trim(); + if (!text) { + throw new Error('expand: query must include text.'); + } + return null; + } + + const match = line.trimmed.match(prefixRe); + if (match) { + const type = match[1]!.toLowerCase() as 'lex' | 'vec' | 'hyde'; + const text = line.trimmed.slice(match[0].length).trim(); + if (!text) { + throw new Error(`Line ${line.number} (${type}:) must include text.`); + } + if (/\r|\n/.test(text)) { + throw new Error(`Line ${line.number} (${type}:) contains a newline. Keep each query on a single line.`); + } + typed.push({ type, query: text, line: line.number }); + continue; + } + + if (rawLines.length === 1) { + return null; + } + + throw new Error(`Line ${line.number} is missing a lex:/vec:/hyde: prefix. Each line in a query document must start with one.`); + } + + return typed.length > 0 ? typed : null; +} + +describe("parseStructuredQuery", () => { + describe("plain queries (returns null for normal expansion)", () => { + test("single line without prefix", () => { + expect(parseStructuredQuery("CAP theorem")).toBeNull(); + expect(parseStructuredQuery("distributed systems")).toBeNull(); + }); + + test("explicit expand line treated as plain query", () => { + expect(parseStructuredQuery("expand: error handling best practices")).toBeNull(); + }); + + test("empty queries", () => { + expect(parseStructuredQuery("")).toBeNull(); + expect(parseStructuredQuery(" ")).toBeNull(); + expect(parseStructuredQuery("\n\n")).toBeNull(); + }); + }); + + describe("single prefixed queries", () => { + test("lex: prefix", () => { + const result = parseStructuredQuery("lex: CAP theorem"); + expect(result).toEqual([{ type: "lex", query: "CAP theorem", line: 1 }]); + }); + + test("vec: prefix", () => { + const result = parseStructuredQuery("vec: what is the CAP theorem"); + expect(result).toEqual([{ type: "vec", query: "what is the CAP theorem", line: 1 }]); + }); + + test("hyde: prefix", () => { + const result = parseStructuredQuery("hyde: The CAP theorem states that..."); + expect(result).toEqual([{ type: "hyde", query: "The CAP theorem states that...", line: 1 }]); + }); + + test("uppercase prefix", () => { + expect(parseStructuredQuery("LEX: keywords")).toEqual([{ type: "lex", query: "keywords", line: 1 }]); + expect(parseStructuredQuery("VEC: question")).toEqual([{ type: "vec", query: "question", line: 1 }]); + expect(parseStructuredQuery("HYDE: passage")).toEqual([{ type: "hyde", query: "passage", line: 1 }]); + }); + + test("mixed case prefix", () => { + expect(parseStructuredQuery("Lex: test")).toEqual([{ type: "lex", query: "test", line: 1 }]); + expect(parseStructuredQuery("VeC: test")).toEqual([{ type: "vec", query: "test", line: 1 }]); + }); + }); + + describe("multiple prefixed queries", () => { + test("lex + vec", () => { + const result = parseStructuredQuery("lex: keywords\nvec: natural language"); + expect(result).toEqual([ + { type: "lex", query: "keywords", line: 1 }, + { type: "vec", query: "natural language", line: 2 }, + ]); + }); + + test("all three types", () => { + const result = parseStructuredQuery("lex: keywords\nvec: question\nhyde: hypothetical doc"); + expect(result).toEqual([ + { type: "lex", query: "keywords", line: 1 }, + { type: "vec", query: "question", line: 2 }, + { type: "hyde", query: "hypothetical doc", line: 3 }, + ]); + }); + + test("duplicate types allowed", () => { + const result = parseStructuredQuery("lex: term1\nlex: term2\nlex: term3"); + expect(result).toEqual([ + { type: "lex", query: "term1", line: 1 }, + { type: "lex", query: "term2", line: 2 }, + { type: "lex", query: "term3", line: 3 }, + ]); + }); + + test("order preserved", () => { + const result = parseStructuredQuery("hyde: passage\nvec: question\nlex: keywords"); + expect(result).toEqual([ + { type: "hyde", query: "passage", line: 1 }, + { type: "vec", query: "question", line: 2 }, + { type: "lex", query: "keywords", line: 3 }, + ]); + }); + }); + + describe("mixed plain and prefixed", () => { + test("plain line with prefixed lines throws helpful error", () => { + expect(() => parseStructuredQuery("plain keywords\nvec: semantic question")) + .toThrow(/missing a lex:\/vec:\/hyde:/); + }); + + test("plain line prepended before other prefixed throws", () => { + expect(() => parseStructuredQuery("keywords\nhyde: passage\nvec: question")) + .toThrow(/missing a lex:\/vec:\/hyde:/); + }); + }); + + describe("error cases", () => { + test("multiple plain lines throws", () => { + expect(() => parseStructuredQuery("line one\nline two")).toThrow(/missing a lex:\/vec:\/hyde:/); + }); + + test("three plain lines throws", () => { + expect(() => parseStructuredQuery("a\nb\nc")).toThrow(/missing a lex:\/vec:\/hyde:/); + }); + + test("mixing expand: with other lines throws", () => { + expect(() => parseStructuredQuery("expand: question\nlex: keywords")) + .toThrow(/cannot mix expand with typed lines/); + }); + + test("expand: without text throws", () => { + expect(() => parseStructuredQuery("expand: ")).toThrow(/must include text/); + }); + + test("typed line without text throws", () => { + expect(() => parseStructuredQuery("lex: \nvec: real")).toThrow(/must include text/); + }); + }); + + describe("whitespace handling", () => { + test("empty lines ignored", () => { + const result = parseStructuredQuery("lex: keywords\n\nvec: question\n"); + expect(result).toEqual([ + { type: "lex", query: "keywords", line: 1 }, + { type: "vec", query: "question", line: 3 }, + ]); + }); + + test("whitespace-only lines ignored", () => { + const result = parseStructuredQuery("lex: keywords\n \nvec: question"); + expect(result).toEqual([ + { type: "lex", query: "keywords", line: 1 }, + { type: "vec", query: "question", line: 3 }, + ]); + }); + + test("leading/trailing whitespace trimmed from lines", () => { + const result = parseStructuredQuery(" lex: keywords \n vec: question "); + expect(result).toEqual([ + { type: "lex", query: "keywords", line: 1 }, + { type: "vec", query: "question", line: 2 }, + ]); + }); + + test("internal whitespace preserved in query", () => { + const result = parseStructuredQuery("lex: multiple spaces "); + expect(result).toEqual([{ type: "lex", query: "multiple spaces", line: 1 }]); + }); + + test("empty prefix value throws", () => { + expect(() => parseStructuredQuery("lex: \nvec: actual query")).toThrow(/must include text/); + }); + + test("only empty prefix values throws", () => { + expect(() => parseStructuredQuery("lex: \nvec: \nhyde: ")).toThrow(/must include text/); + }); + }); + + describe("edge cases", () => { + test("colon in query text preserved", () => { + const result = parseStructuredQuery("lex: time: 12:30 PM"); + expect(result).toEqual([{ type: "lex", query: "time: 12:30 PM", line: 1 }]); + }); + + test("prefix-like text in query preserved", () => { + const result = parseStructuredQuery("vec: what does lex: mean"); + expect(result).toEqual([{ type: "vec", query: "what does lex: mean", line: 1 }]); + }); + + test("newline in hyde passage (as single line)", () => { + // If user wants actual newlines in hyde, they need to escape or use multiline syntax + const result = parseStructuredQuery("hyde: The answer is X. It means Y."); + expect(result).toEqual([{ type: "hyde", query: "The answer is X. It means Y.", line: 1 }]); + }); + }); +}); + +// ============================================================================= +// StructuredSubSearch Type Tests +// ============================================================================= + +describe("StructuredSubSearch type", () => { + test("accepts lex type", () => { + const search: StructuredSubSearch = { type: "lex", query: "test" }; + expect(search.type).toBe("lex"); + expect(search.query).toBe("test"); + }); + + test("accepts vec type", () => { + const search: StructuredSubSearch = { type: "vec", query: "test" }; + expect(search.type).toBe("vec"); + expect(search.query).toBe("test"); + }); + + test("accepts hyde type", () => { + const search: StructuredSubSearch = { type: "hyde", query: "test" }; + expect(search.type).toBe("hyde"); + expect(search.query).toBe("test"); + }); +}); + +// ============================================================================= +// structuredSearch Function Tests +// ============================================================================= + +describe("structuredSearch", () => { + let testDir: string; + let store: Store; + + beforeAll(async () => { + testDir = await mkdtemp(join(tmpdir(), "qmd-structured-test-")); + const testDbPath = join(testDir, "test.sqlite"); + const testConfigDir = await mkdtemp(join(testDir, "config-")); + process.env.QMD_CONFIG_DIR = testConfigDir; + store = createStore(testDbPath); + }); + + afterAll(async () => { + store.close(); + await disposeDefaultLlamaCpp(); + if (testDir) { + await rm(testDir, { recursive: true, force: true }); + } + }); + + test("returns empty array for empty searches", async () => { + const results = await structuredSearch(store, []); + expect(results).toEqual([]); + }); + + test("returns empty array when no documents match", async () => { + const results = await structuredSearch(store, [ + { type: "lex", query: "nonexistent-term-xyz123" } + ]); + expect(results).toEqual([]); + }); + + test("accepts all search types without error", async () => { + // These may return empty results but should not throw + await expect(structuredSearch(store, [{ type: "lex", query: "test" }])).resolves.toBeDefined(); + // vec and hyde require embeddings, so just test lex + }); + + test("respects limit option", async () => { + const results = await structuredSearch(store, [ + { type: "lex", query: "test" } + ], { limit: 5 }); + expect(results.length).toBeLessThanOrEqual(5); + }); + + test("respects minScore option", async () => { + const results = await structuredSearch(store, [ + { type: "lex", query: "test" } + ], { minScore: 0.5 }); + for (const r of results) { + expect(r.score).toBeGreaterThanOrEqual(0.5); + } + }); + + test("throws when lex query contains newline characters", async () => { + await expect(structuredSearch(store, [ + { type: "lex", query: "foo\nbar", line: 3 } + ])).rejects.toThrow(/Line 3 \(lex\):/); + }); + + test("throws when lex query has unmatched quote", async () => { + await expect(structuredSearch(store, [ + { type: "lex", query: "\"unfinished phrase", line: 2 } + ])).rejects.toThrow(/unmatched double quote/); + }); +}); + +// ============================================================================= +// FTS Query Syntax Tests +// ============================================================================= + +describe("lex query syntax", () => { + // Note: These test via CLI behavior since buildFTS5Query is not exported + + describe("validateSemanticQuery", () => { + + test("accepts plain natural language", () => { + expect(validateSemanticQuery("how does error handling work")).toBeNull(); + expect(validateSemanticQuery("what is the CAP theorem")).toBeNull(); + }); + + test("rejects negation syntax", () => { + expect(validateSemanticQuery("performance -sports")).toContain("Negation"); + expect(validateSemanticQuery('-"exact phrase"')).toContain("Negation"); + }); + + + test("accepts hyde-style hypothetical answers", () => { + expect(validateSemanticQuery( + "The CAP theorem states that a distributed system cannot simultaneously provide consistency, availability, and partition tolerance." + )).toBeNull(); + }); + }); + + describe("validateLexQuery", () => { + test("accepts basic lex query", () => { + expect(validateLexQuery("auth token")).toBeNull(); + }); + + test("rejects newline", () => { + expect(validateLexQuery("foo\nbar")).toContain("single line"); + }); + + test("rejects unmatched quote", () => { + expect(validateLexQuery("\"unfinished")).toContain("unmatched"); + }); + }); +}); + +// ============================================================================= +// buildFTS5Query Tests (lex parser) +// ============================================================================= + +describe("buildFTS5Query (lex parser)", () => { + // Mirror the function for unit testing + function sanitizeFTS5Term(term: string): string { + return term.replace(/[^\p{L}\p{N}']/gu, '').toLowerCase(); + } + + function buildFTS5Query(query: string): string | null { + const positive: string[] = []; + const negative: string[] = []; + let i = 0; + const s = query.trim(); + + while (i < s.length) { + while (i < s.length && /\s/.test(s[i]!)) i++; + if (i >= s.length) break; + const negated = s[i] === '-'; + if (negated) i++; + + if (s[i] === '"') { + const start = i + 1; i++; + while (i < s.length && s[i] !== '"') i++; + const phrase = s.slice(start, i).trim(); + i++; + if (phrase.length > 0) { + const sanitized = phrase.split(/\s+/).map((t: string) => sanitizeFTS5Term(t)).filter((t: string) => t).join(' '); + if (sanitized) (negated ? negative : positive).push(`"${sanitized}"`); + } + } else { + const start = i; + while (i < s.length && !/[\s"]/.test(s[i]!)) i++; + const term = s.slice(start, i); + const sanitized = sanitizeFTS5Term(term); + if (sanitized) (negated ? negative : positive).push(`"${sanitized}"*`); + } + } + + if (positive.length === 0 && negative.length === 0) return null; + if (positive.length === 0) return null; + + let result = positive.join(' AND '); + for (const neg of negative) result = `${result} NOT ${neg}`; + return result; + } + + test("plain terms → prefix match with AND", () => { + expect(buildFTS5Query("foo bar")).toBe('"foo"* AND "bar"*'); + }); + + test("single term", () => { + expect(buildFTS5Query("performance")).toBe('"performance"*'); + }); + + test("quoted phrase → exact match (no prefix)", () => { + expect(buildFTS5Query('"machine learning"')).toBe('"machine learning"'); + }); + + test("quoted phrase with mixed case sanitized", () => { + expect(buildFTS5Query('"C++ performance"')).toBe('"c performance"'); + }); + + test("negation of term", () => { + expect(buildFTS5Query("performance -sports")).toBe('"performance"* NOT "sports"*'); + }); + + test("negation of phrase", () => { + expect(buildFTS5Query('performance -"sports athlete"')).toBe('"performance"* NOT "sports athlete"'); + }); + + test("multiple negations", () => { + expect(buildFTS5Query("performance -sports -athlete")).toBe('"performance"* NOT "sports"* NOT "athlete"*'); + }); + + test("quoted positive + negation", () => { + expect(buildFTS5Query('"machine learning" -sports -athlete')).toBe('"machine learning" NOT "sports"* NOT "athlete"*'); + }); + + test("intent-aware C++ performance example", () => { + const result = buildFTS5Query('"C++ performance" optimization -sports -athlete'); + expect(result).toContain('NOT "sports"*'); + expect(result).toContain('NOT "athlete"*'); + expect(result).toContain('"optimization"*'); + }); + + test("only negations with no positives → null (can't search)", () => { + expect(buildFTS5Query("-sports -athlete")).toBeNull(); + }); + + test("empty string → null", () => { + expect(buildFTS5Query("")).toBeNull(); + expect(buildFTS5Query(" ")).toBeNull(); + }); + + test("special chars in terms stripped", () => { + expect(buildFTS5Query("hello!world")).toBe('"helloworld"*'); + }); +}); diff --git a/tsconfig.build.json b/tsconfig.build.json new file mode 100644 index 00000000..ba3811a0 --- /dev/null +++ b/tsconfig.build.json @@ -0,0 +1,11 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "noEmit": false, + "outDir": "dist", + "declaration": true, + "noImplicitAny": false + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.test.ts", "src/test-preload.ts", "src/bench-*.ts"] +} diff --git a/tsconfig.json b/tsconfig.json index bfa0fead..aa39dc01 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -3,14 +3,13 @@ // Environment setup & latest features "lib": ["ESNext"], "target": "ESNext", - "module": "Preserve", + "module": "nodenext", "moduleDetection": "force", "jsx": "react-jsx", "allowJs": true, - // Bundler mode - "moduleResolution": "bundler", - "allowImportingTsExtensions": true, + // Node.js module resolution + "moduleResolution": "nodenext", "verbatimModuleSyntax": true, "noEmit": true, diff --git a/vitest.config.ts b/vitest.config.ts new file mode 100644 index 00000000..fb6d61e1 --- /dev/null +++ b/vitest.config.ts @@ -0,0 +1,8 @@ +import { defineConfig } from "vitest/config"; + +export default defineConfig({ + test: { + testTimeout: 30000, + include: ["test/**/*.test.ts"], + }, +});